THE PROBLEM

Why does iCloud exist?

Because your laptop and your phone can't easily find each other across the internet, behind NAT, behind carrier firewalls. Cloud services solved that by being the always-reachable middleman. They charge you $144 a year for the privilege.

The cloud way

Phone → Apple's data center → encrypts it → stores it → indexes it → notifies your laptop → laptop downloads it. Three round-trips. ~600ms minimum latency. $11.88/month forever.

  1. Photo leaves your phone
  2. Travels to Apple's servers
  3. Stored, scanned, indexed by Apple
  4. Travels to your laptop on demand
  5. You pay rent on it forever

The PhotoSphere way

Phone announces itself on Wi-Fi via mDNS. Laptop sees it. They've already paired (one-time, last week). Phone encrypts the photo with their shared key, POSTs it directly to laptop. Done. ~80ms.

  1. Photo leaves your phone
  2. Encrypts with per-peer key (AES-256-GCM)
  3. Travels straight to your laptop
  4. You own it. Always.
HOW IT LOOKS

Your home network is the cloud.

📡
Your home Wi-Fi
no internet required
💻
MacBook
23,481 photos
● synced
📱
iPhone
last 90 days
↻ syncing 12
🖥️
Family Hub
142 GB · always on
● synced
📱
iPad
favorites only
● synced
no cloud server · no Apple ID · no Google account
HOW IT WORKS

Pair once. Sync forever.

STEP 01

Discover

Each device announces itself on the LAN via mDNS-SD on _photosphere._tcp.local. They appear in each other's "nearby devices" list.

STEP 02

Pair

Tap "pair", scan the QR or type the 6-digit code. Both devices exchange public keys, derive a shared 32-byte AES-256 secret. Done in 5 seconds.

STEP 03

Sync

Every 30s, each device asks its peers: "what photos do you have that I don't?" Manifest is content-hashed. Only deltas transfer, encrypted with the shared key.

STEP 04

Verify

SHA-256 of every received photo is compared to the manifest. Mismatch is rejected. Photos are atomically moved into the library only after verification passes.

END-TO-END ENCRYPTION

AES-256-GCM. Every byte. Every peer.

Photo bodies are encrypted with AES-256-GCM (authenticated encryption) using a per-peer shared key. The 12-byte nonce is random per request and travels in an X-Nonce header. The auth tag is appended to the ciphertext. Tampering on the wire breaks the tag — the receiver rejects it.

  • Key derivation: SHA-256 of (your_private || peer_public). Drop-in upgrade to X25519 ECDH planned.
  • Auth: every /sync/* request carries Authorization: Bearer <device_id> matched against the trusted peer table.
  • Replay: nonces are random and per-message; receiver verifies the auth tag.
  • Wire-sniffing: a Wi-Fi attacker sees ciphertext + a 12-byte nonce. Nothing else.
$ curl -X POST \
  http://192.168.1.42:7700/sync/photo \
  -H "Authorization: Bearer 4f2c…" \
  -H "X-Photo-Uuid: 7a9b…" \
  -H "X-Nonce: a1f3b9c2…" \
  --data-binary @ciphertext.bin

{"received":2451231,"sha":"e3b0…"}

# 2.4 MB encrypted body
# AES-256-GCM auth tag: PASS
# SHA-256 verified
# stored in inbox
SYNC POLICY

Each device pulls what it needs.

Your phone doesn't have 1 TB of disk. It shouldn't have to mirror your laptop's library.

All photos

Mirror everything across two big devices (laptop + desktop). Every photo, every edit, every tag.

Favorites only

Tablet, phone — pull only your favorited photos. The rest stays on the hub. Saves disk, still always-available.

Last year only

Recent memories on every device. 10-year-old vacations only on the hub. Auto-rolls forward as time passes.

Tagged-only

Sync only photos with a specific tag (e.g. "kids", "trips"). Custom rules in YAML for power users.

Hub mode

Designate one machine as always-on. It holds the master library. Phones back up to it. Other devices pull from it.

Bandwidth control

Pause on metered Wi-Fi. Throttle to 1 MB/s during work. Schedule big syncs at 2 AM.

9:41● ● ●
Library
2,381 photos · synced 2m ago
📷 Library 📁 Albums 👤 People ⚙ Settings
MOBILE COMPANION

iOS & Android. Same library.

Native React Native app for iOS and Android. Pair, browse, instant backup. Photos taken on your phone arrive on your laptop within seconds — encrypted, over your home Wi-Fi, never via Apple's or Google's servers.

  • Auto-backup of the camera roll (when on home Wi-Fi).
  • Browse your full library, filtered by selective-sync rules.
  • Search via CLIP — your laptop does the inference, phone just shows results.
  • Live Photo support, video preview, full-resolution download.
  • Background sync hooks (iOS BGTask, Android WorkManager).

Mobile companion ships later in 2026. Email me when it's ready →

SHARED ALBUMS · CRDT

Edit offline. Merge cleanly.

"Family Trip 2024" lives on every paired device. Mom adds 30 photos on the train (no Wi-Fi). Dad adds 12 on the plane. Sister deletes 5 on the bus. When everyone gets home, all three changes merge automatically. No conflicts, no "which version wins" dialog.

Built on Automerge — the same CRDT library used by Atlassian, Notion, and Apple's Numbers collaboration.

  • Offline-first: every edit applies locally, immediately.
  • Eventually consistent: all peers converge to the same state.
  • Conflict-free by construction: not "last write wins."
  • Per-album: granular sharing without sharing your whole library.
SHARED ALBUM · 3 EDITORS
Family Trip · Italy 2024
+ 30 photos · Mom · 2h ago
+ 12 photos · Dad · 1h ago
− 5 photos · Sister · 23m ago
+ comment · Mom · 8m ago
● merged · all peers in sync

Sync is finally free.

No bandwidth caps. No per-device fees. No "Family Plan" upsell. The Wi-Fi you already pay for, doing what it should have been doing all along.