filesystem admin over HTTP https://www.betternas.com
Find a file
Hari 18b6ac625f
Fix macOS Finder WebDAV mount by handling GET on directories (#12)
Go's webdav.Handler returns 405 Method Not Allowed for GET on
collections (directories). macOS Finder sends GET to the WebDAV root
as part of its mount flow and refuses to connect when it gets 405.

Add a finderCompatible wrapper that intercepts GET/HEAD on directories
and returns a minimal 200 response, while passing all standard WebDAV
methods through to the underlying handler unchanged.
2026-04-01 16:42:34 -04:00
.agents/skills/shadcn shadcn skill 2026-04-01 18:04:36 +00:00
apps Fix macOS Finder WebDAV mount by handling GET on directories (#12) 2026-04-01 16:42:34 -04:00
docs Make control-plane the real mount authority 2026-04-01 17:46:50 +00:00
infra/docker Make control-plane the real mount authority 2026-04-01 17:46:50 +00:00
packages Migrate apps/web to shadcn/ui with preset b2D1F1IZv 2026-04-01 18:11:52 +00:00
scripts Make control-plane the real mount authority 2026-04-01 17:46:50 +00:00
.editorconfig pnpm, verify, cleanup (#6) 2026-03-31 23:59:52 -04:00
.env.agent.example Make control-plane the real mount authority 2026-04-01 17:46:50 +00:00
.gitignore introduce .env 2026-04-01 04:32:08 +00:00
.prettierignore Make the web app consume the live mount contract 2026-04-01 17:56:05 +00:00
CLAUDE.md Make control-plane the real mount authority 2026-04-01 17:46:50 +00:00
control.md update docs 2026-04-01 16:43:25 +00:00
go.work init (#5) 2026-03-31 23:50:51 -04:00
go.work.sum edit 2026-04-01 04:04:04 +00:00
package.json setup agent runtime requirements (#7) 2026-04-01 00:37:15 -04:00
pnpm-lock.yaml Migrate apps/web to shadcn/ui with preset b2D1F1IZv 2026-04-01 18:11:52 +00:00
pnpm-workspace.yaml pnpm, verify, cleanup (#6) 2026-03-31 23:59:52 -04:00
README.md Make control-plane the real mount authority 2026-04-01 17:46:50 +00:00
skeleton.md update docs 2026-04-01 16:43:25 +00:00
skills-lock.json shadcn skill 2026-04-01 18:04:36 +00:00
TODO.md update docs 2026-04-01 16:43:25 +00:00
tsconfig.base.json pnpm, verify, cleanup (#6) 2026-03-31 23:59:52 -04:00
turbo.json Migrate apps/web to shadcn/ui with preset b2D1F1IZv 2026-04-01 18:11:52 +00:00

betterNAS

betterNAS is a self-hostable WebDAV stack for mounting NAS exports in Finder.

The default product shape is:

  • node-service serves the real files from the NAS over WebDAV
  • control-server owns auth, nodes, exports, grants, and mount profile issuance
  • web control plane lets the user manage the NAS and get mount instructions
  • macOS client starts as native Finder WebDAV mounting, with a thin helper later

For now, the whole stack should be able to run on the user's NAS device.

Current repo shape

  • apps/node-agent
    • NAS-side Go runtime and WebDAV server
  • apps/control-plane
    • Go backend for auth, registry, and mount profile issuance
  • apps/web
    • Next.js web control plane
  • apps/nextcloud-app
    • optional Nextcloud adapter, not the product center
  • packages/contracts
    • canonical shared contracts
  • infra/docker
    • self-hosted local stack

The main planning docs are:

Default runtime model

                   self-hosted betterNAS on the user's NAS

                         +------------------------------+
                         | web control plane            |
                         | Next.js UI                   |
                         +--------------+---------------+
                                        |
                                        v
                         +------------------------------+
                         | control-server               |
                         | auth / nodes / exports       |
                         | grants / mount profiles      |
                         +--------------+---------------+
                                        |
                                        v
                         +------------------------------+
                         | node-service                 |
                         | WebDAV + export runtime      |
                         | real NAS bytes               |
                         +------------------------------+

 user Mac
   |
   +--> browser -> web control plane
   |
   +--> Finder -> WebDAV mount URL from control-server

Verify

Static verification:

pnpm verify

Bootstrap clone-local runtime settings:

pnpm agent:bootstrap

Bring the self-hosted stack up, verify it, and tear it down:

pnpm stack:up
pnpm stack:verify
pnpm stack:down --volumes

Run the full loop:

pnpm agent:verify

Current end-to-end slice

The first proven slice is:

  1. boot the stack with pnpm stack:up
  2. verify it with pnpm stack:verify
  3. get the WebDAV mount profile from the control plane
  4. mount it in Finder with the issued credentials

If the stack is running on a remote machine, tunnel the WebDAV port first, then use Finder Connect to Server with the tunneled URL.

Product boundary

The default betterNAS product is self-hosted and WebDAV-first.

Nextcloud remains optional and secondary:

  • useful later for browser/mobile/share surfaces
  • not required for the core mount flow
  • not the system of record