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
- concepts/webdav: the auth flow, the write-block guard and client examples.
- [davd/README.md]: the wrapper image and the dufs command line.
- components/proxyd: the layer that checks every
/dav/request.