Writing Criteria
Every guide in this repo is written to the same standard. If you're adding or editing a guide — human or AI — hold it to these.
- Plain words, real ideas. Simple language, never dumbed-down concepts. Explain jargon on first use; collect terms in the glossary.
- No hype. No marketing adjectives, no "revolutionary," no promises about what something will do for the reader.
- Honest about limits. Say what the thing can't do. State uncertainty instead of smoothing it over. Validation notes include what remains unverified.
- No invented numbers. Benchmarks, defaults, and specs are either measured or qualified with "depends on your setup." If it wasn't tested, say so.
- Checkable. Commands are meant to be run, with "Check:" blocks showing what success looks like. Sources are linked, not asserted.
- Respect the reader's setup. Call out Windows/Mac/Linux differences. Don't assume a GPU, a budget, or prior experience.
- Safety isn't skipped. Real risks get stated plainly, not buried.
- Scoped. Each guide says what it covers and points elsewhere for the rest. No guide pretends to be the whole subject.
- Structure over prose. Tables, before/after examples, symptom → fix. Scannable beats essay.
Verification notes for this guide
Standard 3 and 4 applied to this guide, specifically. All live work
used rclone v1.75.2 (official static binary) on Linux, an isolated
config (RCLONE_CONFIG pointing into the lab), and LOCAL remotes
only — a folder on disk played the part of "the cloud." No real
cloud account, credential, or pre-existing rclone configuration was
touched at any point. Full transcripts of every captured run are
kept with the lab (numbered 01–16).
Verified by running:
- Config:
config createfor alocalremote,listremotes,config show,config file, and the file's INI shape.rclone obscureoutput captured — and quoted in chapter 2 as evidence that obscuring is encoding, not encryption. - Looking around:
lsd,ls,lsf(including--recursiveand--files-only),size,tree, andaboutagainst the planted fixture, outputs as printed in chapter 3. copy: a full first copy of the 9-file fixture (2.500 MiB), a second copy reporting "There was nothing to transfer," and a delta copy after a one-line append plus one new file — which transferred 79 B, the whole edited file plus the new one, demonstrating whole-file (not block-delta) semantics.syncdeletions, exactly as chapter 6 shows: a planted destination-only file and a source-deleted file were announced in a--dry-run("Skipped delete"), then actually deleted by the real run, with the footer'sDeleted: 2 (files)line.--max-delete 1against three pending deletions: one file was deleted, the run then failed fatally, exit code 7.--backup-dir: the two remaining pending deletions were moved server-side into the rescue remote path instead of being deleted; contents verified intact withcat.movebetween two paths on one remote, reported asMoved (server-side); the source was gone afterwards.- The
copy/copytotrap, produced by accident and kept:copyto a file-shaped destination created a directory of that name containing the file;copytodelivered the file under the intended name,cmpexit 0. purgeof a populated tree: every file deleted, every directory removed, no confirmation asked.--dry-runnarration:NOTICE: … Skipped copy as --dry-run is setlines for every file, and no destination directory created.--log-filecaptured a complete run log.--progresswithout a terminal printed only the final stats block (the chapter says so).check: a planted content change and a missing file produced named differences and exit code 1;--size-onlyagreed; after a repairingsync,checkreported 0 differences and exit 0;check --download --size-onlyalso passed.hashsum MD5printed real hashes for the local backend.- Exit codes produced for real: 0 (all clean runs, including nothing-to-transfer), 1 (check differences), 3 (listing a missing directory; copying from a missing source, after the default 3 attempts), 7 (fatal error, the max-delete cap).
- Filters:
--exclude '*.tmp',--include '*.log', a two-rule--filter-fromfile (shipped inexamples/),--max-age 24hexcluding exactly the planted 2020 file,--min-size 1Mmatching exactly the one big file, and a filteredcopywhose destination listing confirmed the excluded file never arrived.--files-fromcopied exactly the two listed files. - Crypt: a
cryptremote created over the local remote with standard filename encryption and directory name encryption. Copied through it, the notes appeared normally via the crypt name; via the underlying remote, directory and file names were ciphertext and file contents began with theRCLONE\0\0header followed by unreadable bytes (od dump captured). Copying back out produced a treediff -rjudged identical (exit 0);cryptcheckreported 0 differences;rclone catthrough the crypt remote printed plaintext. A second crypt remote with a wrong password could not even list: "directory not found," exit 3 — because the directory name itself is encrypted. - Layered remotes: an
aliasremote answered listings through its short name. Achunkerremote at chunk size 1M stored the 2.5 MiB fixture as two 1 MiB chunks, one 512 KiB chunk, and a 77-byte metadata file, and reassembled it byte-identically. - Bisync:
--resyncinitialised two folders; after new files on one side and conflicting edits to a shared file on both, a normal run propagated the new file, renamed both edits toshared.txt.conflict1/.conflict2on both sides (contents verified — one ends "milk", the other "eggs"), removed the contested name, and still reported "Bisync successful." serve httpon a loopback address with--read-only: a real HTTP GET returned a file's contents and a directory URL returned 200. The server was stopped after the capture.- The worked example: the shipped
sync-logs.shran twice for real. Between runs a new log appeared on the "device" and the oldest local log was deleted (rotation); the archive ended holding all three files while the device held two —copy, notsync, demonstrated end to end.
Documented-only (not run), and why:
- Real cloud remotes, including the Google Drive OAuth flow (all of chapter 13): deliberately out of scope for the lab — no credentials were used and no real account was touched. Steps are described from rclone's official documentation.
rclone mountsucceeding: the build machine has no/dev/fuse. The attempt was run and its failure captured verbatim ("fusermount3: fuse device not found… failed to mount FUSE fs," exit 1); mount behaviour,--vfs-cache-mode, and clean unmounting are described from documentation.- The interactive
rclone configwalkthrough: the lab created every remote non-interactively withconfig create. The interactive prompts are referenced, not reproduced. - The
cachebackend: rclone's own documentation marks it deprecated; it is described in one paragraph so old references make sense, and was not built or run. filename_encryptionmodesoffandobfuscated:standardwas run end to end; the other two are named and contrasted from documentation.rclone ncdu,--formatfield shaping inlsf,dedupe, serve protocols other than HTTP, config-file encryption,--suffixnaming for backups,--log-leveltuning,mkdir: named where a reader will meet them; no chapter claim rests on their output.- cron and systemd actually firing: the worked-example
script was run by hand; the cron line and the systemd
service/timer are shipped as files in
examples/and described. No job was installed on the build machine. - Windows and macOS specifics (config locations, mount helpers): the lab is Linux; platform differences are flagged as documented where the chapters mention them.