Skip to content

Commit e669d57

Browse files
pmaxhoganclaude
andauthored
docs: refresh the comparison table for the 2.4.0 feature set (#180)
Six new rows in "How Driven compares" for what landed since v2.3.0, plus a re-verification of every competitor cell I touched against current upstream docs. Docs-only; no code or `site-landing/` changes (the landing page has no mirror of this table). ## Rows added | Row | Why | | --- | --- | | Re-uploads backup copies deleted at the destination | #171 (audit) + #168 (live self-heal) | | Parallel, multi-threaded local scan | #169 | | OS-level CPU / disk I/O priority for backup work | #170, #173, #176, #179 | | Live preview of which files a rule keeps or drops | #172, #177 | | Rolling local logs plus a one-click diagnostics bundle | #167 | | Reproducible end-to-end benchmark suite in the repo | #178 | Also: a `:grey_question:` legend entry ("not documented"), so a closed-source client whose behaviour Google or Backblaze simply does not publish is marked honestly instead of being guessed at; the intro paragraph now mentions the priority work; the Features list gains the parallel scanner, the preview, the priority setting, the remote audit, and rolling logs; and `just bench` is in the recipe list with a pointer to `bench/README.md`. ## On the benchmark numbers I deliberately quoted **no** upload throughput from #178. That was a 16 MiB / 300-file smoke run - a pipeline proof, not a verdict - and a headline MiB/s from it would not survive scrutiny. The two numbers that did make it in are locally measured and honest at their scale: the exclusion-preview re-classification (536 ms cached vs 868 ms fresh walk on a 63k-entry tree, from #177) and the scan thread clamp. The bench suite appears as a row on its own merits, with the caveats left in `bench/README.md`. ## Competitor claims and where each was verified Versions checked: rclone 1.74.4, restic 0.19.1, Duplicati 2.3.0.4, Backblaze Personal Backup 10.0.2, Drive for desktop 128.0. **CPU / I/O priority - nobody else has it.** rclone has no priority code and closed both requests pointing at `ionice` (rclone/rclone#864). restic's FAQ answers "How to prioritize restic's IO and CPU time" entirely with `ionice`/`nice` recipes (https://restic.readthedocs.io/en/stable/faq.html). Duplicati still accepts `--thread-priority` but the shipping string is "has no effect, use the operating system controls to set the process priority" (`Duplicati/Library/Main/Options.cs` at the `v2.3.0.4_stable_2026-07-09` tag) - note its published docs page still lists the old text with no deprecation notice, so I cited the source, not the doc. Drive for desktop's entire preference surface is bandwidth rate limits plus pause (https://support.google.com/drive/answer/13470231), with no priority key in the admin policy list. Backblaze offers an automatic/manual bandwidth throttle and an upload-thread count (https://www.backblaze.com/computer-backup/docs/configure-performance-settings-windows). Bandwidth limiting is not I/O priority and the note says so. **Parallel scan.** rclone walks at `--checkers` (8) and transfers at `--transfers` (4) (https://rclone.org/docs/). Duplicati's `FileEnumerationProcess` is a single serial task with the concurrency downstream of it, so its walk is a genuine `:x:` (source at the stable tag). restic reads at `--read-concurrency`, default 2 (https://restic.readthedocs.io/en/stable/manual_rest.html). Google and Backblaze document nothing about scan concurrency - hence the new "not documented" marker rather than a guessed `:x:`. **Destination-side deletion.** rclone gets a `:white_check_mark:` here, not an `:x:`: it keeps no state, so `copy`/`sync` re-list the destination every run and re-transfer anything missing (https://rclone.org/commands/rclone_sync/). The note says so plainly, including that this is why it is slower on the incremental case. Drive for desktop is the one that is worse than absent - "any files you put in the trash are put in the trash everywhere" (https://support.google.com/drive/answer/2375102). Duplicati and restic detect damage but recovery is operator-driven (Duplicati's `RepairHandler.cs` refuses missing dblock files without `--rebuild-missing-dblock-files`; restic's troubleshooting doc says re-run `backup` to heal, https://restic.readthedocs.io/en/stable/077_troubleshooting.html). Backblaze documents nothing either way, so it is marked not-documented rather than `:x:`. **Live rule preview - and one claim I had to walk back.** Duplicati shipped server-evaluated inclusion state in its tree UI in 2.3.0.4 on 2026-07-09 (duplicati/duplicati#6955, closing a six-year-old request, duplicati/duplicati#4194). Six weeks ago "nobody else has this" would have been true; it is not any more, so Duplicati gets a `:white_check_mark:` and the note records the remaining difference (it marks the nodes you expand, with no whole-source counts). rclone and restic are `--dry-run` only. **Logs and diagnostics.** Driven is not unique here and the row shows that: Drive for desktop and Backblaze both get `:white_check_mark:` (https://knowledge.workspace.google.com/admin/drive/capture-google-drive-for-desktop-logs-for-support, https://www.backblaze.com/computer-backup/docs/send-logs-to-backblaze-windows). Duplicati is partial - its "Create bug report" bundle is real, but file logging is opt-in, warnings-only by default, and unrotated. restic has no log-file option at all. **Benchmark suite.** Negative evidence for all five (repo tree listings plus code search); the note names Duplicati's unreleased AutoTune harness and Backblaze's B2-not-client benchmark rather than pretending there is nothing adjacent. No existing rows were removed and none had become false. The trailing line now names the exact versions checked instead of just the month. ## Checks - 40 notes, sequential, every table marker resolves to one and every note is cited (validated by script). - All 27 table rows have 7 cells. - Zero em/en dashes or other dash-like non-ASCII; only the superscript digits the file already used. `git ls-files --eol` reports `w/lf`. - README is not covered by prettier or any markdown linter in CI (prettier runs against `ui/src` only), so there is no formatting gate to run. - `deploy-landing.yml`'s `TAGLINE_MARKER` is the README's first line, which is untouched. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JLB3E2Jm7knNJd37fVpH8X Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 85f6d6a commit e669d57

1 file changed

Lines changed: 65 additions & 20 deletions

File tree

README.md

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ guide to creating that credential in the Google Cloud Console:
2121
## How Driven compares
2222

2323
Driven is a native desktop app that pairs end-to-end encryption with one-way
24-
backup to a cloud you already own, plus laptop-friendly touches (gitignore-aware
25-
excludes, battery and metered-network awareness) that CLI backup tools and
26-
consumer sync clients skip. Where it is thinner today (more backends,
27-
block-level dedup) is marked honestly below.
24+
backup to a cloud you already own, plus laptop-friendly touches - gitignore-aware
25+
excludes, battery and metered-network awareness, and backup work that runs below
26+
normal CPU and disk priority so it does not fight whatever you are actually using
27+
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.
2829

29-
Legend: :white_check_mark: yes &nbsp; :large_orange_diamond: partial (see note) &nbsp; :x: no
30+
Legend: :white_check_mark: yes &nbsp; :large_orange_diamond: partial (see note) &nbsp; :x: no &nbsp; :grey_question: not documented
3031

3132
| Capability | Driven | rclone | Drive for desktop | Duplicati | restic | Backblaze |
3233
| --- | :---: | :---: | :---: | :---: | :---: | :---: |
@@ -43,12 +44,18 @@ Legend: :white_check_mark: yes &nbsp; :large_orange_diamond: partial (see note)
4344
| Block-level deduplication | :x:| :x: | :x: | :white_check_mark: | :white_check_mark: | :x: |
4445
| Locked / open-file backup (Windows VSS) | :white_check_mark: | :x: | :large_orange_diamond:¹² | :white_check_mark: | :white_check_mark: | :white_check_mark: |
4546
| Periodic integrity re-verification | :white_check_mark: | :large_orange_diamond:¹³ | :x: | :white_check_mark: | :large_orange_diamond:¹³ | :large_orange_diamond:¹³ |
46-
| Automatic battery / metered-network / sleep awareness | :white_check_mark: | :x: | :x: | :x: | :x: | :x:¹⁴ |
47-
| Per-source include/exclude incl. .gitignore | :white_check_mark: | :large_orange_diamond:¹⁵ | :x: | :large_orange_diamond:¹⁵ | :large_orange_diamond:¹⁵ | :large_orange_diamond:¹⁵ |
48-
| Native desktop GUI app | :white_check_mark: | :x:¹⁶ | :white_check_mark: | :large_orange_diamond:¹⁷ | :x:¹⁶ | :white_check_mark: |
49-
| In-app file search + selective restore | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :large_orange_diamond:¹⁸ | :white_check_mark: |
47+
| Re-uploads backup copies deleted at the destination | :white_check_mark:¹⁴ | :white_check_mark:¹⁵ | :x:¹⁶ | :large_orange_diamond:¹⁷ | :large_orange_diamond:¹⁷ | :grey_question:¹⁸ |
48+
| Parallel, multi-threaded local scan | :white_check_mark:¹⁹ | :white_check_mark:²⁰ | :grey_question:²¹ | :x:²² | :large_orange_diamond:²³ | :grey_question:²¹ |
49+
| OS-level CPU / disk I/O priority for backup work | :white_check_mark:²⁴ | :x:²⁵ | :x:²⁵ | :x:²⁵ | :x:²⁵ | :x:²⁵ |
50+
| Automatic battery / metered-network / sleep awareness | :white_check_mark: | :x: | :x: | :x: | :x: | :x:²⁶ |
51+
| Per-source include/exclude incl. .gitignore | :white_check_mark: | :large_orange_diamond:²⁷ | :x:²⁷ | :large_orange_diamond:²⁷ | :large_orange_diamond:²⁷ | :large_orange_diamond:²⁷ |
52+
| Live preview of which files a rule keeps or drops | :white_check_mark:²⁸ | :large_orange_diamond:²⁹ | :x: | :white_check_mark:³⁰ | :large_orange_diamond:²⁹ | :x: |
53+
| Native desktop GUI app | :white_check_mark: | :x:³¹ | :white_check_mark: | :large_orange_diamond:³² | :x:³¹ | :white_check_mark: |
54+
| In-app file search + selective restore | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :large_orange_diamond:³³ | :white_check_mark: |
55+
| Rolling local logs plus a one-click diagnostics bundle | :white_check_mark:³⁴ | :large_orange_diamond:³⁵ | :white_check_mark: | :large_orange_diamond:³⁶ | :x:³⁷ | :white_check_mark: |
5056
| Open source (permissive license) | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :x: |
51-
| Cross-platform desktop (Windows, macOS, Linux) | :white_check_mark: | :white_check_mark: | :x:¹⁹ | :white_check_mark: | :white_check_mark: | :x:¹⁹ |
57+
| Cross-platform desktop (Windows, macOS, Linux) | :white_check_mark: | :white_check_mark: | :x:³⁸ | :white_check_mark: | :white_check_mark: | :x:³⁸ |
58+
| Reproducible end-to-end benchmark suite in the repo | :white_check_mark:³⁹ | :x:⁴⁰ | :x:⁴⁰ | :x:⁴⁰ | :x:⁴⁰ | :x:⁴⁰ |
5259

5360
Notes:
5461

@@ -65,30 +72,63 @@ Notes:
6572
- ¹¹ Backblaze restores from within a retention window (30 days by default, extendable).
6673
- ¹² Drive for desktop continuously syncs open files but does not take an application-consistent VSS snapshot.
6774
- ¹³ rclone (`check` / `cryptcheck`) and restic (`check`) verify on demand rather than on an automatic schedule; Backblaze runs periodic server-side checks only.
68-
- ¹⁴ Several tools offer manual bandwidth limits or schedules; only Driven automatically defers on battery, metered, or offline networks and resumes on wake.
69-
- ¹⁵ rclone, Duplicati, restic, and Backblaze support custom include/exclude filter rules but not `.gitignore` semantics.
70-
- ¹⁶ rclone and restic are command-line tools; their GUIs are separate third-party projects (for example RcloneView, Backrest).
71-
- ¹⁷ Duplicati runs as a background service with a local web UI plus a tray helper, not a native desktop app.
72-
- ¹⁸ restic search and selective restore are driven from the CLI (or a mounted snapshot), not an in-app browser.
73-
- ¹⁹ Windows and macOS only; Linux needs third-party tools.
74-
75-
Feature sets verified 2026-07; check each project's current docs before relying on a cell.
75+
- ¹⁴ Driven keeps a local state database, so an unchanged file is not normally re-checked against the cloud at all. A separate audit pass therefore runs at startup and on every deep-verify cycle: it enumerates what the account still holds for each source and re-queues anything whose remote object is gone. It infers "missing" only from an enumeration it completed, so a failed listing heals nothing rather than re-uploading a whole source.
76+
- ¹⁵ rclone keeps no state, so `copy` / `sync` re-list the destination on every run and a file deleted there is simply transferred again. Self-correcting by construction, at the cost of a full remote listing every run.
77+
- ¹⁶ Worse than absent: Drive for desktop mirrors deletions in both directions, so a file deleted in Drive is deleted locally too.
78+
- ¹⁷ Both detect destination damage (`list-broken-files`, `check`), but recovery is operator-driven. Duplicati's `repair` regenerates index files, while missing data volumes need `--rebuild-missing-dblock-files` or get amputated by `purge-broken-files`; restic's `repair` commands drop references to lost data, and healing means re-running `backup` against a source that still has it.
79+
- ¹⁸ Backblaze does not document whether its client detects and re-uploads files whose server-side copies were lost.
80+
- ¹⁹ Driven's walk runs on `available_parallelism()` worker threads (clamped to 2..=8) off the async runtime, and prunes excluded directories that no negation rule can reach into rather than descending them.
81+
- ²⁰ rclone walks at `--checkers` concurrency (8 by default) and transfers at `--transfers` (4 by default).
82+
- ²¹ Neither Google nor Backblaze documents its client's scan concurrency. Backblaze's thread setting governs upload connections, not the local walk.
83+
- ²² Duplicati's file enumeration is a single serial pass; the hashing, compression, and upload stages downstream of it are concurrent.
84+
- ²³ restic reads files concurrently at `--read-concurrency`, which defaults to 2.
85+
- ²⁴ Driven's `io_priority` setting (`low` by default) maps to real per-platform OS calls: below-normal thread priority plus per-handle I/O priority hints on Windows, `ioprio_set` on Linux, `setiopolicy_np` on macOS. It shapes the scan walk, upload reads, and bundle builds. It is best-effort by design, so a refused call means that work runs at normal priority rather than failing.
86+
- ²⁵ None of the five sets an OS priority itself. rclone and restic document running them under `nice` / `ionice` yourself; Duplicati still accepts `--thread-priority` but marks it deprecated ("has no effect, use the operating system controls to set the process priority"); Drive for desktop and Backblaze offer bandwidth throttles (and Backblaze an upload-thread count), which cap network rate rather than CPU or disk priority.
87+
- ²⁶ Several tools offer manual bandwidth limits or schedules; only Driven automatically defers on battery, metered, or offline networks and resumes on wake.
88+
- ²⁷ rclone, Duplicati, restic, and Backblaze support custom include/exclude filter rules but not `.gitignore` semantics. Drive for desktop has no pattern rules at all, only a choice of which folders to sync.
89+
- ²⁸ Driven re-classifies the folder tree from an in-memory cache as you type, so a rule edit updates the tree and its counts without re-reading the disk. On a 63k-entry tree a re-classification takes 536 ms against 868 ms for a fresh walk of the same (already OS-cached) tree, and issues no `read_dir` calls at all, so unlike a walk its cost does not scale with disk speed.
90+
- ²⁹ rclone and restic answer the question with `--dry-run`, which re-walks the source on every attempt.
91+
- ³⁰ Duplicati 2.3.0.4 (July 2026) added server-evaluated inclusion state to its new UI's tree; it marks the nodes you expand rather than summarising the whole source.
92+
- ³¹ rclone and restic are command-line tools; their GUIs are separate third-party projects (for example RcloneView, Backrest).
93+
- ³² Duplicati runs as a background service with a local web UI plus a tray helper, not a native desktop app.
94+
- ³³ restic search and selective restore are driven from the CLI (or a mounted snapshot), not an in-app browser.
95+
- ³⁴ Driven writes daily rolling logs (pruned at 14 days / 25 MB) that interleave backend tracing with the webview's own console output, and the in-app diagnostics export bundles them.
96+
- ³⁵ rclone logs to a file only when you pass `--log-file` (rotation via `--log-file-max-size` and friends), and has no bundle export; its bug template asks you to attach a log you produced by hand.
97+
- ³⁶ Duplicati's "Create bug report" export is a genuine one-click bundle (system info plus an obfuscated copy of the local database), and its web UI has a live log view; file logging is opt-in via `--log-file`, defaults to warnings only, and does not rotate.
98+
- ³⁷ restic has no log-file option at all - output goes to stdout, and the only file logging is an unrotated `DEBUG_LOG` env var that its contributing guide asks you to redact yourself.
99+
- ³⁸ Windows and macOS only; Linux needs third-party tools.
100+
- ³⁹ `bench/` runs Driven's real engine and rclone over identical seeded fixtures against a live Drive account, reporting wall time, throughput, API calls, CPU time, and peak memory for a cold and an incremental pass. See [`bench/README.md`](bench/README.md) for scales, costs, and what is and is not apples-to-apples.
101+
- ⁴⁰ 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+
103+
Competitor rows were verified in July 2026 against rclone 1.74.4, restic 0.19.1,
104+
Duplicati 2.3.0.4, Backblaze Personal Backup 10.0.2, and Drive for desktop 128.0.
105+
These move: check each project's current docs before relying on a cell.
76106

77107
## Features
78108

79109
- One-way backup to your own Google Drive (no second cloud bill, no two-way
80110
sync surprises).
81111
- Optional per-source client-side encryption (XChaCha20-Poly1305 for contents
82112
and file names; a BIP39 recovery phrase guards the master key).
83-
- Scanner that honors `.gitignore`, built-in and custom exclude rules, and a
84-
configurable symlink policy.
113+
- Parallel, multi-threaded scanner that honors `.gitignore`, built-in and custom
114+
exclude rules, and a configurable symlink policy, and that skips excluded
115+
directories instead of descending them.
116+
- Live exclusion preview that re-classifies the folder tree as you edit a rule,
117+
from an in-memory tree rather than a fresh walk of the disk.
85118
- Concurrent, paced executor with retries and resumable uploads.
119+
- Configurable OS priority (`low` by default) for the scan, upload reads, and
120+
bundle builds, so backups yield CPU and disk to whatever is in the foreground.
86121
- Battery and network awareness: backups defer on battery and on metered or
87122
offline networks, then resume automatically.
123+
- Remote-existence audit that re-queues files whose Drive copies were deleted
124+
outside Driven, so a destination-side deletion cannot leave a file silently
125+
un-backed-up.
88126
- Windows Volume Shadow Copy support so locked files (Outlook PSTs, running DB
89127
files, VM disks) still back up.
90128
- In-app restore browser with full-text file-name search and streaming decrypt.
91129
- Activity dashboard with a live tail and filterable history.
130+
- Rolling local log files covering both the backend and the webview console,
131+
collected into a one-click diagnostics bundle.
92132
- In-app auto-update with signed update manifests and a stable / dev channel
93133
selector.
94134
- Anonymous, opt-out telemetry (coarse counts only; never file names, paths, or
@@ -206,8 +246,13 @@ just test # cargo test --workspace + vitest
206246
just lint # cargo fmt --check + clippy + eslint
207247
just bundle # cargo tauri build
208248
just deny # cargo deny check
249+
just bench # benchmark the real engine against rclone (needs live credentials)
209250
```
210251

252+
`just bench` uploads to a real Drive account and costs real bandwidth; read
253+
[`bench/README.md`](bench/README.md) for the prerequisites, scales, and safety
254+
rails before running it.
255+
211256
## Run via Docker
212257

213258
The headless tools - the debugging CLI (`driven-cli`) and the stress / chaos

0 commit comments

Comments
 (0)