Skip to content

Solid → WebDAV bridge — mount any pod in Nautilus / Finder / Windows #507

@melvincarvalho

Description

@melvincarvalho

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:
    • GETGET (passthrough)
    • PUTPUT (passthrough; OS streams body so no 413 here)
    • DELETEDELETE
    • 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions