Why
Solid's HTTP+LDP model is already close to WebDAV. A small bridge means every existing OS file manager (Nautilus, Finder, Windows Explorer) — plus rsync, git, cp, vim, anything that opens files — can read and write any spec-compliant Solid pod as a network volume.
This is the compatibility layer. The companion issue covers the native path: #508 — a Solid-aware filesystem driver (FUSE) that exposes Solid's actual model (ACLs, notifications, JSON-LD types) rather than hiding it. We want both. This issue is the WebDAV one.
Pod-agnostic: speaks the Solid protocol upstream (standard GET/PUT/DELETE, Accept: application/ld+json for containers, LDP POST with Slug, Solid-OIDC + DPoP for auth), so it works against JSS, CSS, NSS, ESS, Inrupt, anything spec-compliant.
The killer side effects:
cp ~/Videos/big.mp4 /mnt/alice/public/ streams via the OS, sidestepping browser-side upload limits.
rsync for backups, git remotes, find/grep, any GUI media player opening files directly — all free.
- Cross-pod copy: mount
alice.solidcommunity.net and bob.inrupt.com side by side in Nautilus and cp between them.
Shape
Standalone command, works against any Solid pod URL:
jss webdav --pod https://alice.solidcommunity.net [--port 6000]
- Starts a local WebDAV listener (default
localhost:6000).
- Translates WebDAV ↔ Solid:
GET → GET (passthrough)
PUT → PUT (passthrough; OS streams body so no 413 here)
DELETE → DELETE
MKCOL → LDP container POST with Slug + Link: <ldp#BasicContainer>
PROPFIND (Depth: 0 or 1) → GET with Accept: application/ld+json, translate ldp:contains to a multistatus XML response
MOVE / COPY → GET source + PUT dest + (DELETE source); recursive for containers
- Injects DPoP / Bearer on outgoing requests using credentials supplied at mount time.
- Mount UX (identical across OSes because WebDAV is standard):
- Linux:
gio mount dav://localhost:6000/ → appears in Nautilus.
- macOS: Finder → Go → Connect to Server →
http://localhost:6000/
- Windows: Map network drive →
http://localhost:6000/
Tradeoffs
- ✓ One component unlocks all three OS file managers
- ✓ WebDAV is a stable spec; works with decades of existing tools
- ✓ Pod-agnostic
- ✗ Loses Solid-specific features (ACL, notifications, JSON-LD types) — that's what the native-mount issue is for
- ✗ Slight overhead from protocol translation
Open questions
- Packaging: standalone
solid-webdav npm package with jss webdav as a wrapper? Keeps it usable without JSS installed.
- Auth lifecycle: WebDAV holds long sessions; DPoP-bound refresh tokens need quiet renewal.
- ACL: not natively in WebDAV. Could be
OPTIONS Allow-only hint, or punt to native-mount.
- Caching: PROPFIND results cache briefly (5-15s) — folder browsing fires a lot of them.
Effort
~500-1000 LOC of glue plus an auth shim.
Related
- Companion: native-mount issue (FUSE) — exposes Solid's full model
solid-apps/explorer upload bug — native cp over a mounted pod would not have that ceiling
Why
Solid's HTTP+LDP model is already close to WebDAV. A small bridge means every existing OS file manager (Nautilus, Finder, Windows Explorer) — plus
rsync,git,cp,vim, anything that opens files — can read and write any spec-compliant Solid pod as a network volume.This is the compatibility layer. The companion issue covers the native path: #508 — a Solid-aware filesystem driver (FUSE) that exposes Solid's actual model (ACLs, notifications, JSON-LD types) rather than hiding it. We want both. This issue is the WebDAV one.
Pod-agnostic: speaks the Solid protocol upstream (standard
GET/PUT/DELETE,Accept: application/ld+jsonfor containers, LDPPOSTwithSlug, Solid-OIDC + DPoP for auth), so it works against JSS, CSS, NSS, ESS, Inrupt, anything spec-compliant.The killer side effects:
cp ~/Videos/big.mp4 /mnt/alice/public/streams via the OS, sidestepping browser-side upload limits.rsyncfor backups,gitremotes,find/grep, any GUI media player opening files directly — all free.alice.solidcommunity.netandbob.inrupt.comside by side in Nautilus andcpbetween them.Shape
Standalone command, works against any Solid pod URL:
localhost:6000).GET→GET(passthrough)PUT→PUT(passthrough; OS streams body so no 413 here)DELETE→DELETEMKCOL→ LDP container POST withSlug+Link: <ldp#BasicContainer>PROPFIND(Depth: 0 or 1) →GETwithAccept: application/ld+json, translateldp:containsto a multistatus XML responseMOVE/COPY→ GET source + PUT dest + (DELETE source); recursive for containersgio mount dav://localhost:6000/→ appears in Nautilus.http://localhost:6000/http://localhost:6000/Tradeoffs
Open questions
solid-webdavnpm package withjss webdavas a wrapper? Keeps it usable without JSS installed.OPTIONSAllow-only hint, or punt to native-mount.Effort
~500-1000 LOC of glue plus an auth shim.
Related
solid-apps/explorerupload bug — nativecpover a mounted pod would not have that ceiling