Offline invoicing with full data ownership.
Invoice Builder is an offline-first, open-source invoicing and quoting application for freelancers and small businesses who want full control over their data.
No accounts. No cloud. No subscriptions.
Your data stays on your machine in a database file you own.
Invoice Builder is designed for freelancers, contractors, and small businesses who want:
- Full ownership of their data - no cloud lockβin
- Offline access - works anywhere, anytime
- A predictable, transparent tool - no subscriptions, no hidden sync
- Cross-platform support - macOS, Windows & Linux
- Import/export freedom - JSON, XLSX, full database backups
- Highly customizable PDFs - branding, layout, colors, typography
- UBL & Peppol BIS 3.0 support β generate invoices that are compliant with European e-invoicing standards for automatic submission to buyers and public administrations
If you value privacy, portability, and control, this app is built for you.
- Create and manage Invoices and Quotes
- Offline-first: works without internet
- Database-file based (create or open a database anywhere)
- Automatic snapshotting of business, bank, style profile, client, item, and currency data per invoice/quote
- Multi-currency support: choose the currency for each invoice/quote individually
- Responsive layout - usable on small and large screens, resizable windows supported
- Invoice/Quote translations β select a language per document, independent of app settings
- Export invoices in UBL 2.1 / Peppol BIS Billing 3.0 XML format, fully compliant for automated e-invoicing
- Export invoices in XRechnung (UBL 2.1) XML format, fully compliant for automated e-invoicing
- Banks, Businesses, Clients, Items, Categories, Units, Currencies
- Persistent search, persistent sort, persistent filter, archive (non-destructive)
- XLSX import/export for most entities
- Automatic creation of missing units/categories on item import
- Fixed or percentage discounts
- Shipping fees
- Tax:
- inclusive or exclusive
- per-item or on total
- deducted tax
- Partial payments, balance due tracking
- Invoice states: unpaid, partially paid, paid, closed
- Quote states: open, closed
- Live PDF preview
- A4 / Letter formats
- Layout presets
- Color, font size, font family (Supported fonts: Helvetica, Times-Roman, Courier, Roboto, Inter), logo size customization
- Table header & row styles
- Uppercase label toggle
- Quote & invoice watermarks (including paid watermark)
- Attachments: include images in PDFs
- Signature support: upload or hand-draw signatures and apply them to PDFs
- Style profiles are now available for invoices and quotes, enabling quick, consistent theming
- Show quantity, unit, and row number in the PDF item table
- Custom header sections and custom values in the PDF item table
- Ability to reorder all columns/headers in the PDF item table
- Ability to include QR codes for payment into PDF
- Ability to customize invoice / quote labels to custom text
- Aggregated data
- Charts and summaries
- Full database backup & restore
- Export all data to JSON and import back
- Export to XLSX for most entities
- Invoices and quotes support export (historical documents remain immutable)
- Language selection: currently French, German, English and Lithuanian
- Number & date formatting (e.g.
1,234.10vs1.234,10) - Invoice/quote number prefix & suffix
- File name customization for exported PDFs
- Light & dark mode
- Enable/disable UBL 2.1 Peppol BIS Billing 3.0, reports, style profiles, presets and quotes
- Check for updates via GitHub releases
- Presets: Predefine default Invoice/Quote data (e.g., business, client, currency, bank, style profile, notes, language, signature) to streamline document creation
- Windows: 10 or newer, 64-bit
- Linux: any modern distribution (Ubuntu, Debian, Linux Mint, etc.) supporting .deb packages
- macOS: 11.0 (Big Sur) or newer, Apple Silicon (M1/M2/M3/M4), 64-bit, .dmg installer available
- Memory: 2 GB RAM minimum (1 GB may work for very small datasets)
- Disk space: ~200 MB for the installer; ~550mb for the app; additional space needed for database files
Invoice Builder now supports two database backends:
| Storage Type | Description | Best For |
|---|---|---|
| SQLite (local file) | Simple, portable, zeroβconfiguration database stored as a single file | Solo users, offline use, desktop mode |
| PostgreSQL (server) | Networkβaccessible database server with concurrency and robustness | Multiβuser setups, Docker deployments, NAS/servers |
Users can now choose between:
- Creating or opening a local SQLite database file, or
- Connecting to a PostgreSQL server by entering host, port, username, password, and database name.
This makes Invoice Builder flexible for both lightweight personal use and more advanced multiβdevice or multiβuser environments.
Invoice Builder can also be self-hosted using Docker for users who prefer running it on their own server or NAS.
This option is ideal if you want:
- Centralized access from multiple machines
- Easy backups via mounted volumes
A pre-built image is published automatically to GitHub Container Registry on every push to main and on every version tag:
ghcr.io/piratuks/invoice-builder:latestPull it at any time with:
docker pull ghcr.io/piratuks/invoice-builder:latestβΉοΈ
VITE_API_URLis no longer needed for Docker deployments. The Docker image now uses nginx as the frontend server. Nginx proxies all/api/*requests to the backend internally, so the frontend never needs to know the backend's external address.VITE_API_URLis only needed when running the web server outside Docker (e.g.npm run dev:react,npm run dev:webserver).If you build the image yourself for non-Docker use, you can still pass it:
docker build --build-arg VITE_API_URL=http://your-host:3000 -t invoice-builder .But for all standard Docker deployments you can omit it entirely.
The default setup runs backend and frontend as separate containers from the same image.
docker compose pull
docker compose up -d| Container | Port | Role |
|---|---|---|
backend |
3000 | Node.js REST API + SQLite/PG |
frontend |
3001 | Static SPA served by serve |
Run both backend and frontend in one container using SERVICE=all:
docker compose -f docker-compose.standalone.yml up -d| Port | Role |
|---|---|
| 3000 | Node.js REST API + SQLite/PG |
| 3001 | Static SPA served by serve |
If you prefer to build the image from source:
# Two-container build
docker compose up -d --build
docker compose up -d
# Or single container
docker build -t invoice-builder .
docker compose -f docker-compose.standalone.yml up -dDownload the latest release from the GitHub Releases page:
β‘οΈ Download Latest Release
No account required.
β οΈ Browser download warningWhen downloading the app, your browser may show a message like:
- βThis file is from an unknown sourceβ
- βThis file is rarely downloadedβ
This is normal for newly published apps and does not indicate a security issue.
Simply choose Keep anyway / Save anyway to proceed with the download. π§ Linux package warningOn some Linux distributions (Ubuntu, Linux Mint, etc.), you may see messages such as:
- βThis package is provided by a third partyβ
- βInstalling software from outside the official repositories may be unsafeβ
This warning appears because the app is not distributed via the default system repositories.
If you downloaded the package directly from the official GitHub Releases page, it is safe to proceed. π macOS Gatekeeper warningBecause this app is unsigned, macOS may display a message like:
- βApp is damaged and canβt be opened. Move to Trashβ
- βApp is from an unidentified developerβ
This happens because macOS Gatekeeper treats all unsigned apps downloaded from the internet as potentially unsafe.
It adds a special quarantine flag to the app bundle, which prevents it from launching.To fix this, after downloading and installing it:
Open Terminal.
Run the following command:
sudo xattr -rd com.apple.quarantine "/Applications/Invoice Builder.app"
- Launch the application
- Create a new database file or open an existing one
- Add at least:
- a Business
- a Currency
- a Client
- a Bank
- an Item
- Create your first Invoice or Quote
- Preview and export to PDF
Detailed tutorials and usage guides are available here: TUTORIAL
When an invoice or quote is created, snapshots of the following are stored with the document to ensure historical accuracy:
- Bank
- Business
- Client
- Items
- Currency
- Style profile
Changes to these entities do not affect existing invoices or quotes.
Snapshots are updated only when editing an invoice or quote and changing the associated client, business, item, or currency.
You can:
- Back up and reopen the full database file
- Export all data to JSON and import it back
- Export entities to XLSX for manual editing
- Import entities from XLSX
Note: Invoices and quotes are export-only to preserve historical data integrity.
Clone the repository, install dependencies, and start the development server:
git clone https://github.com/piratuks/invoice-builder.git
cd invoice-builder
npm install
npm run devgit clone https://github.com/piratuks/invoice-builder.git
cd invoice-builder
npm install
npm run dev:react
npm run dev:webserver- .env.development
VITE_ENABLE_MOCKS={true|false} # Enables or disables mock data (Currently no mocked data is ready)
VITE_API_URL={url} Backend webserver URL when running without Electron (Web/Docker mode)
- .env.production
VITE_API_URL={url} Backend webserver URL when running without Electron (Web/Docker mode)- .env.test
VITE_API_URL={url} Backend webserver URL when running without Electron (Web/Docker mode)- other (Some configuration values are not controlled through .env files and instead live directly in the codebase)
- Webserver configs (which are used only running locally not via docker) -> backend/webserver/config.ts
- Electron configs -> backend/main/config.ts
/src
/backend β Electron + Webserver
/main β Electron main process
/assets - Static resources required by the main process
/ipc - Your interβprocess communication layer
/webserver - Web server (REST API)
/controllers - HTTP request handlers (GET, POST, PUT, DELETE)
/utils - Utility helpers used by the webserver
/shared - Environmentβagnostic logic (used by both Electron and Webserver)
/db - Database access layer shared across environments
/enums - Centralized TypeScript enums used by the main process
/migrations - Folder is used to manage and version database schema changes.
/services - Business logic for each database entity
/types - TypeScript interfaces and type definitions used exclusively by the Electron/Webserver
/utils - Shared utility functions
/preload β Electron preload scripts
/renderer β UI code
/__tests__ β UI unit tests
/app β Core React application
/assets β Fonts, images, and other static assets
/i18n β Translation files
/mocks β MSW (mock service worker) for testing
/pages β React components related to routing
/state β Redux-related code
/shared
/api β A neutral layer for Electron preload, IPC handlers, or a lightweight web server
/hooks β Reusable React hooks
/components β Shared UI components
/enums β TypeScript enums
/types β TypeScript types/interfaces
/utils β Utility functions- Docker - containerization for selfβhosting and reproducible deployments
- Electron - cross-platform desktop framework
- SQLite - lightweight, reliable embedded database
- TypeScript - safer, maintainable code
- React - UI framework
- MUI - styling and UI components
- exceljs - XLSX import/export
- @react-pdf/renderer - PDF generation
Contributions of all kinds are welcome - bug reports, feature ideas, documentation improvements, and pull requests.
Please open an issue before starting major work to ensure alignment.
- Report issues or features here: ISSUES/FEATURES
- Feature requests and discussions are welcome
- Please follow guidelines
| Version | Status |
|---|---|
| v2.5.0 | β Actively supported |
| v2.4.2 | β Actively supported |
| v2.4.1 | β Actively supported |
| v2.4.0 | β Actively supported |
| v2.3.0 | β Actively supported |
| v2.2.2 | β Actively supported |
| v2.2.1 | β Actively supported |
| v2.2.0 | β Actively supported |
| v2.1.1 | β Actively supported |
| v2.1.0 | β Actively supported |
| v2.0.2 | β Actively supported |
| v2.0.0 | β Actively supported |
Details about supported versions and update policy will be documented here.
This project is licensed under the MIT License.
See the LICENSE file for details.
Invoice Builder is maintained by a single developer. Your support helps keep updates coming and new features rolling out!
Want to be a part of this projectβs journey? You can support it here: Buy Me a Coffee
See the full list of supporters here: Supporters
Every contribution counts, even a small one, and your name will appear here as a supporter of Invoice Builder.



