Everything I'd genuinely hate to lose is text. An Obsidian vault I think in, and a folder of code repositories. Not photos, not video — just the stuff I've written and built. Which is good news, because it means the backup I actually needed is small, cheap, and dull. I built it in one afternoon: an encrypted, versioned, daily, offsite copy of everything irreplaceable, for roughly 2p a month. Here's how, and — more usefully — the three things that make a backup real, none of which the tool does for you.
First I decided what NOT to back up
I started where most people start: "back up the whole machine." Then I actually looked into a bootable, bare-metal restore on macOS and concluded it basically isn't a thing without a local Time Machine drive — and I wanted the copy off the machine, in the cloud. So I stopped chasing the heroic version and asked a better question: what's genuinely irreplaceable here?
The answer was small. The vault, and the source of my repos — code and git history only. Everything else is re-downloadable: the OS, the apps, node_modules, Python venvs, the Flutter SDK, Terraform state, model weights, big data folders. All excluded. That one decision — naming what you're deliberately not protecting — is what shrank the job from "image a 500GB laptop" to a 1.22 GiB first snapshot. Cheap and trustworthy start with scope.
restic, into a Google Cloud Storage bucket
The tool is restic, backing up to a GCS bucket. Three properties made it the pick over an rsync copy or a nightly tarball:
- Client-side encryption — Google only ever stores ciphertext. The data is readable on my laptop and nowhere else.
- Deduplication — a daily run on a vault that barely changed stores almost nothing new, so "daily" is nearly free.
- Snapshot history — point-in-time restore. It's a Time Machine for the cloud, not a single overwritten mirror. rsync and tarballs can't give you that, so they were out.
The retention I wanted — keep 7 daily, 4 weekly, 6 monthly restore points and prune the rest — is a single restic forget policy. A launchd agent runs it every day at noon (and on wake if the laptop was asleep). At GCS Standard prices, 1.22 GiB is a rounding error: a couple of pence a month, all in.

The one secret that has to outlive the machine
Client-side encryption has an uncomfortable flip side, and it's worth saying plainly: if you lose the passphrase, the backup is gone. Not "phone support" gone — mathematically gone. So the passphrase lives in two places, on purpose. In the Mac's Keychain, so the daily automated run can read it unattended. And escrowed in my password manager — the copy that survives if the laptop is lost, stolen, or dead. That second copy is the whole point: in a real disaster the machine is gone, and the entire value of the backup collapses onto one string of characters stored somewhere else. Guard it like it's the backup, because it is.
A backup you've never restored from is just a hope
The last step is the one everyone skips: I ran a restore drill. Pulled the vault and a repo back down from the cloud and diffed them against the originals — byte-identical. That drill is the entire difference between "I have backups" and "I have restores," and only one of those is worth anything at 2am.
It matters because backups fail in stupid, silent ways. Building this, a code review caught a real one: an empty-array expansion in the backup script that crashes under set -u on the ancient bash 3.2 that ships with macOS — the kind of bug that quietly turns a "daily backup" into nothing. So the job also emits a macOS notification if a run errors or the last success is more than two days old. A backup that fails quietly is identical to no backup at all.
The transferable bit
A backup is only ever as good as three things the tool won't decide for you: what you're deliberately not protecting (scope is what keeps it cheap and simple), the one secret that must outlive the hardware (and where a second copy lives), and proof that a restore actually works (a drill, not a promise). The software — restic, a bucket, a scheduled job — is the easy 20%.
It runs at noon every day and I've stopped thinking about it, which was the entire goal. If you want infrastructure that's boring on purpose — the kind you can forget because it's actually correct — that's the sort of work I do at twentytwotensors. Get in touch.