personAbout folder_openProjects articleBlog
arrow_back All projects

Project

Wanna try it? Request access.mail Contact

Utopia

A self-hosted personal finance platform with real-time market intelligence. Track every euro, monitor crypto and stocks live, and keep your data on your own server.

GoTemplDatastarPostgreSQLWebAuthn

About the Project

Utopia grew out of frustration with fragmented personal finance tools: a spreadsheet for budgets, one app for investments, another for crypto – and none of them communicating with each other. The aim was to develop a single dashboard covering all of it (income, expenses, savings, live market prices, a portfolio view) on your own hardware, with no third-party service involved.

The entire stack ships as a single Go binary with PostgreSQL running directly on the server. Authentication is passwordless via WebAuthn passkeys. Market data streams directly from Binance at one-second intervals and Yahoo Finance for equities – cached server-side so every connected client gets instant responses.

Utopia dashboard – light theme Utopia dashboard – dark theme

Key Features

dashboard Financial Dashboard

Interactive cash-flow charts, category spending breakdowns, and net-worth tracking across any date range. Built on ECharts for fluid, zoomable visualisations.

account_balance Budget Management

Set monthly spending limits per category. Actual-vs-budget bar charts highlight overspend instantly. An alert triggers when you approach or exceed the limit.

trending_up Live Market Data

Crypto prices stream from Binance WebSocket at 1-second intervals across 500+ USDT pairs. Stocks and ETFs are polled from Yahoo Finance every 60 seconds.

pie_chart Portfolio Tracking

Monitor asset allocations across crypto holdings and equity positions. Portfolio value is calculated continuously against live prices with historical performance charts.

fingerprint Passkey Authentication

Fully passwordless via WebAuthn. Your device biometric or PIN is your credential; nothing to breach, phish, or forget.

lock Self-Hosted and Private

One Go binary, PostgreSQL on the server. Spins up in minutes on any VPS or home server. Your financial data never leaves your infrastructure.

Technology

Go

Ships as a single statically-compiled binary. That one executable handles HTTP routing, database migrations, Binance WebSocket streams, Yahoo Finance polling, passkey ceremonies, and static file serving, with no interpreter or runtime required on the server. Cold starts sit under 10ms.

Templ

HTML templates that compile to typed Go functions rather than parsed strings. The practical upside is that structural errors and type mismatches are caught at build time, before anything reaches the browser. The UI is entirely server-rendered; the client receives plain HTML.

Datastar

A tiny SSE-based reactivity library that enables live DOM updates without a JavaScript framework. Dashboard widgets refresh in real-time through server-sent events, client-side complexity stays minimal while the server retains full control.

PostgreSQL

All financial data is persisted in PostgreSQL with automatic schema migrations via golang-migrate. ACID transactions ensure integrity for every import and update. Indexed aggregation queries stay fast even across years of transaction history.

WebAuthn

Passkeys are public-key credentials bound to the device; the private key never leaves it. The server stores only the public side, so there is nothing sensitive to protect on that end and nothing to reset or recover. Authentication follows the WebAuthn / FIDO2 standard throughout.

Binance WS + ECharts

A persistent Binance WebSocket connection streams 1-second miniTicker events for every subscribed pair. Prices land in an in-memory store and are served to clients via a lightweight REST endpoint. The frontend aggregates raw prices into 10-second OHLC candles rendered with ECharts, including gap-fill from Binance Klines on page load.

Live Crypto Tracker

Powered by Binance WebSocket: 1-second price updates, full OHLC candlestick charting.

Bitcoin (BTC)

Prices in EUR · fetching live rate... · Source: Binance

Easy there

You naughty boy, thou shall not spam the market data endpoint. Wait a moment before requesting again.