Back to home
Next.jsGoPostgreSQLOllamaDockerTelegram Bot APINginx

WheresMyMoney

AI-powered personal finance platform with local LLMs, Telegram bot, and a Go backend.

WheresMyMoney dashboard

Overview

A full personal finance management system where AI categorizes transactions through natural language — running local models via Ollama for privacy. Integrated with Telegram for quick expense logging, web dashboard built in Next.js, REST API in Go, and self-hosted on a VPS with Docker and Nginx.

The Challenge

Existing personal finance apps share your financial data with third-party AI services to provide categorization. I wanted AI-powered insights without compromising transaction privacy — which meant running the language models locally.

Additionally, the friction of opening an app to log an expense means you forget most of them. The integration needed to live where I already was: Telegram.

Architecture

Frontend

  • Next.js (App Router)
  • TypeScript
  • TailwindCSS

Backend

  • Go (REST API)
  • PostgreSQL
  • Docker Compose

AI Layer

  • Ollama (local LLMs)
  • Natural language parsing
  • Category inference

Infrastructure

  • VPS (self-hosted)
  • Nginx (reverse proxy)
  • Telegram Bot Webhook

Key Technical Decisions

Why Go for the backend?

The REST API handles concurrent webhook requests from Telegram and web dashboard queries simultaneously. Go's concurrency model (goroutines) handles this naturally without callback complexity, and the compiled binary has negligible memory overhead on a small VPS.

Why Ollama for local LLMs?

Running Qwen2.5:7b locally means zero API costs, no data sent to external services, and full control over the model. Ollama's Docker image made deployment trivial. The tradeoff is inference latency (~2-3s per categorization) which is acceptable for async expense logging.