You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: flip the 2.5.0 DRAFT sections live and correct the versioning story (#225)
Pass 2 of the 2.5.0 docs refresh (pass 1 was #209, which left DRAFT
blocks
commented out for features still in flight). Everything in those blocks
has
now merged, so this flips them live - verified against the merged code,
not
restated from PR descriptions.
## What flipped from DRAFT to live
- **README.md** Features list + **site-landing/index.html** feature
grid:
S3-compatible backend (#207), local/removable-folder backend (#212),
scheduled integrity scrub (#203), rclone config importer (#213). Guided
macOS Full Disk Access onboarding (#216) gets its landing-page card (it
was already live in README prose from an earlier pass).
- **Restore drill (#215) stays commented out**: the core engine landed
but
the PR is DRAFT/unmerged with no UI surface a user can click yet.
## Corrections to reality, not just restated PR text
- **Footnote 6** no longer says "Google Drive is Driven's only backend
today" - flagged stale by two prior agents and left for this pass.
- **Versioning does not work on S3 or local-folder destinations** (issue
#220): a versioned change forces the create path, and both backends
derive a deterministic remote key, so the re-upload overwrites the
previous bytes. Nothing on `main` currently gates the per-source
versioning toggle to prevent turning it on there (verified in
`SourceTable.vue` and `executor.rs`); a fix is open in PR #224 but
unmerged as of this writing. The comparison table drops "point-in-time
restore" to partial for Driven with a footnote, and the docs now say
exactly what the in-app copy already says instead of promising more.
- **The integrity scrub's checksum coverage is backend-dependent**, not
uniform: full on Drive and `driven-localfs` (which always re-hashes its
own committed bytes), but size-only for an S3 object uploaded via
multipart, because S3's ETag for one is a digest of part digests, not a
plain content digest (`driven-s3`'s own `metadata()` doc comment says as
much). The scrub's `classify()` correctly reports these as
`Unverifiable` rather than a false pass - the docs now say so too,
instead of implying uniform checksum verification.
- **APFS snapshots are not a Full Disk Access substitute**, restated
everywhere the feature is described (they were already careful about
this pre-existing README prose; carried the same discipline into the
ROADMAP/DESIGN updates).
- Dropped a false "no code change needed to add the next backend" claim
and an unconditional "Driven uses your own Google OAuth credentials"
line that doesn't hold for the two non-OAuth backends.
- Added a compact "Local / removable-folder caveats" note: no trash,
FAT32's 4 GiB per-file ceiling (fatal, with a clear message), and
Windows' classic 260-character path limit being a real, still-open
caveat (`driven-localfs` has no `\\?\` long-path prefixing yet - per
PR #212's own "not verified / known caveats" section).
## design/ROADMAP.md and design/DESIGN.md
- ROADMAP's "Beyond V1" section is checked off for everything that
shipped, including two things that were previously false even after
the code landed: the APFS broker being wired into `driven-vss`'s
`map_for_volume` seam (confirmed at the actual `assembly::build_vss`
macOS call site, not just crate-doc claims - this exact class of gap is
what pass 1 caught before), and the FDA onboarding UI existing.
- DESIGN.md's crate table (s4.2) and non-goals (s2) now describe three
destinations (`driven-drive`, `driven-s3`, `driven-localfs`) behind the
`driven-remote::RemoteStore` trait plus the `driven-backend` factory,
instead of Drive plus "maybe someday." The point-in-time-versioning
section (s5.5.1) gets a note explaining why its Drive-trash-based
design does not carry over to a backend with a deterministic key.
## Verification
Every claim above was checked against the actual code on `main`
(`crates/driven-s3`, `crates/driven-localfs`, `crates/driven-rclone`,
`crates/driven-remote`, `crates/driven-apfs`, `crates/driven-vss`,
`crates/driven-core/src/scrub.rs`, `ui/src/components/SourceTable.vue`,
`ui/src/locales/en-US.json`, `src-tauri/src/assembly.rs`), not restated
from PR descriptions. `git diff --check` is clean and the diff
introduces
no em/en-dashes or other non-ASCII beyond the file's existing
superscript
footnote / `§` conventions.
CHANGELOG.md and version numbers are untouched (release-please's
territory).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01Qu8GxMwkuxF7JBzwRjtcw7
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+59-16Lines changed: 59 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,9 +12,10 @@ ever leave it, so Google stores only ciphertext.
12
12
13
13

14
14
15
-
Driven uses your own Google OAuth credentials, so your files never pass through
16
-
anyone else's servers. The first-run wizard includes a step-by-step, plain-English
17
-
guide to creating that credential in the Google Cloud Console:
15
+
When backing up to Google Drive, Driven uses your own OAuth credentials, so
16
+
your files never pass through anyone else's servers. The first-run wizard
17
+
includes a step-by-step, plain-English guide to creating that credential in
18
+
the Google Cloud Console:
18
19
19
20

20
21
@@ -25,7 +26,8 @@ backup to a cloud you already own, plus laptop-friendly touches - gitignore-awar
25
26
excludes, battery and metered-network awareness, and backup work that runs below
26
27
normal CPU and disk priority so it does not fight whatever you are actually using
27
28
the machine for - that CLI backup tools and consumer sync clients skip. Where it
28
-
is thinner today (more backends, block-level dedup) is marked honestly below.
29
+
is thinner today (block-level dedup, breadth of backends versus rclone's dozens)
30
+
is marked honestly below.
29
31
30
32
Legend: :white_check_mark: yes :large_orange_diamond: partial (see note) :x: no :grey_question: not documented
| OS-level CPU / disk I/O priority for backup work |:white_check_mark:²⁴ |:x:²⁵ |:x:²⁵ |:x:²⁵ |:x:²⁵ |:x:²⁵ |
@@ -64,7 +66,7 @@ Notes:
64
66
- ³ rclone, restic, and Duplicati back up on a schedule (cron / systemd / built-in scheduler), not from a live file-change watcher.
65
67
- ⁴ rclone resumes at file granularity on re-run; mid-file resume of a large object depends on the backend.
66
68
- ⁵ Backblaze Personal Backup targets Backblaze's own cloud, not storage you supply.
67
-
- ⁶ Google Drive is Driven's only backend today; additional backends and block-level dedup are on the post-v1 backlog ([issue #34](https://github.com/pmaxhogan/driven/issues/34)), not shipped.
69
+
- ⁶ Block-level deduplication is on the post-v1 backlog ([issue #34](https://github.com/pmaxhogan/driven/issues/34)), not shipped.
68
70
- ⁷ Drive uses server-side encryption; client-side encryption exists only for eligible Google Workspace accounts an admin configures, not consumer accounts.
69
71
- ⁸ Backblaze defaults to provider-managed keys; a user-set private key is optional, and its passphrase is entered on Backblaze's servers during a web restore.
70
72
- ⁹ These tools protect the key with a passphrase you must remember; only Driven generates a BIP39 recovery phrase you can write down to recover the key.
@@ -101,6 +103,8 @@ Notes:
101
103
- ⁴⁰ The others publish unit-test microbenchmarks, internal tuning harnesses (Duplicati's unreleased AutoTune), or vendor marketing numbers, rather than a runnable end-to-end suite. Backblaze does publish a quarterly benchmark, but of B2 object storage rather than the backup client.
102
104
- ⁴¹ Driven's checkmark is scoped to Windows, where a VSS snapshot lets a locked file (Outlook PST, running DB, VM disk) back up while it is held open. macOS has an equivalent behind an opt-in setting (Settings > Rules): a small privileged helper mounts a read-only APFS local snapshot so a *busy* file can be read: it is off by default, and it does nothing for a Full Disk Access denial. On both macOS and Linux, a file Driven cannot open is in any case classified precisely as a transient lock (`local.file_locked`) versus a macOS Full Disk Access denial (`local.permission_denied`) and skipped with a clear reason in the activity log, rather than misreported as a disk error. Linux has no snapshot equivalent and none is planned. See `design/DESIGN.md` §5.3 and §5.3.2.
103
105
- ⁴² Driven's checkmark is scoped to the Google Drive destination. Keeping previous versions relies on a changed file's re-upload landing on a NEW remote object, which is true of a Drive create but not of a destination whose object key is derived from the file name: on S3-compatible stores and local folders the re-upload overwrites the previous copy. Driven therefore does not offer per-source versioning or a restore-by-date on those destinations at all, rather than reporting a point-in-time restore it cannot perform. For recoverability on S3, enable the provider's own bucket versioning. See [issue #220](https://github.com/pmaxhogan/driven/issues/220).
106
+
- ⁴³ Google Drive (the original destination), any S3-compatible object store (AWS S3, Cloudflare R2, MinIO, Backblaze B2 in S3-compatible mode, Wasabi), and a local or removable folder (USB drive, external disk, NAS share) - all behind one `RemoteStore` trait, shipped in v2.5.0. OneDrive and other non-S3-compatible cloud APIs are not implemented.
107
+
- ⁴⁴ Driven runs three independent periodic checks, not one: a weekly local re-hash (deep-verify) that catches local bit-rot, a startup / deep-verify remote-existence audit that catches an object deleted at the destination outside Driven, and, added in v2.5.0, a weekly rolling integrity scrub that re-checks each already-backed-up object's size against the destination and, where the destination can supply one, its content checksum too - catching remote-side corruption or tampering that neither of the other two checks can see. On by default; a source's population is swept in bounded slices (500 objects per run by default) rather than all at once. Checksum coverage depends on the destination: full on Google Drive and on a local-folder destination (which always re-hashes the bytes it just wrote); size-only for an S3 object uploaded via multipart, because S3 stores no plain content digest for one, only an ETag that digests the individual parts - the scrub reports those as unverifiable rather than guessing, never as falsely clean.
104
108
105
109
Competitor rows were verified in July 2026 against rclone 1.74.4, restic 0.19.1,
106
110
Duplicati 2.3.0.4, Backblaze Personal Backup 10.0.2, and Drive for desktop 128.0.
@@ -143,20 +147,30 @@ These move: check each project's current docs before relying on a cell.
143
147
- Guided Full Disk Access onboarding for macOS: when macOS privacy protection
144
148
blocks a file, Driven says so and offers a one-click jump to the right
145
149
System Settings pane instead of leaving you to find it.
150
+
- Choice of backup destination: Google Drive, any S3-compatible object store
|`driven-core`| Pure logic. Sync state machine, scanner, planner, exclusion rules, scheduler, activity log writer, pacer, retry/backoff. **No I/O except via injected traits.**|
245
-
|`driven-drive`|`RemoteStore` trait + Google Drive implementation + `InMemoryRemoteStore` fake. Owns OAuth flow and refresh-token storage. |
246
-
|`driven-crypto`| Authenticated encryption format. Filename encryption, chunked file encryption, key wrapping via OS keychain. |
251
+
|`driven-remote`| The `RemoteStore` trait itself, plus `BackendKind` (the destination taxonomy: `GoogleDrive` / `S3` / `LocalFolder`), shared retry policy, and the remote-side error taxonomy. Backend-agnostic - depends on none of the concrete implementations below. |
252
+
|`driven-drive`| Google Drive implementation of `RemoteStore` + `InMemoryRemoteStore` fake (used by every backend's contract tests, not just Drive's). Owns the Drive OAuth flow and refresh-token storage. |
253
+
|`driven-s3`| S3-compatible implementation of `RemoteStore` (AWS S3, Cloudflare R2, MinIO, Backblaze B2 in S3-compatible mode, Wasabi), authenticated with a directly-entered access key pair. |
254
+
|`driven-localfs`| Local/removable-folder implementation of `RemoteStore`: a plain directory tree, with a destination-identity marker file so an unmounted removable drive is never mistaken for an empty one. Needs no credential. |
255
+
|`driven-backend`| The factory: turns an account's persisted `BackendKind` + config into the `Arc<dyn RemoteStore>` the sync engine, destination picker, and restore path all run against. The one place a new backend gets wired up. |
256
+
|`driven-rclone`| CLI-only: reads an existing `rclone.conf` and classifies each remote into what Driven can make of it (`s3` / `drive` / unsupported). Translate-only - it never creates an account or talks to a network API itself. |
257
+
|`driven-crypto`| Authenticated encryption format. Filename encryption, chunked file encryption, key wrapping via OS keychain. Applied above the `RemoteStore` seam, so it works identically regardless of which backend a source targets. |
247
258
|`driven-power`| Battery + AC + metered-network detection, normalized across Windows / macOS / Linux. |
0 commit comments