Skip to main content

LLM wiki pattern

kiwifs init --template knowledge --root ./knowledge
Directory structure
knowledge/
├── SCHEMA.md
├── index.md
├── log.md
├── pages/
├── episodes/
└── .kiwi/playbook.md
Call kiwi_context on connect, then follow playbook operations. See Agent playbook.

Agent writes

curl -X PUT 'http://localhost:3333/api/kiwi/file?path=pages/auth.md' \
  -H 'X-Actor: my-agent' \
  -H 'X-Provenance: run:run-249' \
  -d '# Authentication

OAuth2 + JWT.'
curl -X POST 'http://localhost:3333/api/kiwi/bulk' \
  -H 'Content-Type: application/json' \
  -d '{
    "files": [
      {"path": "pages/auth.md", "content": "# Auth\n\nUpdated."},
      {"path": "log.md", "content": "- 2026-05-21: updated auth"}
    ],
    "actor": "agent:exec_abc",
    "message": "run 249"
  }'
echo "# Finding" > /mnt/kiwi/pages/finding-042.md
curl 'http://localhost:3333/api/kiwi/meta?where=$.derived-from[*].id=run-249'

MCP tool sequences

kiwi_context
kiwi_search("authentication")
kiwi_write("pages/auth.md", content)
kiwi_read("index.md")
kiwi_write("index.md", updated)
kiwi_append("log.md", "- added auth")
kiwi_search("payment timeout")
kiwi_read("pages/payments.md")
kiwi_append("episodes/2026-05-21.md", observation)
kiwi_memory_report
kiwi_read("episodes/2026-05-21.md")
kiwi_write("pages/topic.md", merged_content_with_merged_from)
See Episodic memory.
kiwi_analytics
kiwi_health_check("pages/auth.md")
kiwi_lint

DQL

kiwifs query 'TABLE title, status FROM "pages" WHERE status = "draft" SORT priority DESC'

Aggregation

kiwifs aggregate --group status --calc count,avg:priority

Import

kiwifs import --from postgres --dsn "postgres://..." --table users --root ./knowledge

Export

kiwifs export --format jsonl --include-content -o knowledge.jsonl
See Document export.

Production config

.kiwi/config.toml
[server]
public_url = "https://wiki.example.com"

[search]
engine = "sqlite"

[search.vector]
enabled = true

[search.vector.embedder]
provider = "ollama"
model = "nomic-embed-text"

[versioning]
strategy = "git"

[backup]
remote = "git@github.com:org/knowledge.git"
interval = "5m"

Docker

docker run -d --restart always \
  -v /data/knowledge:/data \
  -p 3333:3333 \
  ameliaanhlam/kiwifs serve --root /data

Go embed

import "github.com/kiwifs/kiwifs/pkg/kiwi"

srv, err := kiwi.New("/data/knowledge", kiwi.WithSearch("sqlite"))
mux.Handle("/wiki/", http.StripPrefix("/wiki", srv.Handler()))
See Go embed and Alternate protocols.
Last modified on May 23, 2026