Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.kiwifs.com/llms.txt

Use this file to discover all available pages before exploring further.

KiwiFS is configured via .kiwi/config.toml inside your knowledge root directory. All settings are optional — KiwiFS runs with sensible defaults out of the box. Environment variables in the form ${VAR} are expanded in all string values.

Server

[server]
host = "0.0.0.0"
port = 3333
cors_origins = ["https://app.example.com"]
public_url = "https://wiki.example.com"
The public_url is used for permalink generation. Override via KIWI_PUBLIC_URL env var.
[search]
engine = "sqlite"        # "sqlite" (default) or "grep"
async_index = true
index_window_ms = 200
index_batch_max = 50
Enable semantic search by configuring an embedder and a vector store.
[search.vector]
enabled = true
chunk = 512
worker_count = 4

[search.vector.embedder]
provider = "openai"      # openai | ollama | cohere | http | bedrock | vertex
model = "text-embedding-3-small"
api_key = "${OPENAI_API_KEY}"
dimensions = 1536

[search.vector.store]
provider = "sqlite-vec"  # sqlite-vec | qdrant | pgvector | pinecone | weaviate | milvus
ProviderRequired fields
openaiapi_key, model
ollamabase_url, model
cohereapi_key, model
httpurl (custom endpoint)
bedrockregion, model
vertexproject, location, model
ProviderNotes
sqlite-vecZero-config, embedded (default when vector is enabled)
qdrantRequires separate Qdrant server
pgvectorRequires PostgreSQL with pgvector extension
pineconeCloud-hosted
weaviateSelf-hosted or cloud
milvusSelf-hosted or cloud

Versioning

[versioning]
strategy = "git"          # "git" (default), "cow", or "none"
async_commit = true
batch_window_ms = 200
batch_max_size = 50
max_versions = 100        # only for "cow" strategy
  • git — every write is a real git commit. Full history, blame, diff.
  • cow — copy-on-write snapshots without git. Lighter, limited history.
  • none — no versioning. Writes overwrite in place.

Authentication

[auth]
type = "none"             # "none", "apikey", "perspace", or "oidc"
api_key = "kiwi_sk_..."   # for type = "apikey"

# Per-space keys
[[auth.api_keys]]
key = "kiwi_sk_eng_..."
space = "engineering"
actor = "eng-team"

# OIDC
[auth.oidc]
issuer = "https://accounts.google.com"
client_id = "your-client-id"
Auth is hot-reloadable — send SIGHUP to the server process to reload auth configuration from disk without restarting.

Assets

[assets]
max_file_size = "10MB"
allowed_types = ["image/png", "image/jpeg", "image/gif", "image/webp", "application/pdf"]

UI

[ui]
theme_locked = false      # when true, users cannot change the theme

Backup

[backup]
remote = "git@github.com:org/knowledge.git"
interval = "5m"
branch = "main"
Override via env: KIWI_BACKUP_REMOTE, KIWI_BACKUP_INTERVAL.

Janitor

The janitor periodically scans for stale pages, orphans, and broken links.
[janitor]
interval = "1h"
stale_days = 30
startup_scan = true

DataView

[dataview]
max_scan_rows = 10000
query_timeout = "5s"
max_auto_indexes = 20
computed_fields = true

[dataview.custom_fields]
age_days = "days_since(updated)"
is_long = "len(body) > 5000"

Memory

[memory]
episodes_path_prefix = "episodes/"

Tracing

Query tracing is enabled by default and writes structured JSON records of what KiwiFS did during each request.
[tracing]
enabled = true            # default true; set false to suppress
output = "stderr"         # "stderr" (default) or "file"
file = "/var/log/kiwifs-trace.jsonl"

Multi-space

Run multiple independent knowledge bases from one server.
[[spaces]]
name = "engineering"
root = "/data/eng-wiki"

[[spaces]]
name = "product"
root = "/data/product-wiki"
Each space gets its own set of API endpoints under /api/kiwi/{name}/....
You can also add spaces via CLI flags: kiwifs serve --space eng=/data/eng --space product=/data/product.
Last modified on May 4, 2026