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
- Export your files from CleanShot Cloud into a folder.
- 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. - Run a dry run. Nothing gets written:
# 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.csvCheck the report (imported, skipped, conflicts). Happy? Run it for real:
docker compose exec server bun scripts/import.ts /import/cleanshot --owner yourname --manifest /import/cleanshot/manifest.csv --applyExample manifest:
id,filename,created_at,title
Xq7pL2a,Xq7pL2a.png,2025-03-14T10:22:00Z,Bug repro
Kd93mPz,demo.mp4,2025-04-02T18:05:00Z,Launch demoFlip 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.