
Starting Point
Existing tools charge monthly fees or store financial data on third-party servers. I wanted a self-hosted solution that does exactly what I need — with support for German tax requirements and international use.
Implementation
German invoice requirements (§14 UStG, §19 UStG, §14b UStG) as the foundation.
Monorepo with SvelteKit frontend and Fastify API. PostgreSQL with Drizzle ORM.
Server-side PDF generation with pdf-lib. No browser, no Puppeteer.
German invoice requirements (§14 UStG, §19 UStG, §14b UStG) as the foundation.
Monorepo with SvelteKit frontend and Fastify API. PostgreSQL with Drizzle ORM.
Server-side PDF generation with pdf-lib. No browser, no Puppeteer.
Functions
Explore the key capabilities

Invoices & PDF
Sequential numbering, §14-UStG-compliant fields, live preview, archiving.
Dashboard
Monthly overview, open items, year comparison.


Dunning
Three stages: payment reminder, first dunning, final dunning. Dedicated PDF templates.
Expenses
Tracking with tags, payment methods, receipt uploads. CSV export for tax advisors.

Technical Details
Monorepo architecture. TypeScript end-to-end from API to frontend.
Svelte 5 Runes for state management. SvelteKit for routing and SSR.
Fast Node.js server. JWT auth, REST API, file uploads.
Relational database for financial data. Drizzle for type-safe queries.
Server-side PDF creation. Manual positioning, but zero dependencies.
Status
Covers the complete freelancer workflow: clients, invoices, dunning, expenses, exports. Runs self-hosted on your own server or locally on your PC.
Open source on GitHub.
pdf-lib has no HTML rendering — every element needs manual positioning. More work, but full control over every detail.
Drizzle migrations don't run automatically on schema changes. Manual trigger at startup saves debugging.