Changelog
Notable changes to Frost, newest release first. Each release lists what was added, fixed and improved, in that order, and leaves out empty sections.
#v0.1.0
#Added
Frost backs up to your own server over SSH. Any machine with an SSH server works, from a NAS or Raspberry Pi to a VPS, with nothing to install on it. Frost logs in with its own SSH key, so scheduled backups never need a password, and
frost initcan add the key to the server for you.Frost backs up to a local drive. Pick a folder on an internal or external drive. Frost never creates that folder after setup, so an unplugged drive can't send backups to another disk, and a scheduled backup waits a few minutes for a drive that isn't mounted yet.
Backups move between drives, servers and buckets. Self-hosted, local drive and S3 storage keep the same files under one folder, so copying that folder moves a repository without uploading it again.
Frost backs up to S3-compatible storage. Everything is encrypted on your machine first, and kept in a
frost/folder inside the bucket so the bucket can hold other things too.Frost can store backups on Permafrost. Connecting takes one access key, with no bucket, region or endpoint to set up. You can also point Frost at your own Permafrost server.
frost initpoints you to a Permafrost key. If you don't have one yet, it opens getfro.st/perma in your browser, and you paste the key it gives you. If Permafrost rejects a key or an upload later, commands that access backups give its reason and point you tofrost init.frost statusshows how much storage you use. Astoragerow shows a Permafrost account's use and limit, or how full a self-hosted server's or local drive's disk is.statusandbackupwarn when the storage needs attention, such as when it's nearly full.frost initwalks you through setup. In a terminal it opens a full-screen setup that asks one thing at a time and says where to find each answer. S3 services have their own list, with presets for Amazon S3 and Cloudflare R2 and unverified presets for Backblaze B2 and Wasabi. If connecting fails, it says why in plain words and goes back to the answer that caused it.Backups only upload what changed. Files are split where their content says, not at fixed offsets, so an edit only re-uploads the chunk or two around it. Files that haven't changed since the last run aren't even read.
Interrupted backups pick up where they stopped. Uploaded chunks are recorded as the run goes, so the next run skips them. On a new machine, Frost rebuilds its record from what's already in storage and only uploads new data.
Backups rarely list your storage. Frost trusts its local record of what's stored and compares it with storage once a week, after a check finds something missing, or when the storage moved.
frost status --verifyalways compares.Snapshots have short, readable IDs. IDs look like
maple-absurd-3f1c. You can restore by ID or by time, likelatest,3 days agoor2026-09-20.A backup with nothing new saves no snapshot. If nothing changed since the last snapshot,
frost backupsays it's already backed up instead of saving a copy. Otherwise it says how many files were added, changed and removed.Snapshot file lists use multiple objects. A snapshot's file list is stored in chunks like file data, so the complete list can exceed Permafrost's 16 MiB object limit, up to what memory and runtime limits allow. The parts that didn't change since the last backup aren't uploaded again.
frost backup --dry-runshows what would upload. It says what changed and lists every file with new data, and the total.Busy files keep their last good copy. A file that changes while it's read is read again at the end of the backup. If it's still changing, the snapshot keeps its previous copy, and
frost backupandfrost statussay which files.A missing folder doesn't stop the others. A configured folder that isn't there, like one on an unplugged drive, is skipped and the rest are backed up.
frost backupandfrost statussay which one wasn't found.An unreadable folder fails the backup. Items inside a folder that can't be read are skipped and counted in
frost status, but a backed-up folder Frost can't read at all fails the run rather than saving nothing. On macOS, the error explains how to grant Full Disk Access.Backups don't download files that are only in iCloud. On macOS, a file iCloud keeps only online is skipped and listed rather than downloaded, so a backup doesn't fill your disk or wait on downloads.
Restores say where they go. Choose
--besidefor a new folder next to the originals,--to <dir>for a new folder somewhere else, or--overwriteto replace the originals. Only--overwritereplaces files, and each file is checked and written to a temporary file before it's moved into place.Restores download in parallel. Chunks download 8 at a time across all the files being restored. A chunk that repeats, like the empty parts of a disk image, downloads once.
Interrupted restores carry on. If a restore stops, Frost prints the command that continues it in the same folder. Files already there are checked and skipped, and the file it was writing picks up from its last good chunk.
Restoring over the originals skips what's already right.
frost restore --overwritechecks each original against the snapshot first, and files that already match aren't downloaded.frost browseopens a snapshot browser. You can browse snapshots by date, walk the files as they were, compare two snapshots and pick files to restore. It fits small terminals, and a scheduled backup can run while it's open.The browser can pick a restore folder. "New folder elsewhere" opens Finder, Explorer or a Linux folder picker, and you type the folder when there isn't one.
Restores from the browser open in your file manager. When a restore finishes, Frost shows what it restored in Finder, Explorer or your Linux file manager. Nothing opens over SSH or when the restore fails.
Backups check themselves. After a backup that saves a snapshot, and at least once a day otherwise, Frost downloads a random sample of chunks and checks them against their IDs.
frost statusshows the result, andfrost status --verifyruns a check on demand.Storage changes are checked.
frost config setchecks a new storage location before saving it, and refuses one with no backups, backups made with another key, or afrost.repowithout its snapshots.frost initasks before starting a separate set of backups when this machine's are somewhere else.Frost explains when it can't find your backups. The error and
frost statussay where they were last and how to get back to them, and a scheduled backup that failed because of it shows infrost status. Snapshots that disappear from storage are reported too.Backups run on a schedule without a daemon.
frost initinstalls a launchd, systemd, cron or Task Scheduler job depending on your OS, and on Linux it runs while you're logged out too. Changing the schedule withfrost config setupdates the job.A missing scheduled job is easy to put back. If the job disappears,
frost statussays so andfrost config set schedule.enabled truereinstalls it.You choose when scheduled backups run.
schedule.timeandschedule.dayset the time and the day of weekly backups, daily at 15:00 by default. Every scheduler uses them, and shorter intervals count from that time.Missed backups run once your computer is back. A backup missed while the computer was off or asleep runs when it wakes, starts or you log in, once however many runs it missed. Setting
schedule.catch_uptofalseskips missed runs instead.Scheduled backups wait their turn. A scheduled run that finds a backup already done for its time exits quietly, and one that finds another backup running waits for it. When a computer has just woken, it gives the network a few minutes to come back.
Editing
config.tomlby hand takes effect. The next command updates the scheduled job to match a changed schedule and says so, and checks a new storage location the wayfrost config editdoes. Scheduled runs follow the file as it is, and on Linux they update their own job.Changing the schedule never stops a running backup. On macOS and Windows, a change made with
frost config,frost initor a text editor while a scheduled backup runs waits for it, and Frost applies the change in the background as soon as the backup finishes.frost backupasks first near a scheduled backup. In a terminal, it says when a scheduled backup starts within the hour or finished within the last hour, and asks whether to back up anyway. If a scheduled backup is running, it says so.Frost packages include the runtime. macOS, Linux and Windows packages contain Node.js, Frost's scripts and assets, so users don't need to install Node.js or npm. The runtime stays at a fixed path while updates activate versioned scripts.
Windows scheduled backups use the signed bundled runtime. The Task Scheduler task names Frost as its author, says how to remove it, and runs the launcher with the saved config and cache folders.
Windows scheduled runs have a log. Backup output, failures and update results go to
frost.login the cache folder, and logs over 1 MiB are trimmed before the next run.Frost updates itself.
frost updateinstalls the latest release, and scheduled backups do it on their own at most once every 20 hours. Each release is checked against a signing key built into Frost before anything is replaced, and settingupdate.autotofalseonly tells you about new ones.frost keymanages your recovery phrase. It shows the phrase behind a confirmation, checks a phrase against your backups, or imports one on a new machine.frost config editsaves only after you check the changes. It opens a copy ofconfig.toml, lists the settings you changed, and saves the copy as written, comments and all, once you typeyes. A file that doesn't parse goes back to the editor instead of breaking scheduled backups, and aconfig.tomlthat's already broken can still be opened and fixed.Frost installs with one line.
install/install.shdetects macOS, Linux, WSL or Git Bash, checks signed checksums, and installs the complete package with a launcher. It requiresssh-keygenfrom OpenSSH 8.1 or newer and refuses an unverified package.Windows installs from PowerShell.
irm https://raw.githubusercontent.com/whatithasisandalwayswillbe/frost/main/install/install.ps1 | iexchecks the release the same way, using the release's own OpenJS-signed runtime, so it needs nothing else installed. It putsfrostin%LocalAppData%\frost\binand adds that folder to yourPATH.npm and pnpm can install Frost.
npm install -g getfrostorpnpm add -g getfrostgives you afrostcommand that installs the signed release on its first run and then runs it. Frost keeps updating itself, and the package needs Node.js 22 or newer.