Mihira
Case study

VestPlan: idea to live product.

An investment simulator for people who earn, save and invest in different currencies. I designed, built and deployed it alone, alongside a full-time job, and I run it in production. It is open source, so every claim here can be checked.

Live data sources
5
Automated tests, 100% coverage
545
Languages
6
In production since June 2026
Live

The problem

Most savings calculators assume one currency and leave inflation out. That misleads anyone with a salary in reais and a fund priced in euros. VestPlan shows what a plan is worth in today’s money, in your own currency, and how wide the range of outcomes really is.

What it looks like

VestPlan from Europe, in English: a wealth projection in today’s euros, with a goal line, a shaded range of likely outcomes, and a note citing the World Bank as the inflation source.
From Europe: English, euros, a euro bond fund.
VestPlan from Brazil, in Portuguese: the same projection in reais, with a Tesouro Selic 2029 government bond in the plan.
From Brazil: Portuguese, reais, a Tesouro Selic bond.
VestPlan on a phone: the euro projection, with inflation adjustment and the estimated range switched on.
On a phone.

What I built

The product

Pick real funds and a monthly amount, and see what the plan is worth in today’s money, with an honest range around it. No account needed, and a plan can be shared as a link.

In more detail

  • React front end; the projection maths runs in the browser
  • Inflation adjustment, with a range widened by exchange-rate volatility
  • Shared plans live entirely in the link: no stored user data

Made for where you live

Brazil gets Portuguese, reais and a Brazilian government bond; Europe gets euros and a euro bond fund. Inflation comes from the official figure for each currency.

In more detail

  • Region from a GeoIP lookup, falling back to browser timezone
  • Six languages; default portfolios per region
  • Inflation from IPCA for BRL and World Bank CPI elsewhere

The data behind it

Prices, inflation and exchange rates refresh automatically from market and official sources. The figures are stored, so a source having a bad day does not take the calculator down.

In more detail

  • Java 21 and Spring Boot, PostgreSQL with Flyway migrations
  • Scheduled syncs from Yahoo Finance, the ECB, the World Bank, Brazil’s central bank and Tesouro Direto
  • Return, volatility and risk class computed from price history

Keeping it running

Releasing is one step and rolling back is changing one number. Every change runs the full test suite before it can ship.

In more detail

  • Tag-triggered image builds, pushed to the Codeberg registry
  • Rootless Podman behind a shared Caddy edge, a memory cap on every service
  • 256 backend and 289 frontend tests, coverage on every pull request

How it is monitored

Six dashboards, each answering one question someone running the site actually asks.

Backend
Is the site answering, and how fast?
Data sources
Are the outside sources behaving?
Data refreshes
Did the last refresh work?
Server
Is the machine itself healthy?
Fund usage
What do people actually plan with?
Clicks
Which links get used, and by whom?

In more detail: the monitoring stack

  • Prometheus metrics from the app and the host; OpenTelemetry traces in Tempo, 10% sampled
  • Dashboards provisioned from files in the repository and checked in CI
  • Storage capped: 15 days, and 1 GB for metrics
  • Disk-space alerts, unit-tested with promtool
In more detail

Decisions behind it

The maths runs in the browser.

Results update as you type, and there is no user data on the server to store, leak or delete.

Exchange rates are not forecast.

The central path follows the inflation difference between currencies; history only widens the range. A projection cannot invent a return out of a currency bet.

Clicks are counted without trackers.

The browser solves a small server-signed proof-of-work puzzle first. People never notice it; scripted spam becomes expensive.

What this means for your project

It gets finished and handed over.

The code, the deployment and the runbook live in your repository, not in my head. Your team can take it over without a call.

You will know when something breaks.

Dashboards and alerts from the first week, not after the first outage.

No lock-in.

Plain Linux, open-source parts and a server you own. Moving it elsewhere is a weekend, not a rewrite.

Want something like this?

A product built and running on your own domain, or an app you already have made this solid. Both are packages I offer.