Convex backups, file storage included
backupd runs Convex’s own export on your schedule, file storage included, and keeps each snapshot encrypted to a key you hold. Restoring is one convex import away.
Integrity check
marketing-site-2026-10-13-0300.zip.zst.age- 5
- 54,054
- 5s
- integrity
- Fetch the backup
- Decrypt
- Test the ZIP
- Count documents
| Table | Backed up | Restored | Result |
|---|---|---|---|
pageViews | 48,210 | 48,210 | match |
posts | 3,904 | 3,904 | match |
authors | 1,212 | 1,212 | match |
comments | 640 | 640 | match |
settings | 88 | 88 | match |
- Cloud + self-hosted
- Convex Cloud and self-hosted backends.
- Files included
- Every export includes your file storage.
- Per-table counts
- Documents counted in every table.
- Yours to open
- Open the file with age, zstd and npx convex.
How a backup runs
- Export the deploymentWe run convex export with file storage included. The result is the same ZIP Convex itself produces.
- Compress and encryptThe ZIP is compressed with zstd and encrypted with age to backupd’s key and every key you add.
- Check and countThe ZIP is tested for integrity, and every table’s documents are counted from the export.
Backup
marketing-site-2026-10-16-0300.zip.zst.age- Export
- Stage
- Compress
- Encrypt
- Check
How it is checked
Every Convex backup gets an integrity check: the ZIP is tested end to end, and the documents in each table are counted from the export itself.
Those counts are stored in the backup’s encrypted manifest, so you can see what each snapshot held.
What backupd needs
- Convex Cloud: your deployment URL and a production deploy key, both under Settings → URL & Deploy Key in the Convex dashboard.
- Self-hosted Convex: the backend URL (your CONVEX_SELF_HOSTED_URL) and an admin key made with generate_admin_key.sh.
- The deployment must be reachable over HTTPS from the internet.
Add database
backupd connects over TLS. Use a read-only user.
Deployment URL
https://happy-otter-123.convex.cloud
Deploy key
prod:happy-otter-123|••••••••••••
Schedule
Daily at 03:00
Keep backups
30 days
Restore it yourself
Every backup is encrypted with age to your key as well as ours. Download it, and open it with free tools on your own machine:
# Decrypt, decompress, then import into a deployment
$ age -d -i backupd.agekey app.zip.zst.age | zstd -d > snapshot.zip
npx convex import --replace-all snapshot.zipNot yet
- There is no temporary Convex deployment to restore into, so Convex backups get an integrity check and per-table document counts instead of a full restore test.
- The export is staged on our worker’s scratch disk before it is compressed and encrypted, unlike the other engines, which stream.
- In-app restores go back into the deployment the backup came from.
- Tables whose names start with an underscore are not counted.
Questions
Yes. Exports run with file storage included, so the ZIP holds your documents and your stored files.
Use a production deploy key. backupd uses it to run convex export, and convex data to list your tables when you connect.
The ZIP is tested for integrity and we count the documents in every table. Convex has no throwaway deployment we can restore into, so there is no full restore test for Convex yet.
Back up Convex tonight
Paste a connection string, pick a schedule and add your key. Starter is free for 14 days.