NomadWealth: Self-Hosted Net-Worth App
Turning a personal finance dashboard into a self-hostable commercial product — one private cockpit for holdings, real estate, loans, cash and a FIRE projection, deployed to the buyer’s own Vercel and Neon Postgres, built so the vendor can never see their data.

Project overview
NomadWealth is a self-hostable personal net-worth and investment cockpit — one private dashboard for your entire financial picture, not just your stocks: public holdings, real estate, private loans, cash, business income and a FIRE projection, all switchable live between EUR, USD, GBP and RON. It began life as a single-user, env-password personal dashboard I built for my own finances, then I packaged it into a sellable product that each buyer deploys to their own Vercel and connects to their own Neon Postgres.
The defining constraint shaped every decision: as the vendor, I literally cannot see the buyer’s data. It lives in a database only they hold the keys to, reached only by code running in their account. This phase turned a working personal tool into a productised, one-click-deployable app — a setup wizard, an in-browser importer, offline license activation and a marketing site — added around the existing domain features rather than on top of a rewrite. The work overlaps most closely with custom Next.js development, product engineering and privacy-first architecture.

The challenge
A dashboard I’d written for myself worked, but it was single-user, assumed one hard-coded password and one database, and stored secrets in environment variables. To sell it, I had to make it something a non-technical buyer could stand up in minutes and trust with their most sensitive data — without gutting the domain features that made it useful in the first place.
Ship a commercial product where the vendor structurally cannot access any customer’s financial values — no analytics, no error payloads, no phone-home.
Take a buyer from “click deploy” to a working, signed-in, multi-currency dashboard with no shell, no manual migrations and no config files.
Add licensing, multi-tenancy-of-one, setup and import around the existing net-worth engine while preserving its data model and behaviour.
Verify a paid license on an install the vendor can’t reach, with no license server in the request path and no data ever leaving the buyer’s deployment.
What was delivered
I built the packaging layer additively on top of the personal dashboard, keeping the “no vendor data access” invariant as a hard rule that every new feature had to respect. That included a one-click Vercel + Neon deploy, a guided setup wizard, runtime database migrations that need no dev tooling, offline Ed25519 license activation, a privacy-preserving in-browser importer, and a public marketing and security site — while the domain cockpit itself gained live prices, alerts, sharing and a data export.
A Deploy-with-Vercel flow provisions a fresh Neon Postgres via the native integration, injects the connection string and boots straight into the setup wizard.
A first-run wizard confirms the database, runs migrations, activates the license, sets the owner password and offers a CSV/Excel import or an empty start.
Ed25519-signed keys verified against a public key embedded in the app, with an optional opaque revocation check that sends only the key — never data.
Spreadsheets are parsed entirely client-side, mapped and previewed in the browser, then committed per asset class — financial values never touch a vendor server.

Core functionality included
Public holdings, real estate, private loans, cash, business income and freelance clients roll up into one live total, with an asset-class breakdown and net-worth-over-time snapshots.
The whole cockpit re-denominates instantly between EUR, USD, GBP and RON using keyless Frankfurter FX rates — no page reload, no vendor key required.
US and Bucharest-exchange equities price from Yahoo (keyless); crypto uses the buyer’s own optional CoinMarketCap key, refreshed by a daily authorised cron.
A financial-independence projection models growth against a target so the owner can see their trajectory, not just today’s balance.
Private loans accrue interest, track expected vs actual receipts and compute an effective annualised yield (IRR) over real cashflows — all unit-tested pure functions.
Dividend income and realised trades are tracked separately from unrealised P/L, with average-cost aggregation per symbol.
A watchlist plus threshold price alerts, evaluated server-side and delivered via Web Push and email so the owner is notified without opening the app.
Shareable view-only links to a chosen subset of tabs, gated by a 256-bit token whose SHA-256 hash is all the database stores — viewers structurally cannot reach session-gated actions.
A hashed owner password (PBKDF2 via Web Crypto) set in the wizard, with optional TOTP two-factor and QR enrolment.
An owner-only export streams every financial table out of the buyer’s own database, deliberately excluding secrets — their data is never locked in.
Records soft-delete via
deleted_at and land in a recoverable trash view rather than being destroyed.A web manifest, theme-color and Apple web-app metadata make the cockpit installable to the home screen.
SEO-optimised
/welcome, /cockpit showcase and a /security page that states the no-data-access guarantee plainly, plus comparison and changelog pages.

Key architecture decisions
The guiding principle was to extend, not rebuild. The personal dashboard already had a working net-worth engine, a Drizzle/Neon data model and a session mechanism, so productisation added a thin packaging layer — licensing, setup, import and marketing — with almost no change to the underlying domain schema. The non-negotiable invariant sat above everything: the vendor can never see buyer data, which ruled out conventional analytics, error reporting with payloads and any license server in the hot path.
Two decisions did the heavy lifting. First, migrations run at runtime over the Neon driver rather than through drizzle-kit — the SQL is embedded into the app, applied by the setup wizard and tracked in a bookkeeping table, tolerant of “already exists” so it stays idempotent on restricted serverless hosts. Second, a first-run guard in middleware redirects every route to /setup until the install is configured, then fast-paths warm requests with a signed cookie. Licensing is offline by design: keys are Ed25519-signed and verified against a public key baked into the binary, so activation needs no network call at all.
No analytics on financial values, no error payloads, no vendor services at boot — the app runs with only a database URL and a session secret.
Embedded SQL applied over the Neon driver and tracked in a migrations table means buyers migrate without ever running a CLI.
Unconfigured installs funnel to the wizard; a signed cookie fast-paths configured ones, while marketing routes stay always-public.
Ed25519 signatures verified locally; setup re-verifies the signed key server-side and rejects empty or trial keys to close the free-deploy loophole.

Results and outcomes
The project became a genuinely self-hostable commercial product: a buyer can go from a single click to a working, signed-in, multi-currency net-worth cockpit on infrastructure they wholly own, with the vendor unable to read a single figure. The domain features I originally built for myself now ship as a polished, privacy-first app.
One-click Vercel + Neon deploy, a guided wizard and offline activation turned a personal tool into something a non-technical buyer can run.
Client-side import, offline licensing and zero data-capturing telemetry mean the “we can’t see your data” claim is architectural, not a policy promise.
Runtime migrations and the setup wizard remove every CLI step from the buyer’s path to a working dashboard.
Six asset classes, live prices, FX, dividends, alerts and a FIRE projection in one cockpit rather than a spreadsheet plus five apps.
One-click export and soft-delete recovery mean the owner always controls and can extract their own data.
Licensing, setup, import and marketing were added around the domain model, so new asset classes or features slot in without touching the core.
Technology used
NomadWealth is built with Next.js 15 (App Router), React 19 and TypeScript, styled with Tailwind and shadcn/ui in a dark, cockpit aesthetic with Framer Motion, and charted with Recharts and lightweight-charts. Data runs through Drizzle ORM on Neon serverless Postgres with Zod-validated Server Actions. Licensing uses Ed25519 signatures via the Web Crypto API; owner auth uses PBKDF2 and TOTP; alerts use Web Push (VAPID) and email; FX comes from Frankfurter and prices from Yahoo and (optionally) CoinMarketCap. It deploys to Vercel via a one-click template and the native Neon integration.
The delivery is most relevant to custom Next.js and full-stack development, privacy-first product engineering and ongoing support for self-hostable SaaS.
Next steps
This case study covers the productisation of a working personal dashboard into a self-hostable, sellable app. The next stage is launch hardening and growth: broadening the setup and import paths, deepening the alerting and projection tooling, and running the marketing, licensing and renewal loop that sits alongside the product — all while holding the line on the no-vendor-data-access invariant.
If you are turning an internal tool into a self-hostable product, or need a privacy-first full-stack build where the vendor genuinely can’t see customer data, the most relevant starting points are usually custom development and ongoing support.
Looking for similar outcomes? Start with SaaS Development and browse more project examples.
Best matched offer
This project is closest to SaaS Development. Start there if you want a similar outcome.
Newsletter
Get useful WordPress emails
Practical fixes, cleaner SEO wins, and lessons from real builds.
What this proves
This project shows the kind of commercial problem the work is built around: clearer implementation, fewer technical compromises and a better path from website investment to business outcome. If you need a similar approach, explore SaaS Development and practical implementation guides.
Keep exploring
Quick paths to related services, practical guides and real project examples, curated to help visitors move from curiosity to action.
Related services
Relevant case studies
Related guides
How to Turn Your WordPress Website Into a Progressive Web App
How a Progressive Web App can turn a WordPress website into a faster, app-like experience with home screen acc...
Custom WordPress Development vs Page Builders: What Actually Scales in 2026
Page builders are useful for speed, but custom WordPress development usually scales better when performance, S...
Why I Switched to Kinsta Hosting: A Game-Changer for My Business
Switching hosting providers can have a bigger impact than most WordPress site owners expect, improving speed,...
Want Similar Results for Your Business?
Let's discuss how I can help scale your website with a custom solution tailored to your business needs. From performance optimization to complete redesigns, I deliver results that drive growth.
Free 30-minute consultation • No commitment required • For business ready
