Skip to main content
KiwiFS stores real files on a real filesystem, not blobs in a database. How POSIX-like the experience is depends on how you reach those files.

Compliance by access path

What works on NFS and FUSE

Intentionally not supported

Concurrency and durability

REST writes accept an If-Match header with the file’s ETag. A stale ETag returns 409 Conflict. If-Match: * follows RFC 7232.
Writes from every protocol share one pipeline and one lock, so concurrent writers queue instead of corrupting each other.
The server holds an flock on .kiwi/server.lock. The kernel releases it on any exit, including SIGKILL, so there is no stale lock to clean up. Two servers can’t share one knowledge root.
Every 10 seconds, a background watcher removes .git/index.lock if it is older than 60 seconds. Git subprocesses get SIGTERM before SIGKILL, so they usually release the lock themselves.
KiwiFS sets core.autocrlf=false and * -text in .gitattributes, so ETags always match the raw bytes on disk. The API blocks writes to .gitattributes.
YAML frontmatter larger than 64 KB is treated as empty. Headings in the body are still indexed.
Create a symlink by writing its target with Content-Type: application/x-symlink, and read the target back with readlink:
Terminal

Alternate protocols

Set up NFS, S3, WebDAV, and FUSE.

Files as truth

Why KiwiFS stores plain files.

Versioning

Git commits behind every write.
Last modified on October 19, 2026