Skip to main content
KiwiFS stores real files on disk. POSIX behavior depends on how you access them.

Compliance by access path

Access pathPOSIX levelNotes
Direct filesystemFullReal files, atomic writes, mmap works
NFS mountNear-fullSymlinks, open-unlink, stable handles
FUSE mountNear-fullRemote client; no kernel mmap
WebDAVPartialMOVE/COPY/MKCOL; buffered writes
REST / S3 / MCPN/AHTTP or tool semantics

What works on NFS and FUSE

SemanticNFSFUSE
Atomic writes (tmp → fsync → rename)YesYes
rename(2)YesYes
SymlinksYesYes
Open-then-delete (POSIX unlink)Yes
fsyncYesYes
Directory renameYesYes
readdir hides .git, .kiwiYesYes
64 MB max file size (EFBIG)YesYes

Concurrency and durability

If-Match / ETag on REST writes. Returns 409 on conflict.
One mutex across all protocols. Concurrent writers are safely queued.
flock on .kiwi/server.lock. Released automatically on process exit (including SIGKILL).
A background watcher cleans stale index.lock every 10 seconds (60-second threshold). Also cleaned at startup.
core.autocrlf=false and * -text in .gitattributes. ETags always match raw bytes.

Intentionally limited

  • FUSE does not support kernel mmap (HTTP-backed I/O).
  • WebDAV is not a full POSIX layer.
  • Two KiwiFS servers must not share one knowledge root — the lock prevents split-brain.
Symlinks work on NFS (real os.Symlink) and FUSE/REST (Content-Type: application/x-symlink). Targets escaping the knowledge root are rejected.
curl 'http://localhost:3333/api/kiwi/readlink?path=link.md'

Alternate protocols

NFS, S3, WebDAV, FUSE setup.

Files as truth

Storage philosophy.
Last modified on May 23, 2026