Quick start
- Published image
- Build from source
Terminal
ameliaanhlam/kiwifs for linux/amd64 and linux/arm64. Each release is tagged with its version, such as 0.19.78, and latest follows the newest release.http://localhost:3333. If /data is empty, KiwiFS initializes a new knowledge base there on first start.
What’s in the image
The default command is:kiwifs, so any arguments you pass replace that command. Always include --root /data when you pass your own.
Build stages and bundled tools
Build stages and bundled tools
The runtime image includes
git for versioning, Pandoc, Marp CLI, Chromium, and MkDocs for document export, and the Docker CLI. It doesn’t include Typst or XeLaTeX, so server-side PDF export needs a derived image.Docker Compose
The repository’sdocker-compose.yml builds the image and starts an optional pgvector database for vector search.
docker-compose.yml
Terminal
build and image with image: ameliaanhlam/kiwifs:latest.
For development, docker-compose.dev.yml runs the backend with hot reload on port 3333, the Vite dev server on port 5173, an MCP server on port 8181, and pgvector.
Configuration
Most settings live in.kiwi/config.toml inside the mounted knowledge root. See Optional features for the available sections.
Environment variables
KiwiFS reads these environment variables directly:
Any other variable takes effect only when
config.toml references it with ${VAR}. For example, the Compose file’s OPENAI_API_KEY and KIWI_PGVECTOR_DSN turn on vector search with this config:
.kiwi/config.toml
Authentication
Pass auth flags along with the rest of the serve command.[auth] api_key = "${KIWI_API_KEY}" in config.toml and pass -e KIWI_API_KEY instead. See Auth and tokens.
NFS, S3, and WebDAV
Publish the ports and enable each protocol.docker-compose.yml
--nfs-allow to the CIDRs of your clients. See Alternate protocols.
Persistence and permissions
Mount the knowledge root at/data, or all pages and history are lost when the container is removed. Indexes in .kiwi/state/ are rebuildable, but your markdown files and .git are not.
The server runs as the non-root user kiwi. If KiwiFS can’t write to a bind-mounted folder, make the folder writable for that user or run the container with --user "$(id -u):$(id -g)".
Health checks
These endpoints never require authentication. The image includes BusyBox
wget, but not curl.
docker-compose.yml
Production tips
- Pin a version tag, such as
ameliaanhlam/kiwifs:0.19.78, rather thanlatest. - Run one container per knowledge root. KiwiFS serializes writes inside one process.
- Turn on backup sync to push history to a git remote.
- Set memory limits, and raise them if you enable vector search.
docker-compose.yml
Related
Kubernetes
Run KiwiFS in a cluster.
Ollama vector search
Local embeddings on a small VPS.