Talib Ibrahim

03 / 12

Orbit

A self-hosted dashboard that keeps a photo library in more than one place.

Kind
Self-hosted dashboard
Role
Solo
Year
2026
Stack
  • Next.js
  • TypeScript
  • Node.js
  • SQLite
  • Syncthing
  • Docker
  • Tailscale
Orbit on a desktop browser and a phone, with demo data: the overview dashboard and the phone offload screen, beside the headline "Every photo. Three places. Proven."

The problem

Immich is a good self-hosted photo app, but its own docs say it is not a backup. People who want three copies, one of them offsite, end up wiring Syncthing, cron jobs and manual checks together. The worst moment is deleting photos from a phone without knowing they are really safe.

The hard call

Checking that a copy is good means hashing files, and hashing a whole library every time would bury the disks in I/O. Orbit hashes recent uploads plus a random 2% of older files, and checks size and database freshness on every copy. The phone only reads "safe to offload" once all of that passes.

What I built

A hub that polls an agent on each device every 60 seconds and caches the last good answer in SQLite, so an offline device shows "last seen", not an error. Everything binds to Tailscale with no public ports. Database dumps run nightly to every copy, and one button promotes an Oracle Cloud Always Free standby.

Outcome

Checked against Immich v3.3.0 and Syncthing v2.1.6. It has an agent test suite and a written restore-test checklist, and it updates itself nightly. I run it on my own photo library. The screenshots use demo data.

Recruiter mode