Personal Object Storage - A real POS! https://dropbear.tfks.net
  • Go 97.6%
  • HTML 1.3%
  • Just 1.1%
Find a file
agent-dev 357860eb7f Collapse the credential+store assembly triad into openRootStore
Nine command call sites re-ran an identical ValidateRemote → LoadCredentials → assign creds → newObjectStore sequence, each independently reassembling cfg.Credentials — a real drift surface. openRootStore (cmd/dropbear/store.go) owns that assembly once and returns (store, prefix). Two sentinel errors (errRemoteConfig, errStoreInit) let each caller keep its own exit-code vocabulary via errors.Is: the sync family keeps 8/1, retire keeps 3/4, the daemon keeps sysexit 64, and plan keeps its non-fatal warning path.

register (builds config from flags via remoteconfig.Parse, not ValidateRemote) and statusreport.populateOnline (internal package, non-fatal drift semantics through injected seams) are deliberately left untouched — different contracts. This is the tight, non-leaky slice of IMPROVE.html item 3; the eager rootsession.Open Session bundle it pitched would be leaky, since the full boot sequence exists in only 2 of ~13 commands.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 13:18:44 -07:00
.agents Repair the /runbooks slash-command seam with a symlink plus test::contracts guard, and add a generated wiki/decisions index drift-guarded by test::decisions-drift 2026-07-18 07:36:18 -07:00
.claude Relocate agent commands/skills into .agents with .claude symlinks 2026-06-24 21:33:55 -07:00
.codex/skills Initial commit 2026-05-06 00:25:46 +00:00
.forgejo/workflows Unify upload.Core construction across CLI and daemon, and bump the toolchain to go1.26.5 2026-07-29 10:05:14 -07:00
.githooks improve test & build story 2026-05-25 20:48:07 -07:00
.pi Initial commit 2026-05-06 00:25:46 +00:00
cmd Collapse the credential+store assembly triad into openRootStore 2026-07-29 13:18:44 -07:00
doc Collapse the sync and plan remote-view projections into one deep internal/remoteview module 2026-07-29 10:03:09 -07:00
internal Collapse the active-device derivation into deviceregistry.ActiveDevices 2026-07-29 11:09:51 -07:00
openspec Reject absolute-symlink uploads at the walker and gate delete propagation on a committed baseline 2026-07-15 09:48:20 -07:00
wiki Unify upload.Core construction across CLI and daemon, and bump the toolchain to go1.26.5 2026-07-29 10:05:14 -07:00
.gitignore Add tray daemon start/stop via platform lifecycle controller 2026-07-02 21:28:59 -07:00
.golangci.yml fix the build 2026-05-25 21:33:03 -07:00
AGENTS.md Close the glossary gap with an Internals section, promote the file-status state machine to a decision page with a Mermaid diagram, delete wiki/code and the obsolete SPECS.md/ROADMAP.md, freeze START.md as design history, and declare every wiki dir in AGENTS.md with test::contracts coverage 2026-07-18 21:35:49 -07:00
build.just Add build::dist release recipe and fix CGo-less darwin cross-builds 2026-07-02 21:28:59 -07:00
CLAUDE.md Initial commit 2026-05-06 00:25:46 +00:00
daemon.just Add desktop tray app for daemon status and control 2026-06-30 14:22:30 -07:00
docker-compose.yml Add desktop tray app for daemon status and control 2026-06-30 14:22:30 -07:00
fjx.json Relocate agent commands/skills into .agents with .claude symlinks 2026-06-24 21:33:55 -07:00
go.mod Unify upload.Core construction across CLI and daemon, and bump the toolchain to go1.26.5 2026-07-29 10:05:14 -07:00
go.sum Add macOS FSEvents hint backend for fswatch 2026-06-30 22:28:02 -07:00
HANDOFF.md track HANDOFF.md until done spiking 2026-05-27 20:21:25 -07:00
Justfile Repair the /runbooks slash-command seam with a symlink plus test::contracts guard, and add a generated wiki/decisions index drift-guarded by test::decisions-drift 2026-07-18 07:36:18 -07:00
README.md Document the Homebrew install path, release flow, and roots CLI 2026-07-02 21:28:59 -07:00
src.just Repair the /runbooks slash-command seam with a symlink plus test::contracts guard, and add a generated wiki/decisions index drift-guarded by test::decisions-drift 2026-07-18 07:36:18 -07:00
START.md Close the glossary gap with an Internals section, promote the file-status state machine to a decision page with a Mermaid diagram, delete wiki/code and the obsolete SPECS.md/ROADMAP.md, freeze START.md as design history, and declare every wiki dir in AGENTS.md with test::contracts coverage 2026-07-18 21:35:49 -07:00
test.just Close the glossary gap with an Internals section, promote the file-status state machine to a decision page with a Mermaid diagram, delete wiki/code and the obsolete SPECS.md/ROADMAP.md, freeze START.md as design history, and declare every wiki dir in AGENTS.md with test::contracts coverage 2026-07-18 21:35:49 -07:00

dropbear

Personal Dropbox, More Cuddly

Single-user file sync between local folders and S3-compatible object storage. The bucket stores content-addressed (SHA-256) blobs, per-device JSON manifests, and tombstones — never a POSIX filesystem. Local state lives in SQLite; each synced root carries its identity in .dropbear/root.toml.

CI Docs

What it does

  • Bidirectional sync with explicit tombstones for deletes and conflict files instead of auto-merge.
  • Removable-drive safe — a missing root is offline, never an inferred deletion.
  • On-demand downloads ("shelving") — remote files can live as zero-byte stubs and materialize when you fetch them.
  • Daemon mode — a background supervisor watches N roots with a filesystem watcher, remote head polling, a loopback status API, and systemd/launchd packaging.
  • Sync modes per root: bidirectional, upload-only, download-only, archive-only.

Non-goals: multi-user, FUSE, realtime collaboration, POSIX-on-S3, full ACL preservation.

Install

brew tap tfks/tap https://git.tfks.net/tfks/homebrew-tap.git
brew install tfks/tap/dropbear   # installs dropbear + dropbear-tray (builds from source)

Then bootstrap the background service — create the credentials env file and run dropbear daemon install; see wiki/runbooks/homebrew-install.md. Manage the folders the daemon watches with dropbear roots list|add|remove (edits daemon.toml in place; --restart applies immediately).

Quick start (from a checkout)

just setup              # check prereqs, configure git hooks, download modules
just build              # compile ./bin/dropbear

# point a folder at a bucket (credentials via env: DROPBEAR_S3_* or AWS_*)
dropbear register ~/Sync \
  --root-id home --device-id laptop \
  --remote-bucket my-bucket --remote-endpoint https://…
dropbear sync ~/Sync    # upload/download pending changes
dropbear status ~/Sync  # health report: identity, classification, conflicts, peers, drift

Run dropbear --help for the full command set. Highlights: register, scan, plan, sync, fetch, shelve, restore, status, clean, gc, retire, daemon, roots.

Development

just            # list every recipe
just check      # format + vet + lint (run after edits)
just validate   # check + tests + secrets scan + dep audit (CI gate)

Where to look next

  • wiki/PROJECT.md — current state, direction, and the index of architectural decisions (wiki/decisions/).
  • wiki/runbooks/ — operational workflows, also runnable as /runbooks:<name> slash commands.
  • AGENTS.md — the operating manual for humans and AI agents working in this repo.
  • openspec/ — proposals and specs for in-flight and shipped changes.
  • doc/ — feature and use-case notes.