Head to head
restic vs Kopia
Kopia does more: a desktop app, a repository server, per-directory policies and scheduling inside the tool. Whether more is what you want from the software that owns your only copy is the actual question.
Should you use restic or Kopia?
Use restic for servers and Kopia for households with machines that need a GUI. restic is a single binary in cron with no daemon, no listening port and eleven years of production use, which is the smallest failure surface available. Kopia adds KopiaUI, a repository server, scheduling and per-directory policy inheritance, and pays for it with a wider attack surface, a maintenance-owner model that can silently stop reclaiming space, and a release cadence of two to four releases a year while still pre-1.0 after seven years.
Every comparison of these two ends up praising KopiaUI's screenshots. Set that aside. A backup tool is judged on what happens when you need it and on what quietly rots when you are not watching, and on both of those axes the interesting differences are elsewhere: who owns maintenance, what a version bump can remove, and how many processes are listening on a port.
What the specification table decides#
Services to run shows the real architectural gap: restic is not container shaped at all, it is a binary that exits, while Kopia normally means a long-lived process. Datastore looks identical (both content-addressed repositories, no database service) and hides a difference: Kopia's index is epoch-based and its space reclamation is asynchronous, which is why the maintenance section below exists. Maturity is mature against stable, and that is a real distinction here rather than a label.
| Specification | restic | Kopia |
|---|---|---|
| Licence | BSD-2-Clause (Permissive) | Apache-2.0 (Permissive) |
| Written in | Go | Go (KopiaUI is Electron) |
| First release | 2015 | 2019 |
| Maturity | Mature | Stable |
| Datastore | Its own content-addressed repository (files in a directory or bucket), no database service | Its own content-addressed repository with an epoch-based index, plus a local cache directory |
| Services to run | not container shaped | 1 |
| Idle memory | 100 MB | 200 MB |
| Memory in use | 800 MB | 700 MB |
| Operational load | 2 / 5, Light | 2 / 5, Light |
| Identity | Not applicable | Local accounts only |
| arm64 builds | Yes | Yes |
| Default ports | none | 51515 |
| Backup shape | Mixed | Mixed |
Kopia is still 0.x after seven years, and that means something specific#
Kopia's first release was 2019. It is at 0.23.x in 2026. That is not a sign of instability in the sense of crashes, and the code is used in production by plenty of people. What the version number correctly signals is cadence and change policy:
- Two to four releases a year, in bursts rather than on a train.
- Breaking changes land inside minor versions. 0.23.0 (May 2026) removed LZ4 compression outright and restricted unauthenticated server binds to loopback only. If your policy specified an LZ4 variant, it broke. If you had
kopia serverbound to a LAN address without credentials, it stopped working. - 0.23.1, a month later, fixed a rare race condition that could lose data.
restic is also technically 0.x, at 0.19.1 released 5 July 2026, and it has been for eleven years. The difference is not the digit, it is that restic does not remove features between minors and newer restic reads older repositories, so upgrades never break restores.
None of this makes Kopia a bad choice. It makes it a choice you should pin a version for, read release notes before bumping, and not run latest in a container against.
The GUI and CLI compatibility question has a boring answer#
This is the question everyone asks and the answer is genuinely reassuring: there is one repository format. KopiaUI bundles a kopia binary and speaks exactly the same format as the CLI. A repository created by a cron job on your server opens in KopiaUI on your desktop, and a repository created in KopiaUI is scriptable from the command line. No import, no conversion, no "GUI edition".
What is separate is connection state. All three shapes (CLI, kopia server --ui, KopiaUI) read *.config files from %APPDATA%\kopia, $HOME/.config/kopia or ~/Library/Application Support/kopia, and KopiaUI attempts to connect to every file ending in .config at startup. Leftovers from testing produce errors and phantom repositories in the interface. Rename them to .config.bak and the noise stops.
The genuinely strict part is version compatibility. Kopia promises to read the current repository format plus at least one previous, refuses to write a format it does not handle, and will never upgrade a repository without an explicit human command:
kopia repository upgrade begin \
--upgrade-owner-id=laptop@home \
--io-drain-timeout=5m --allow-unsafe-upgradeThat is a coordinated operation. Every client must already be on the new version and disconnected while it runs, because older Kopia cannot open the upgraded repository afterwards. Upgrading your laptop's Kopia and forgetting the NAS is how you find out, when the NAS starts refusing to write to a repository it can still read.
The maintenance owner is Kopia's real operational trap#
Exactly one client performs full maintenance on a Kopia repository. Quick maintenance runs roughly hourly, full maintenance every 24 hours, and only full maintenance marks unreachable content so blobs can eventually be deleted.
If that owning machine is reimaged, retired or simply left off for a month, every other client keeps backing up successfully, kopia snapshot delete keeps appearing to work, and nothing is ever reclaimed. Your bucket grows forever with no error anywhere. Check it:
kopia maintenance info
kopia maintenance set --owner=nas@homePut that first command in whatever you use to review your infrastructure quarterly. It is the single most common way a Kopia repository goes wrong, and it is silent.
restic's equivalent is not silent, it is loud in the other direction. restic forget only removes references and restic prune reclaims, and if you never run prune your bill visibly stops falling. The failure is obvious because it is your job to schedule both:
restic forget --host web1 --keep-daily 7 --keep-weekly 4 --keep-monthly 12
restic prune --max-repack-size 20G --retry-lock 10mNeither model is wrong. Kopia's fails quietly and restic's fails to your cron log. Pick the one whose failure mode you will actually notice.
What Kopia gives you that restic does not#
Three things, and they are worth real money in the right situation:
- Policies that live in the repository. Compression, exclusions and retention are per-directory with inheritance, stored server side rather than duplicated across everyone's crontab. Changing retention for all laptops is one command, not four cron edits.
- A repository server. Laptops connect to
kopia serverwith their own credentials and never hold the object storage keys. If a laptop is stolen, you revoke one user rather than rotating a bucket key and updating every other machine. Since 0.23.0 an unauthenticated server may only bind to loopback, so remote access requires credentials plus TLS or a proxy in front. Put Caddy there and read Reverse proxy and TLS. - Scheduling inside the tool. No systemd timers, no cron, no wrapper. For a Windows desktop or a Mac in a household, that is the difference between backups happening and not happening.
Kopia has no OIDC or LDAP. Server auth is local users and client certificates only, so if every service in your house must sit behind Authelia or Pocket ID, Kopia's server is an exception you will have to proxy. See Single sign-on for self-hosters.
What restic gives you that Kopia does not#
A smaller thing to be wrong about. No daemon, no listening port, no web application, no auth model, no scheduler. It runs, it exits, it leaves a repository. Backends are compiled in, so a bucket at Backblaze or a Garage cluster is a URL:
export RESTIC_REPOSITORY="s3:s3.eu-central-003.backblazeb2.com/tdg-backups/nas"
restic backup /srv --exclude-caches --compression auto
restic check --read-data-subset=1/10It also has the stronger immutability story. rest-server with --append-only, or S3 Object Lock on the bucket, means a compromised client cannot delete its own history. Kopia has no equivalent enforcement of its own, and its maintenance model requires delete rights on the destination by design.
The price is genuine. There is no GUI, no dashboard, no schedule you can click, and the third party wrappers are yours to maintain. On a laptop belonging to someone who will never open a terminal, that is a bad trade.
Do not choose on aesthetics#
KopiaUI looks better than a cron log. That is true and it is close to irrelevant, because the interface is not what you interact with when the backup matters. What you interact with then is a restore, and both tools restore fine.
What you interact with the other 364 days is failure notification, and neither tool sends you one by itself. Whichever you pick, wire the exit code somewhere you will see it, and rehearse a restore on a schedule. A pretty dashboard showing green for a repository nobody has ever restored from is worse than an ugly cron job you have tested.
Which one for your situation#
| Your situation | Use | Why |
|---|---|---|
| Backing up a Linux server or NAS | restic | One binary in a timer, no daemon, no port, no web app |
| Household with a Windows or Mac machine and a non-technical user | Kopia | KopiaUI plus scheduling in the tool, same repository format underneath |
| Laptops that must not hold bucket credentials | Kopia | The repository server holds the keys and issues per-user logins |
| You need append-only or immutable destinations | restic | rest-server --append-only or S3 Object Lock; Kopia needs delete rights |
| Multi-terabyte repository, small backup host | Kopia | restic's index-in-RAM pruning is the operation that gets OOM-killed |
| Retention policy shared across many machines | Kopia | Policies live in the repository with per-directory inheritance |
| You pin versions and read release notes rarely | restic | Kopia removes things inside minor releases |
| Everything behind one SSO portal | restic | Neither integrates, but restic has no login to integrate |
What to do next#
If you are backing up servers, run restic and use Backup planner to size retention against your actual data before you point it at a bucket. If you are backing up a household, run Kopia, and on the same day you set it up run kopia maintenance info and write the owning machine's name down somewhere you will see it again.
Then read Backups that actually restore, because the verification cadence matters more than the tool: restic check --read-data-subset=1/10 or kopia snapshot verify --verify-files-percent=5 monthly, and a real restore of a real file quarterly. If neither of these is the shape you want, restic vs BorgBackup covers the SSH-only option and Duplicati vs restic covers the fully clickable one. The Backup category has rclone for the cases where you do not want snapshots at all.
Questions#
Is Kopia safe to use while it is still 0.x?
In practice yes, but read the version number as a statement about cadence rather than quality. Kopia has been pre-1.0 since 2019 and ships in bursts, two to four releases a year, with breaking changes inside minors: 0.23.0 in May 2026 removed LZ4 compression and restricted unauthenticated server binds to loopback, and 0.23.1 a month later fixed a rare race that could lose data. restic is also technically 0.x, at 0.19.1, but after eleven years and with no comparable pattern of removals between minors.
Can KopiaUI open a repository created by the Kopia CLI?
Yes. KopiaUI bundles a kopia binary and speaks the identical repository format in both directions, so there is no GUI-only or CLI-only repository. What is separate is connection state, which lives in *.config files in the Kopia config directory. KopiaUI tries to connect to every file ending in .config that it finds there, so leftover test configs produce startup errors and phantom repositories. Rename anything you do not want connected.
Why is my Kopia bucket not shrinking after I delete snapshots?
Deleting a snapshot is a metadata operation. Content becomes unreferenced only at the next full maintenance, which runs on a 24 hour default, and blobs are then deleted after deliberate safety delays that exist so caches and eventually consistent object storage can converge. Expect hours to days and several cycles. Also check kopia maintenance info: exactly one client owns full maintenance, and if that machine was reimaged, nothing is reclaiming anything at all.
Does restic have a GUI?
Not an official one. There are third party wrappers such as Backrest and resticprofile, and they are yours to maintain: if the wrapper stops being updated, you still have a working restic repository and a broken interface. That is a fair trade for a server. It is a poor trade for a laptop belonging to someone who will never open a terminal, and that is the case where Kopia genuinely wins.
Which one uses less memory?
restic during a prune on a large repository is the worst case in this comparison: it loads the repository index into RAM, so multi-terabyte repositories with tens of millions of blobs want several GB. Kopia's memory scales with parallel uploads and compression rather than total repository size, and the FAQ says lowering --parallel and disabling compression reduces it. On a small backup host Kopia is the more forgiving one; on a big one restic's pruning is the operation to plan around.
Can I migrate from restic to Kopia?
Not directly. The repository formats are unrelated and there is no converter, so migration means initializing a new Kopia repository, seeding a full backup, and keeping the restic repository read-only until its retention window expires. Budget disk and time for both existing at once, and do not delete the old repository until you have restored a real file from the new one.
Sources#
- Kopia GitHub releases, 0.23.0 breaking changes and 0.23.1
- Kopia docs, repository maintenance (quick vs full, owner, safety delays)
- Kopia docs, compatibility guarantees between versions
- Kopia docs, upgrading and repository format upgrades
- Kopia docs, repository server
- restic 0.19.1 release announcement
- restic docs, working with repositories
- restic docs, tuning parameters
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.