invoicerr
# Invoicerr  Invoicerr is a simple, open-source invoicing application designed to help freelancers manage their quotes and invoices efficiently. It provides a clean interface for creating, sending, and tracking quotes and invoices — so you get paid faster, with less hassle. --- ## 📢 Maintainer availability I no longer have enough personal time to work on Invoicerr full-time (studies + job). The project is still open, and I can continue to review and manage community pull requests, but development speed from my side will be slower. ---  <section> <img src="https://wakatime.com/badge/user/4cf4132a-4ced-411d-b714-67bdbdc84527/project/2f27011d-6794-4fbe-97c9-9fdef2550fc7.svg?style=flat"> <img src="https://m3-markdown-badges.vercel.app/stars/12/1/invoicerr-app/invoicerr"> <img src="https://m3-markdown-badges.vercel.app/issues/12/1/invoicerr-app/invoicerr"> </section> ## ✨ Features - Create and manage invoices - Create and manage quotes (convertible to invoices) - Manage clients and their contact details - Track status of quotes and invoices (signed, paid, unread, etc.) - Built-in quote signing system with secure tokens - Generate and send quote/invoice emails directly from the app - Generate clean PDF documents (quotes, invoices, receipts, and more) - Custom brand identity: logo, company name, VAT, and more - Authentication via JWT or OIDC (stored in cookies) - International-friendly: Default English UI, customizable currencies - SQLite database for quick local setup - Docker & docker-compose ready for self-hosting - Built with modern stack: React, NestJS, Prisma, SQLite/PostgreSQL - REST API backend, ready for future integrations (mobile & desktop apps) - Plugin system for community-made features --- ## 🌍 Translation Invoicerr uses weblate to easily manage the translations [](https://hosted.weblate.org/engage/invoicerr/) [](https://hosted.weblate.org/engage/invoicerr/) --- ## 🐳 Docker Installation (Recommended) #### Supported Architectures The images are built for the following architectures: - `linux/amd64` (x86_64) - `linux/arm64/v8` (ARMv8) #### Why not `linux/arm/v7`? The `linux/arm/v7` architecture is not supported due to the use of prisma, which does not provide prebuilt binaries for this architecture. This means that the application will not run on 32-bit ARM devices. The fastest way to run Invoicerr is using Docker Compose. A prebuilt image is available at [ghcr.io/invoicerr-app/invoicerr](https://ghcr.io/invoicerr-app/invoicerr). ### 🚀 Quick Start 1. Clone the repository: ```bash git clone https://github.com/invoicerr-app/invoicerr.git cd invoicerr ``` 2. Edit the `docker-compose.yml` to set your environment variables. 3. Run the app: ```bash docker compose up -d ``` 4. Open your browser at: ``` http://localhost ``` --- ### 🔧 Environment Variables These environment variables are defined in `docker-compose.yml` under the `invoicerr` service: - `DATABASE_URL` PostgreSQL connection string. Example: `postgresql://invoicerr:invoicerr@invoicerr_db:5432/invoicerr_db` - `APP_URL` Full public URL of the frontend (e.g., `https://invoicerr.example.com`). This is required for email templates and links. - `SMTP_HOST`, `SMTP_USER`, `SMTP_PASSWORD` Credentials and server used for sending emails (quotes, invoices, etc.) - `SMTP_FROM` Optional — address used as the sender for emails. If omitted, defaults to `SMTP_USER`. - `JWT_SECRET` Optional but recommended for JWT authentication. Can be any random string. If not set, a default secret will be used. But it can have issues with docker deployments. Make sure port 80 is available on your host machine, or change the mapping. --- ## 💻 Manual Installation (Local Development) ### Prerequisites - Node.js v20+ - SQLite (or configure another `DATABASE_URL`) - PNPM or NPM ### Steps 1. Clone the project: ```bash git clone https://github.com/invoicerr-app/invoicerr.git cd invoicerr ``` 2. Backend setup: ```bash cd backend npm install npx prisma generate npm run start ``` 3. Frontend setup (in a new terminal): ```bash cd frontend npm install npm run start ``` 4. Open in your browser: - Frontend: `http://localhost:5173` - API: `http://localhost:3000` --- ## 🧪 Lancer les tests end-to-end (Cypress) Pour lancer les tests e2e localement ou en CI : 1. Démarrer le backend et le frontend avec les variables de test : ```bash cd backend && npm run start:test & cd frontend && npm run start:test & ``` (Assurez-vous d'avoir un .env.test dans chaque dossier) 2. Dans un autre terminal, lancer Cypress : ```bash cd e2e npm install npm run e2e:open # ou npm run e2e:run ``` En CI, le workflow GitHub Actions fait ces étapes automatiquement. --- ## 📸 Screenshots <details> <summary>Dashboard</summary>  </details> <details> <summary>Quotes</summary>  </details> <details> <summary>Invoices</summary>  </details> <details> <summary>Clients</summary>  </details> <details> <summary>Settings</summary>  </details> ## 🧰 Technologies - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/React/react1.svg"/> - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/NestJS/nestjs1.svg"/> - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/TypeScript/typescript1.svg"/> - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/Prisma/prisma1.svg"/> - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/SQLite/sqlite1.svg"/> - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/PostgreSQL/postgresql1.svg"/> - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/TailwindCSS/tailwindcss1.svg"/> - <img src="https://ziadoua.github.io/m3-Markdown-Badges/badges/Docker/docker1.svg"/> ## ⚖️ License This project is dual-licensed: - Open Source: [AGPL-3.0](./LICENSE) - Commercial: [COMMERCIAL-LICENSE](./COMMERCIAL-LICENSE) Contact me for commercial use.