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
[ search ]
engine = "sqlite" # "sqlite" (default) or "grep"
async_index = true
index_window_ms = 200
index_batch_max = 50
Vector search
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
Provider Required fields openaiapi_key, modelollamabase_url, modelcohereapi_key, modelhttpurl (custom endpoint)bedrockregion, modelvertexproject, location, model
Provider Notes 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 ]
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.