The archive
09 / SA· Live·Live

Satchel

Self-hosted file store for a small circle — folders, resumable uploads, member sharing, and short public share links with QR codes. Built from an empty repo to a live, deployed product in five days.

Added23 Jul 2026UpdatedInvalid Datesatcheldrop.com

Overview

Self-hosted file store for a small circle — folders, resumable uploads, member sharing, and short public share links with QR codes. Built from an empty repo to a live, deployed product in five days.

Build log

53 entries

  1. The events read API, and the useNotifications seam it feeds

  2. A server-side preview render API for text, code and markdown

  3. Migrate down is not a rollback — serve re-applies it at boot

  4. The events stream — an stl_events collection, hook emitters and a retention policy

  5. The move picker refuses the folder the items are already in

  6. Papercuts — hover-gated row actions, a server-read retention window, and PocketBase datetimes normalised before Date.parse

  7. API defect sweep — 404 for unmatched /api paths, JSON errors for every Accept header, an explicit ISO expiry grammar

  8. ZIP egress recorded per transfer — measured, not capped

  9. child_count now syncs on the destination folder for both move and undo

  10. Member self-purge, closing the folder-purge escalation path

  11. Bulk download over an authenticated ZIP route

  12. Drag to move — onto folders, chips and breadcrumbs alike

  13. Touch selection — long press, 44px targets and a bottom action bar

  14. Selection and bulk actions across the file browser

  15. Sort and view preferences that survive navigation

  16. The first build wave exposed two concurrency defects — recorded before they got patched over

  17. Server-owned trash retention, with a near-expiry countdown on the rows

  18. FileBrowser broken into seams — navigation, surface states and item actions

  19. Circle storage usage, measured against a soft target

  20. A ranked spec set with an explicit cut line, and a build runner to drive it

  21. Vendored a set of engineering skills and configured them for this repo

  22. The brand mark lands — sidebar, login, favicons and the public link pages

  23. serve-local pre-creates a dev superuser so PocketBase stops auto-opening the installer

  24. Deleting a non-empty folder is refused — an orphaning guard

  25. Mobile sweep — min-w-0 on SidebarInset kills the horizontal overflow at its root

  26. A command palette with a band trigger, preview handoff and an owner-scoped search endpoint

  27. Folder chips with cap and expand, backed by a hook-maintained, cascade-aware child_count

  28. Linear-style row anatomy — a contained list surface, tinted type tiles and two-line cells

  29. Indigo accent tokens, AA-checked in light and dark, plus a file-type tint and label vocabulary

  30. A My Files overview line, backed by its own /api/overview endpoint

  31. Closing design house-rules drift — motion tokens, button box, focus rings and placeholders

  32. PocketBase CORS locked to the app origin

  33. Satchel goes live — the Nuxt frontend deployed and verified end-to-end at satcheldrop.com

  34. PocketBase deployed and verified live at api.satcheldrop.com

  35. A departing member's items now transfer to the admin on removal, instead of orphaning

  36. Link expiry was off by one in negative-UTC zones

  37. Mona Sans, locally hosted, replaces Inter — plus reduced-motion, inset focus rings and a URL-persisted links filter

  38. A shadcn-vue-first component pass — Sidebar, ToggleGroup, Breadcrumb, Progress, DatePicker and NumberField replace the hand-rolled ones

  39. Link hardening — rate limiting, a trash warning, dead-link handling and a fail-closed cookie secret

  40. A links dashboard with visit analytics and a nav badge

  41. QR codes on every link, with status badges and link indicators on the items they point at

  42. Streaming ZIP download for public folder links

  43. Short public share links — password gate, byte cap and scope enforcement, all before a single byte is served

  44. Member sharing — a shares collection, an access resolver, and a shared-with-me page

  45. Trash with restore, and a scheduled purge behind it

  46. The file browser — folders, previews and drag-drop uploads

  47. A resumable multipart upload pipeline, with a docked progress panel

  48. An auth-gated storage proxy with range support and cached thumbnails

  49. Folders and files collections, with path maintenance and a common-tree trash guard

  50. A settings page — profile edits, and admin member management

  51. Phase 1 foundation — design tokens, a PocketBase client with an SSR auth cookie, and a global auth guard

  52. Invite-only users with admin and member roles, and a guard against self-promotion

  53. Satchel begins — a self-hosted file store for a small circle, spec'd before a line was written