arizuko

arizuko › components › davd

davd

davd serves the groups directory over WebDAV, and proxyd checks every request before davd sees it.

davd serves the group folders as a network drive

davd turns the folder of an agent into a network drive. You mount it with rclone and edit the files of the agent from your own machine, without a login on the server.

davd is a WebDAV server over the groups/ directory of each instance. WebDAV is the standard way to expose a folder as a network drive. The whole daemon is the sigoden/dufs Rust binary in an alpine image, which adds the standard wget healthcheck, started with --port 8080 /data. /data is a bind mount of <data-dir>/groups/.

davd itself knows nothing about identity. Authentication and the limit to one group happen one step earlier, in proxyd. proxyd accepts only Authorization: Bearer <JWT> or the refresh_token cookie, so a client that sends HTTP Basic auth, such as Finder or Windows Explorer, cannot sign in. howto/webdav shows how to mint a token.

Operators need to edit agent files without a shell

davd serves the folder that the agent reads on each turn: PERSONA.md, MEMORY.md, facts/, custom skills and diary entries. Operators need to edit those files in a real editor, such as vim or VS Code on an rclone mount, without a shell on the host.

WebDAV gives that with standard verbs that every operating system already speaks: PROPFIND, PUT, DELETE and MKCOL. Without davd, you need direct filesystem access on the server to edit the files of a group. The alternative is a custom REST API that repeats what WebDAV already defines.

Every request passes proxyd before davd

operator (rclone, curl)
   │  WebDAV request to https://<host>/dav/<group>/<path>
   ▼
 proxyd
   │  verify JWT (cookie or Bearer)
   │  check group claim against URL path
   │  davAllow: reject writes to .env, *.pem, .git/, logs/
   ▼
 davd  (dufs on :8080, serving /data)
   │
   ▼
 <data-dir>/groups/<group>/<path>
Inputs
WebDAV verbs that proxyd forwards.
Outputs
Bytes read from or written to the folder of the group on disk. The agent reads the same bytes on its next turn, with no deploy and no restart.
Dependencies
A bind mount of the data directory at /data, and proxyd in front for any access from outside the host. Direct access to davd equals root access to every group folder.

concepts/webdav covers the write-block guard of proxyd, the path check per group, and complete client examples.

davd runs alone but has no auth

davd runs alone, with one warning: davd has no auth. Never bind it to a public interface without proxyd or another auth layer in front.

# run davd against a local directory
docker run --rm -p 8080:8080 \
  -v /srv/data/myinstance/groups:/data \
  arizuko-davd:latest

# probe (read-only PROPFIND on the root)
curl -s -X PROPFIND -H 'Depth: 1' http://localhost:8080/

# mount it with rclone
rclone mount :webdav,url=http://localhost:8080: ~/mnt/groups \
  --vfs-cache-mode writes

GET / returns 200 with the dufs index, and the healthcheck reads it with a 3-second wget timeout. davd has no /health route of its own.

davd reads no environment variables

davd itself reads no environment variables: the container starts with fixed flags, --port 8080 /data. The compose generator reads WEBDAV_ENABLED, which turns the daemon and its /dav/ route on. proxyd holds the write-block rules and the /dav/<group>/ path check. reference/env has the full list and the defaults.

Three sources cover the details