Releases: markgustetic/sentra
Release list
v0.6.1
sentra v0.6.1
Encrypted, deduplicated, agent-aware backups for S3 and S3-compatible
storage. See the README and
QUICKSTART
to get started.
Changelog
Other
- 0c1a7a5: release: reference the tap token the only way goreleaser accepts (@markgustetic)
Homebrew: brew install markgustetic/tap/sentra
v0.6.0
sentra v0.6.0
Encrypted, deduplicated, agent-aware backups for S3 and S3-compatible
storage. See the README and
QUICKSTART
to get started.
Changelog
Documentation
- 88ac213: docs: desktop notifications design spec (@markgustetic)
Other
- b342f3f: cli,tui: notify the desktop after every backup and policy run (@markgustetic)
- 0dcff9d: deps: land the 2026-09-07 Dependabot batch at per-dependency max (@markgustetic)
- 05a0b2c: notify: desktop notifications for backup runs (leaf package, config, policy summary) (@markgustetic)
- 0719d9c: notify: keep the trailing argv title, subtitle, body on linux too (@markgustetic)
- 86c3380: release: drop the container image (@markgustetic)
Homebrew: brew install markgustetic/tap/sentra
v0.5.0
sentra v0.5.0
Encrypted, deduplicated, agent-aware backups for S3 and S3-compatible
storage. See the README and
QUICKSTART
to get started.
Changelog
Documentation
- d156abf: docs: backup wizard + scheduled tab implementation plan (@markgustetic)
- 9d7de15: docs: backup wizard + scheduled-backups rail tab design (@markgustetic)
- 819d391: docs: explain sleep vs shutdown behavior and the login-time catch-up (@markgustetic)
- e95655d: docs: name the schedule step's time, weekday, and policy name (@markgustetic)
- 906c8e9: docs: note the TUI's guarded mutations, async timer probe, and table glyph (@markgustetic)
- d4af8ca: docs: record root resolution, manifest-ID, and index invariants in AGENTS.md (@markgustetic)
- fbdbb3b: docs: regenerate the Backup screenshot for the wizard (@markgustetic)
- a3b80d1: docs: regenerate the Backup screenshots for the one-line rail (@markgustetic)
- d9a5551: docs: seven-view rail and the backup wizard (@markgustetic)
Other
- 8ef60bf: agent: reject negative caps instead of panicking mid-scan (@markgustetic)
- 59658d4: atomicfile: cover every dotfiles link shape in one symlink table (@markgustetic)
- a8741f8: atomicfile: extract config's atomic writer into a leaf package (@markgustetic)
- bff8f42: atomicfile: name the target path in the create-temp error (@markgustetic)
- ab4a899: atomicfile: say why the directory is not fsynced; keep caller prose on the callers (@markgustetic)
- 9f3dc9c: blobstore, agent: make the PutIfAbsent contract normative and name the flag in the cap error (@markgustetic)
- a8671d0: blobstore: retry PutIfAbsent under the outer policy (@markgustetic)
- b0098d2: blobstore: share one buffered retry between Put and PutIfAbsent (@markgustetic)
- 98e0add: cli: anchor the --if-due last-run lookup to the config dir like the run itself (@markgustetic)
- 4e37760: cli: build every policy subcommand test on testPolicyDeps (@markgustetic)
- 2e52b31: cli: build policy test deps through one constructor that can never reach a real LaunchAgent (@markgustetic)
- 81b8bac: cli: carry Reconfigure on the dashboard launch (@markgustetic)
- 9b408f3: cli: clear the progress frame before a skip note; keep skipLine nil-safe (@markgustetic)
- bd20baa: cli: fail fast when an explicit --config names a missing file (@markgustetic)
- a339348: cli: gate launches carry Reconfigure whenever a config exists (@markgustetic)
- 4e0136d: cli: install schedules through scheduler.InstallFor like the TUI (@markgustetic)
- 048e3ba: cli: policy run --if-due and --startup-delay for anacron-style catch-up (@markgustetic)
- eec99b3: cli: print skipped folders during backup and policy run, count them in summaries (@markgustetic)
- 7209a95: cli: refuse a negative --max-tool-calls instead of running the default budget (@markgustetic)
- 769c51e: cmd/sentra: exit 128+signum after a signal-cancelled run (@markgustetic)
- b84a0f1: cmd/sentra: run commands under a signal-cancelled context (@markgustetic)
- a78c22c: config: quote policy names as YAML map keys (@markgustetic)
- d9e3f12: config: replace sentra.yaml atomically via temp file and rename (@markgustetic)
- 214f1ec: config: write through a symlinked sentra.yaml instead of replacing the link (@markgustetic)
- fef1d6f: crypto: cap KDF params so a tampered config cannot OOM or hang Open (@markgustetic)
- 501b9e7: crypto: quantify the worst case the KDF ceilings admit (@markgustetic)
- 16762f8: mcpserver: plan a backup against the resolved root the snapshot will record (@markgustetic)
- 2f0d03e: mcpserver: report skipped folders in confirm_backup; document the skip contract (@markgustetic)
- 2d585a4: mcpserver: walk confirmed backups with the configured backup options (@markgustetic)
- 75505b1: policy: add PreviousRun, the backward twin of NextRun (@markgustetic)
- 4569bdc: policy: build retention policies with pins via RetentionFromConfig (@markgustetic)
- 5cd94d2: policy: keep NormalizePath absolute on every failure; refuse dangling symlinks (@markgustetic)
- faffd0c: policy: keep secrets out of hook logs and hook environments (@markgustetic)
- ccec096: policy: make RunHook's webhookEnv a plain parameter; TUI hooks pass it (@markgustetic)
- b9e9d3b: policy: move the TUI's last-run resolver down to internal/policy (@markgustetic)
- 5feb836: policy: one BackupWalkerOptions for every snapshot-taking surface (@markgustetic)
- 5a2d5d7: policy: refuse more than one webhook env name instead of concatenating (@markgustetic)
- e03cc7e: policy: resolve policy paths through symlinks exactly like snapshot roots (@markgustetic)
- 62c4a90: policy: store and run policy paths absolute (@markgustetic)
- d7b15d7: repo: carry OnSkip into every snapshot walk and count skips in the stats (@markgustetic)
- 8d29949: repo: confirm lock ownership on one detached context for acquire and release (@markgustetic)
- ad4968c: repo: confirm reused chunks still exist before the incremental scan trusts them (@markgustetic)
- 6c46e5b: repo: decide chunk presence in Check from one List, not a HEAD per reference (@markgustetic)
- 0278213: repo: fold the KDF ceiling test into config_mac_test.go (@markgustetic)
- 8c29218: repo: init test repos with cheap Argon2id params (@markgustetic)
- 08bd669: repo: invalidate the dest index on a detached context after a cancelled sync (@markgustetic)
- 5a0f0da: repo: invalidate the mirror index even when the manifest phase fails partway (@markgustetic)
- a57234b: repo: invalidate the mirror's snapshot index after sync copies manifests (@markgustetic)
- 713c48e: repo: log every lock failure on the best-effort index write at debug (@markgustetic)
- 7dfdf29: repo: name the resolved path in ErrRootNotDir when it differs (@markgustetic)
- 809ec36: repo: persist a rebuilt snapshot index only under an uncontended lock (@markgustetic)
- 7b24209: repo: refuse a backup plan whose root is not the canonical spelling (@markgustetic)
- b5c6b38: repo: refuse a manifest whose ID does not match its key (@markgustetic)
- efe5fed: repo: release the lock on a context detached from the caller's cancel (@markgustetic)
- 7487a34: repo: rename the fidelity test's Stat counter so it does not collide with check_test's (@markgustetic)
- 8e44f6b: repo: resolve a backup root's symlinks and require a directory (@markgustetic)
- 71ed7e0: repo: split ResolveRoot and the incremental probe out of snapshot.go (@markgustetic)
- 2c963d8: repo: treat an acquire whose lock blob carries our own UUID as won (@markgustetic)
- ae6d141: repo: wrap the sync phase error before joining it with an index failure (@markgustetic)
- d53d1c6: scheduler: ResyncFor/InstallFor absorb the target prelude for both surfaces (@markgustetic)
- fe4f6a6: scheduler: activate timers on install, deactivate on uninstall (@markgustetic)
- 2219cb1: scheduler: render hourly schedules on darwin (@markgustetic)
- 1dcbb4c: scheduler: resync an installed timer after policy add --replace (@markgustetic)
- 3a738e3: scheduler: run at load with --if-due so a missed slot is caught up at login (@markgustetic)
- 67806b6: setup: keep the backup-user profile off the session and config profiles (@markgustetic)
- 3bc5371: setup: make the two profile-collision sentinels self-standing sentences (@markgustetic)
- 6d7d048: setup: provision tests use t.TempDir() paths, not literal /tmp files (@markgustetic)
- ee730d2: setup: sa...
v0.4.0
sentra v0.4.0
Encrypted, deduplicated, agent-aware backups for S3 and S3-compatible
storage. See the README and
QUICKSTART
to get started.
Changelog
Features
- 1086e33: feat(setup): Effects.ProvisionBackupUser on the seam and every fake (@markgustetic)
- 4d43fe8: feat(setup): IAM backup-user provisioner behind a fake-able iamAPI (@markgustetic)
- 88aa78d: feat(setup): PrepareAWS provisions the backup user and switches profile after verify (@markgustetic)
- f406dd6: feat(setup): backup-user plan fields, report types, profile validation, gate (@markgustetic)
- 182fdd3: feat(setup): minimal-touch AWS credentials-file writer with refusals (@markgustetic)
- f1cb7c8: feat(setup): per-bucket managed policies so buckets accumulate on the backup user (@markgustetic)
- 89fea2b: feat(setup): review screen names the backup-user step and its profile (@markgustetic)
- 8c2c0e3: feat(tui): backup picker preview follows the cursor, cached by target (@markgustetic)
- 86d9334: feat(tui): backup view renders the preview pane beside the picker (@markgustetic)
- 5e491f5: feat(tui): focused-field box + blink for password/restore/sync forms (@markgustetic)
- 3fb6ac4: feat(tui): focused-field box + blink for the policies add form (@markgustetic)
- c7eaddc: feat(tui): focused-field box + cursor blink for single-field views (@markgustetic)
- 2e56989: feat(tui): previewView renders the backup picker pane (@markgustetic)
- 4ef2577: feat(tui): readPreview — pane data for the backup picker preview (@markgustetic)
- e0f6479: feat(tui): setup done screen reports the backup user or its warning (@markgustetic)
- 2bb73a6: feat(tui): setup wizard offers the dedicated backup user with a profile input (@markgustetic)
- c42fa53: feat(tui): views focus their stage's field on viewShownMsg and blur it on viewHiddenMsg (@markgustetic)
- bfe1d6a: feat(tui): width-bounded picker lines; truncateToWidthLeft keeps a path's leaf (@markgustetic)
- e7ab572: feat(ui): FieldBox style + shared focus-affordance test helpers (@markgustetic)
Bug fixes
- 9250fc2: fix(prune): apply-mode reclaims orphans even when retention drops nothing (@markgustetic)
- f34de13: fix(setup): IAM policy — drop unsatisfiable s3:prefix condition, use real encryption action names (@markgustetic)
- b19359b: fix(tui): backtracking after backup-user adoption rebuilds the adopted plan (@markgustetic)
- f5d4042: fix(tui): backup preview — root header, wide-pane cap, symlink test hardening (@markgustetic)
- 21492ff: fix(tui): backup — notice line and tag field respect the interior width (@markgustetic)
- ee1f387: fix(tui): blur a text field on every exit from its stage, re-focus on the way back (@markgustetic)
- ecc2b42: fix(tui): blur recoverykit's savePath on every exit from the save stage (@markgustetic)
- 9a5f4c3: fix(tui): bound lines to interior width to prevent panel wrapping (@markgustetic)
- 39ef5a3: fix(tui): clip overflow indicator; extend test to cover all widths (@markgustetic)
- 174ea15: fix(tui): deliver blink ticks simultaneously, not by precedence (@markgustetic)
- 63e905e: fix(tui): don't inline a mutating Focus() into a return statement (@markgustetic)
- fdb07a3: fix(tui): jobs — replace-via-add resyncs the OS timer; re-port lost form tests (@markgustetic)
- 029fbec: fix(tui): previewView — airtight width bound and strengthened test (@markgustetic)
- 99d1835: fix(tui): prune view offers a GC-only run when retention drops nothing (@markgustetic)
- ae0a61b: fix(tui): re-Focus the palette/chat field on open, don't replay a cached cmd (@markgustetic)
- 47415ae: fix(tui): recognize textinput.Blink bootstrap sentinel in assertBlinkCmd (@markgustetic)
- 435dab8: fix(tui): setup retry keeps the verified backup-user profile instead of re-provisioning (@markgustetic)
- c4f8905: fix(tui): shorten copy to fit interior width naturally at 80-col minimum (@markgustetic)
- 96a7f24: fix(tui): start blinks from Focus()'s own cmd, not textinput.Blink (@markgustetic)
- 603b7d7: fix(tui): the shell hides the outgoing view, shows the launch view, and delivers blink ticks to the screen only (@markgustetic)
- f1d6159: fix(tui): wire palette/modal blink into real App dispatch (@markgustetic)
Refactoring
- 4b61561: refactor(tui): every focused-field box comes from boxedField, so it follows Focused() not the stage (@markgustetic)
- 5705d62: refactor(tui): return goBack's pair directly (@markgustetic)
- b8366ca: refactor(tui): unlock, password and sync construct blurred; the shell's show is the only focus source (@markgustetic)
Documentation
- 285b422: docs(plan): Task 3 reuses diag's AWS config loader instead of duplicating it (@markgustetic)
- c5b335c: docs(plan): dedicated backup user provisioning implementation plan (@markgustetic)
- e05b335: docs(spec): dedicated backup user provisioning in the setup wizard (@markgustetic)
- 7fdeb07: docs(spec): profile row hidden when toggle off; secret guarantee stated precisely (@markgustetic)
- 5d6013b: docs(tui): correct two rationales the fix wave got wrong (@markgustetic)
- 86cf483: docs(tui): correct why simultaneous blink delivery is safe; take broadcast's model (@markgustetic)
- d34de3e: docs(tui): drop the last references to construction-focused views (@markgustetic)
- 90f33b9: docs(tui): record the focus-follows-the-screen contract (@markgustetic)
- 092b1c4: docs(ui): state the real reason framing a styled field is safe (@markgustetic)
- c5f01ac: docs: dedicated backup user in the setup contract, README, and quickstart (@markgustetic)
- 33bcf70: docs: one bucket per account via the wizard — inline policy is replaced on rerun (@markgustetic)
- 8e47af3: docs: plan — backup picker preview pane (6 TDD tasks) (@markgustetic)
- 3812ce2: docs: record the single-use blink cmd and the real delivery invariant (@markgustetic)
- 3532c82: docs: settings screenshot and alt text for the scheduled-backups row (@markgustetic)
- f8caa92: docs: spec — backup picker cursor-following file preview pane (@markgustetic)
Other
- 1ca2dcb: Merge origin/main (settings screenshot + alt text) (@markgustetic)
- 529ff19: Merge origin/main into worktree-field-focus (@markgustetic)
- de1d31c: Merge remote-tracking branch 'origin/dependabot/github_actions/actions-65ce2e7c2d' (@markgustetic)
- 4afe896: Merge remote-tracking branch 'origin/dependabot/go_modules/go-deps-minor-e99e8ab37e' (@markgustetic)
- c3a108e: chore(lint): exclude gosec G101 in tests — fixtures are AWS example keys (@markgustetic)
- 38e4862: ci(dependabot): ignore Charm's untagged nested modules it cannot resolve (@markgustetic)
- 0f16810: ci(deps): bump anchore/sbom-action/download-syft in the actions group (@dependabot[bot])
- 7a9fa89: ci(release): homebrew templates tolerate an unset HOMEBREW_TAP_TOKEN (@markgustetic)
- f7a679c: deps(deps): bump github.com/testcontainers/testcontainers-go/modules/minio (@dependabot[bot])
- d5ea441: style(setup): gofmt fakeEffects field alignment after adding provisionBackupUser (@markgustetic)
- 76e70be: test(setup): assert the exact canonical policy, user, and policy name are attached (@markgustetic)
- f58c62c: test(setup): drop the redundant interface annotation flagged by staticcheck ST1023 (@markgustetic)
- 0a9a635: test(setup): mark the deliberately permissive fixture mode for gosec (@markgustetic)
- 577b8bc: test(setup): opt-in live provisioning check behind the live build tag (@markgustetic)
- b127181: test(tui): profile refusal test asserts the notice, not the stage text (@...
v0.3.0
sentra v0.3.0
Encrypted, deduplicated, agent-aware backups for S3 and S3-compatible
storage. See the README and
QUICKSTART
to get started.
Changelog
Features
- ad5f92d: feat(cli): schedule status prints next run; policy remove cleans up timer files (@markgustetic)
- fb99a60: feat(policy): NextRun computes the next wall-clock fire for a schedule (@markgustetic)
- 146fc73: feat(tui): JobsView list stage — cadence, timer state, next and last run (@markgustetic)
- 3c0b8ac: feat(tui): delete a job removes the policy and its timer in one confirmed step (@markgustetic)
- 32a9e08: feat(tui): jobs add/edit form — prefill, read-only name, timer resync on save (@markgustetic)
- cb3ab67: feat(tui): jobs drill-in — newest snapshot tree per path with placeholder (@markgustetic)
- ea35d12: feat(tui): jobs row helpers — path normalization, tag match, last-run resolution (@markgustetic)
- 6135146: feat(tui): jobs timer install/uninstall and run-now behind the existing gates (@markgustetic)
Bug fixes
- 14192cb: fix(tui): jobs detail — clear ghost page on delete, guard stale loads by snapID (@markgustetic)
- 75e0be4: fix(tui): jobs — port two more coverage gaps, comment cleanup (@markgustetic)
- 3097f7e: fix(tui): jobs — tab reaches detail path-cycling; summary shows tags/prune (@markgustetic)
Documentation
- bd78ee1: docs(tui): jobs_form.go — errPolicyExists comment no longer claims PoliciesView sharing (@markgustetic)
- 8642067: docs: implementation plan for the scheduled-backups (jobs) view (@markgustetic)
- 0d2f21b: docs: record sentra mcp and the chat overlay in the agent contracts (@markgustetic)
- 9ff8c70: docs: scheduled-backups view replaces policies/schedule in the launcher docs (@markgustetic)
- 0126e8f: docs: spec for the scheduled-backups (jobs) view (@markgustetic)
Other
- 530bf52: feat(tui)!: jobs view replaces the policies and schedule views (@markgustetic)
Container image: ghcr.io/markgustetic/sentra:0.3.0
Homebrew: brew install markgustetic/tap/sentra
v0.2.0
sentra v0.2.0
Encrypted, deduplicated, agent-aware backups for S3 and S3-compatible
storage. See the README and
QUICKSTART
to get started.
Changelog
Features
- b8f725d: feat(cli): sentra mcp — serve the repository to MCP clients (@markgustetic)
- fe5b7f7: feat(tui): assistant chat overlay (ctrl+a) (@markgustetic)
Documentation
- 287b1ad: docs: specs for MCP server mode and the TUI chat overlay (@markgustetic)
Container image: ghcr.io/markgustetic/sentra:0.2.0
Homebrew: brew install markgustetic/tap/sentra
v0.1.0
sentra v0.1.0
Encrypted, deduplicated, agent-aware backups for S3 and S3-compatible
storage. See the README and
QUICKSTART
to get started.
Changelog
Features
- 6bac1cc: feat(agent): orchestrator stitches heuristics + tools + LLM (Mark Gustetic mark.gustetic@gmail.com)
- f74d18c: feat(blobstore): define Store interface (Mark Gustetic mark.gustetic@gmail.com)
- f336cc1: feat(blobstore): in-memory implementation (Mark Gustetic mark.gustetic@gmail.com)
- a508da6: feat(blobstore): s3 implementation skeleton (Mark Gustetic mark.gustetic@gmail.com)
- 8006577: feat(chunker): fastcdc with sha256 hashing (Mark Gustetic mark.gustetic@gmail.com)
- 7c15641: feat(chunker): zstd compress/decompress (Mark Gustetic mark.gustetic@gmail.com)
- ce18278: feat(cli): --json on backup, restore, prune, sync, and doctor (Mark Gustetic mark.gustetic@gmail.com)
- da896b6: feat(cli):
sentra local --webopens the browser UI against MinIO (Mark Gustetic mark.gustetic@gmail.com) - f0cebd5: feat(cli):
sentra passwd— rotate the wrapping passphrase (Mark Gustetic mark.gustetic@gmail.com) - e1bac71: feat(cli):
sentra sync— replicate repo to a clone destination (Mark Gustetic mark.gustetic@gmail.com) - 0c0098c: feat(cli): add NewLocal for the local-MinIO dev flow (Mark Gustetic mark.gustetic@gmail.com)
- 29e9f3b: feat(cli): add UIDeps.SetupSeedConfig to pre-fill first-run wizard (Mark Gustetic mark.gustetic@gmail.com)
- e87c755: feat(cli): agent scan command with --apply and --json (Mark Gustetic mark.gustetic@gmail.com)
- e39704f: feat(cli): backup command with progress UI (Mark Gustetic mark.gustetic@gmail.com)
- df32d9b: feat(cli): bare sentra / sentra ui discover the home config from anywhere (Mark Gustetic mark.gustetic@gmail.com)
- 1b847c6: feat(cli): cobra root with version flag (Mark Gustetic mark.gustetic@gmail.com)
- 50dfeaf: feat(cli): diff command and repo.Diff helper (Mark Gustetic mark.gustetic@gmail.com)
- d9971ba: feat(cli): init command with sentra.yaml + repo bootstrap (Mark Gustetic mark.gustetic@gmail.com)
- 069c2e9: feat(cli): prune command with retention + GC (Mark Gustetic mark.gustetic@gmail.com)
- 65a6249: feat(cli): resolve --config through discovery in every run body (Mark Gustetic mark.gustetic@gmail.com)
- 4c07373: feat(cli): resolveConfigPath applies discovery to unchanged --config defaults (Mark Gustetic mark.gustetic@gmail.com)
- 20f7879: feat(cli): restore command (Mark Gustetic mark.gustetic@gmail.com)
- 00bde41: feat(cli): route launch repo-open failures to the TUI connect gate (Mark Gustetic mark.gustetic@gmail.com)
- 8793026: feat(cli): route sentra ui to first-run wizard or unlock gate (Mark Gustetic mark.gustetic@gmail.com)
- 58a899b: feat(cli): sentra ls — list a snapshot's tree (Mark Gustetic mark.gustetic@gmail.com)
- 6c2b621: feat(cli): snapshots command with table and json output (Mark Gustetic mark.gustetic@gmail.com)
- 4cddf41: feat(cli): thread build identity and ui.hide_splash into the TUI (Mark Gustetic mark.gustetic@gmail.com)
- b5cb448: feat(cli): thread store/actions/keyring/config-path into tui.Deps (Mark Gustetic mark.gustetic@gmail.com)
- ed21b87: feat(cli): ui command and default-on-no-args (Mark Gustetic mark.gustetic@gmail.com)
- 37a4439: feat(cli): wire passphrase resolver into all commands (Mark Gustetic mark.gustetic@gmail.com)
- 77539f1: feat(cmd): register
sentra localwith a production MinIO probe (Mark Gustetic mark.gustetic@gmail.com) - c89ecc7: feat(config): DiscoverPath resolves cwd sentra.yaml, else XDG home fallback (Mark Gustetic mark.gustetic@gmail.com)
- 15b6932: feat(config): Write creates missing parent dirs for the home config path (Mark Gustetic mark.gustetic@gmail.com)
- 71049f4: feat(config): add ui.hide_splash setting (Mark Gustetic mark.gustetic@gmail.com)
- 31adbed: feat(config): koanf-based loader with env overlay (Mark Gustetic mark.gustetic@gmail.com)
- 8717e4e: feat(config): passphrase resolver with documented priority (Mark Gustetic mark.gustetic@gmail.com)
- b69611f: feat(crypto): aes-256-gcm seal/open with versioned blob format (Mark Gustetic mark.gustetic@gmail.com)
- 2efb118: feat(crypto): argon2id key derivation (Mark Gustetic mark.gustetic@gmail.com)
- d2d2119: feat(crypto): random salt and repo key generators (Mark Gustetic mark.gustetic@gmail.com)
- 958e4cf: feat(crypto): validate KDFParams sanity bounds (Mark Gustetic mark.gustetic@gmail.com)
- 4cca559: feat(diag): extract read-only AWS + bucket-name diagnostics into internal/diag (Mark Gustetic mark.gustetic@gmail.com)
- 3f11dd7: feat(doctor): print the resolved config path (Mark Gustetic mark.gustetic@gmail.com)
- 02670e4: feat(repo): capture symlinks and directories in snapshots (manifest v2) (Mark Gustetic mark.gustetic@gmail.com)
- 84c278d: feat(repo): create and load snapshots with chunk-level dedup (Mark Gustetic mark.gustetic@gmail.com)
- accab2e: feat(repo): garbage collect unreferenced blobs (Mark Gustetic mark.gustetic@gmail.com)
- 4760d5e: feat(repo): group retention by source root (Mark Gustetic mark.gustetic@gmail.com)
- 2a7a17e: feat(repo): incremental scan — reuse parent chunks for unchanged files (Mark Gustetic mark.gustetic@gmail.com)
- ef975a4: feat(repo): init and open with encrypted config (Mark Gustetic mark.gustetic@gmail.com)
- 46c2724: feat(repo): list snapshots newest-first (Mark Gustetic mark.gustetic@gmail.com)
- 2e21428: feat(repo): manifest types (Mark Gustetic mark.gustetic@gmail.com)
- 907355d: feat(repo): plumb ProgressReporter through CreateSnapshot and Restore (Mark Gustetic mark.gustetic@gmail.com)
- 3b57c58: feat(repo): restore snapshots (Mark Gustetic mark.gustetic@gmail.com)
- b5ce83a: feat(repo): retention policy planner (Mark Gustetic mark.gustetic@gmail.com)
- 4350421: feat(scheduler): add Install/Installed/Uninstall filesystem helpers (Mark Gustetic mark.gustetic@gmail.com)
- f03d8a4: feat(setup): add Effects seam + DefaultEffects; move DefaultAWSPrepare and AWS-CLI drivers into internal/setup (Mark Gustetic mark.gustetic@gmail.com)
- e879790: feat(setup): add Engine.InitRepo preserving the verify-before-keyring guard (Mark Gustetic mark.gustetic@gmail.com)
- e2b066a: feat(setup): add Engine.PrepareAWS — headless AWS auth + bucket-prep sequence (Mark Gustetic mark.gustetic@gmail.com)
- 254f389: feat(setup): add Engine.WriteConfig + draft persistence (WriteDraft/RemoveDraft/DraftPath) (Mark Gustetic mark.gustetic@gmail.com)
- 21b3852: feat(setup): add EnvProbe seam over env + ~/.aws/config (Mark Gustetic mark.gustetic@gmail.com)
- 66d4e29: feat(setup): infer S3-compatible backend from endpoint_url + env creds (Mark Gustetic mark.gustetic@gmail.com)
- a575eb9: feat(tui): Files view — snapshot directory tree as a box-and-arrows topology (Mark Gustetic mark.gustetic@gmail.com)
- ef577d4: feat(tui): Policies view ADD inline form (config-only, validated, confirm-gated) (Mark Gustetic mark.gustetic@gmail.com)
- c175f4f: feat(tui): Policies view REMOVE action (config-only, confirm-gated) (Mark Gustetic mark.gustetic@gmail.com)
- 9aced51: feat(tui): Policies view RUN action (op-guarded snapshot + check + retention prune) (Mark Gustetic mark.gustetic@gmail.com)
- 6ffe34d: feat(tui): add ConfigPath/NewStore/Actions/SaveKeyringPassphrase to Deps (Mark Gustetic mark.gustetic@gmail.com)
- e0a6b41: feat(tui): add PasswordView for repo passphrase rotation (Mark Gustetic mark.gustetic@gmail.com)
- 0a1f0fd: feat(tui): add SettingsView with config summary and re-entry launchers (Mark Gustetic mark.gustetic@gmail.com)
- 659c327...