Self-hosted, for anyone
Python's server, packed into one program with PyInstaller, starts with the desktop app — or runs inside the Android app itself (Chaquopy), so a phone alone can host everything.
One app for finances, tasks, calendar, habits, notes, goals, study, training and more — built by one person, engineered so your data never leaves your own devices, and tested like a product.
The demo runs Atlas Compass on a public server with sample data — no sign-up, reset daily.
The app isn't a website: its server runs on the buyer's own computer or phone. The only thing on our side is the store — and it never sees anyone's data.
Python's server, packed into one program with PyInstaller, starts with the desktop app — or runs inside the Android app itself (Chaquopy), so a phone alone can host everything.
A single React + Vite front end, packaged as Electron on Windows and Capacitor on Android, with narrow-screen layouts of its own for the phone.
A sync socket tells every signed-in device what changed, so the phone and the computer update at once without polling.
Each account has its own database, encrypted with SQLCipher. Its random key is stored only wrapped twice — by the account's password and by a recovery code — each through PBKDF2-HMAC-SHA256 with 600,000 iterations. Lose both and nobody, including the author, can open it.
Each install has an Ed25519 identity and an X25519 key, paired once with a QR code. Away from home, the phone leaves its signed offer on public Nostr relays: sealed to the computer's key (ephemeral X25519 + HKDF + AES-GCM), under a mailbox tag that rotates hourly, with a throwaway key per message. The relays can't read it, link it, or sit in the middle.
A key is a small signed payload: Ed25519 over the buyer's email and order, in base32. The app checks it locally, forever, with no activation server. Updates are announced through a signed feed, so the app only trusts news that really comes from the store.
On the phone, what was seen is cached and every change made offline waits in an ordered queue with its own operation id, so a retry is never applied twice. When two devices changed the same thing, it's merged field by field; only a real clash is shown, with a history to undo it.
Cloudflare Pages Functions on a free plan. Payment webhooks are signature-checked (Paddle's within five minutes; Mercado Pago's payment fetched back from its own API), and fulfilment is idempotent — a retried notification never makes a second key or a second email. Orders in D1, installers in R2 behind the key, a key shown on the thank-you page so it never depends on email.
The author's own full app, Atlas Compass (what's sold), the public demo and a TV app all come from the same repository, chosen by build flags. Each edition closes on the server what it doesn't include (not just hides it), and tests keep every edition honest.
The choices behind how it works, and why.
A personal app holds finances, health, notes and contacts. Keeping the server on the buyer's own computer or phone means there is no central database to breach, no account to lose, and nothing that stops working if a company does. The cost — no automatic cloud — is covered by device-to-device sync and backups the user controls.
Instead of one database with rows per user, every account gets its own SQLCipher file and its own key. One person's password can never open another's data, an account can be moved, exported or deleted as a single file, and a damaged file affects only that account.
An activation server would make a local, private app depend on someone else being online. A signed key verified with an embedded public key works forever, without a connection, and can't be forged — so the app keeps working exactly the same no matter what happens to the store.
A phone that was offline replays its queue when it reconnects, and a request can be retried after a dropped connection. Each change carries an operation id the server remembers, so it's applied exactly once; and two devices editing the same item are merged field by field, so only a real clash needs the user.
Payment providers retry their notifications, and email can be late or land in spam. Fulfilment is idempotent — one key per order, however many times it's notified — and the thank-you page shows the key itself as soon as the payment is confirmed, with the email as a copy.
The full app, Atlas Compass and the public demo share one repository, chosen by build flags, so a fix reaches all of them at once. What an edition leaves out is closed on the server, not just hidden in the interface, and the test suite checks every edition separately.
Every push to main runs on clean GitHub-hosted machines. Nothing reaches the public demo unless every check passes.
The web app builds on Linux (which catches file-name case bugs Windows forgives) and stays within an 800 KB startup budget; the server installs from scratch, its migrations form a single line and 300+ unit tests pass — the license, the editions, sync, currencies, backups; Playwright drives the real server in a browser; the store's payment flow is tested with the providers faked.
Only a green main redeploys the public demo, which runs Atlas Compass itself. A version tag (v*) builds the Windows installer and the Android APK and publishes them with that version's section of the changelog; the store and its database deploy with Wrangler.
The demo is a two-stage Docker image run as an unprivileged user with a health check, described in render.yaml; the store's bindings (D1, R2, KV) live in wrangler.toml and its schema in schema.sql. Everything can be recreated from the repository.
Nicolas Lozano · LinkedIn · [email protected]