The Problem
Freelancers and small businesses need to send invoices and quotes without depending on cloud services, subscriptions, or giving up control of their financial data. Existing SaaS tools create lock-in, require internet access, and often expose sensitive client and business data to third parties. Offline desktop alternatives tend to be either overly complex or poorly maintained.
What This Does
Invoice Builder is an offline-first Electron application for creating, managing, and exporting invoices and quotes. All data lives in a local SQLite database file (src/main/database.ts) that the user owns. The app exposes CRUD operations for businesses, clients, items, categories, units, and currencies through a well-organized IPC layer (src/main/ipc/).
The renderer is a React/TypeScript SPA (src/renderer/app/App.tsx) with a modular page structure under src/renderer/pages/. The invoice form is particularly granular, split into focused components like BusinessSelector.tsx, ClientSelector.tsx, and dropdown components for tax, discounts, and payments. PDF generation supports A4/Letter formats, layout presets, watermarks, and attachments. i18n covers English, French, and Lithuanian (src/renderer/i18n/). A migration system (src/main/migrations/) handles schema evolution.
How To Use It
Setup
npm install npm run dev
Configuration
.env.development.example, .env.production.example, and .env.test.example define expected environment variables. electron-builder.yml handles packaging for Windows, Linux, and macOS. No external services or API keys are required; the app runs fully offline.
Running it
Dev mode: npm run dev launches the Electron app. Production build: npm run build followed by npm run dist (per standard Electron patterns, though exact scripts should be confirmed in package.json). The main process entry point is src/main/main.ts; the renderer entry is src/renderer/main.tsx.
Real-World Use
A small consultancy with a handful of clients can run Invoice Builder on a single Windows or macOS machine. The consultant creates a business profile, adds clients and line items, then generates a branded PDF invoice with partial payment tracking. All data stays in a local database file that can be backed up via the app's JSON export or full database backup features. The history of invoices remains immutable, which supports auditability.
Code Health & Issues
Med - Large vendored font payload: src/renderer/assets/roboto/ contains dozens of font files, inflating repo size. Could be trimmed to a subset or loaded from a CDN (though offline-first argues against CDN). Low - Typo in utility filename: src/main/utils/dbFuntions.ts should be dbFunctions.ts. Minor, but indicates a lack of strict linting enforcement. Low - Mock service worker in production path: public/mockServiceWorker.js and src/renderer/mocks/ suggest MSW is configured; ensure it's excluded from production builds. Positive signals: CI via GitHub Actions (.github/workflows/main.yml), Dependabot enabled, issue/PR templates, code of conduct, security policy, and a license are all present. Two test files exist, though coverage is likely thin for a 200-file codebase.
The Bottom Line
Invoice Builder is a genuinely useful, well-structured desktop app for freelancers and small businesses that want offline invoicing with full data ownership. The architecture is clean, the feature set is broad (multi-currency, partial payments, custom PDFs, i18n), and the project shows professional maintenance habits. It's not a SaaS replacement for teams needing collaboration or cloud sync, but for a solo operator or small practice, it's a credible, privacy-respecting tool worth evaluating.