Skip to main content
The published image runs the full server: REST API, web UI, MCP over HTTP, and the optional NFS, S3, and WebDAV protocols. It also bundles the tools for server-side document export.

Quick start

Terminal
Images are published to Docker Hub as 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.
Open 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:
The entrypoint is kiwifs, so any arguments you pass replace that command. Always include --root /data when you pass your own.
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’s docker-compose.yml builds the image and starts an optional pgvector database for vector search.
docker-compose.yml
Terminal
To use the published image instead of building, replace 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
Restart the container. When the vector store is empty, KiwiFS embeds existing pages in the background on startup.

Authentication

Pass auth flags along with the rest of the serve command.
To keep the key out of the process list, set [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
The NFS server runs in userspace (NFSv3), so the container doesn’t need privileged mode. It only accepts localhost by default, so set --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 than latest.
  • 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

Kubernetes

Run KiwiFS in a cluster.

Ollama vector search

Local embeddings on a small VPS.
Last modified on October 19, 2026