Omarchy Time Machine
#Time Machine
Backups you can forget about, until the day you can't.
Time Machine copies your home folder somewhere safe every night, and puts one answer in your bar: when were my files last backed up? Most days that answer is boring. Today, 03:00. Fine, move on. On the day it isn't boring, the icon turns red and stays red until you deal with it.
It keeps every backup, not just the latest one. So when you notice on Thursday that you wrecked a file on Monday, you can go back to Sunday and take it back.
The bar shows one icon and nothing else. No counter, no percentage, no badge tallying something at you all day. A widget that talks constantly is a widget you stop hearing, so this one keeps quiet until something breaks.
#Install
sudo pacman -S restic omarchy plugin add https://github.com/jankeesvw/omarchy-time-machine omarchy plugin enable jankeesvw.time-machine omarchy bar move jankeesvw.time-machine --section right
restic is the thing that does the actual copying. It's excellent, it's boring in the best way, and it's the only thing you need to install.
#The command line
Most of this you can do from the panel. The rest is a command that lives inside the plugin rather than on your PATH, so typing omarchy-time-machine on its own gets you command not found:
~/.config/omarchy/plugins/jankeesvw.time-machine/bin/omarchy-time-machine
Every omarchy-time-machine ... line below means that path. If you are going to type it more than once, give it a name:
alias omarchy-time-machine=~/.config/omarchy/plugins/jankeesvw.time-machine/bin/omarchy-time-machine
Put that in your ~/.bashrc to keep it. The plugin never adds anything to your PATH itself, because where your shell looks for commands is yours to decide.
#Point it somewhere
Click the icon in your bar and choose Create Configuration. It writes a starter file and opens it in your editor, so you're never staring at a blank buffer wondering what goes in it. What you get looks like this:
{ "source": "~", "destinations": [ { "name": "backup-drive", "display_name": "Backup drive", "repository": "/run/media/CHANGE-ME/backup/restic", "schedule": "*-*-* 03:00:00" } ] }
source is what gets backed up, repository is where it goes, and schedule says three in the morning, every morning. Point repository at your external drive and you're most of the way there.
An external drive is the easy case. It also does a NAS over SSH, or a bucket in the cloud:
{ "name": "drive", "repository": "/run/media/you/backup/restic" } { "name": "nas", "repository": "sftp:you@nas:/volume1/backup" } { "name": "offsite", "repository": "s3:s3.amazonaws.com/my-bucket" }
List more than one and the panel lists them all, each with its own schedule and its own history.
Anywhere restic can write works: a local disk, SFTP, a REST server, S3, Minio, Wasabi, Backblaze B2, Azure Blob, Google Cloud Storage, Alibaba OSS, OpenStack Swift, or anything rclone can reach. A drive in your bag and a bucket in the cloud is a good pair: one is fast, the other survives your house.
#Pick a password
Your backups are encrypted, and that's not optional. An external drive gets lost, a NAS gets stolen, a bucket in the cloud sits on somebody else's computer. Encrypted means that when your backup ends up somewhere you didn't intend, it's noise to whoever finds it.
The price of that is a password. Pick one and it gets stored on this machine, so you'll never be asked for it again in normal use:
omarchy-time-machine key set --dest backup-drive omarchy-time-machine init --dest backup-drive omarchy-time-machine install
Those three lines set the password, prepare the destination, and switch on the nightly schedule. That's the setup done. Go do something else.
#Now save that password somewhere else
Read this bit. It's the one thing that quietly makes backups worthless.
Your password is stored in your home folder, and your home folder is what gets backed up. So the copy that ends up inside your backup is locked behind the very password you'd be trying to recover. If this laptop is stolen or dies, your backups are a pile of bytes that nobody can open. Not you, not me, not restic.
omarchy-time-machine key show --dest backup-drive
Put that in your password manager. Print it and put it in a drawer. Do it today, because the moment you need it is exactly the moment you can't get to it.
If you use 1Password, there's a shortcut:
omarchy-time-machine key save-1password --dest backup-drive
That writes it into your vault as "Time Machine backup key (backup-drive)", with a note saying which destination it opens. It refuses if an item by that name already exists, because two of them is how you end up trying the wrong one in a year.
#Getting files back
Open the panel and hit Restore Files. Pick a day, then browse to whatever you're looking for, the same way you'd browse any folder.
Arrows move through the list, Enter opens a folder, and typing filters what you see. Switch to a different day and you stay in the same folder, so you can flip between Monday and Sunday to spot what changed.
You can bring back a single file, or the whole folder you're standing in.
Everything you restore lands in ~/Restored/, never on top of your current files. That's deliberate. Getting a file back should never destroy the work you did since. You move things into place yourself, where you can see exactly what you're replacing. When a restore finishes you get a notification, and clicking it opens your file manager with the file already selected.
#Things you might want to change
You only need name and repository. Everything else already has a sensible default.
| Setting | Default | What it's for |
|---|---|---|
source |
your home folder | What gets backed up. A path, or a list of them: ["~", "/etc", "/srv/data"]. If one is missing the backup stops rather than quietly taking half of it. |
exclude_file |
excludes.txt next to your config |
Things to skip. Caches, downloads, virtual machine images. Anything you can get back another way. |
retention |
7 daily, 4 weekly, 12 monthly, 3 yearly | How far back you can go. Older backups get thinned out rather than kept forever. |
schedule |
none | When it runs. "*-*-* 03:00:00" is every night at three. Leave it out and this destination only runs when you press the button. |
display_name |
the name |
What the panel calls it. "The drive in my bag" reads better than usb2. |
pre_command |
none | A command to wake the destination first. See below. |
on_failure_command |
none | A command to run when a backup fails, if a red icon isn't enough. |
Run omarchy-time-machine install again after changing a schedule.
Run it once after updating past 1.1.0 as well, even if nothing changed. Timers written before that carried a Requires= on the backup service, which meant that stopping a running backup switched the timer off with it: the run you cancelled was the last one that was ever scheduled, and nothing said so. The units are rewritten and re-enabled by that command; until you run it, an already-stopped timer stays stopped.
Times show on a 24-hour clock, to match the Omarchy clock next to it. If you'd rather have AM and PM, that's a setting on the widget in shell.json:
{ "id": "jankeesvw.time-machine", "timeFormat": "h:mm AP" }
#If your destination isn't always there
A drive that has to be mounted, a NAS that goes to sleep. Without a nudge the backup fails with an unhelpful "repository not found" and you find out days later.
{ "name": "usb", "repository": "/run/media/you/backup/restic", "pre_command": "systemctl --user start mount-backup-disk" }
Whatever you put there runs first, every time. Keep it quick, and make sure it's harmless to run when the destination is already awake.
#If something goes wrong
The panel tells you when the last backup failed and when the last good one was, which is usually the thing you actually want to know. For the details:
omarchy-time-machine log --dest backup-drive # what happened last night systemctl --user list-timers 'omarchy-time-machine@*' # when does it run next omarchy-time-machine backup --dest backup-drive --dry-run # test everything, write nothing omarchy-time-machine check --dest backup-drive # verify the backup isn't damaged
To see what you have set up and when each one last ran:
$ omarchy-time-machine destinations NAME LABEL WHERE SCHEDULE LAST BACKUP nas Synology in the cup... sftp:me@nas:/volume1/backup *-*-* 03:00:00 2026-08-25 03:07 usb Drive in my bag /run/media/me/backup/restic on request 2026-08-18 06:50 offsite Offsite s3:s3.eu-central-1.amazonaws.com/attic *-*-* 04:30:00 never 35 snapshots, 373 GB stored in total
That reads your settings and one local file, nothing else, so it answers straight away whether or not the drive is plugged in.
You can drive the whole thing from the terminal if you prefer. omarchy-time-machine on its own lists what it can do.
#Uninstalling
omarchy plugin remove jankeesvw.time-machine
That removes the widget and leaves your schedule, settings and backup password alone, because taking away a widget shouldn't take away your ability to open your backups. When you want those gone as well:
systemctl --user disable --now 'omarchy-time-machine@*.timer' rm -f ~/.config/systemd/user/omarchy-time-machine* systemctl --user daemon-reload rm -rf ~/.config/omarchy-time-machine # settings and your backup password rm -rf ~/.local/state/omarchy-time-machine # history and logs
Careful with the first one. It holds the password to your backups, and deleting it without a copy elsewhere makes them permanently unreadable. The second holds a record of when each backup ran, plus a log of every run for the last thirty days, which includes the names of files that couldn't be read.
None of this touches the backups themselves. They stay exactly where they are, and anyone with the password can still open them.
#Licence
MIT.
icon.svg embeds the fa-history outline from Font Awesome Free, licensed CC BY 4.0.
The wallpaper behind the screenshots is a pattern built from Heroicons, licensed MIT, Copyright (c) Tailwind Labs, Inc.