Case Study

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.

nomadwealth_dashboard

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.

NomadWealth dashboard showing total net worth in a chosen currency, asset-class breakdown and a net-worth-over-time chart
The single-source net-worth cockpit: every asset class aggregated into one live, multi-currency total.

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.

Sell without seeing the data
Ship a commercial product where the vendor structurally cannot access any customer’s financial values — no analytics, no error payloads, no phone-home.
Deploy without a terminal
Take a buyer from “click deploy” to a working, signed-in, multi-currency dashboard with no shell, no manual migrations and no config files.
Package, don’t rewrite
Add licensing, multi-tenancy-of-one, setup and import around the existing net-worth engine while preserving its data model and behaviour.
Licensing that works offline
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.

One-click self-host
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.
Guided 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.
Offline license activation
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.
Privacy-first web importer
Spreadsheets are parsed entirely client-side, mapped and previewed in the browser, then committed per asset class — financial values never touch a vendor server.

NomadWealth setup wizard step confirming the connected Neon database and running migrations automatically
The setup wizard takes a buyer from a blank deployment to a migrated database and an activated license without opening a terminal.

Core functionality included

Whole-net-worth aggregation
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.
Live multi-currency switching
The whole cockpit re-denominates instantly between EUR, USD, GBP and RON using keyless Frankfurter FX rates — no page reload, no vendor key required.
Live market prices
US and Bucharest-exchange equities price from Yahoo (keyless); crypto uses the buyer’s own optional CoinMarketCap key, refreshed by a daily authorised cron.
FIRE projection
A financial-independence projection models growth against a target so the owner can see their trajectory, not just today’s balance.
Loans with real yield maths
Private loans accrue interest, track expected vs actual receipts and compute an effective annualised yield (IRR) over real cashflows — all unit-tested pure functions.
Dividends & realised performance
Dividend income and realised trades are tracked separately from unrealised P/L, with average-cost aggregation per symbol.
Watchlist & price alerts
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.
Read-only share links
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.
Owner auth with 2FA
A hashed owner password (PBKDF2 via Web Crypto) set in the wizard, with optional TOTP two-factor and QR enrolment.
One-click data export
An owner-only export streams every financial table out of the buyer’s own database, deliberately excluding secrets — their data is never locked in.
Soft-delete & trash
Records soft-delete via deleted_at and land in a recoverable trash view rather than being destroyed.
Installable PWA
A web manifest, theme-color and Apple web-app metadata make the cockpit installable to the home screen.
Public marketing & security site
SEO-optimised /welcome, /cockpit showcase and a /security page that states the no-data-access guarantee plainly, plus comparison and changelog pages.

NomadWealth web importer showing a spreadsheet parsed client-side, columns mapped to asset fields and a preview before commit
The importer parses and previews spreadsheets entirely in the browser, committing per asset class so raw financial data never leaves the buyer’s machine until it hits their own database.
A read-only shared dashboard view alongside a price-alert notification
Hashed-token share links and server-side alerts extend the cockpit outward without ever weakening the single-owner security model.

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.

Privacy as an invariant
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.
Runtime migrations, not dev tooling
Embedded SQL applied over the Neon driver and tracked in a migrations table means buyers migrate without ever running a CLI.
First-run guard middleware
Unconfigured installs funnel to the wizard; a signed cookie fast-paths configured ones, while marketing routes stay always-public.
Offline, forge-proof licensing
Ed25519 signatures verified locally; setup re-verifies the signed key server-side and rejects empty or trial keys to close the free-deploy loophole.

The public /security page stating that the vendor cannot see buyer data, licensing is offline and no analytics capture financial values
The public security page makes the architecture’s core promise legible to buyers — and the code is written to keep that page honest.

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.

A sellable, self-hosted product
One-click Vercel + Neon deploy, a guided wizard and offline activation turned a personal tool into something a non-technical buyer can run.
A provable privacy guarantee
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.
Zero-terminal onboarding
Runtime migrations and the setup wizard remove every CLI step from the buyer’s path to a working dashboard.
A complete financial picture
Six asset classes, live prices, FX, dividends, alerts and a FIRE projection in one cockpit rather than a spreadsheet plus five apps.
No lock-in
One-click export and soft-delete recovery mean the owner always controls and can extract their own data.
An extensible packaging layer
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.

Double opt-in required. One quick confirmation click and you're in.

ND

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.

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.

Get in Touch

Free 30-minute consultation • No commitment required • For business ready