Docs

Import from CleanShot

Bring your CleanShot Cloud uploads over without breaking a single link.

The trick: we keep the original IDs. If your old link was share.example.com/Xq7pL2a, the same ID lives on your server, and share.example.com redirects to your main address, so it opens drive.example.com/Xq7pL2a. IDs are case sensitive and anything matching [A-Za-z0-9_-]{3,64} works. New uploads get fresh 7 character IDs that never collide with imported ones.

Steps

  1. Export your files from CleanShot Cloud into a folder.
  2. Optional: make a manifest (CSV or JSON) with id, filename, created_at, title. Without one, the file name (minus extension) is used as the ID.
  3. Run a dry run. Nothing gets written:
shell
# put the export in ./import/cleanshot next to docker-compose.yml, then:
docker compose exec server bun scripts/import.ts /import/cleanshot --owner yourname --manifest /import/cleanshot/manifest.csv

Check the report (imported, skipped, conflicts). Happy? Run it for real:

shell
docker compose exec server bun scripts/import.ts /import/cleanshot --owner yourname --manifest /import/cleanshot/manifest.csv --apply

Example manifest:

csv
id,filename,created_at,title
Xq7pL2a,Xq7pL2a.png,2025-03-14T10:22:00Z,Bug repro
Kd93mPz,demo.mp4,2025-04-02T18:05:00Z,Launch demo

Flip DNS

Once everything's in, change share.example.com from the CleanShot CNAME to your server (or your Cloudflare Tunnel). Stavo treats it as an extra domain and redirects to drive.example.com. Old links start resolving on your box. Spot check a few from your Slack history.