Open Source

Self-Hosted Personal Finance for Global Citizens

AI-powered transaction classification, real-time portfolio tracking, and event-driven analytics. Secured by AES-256 encryption. Built for self-hosting. Designed for global finances

Bliss capybara mascot in a turtleneck, seated in a mid-century chair beside currency coins

Multi-Currency P&L

A complete profit & loss view across all your accounts, currencies, and countries. Bliss automatically converts every transaction to your portfolio currency using historical FX rates, giving you a unified financial picture.

  • Category-level breakdown with group aggregation
  • Multi-country, multi-currency consolidation
  • Monthly and yearly comparisons with trend analysis
  • Investment income and expense separation
View analytics specs
Bliss Finance P&L report showing category breakdowns, income vs expenses, and multi-currency consolidation

Architecture at a Glance

Three services behind a single .env file. The SPA talks to the API via REST, and the API delegates heavy work to the backend through an event-driven pipeline.

Nginx (:8080)
├── React SPA (Vite + shadcn)
│   └─► REST APIs (JWT in HttpOnly Cookie)
│
└── Next.js API (:3000)
    ├── NextAuth, >60 endpoints
    ├─► PostgreSQL 16 + pgvector
    │   AES-256-GCM encryption
    │   768-dim embeddings
    │
    └─► Express Backend (:3001)
        Internal REST (API key auth)
        Event-driven pipeline
        10 BullMQ Workers
        │
        ├─► Redis (cache + job queues)
        ├─► Gemini (AI classification)
        ├─► Plaid (bank sync)
        ├─► TwelveData (stock prices)
        ├─► CurrencyLayer (FX rates)
        └─► Sentry (observability)

Tech Stack

  • Next.js 15 API (Pages Router, ESM)
  • Express + BullMQ Backend (CJS)
  • React 18 + Vite SPA (shadcn/ui)
  • PostgreSQL 16 with pgvector
  • Redis 7 (BullMQ queues)
  • Prisma 6 ORM + AES-256-GCM encryption

10 BullMQ Workers

Every heavy operation runs asynchronously. Classification, portfolio valuation, analytics, insights, Plaid sync, and security master refresh — all processed via dedicated workers with structured error reporting.

Read the architecture guide