Two months and 115 commits since the first tagged release. The headline: Inkvoice now does EU e-invoicing, plus SSO and a lot more billing depth.
EU e-invoicing
Germany (E-Rechnung), an opt-in module that stays off by default, so if you don't need it you never see it:
- EN 16931 compliant output: ZUGFeRD 2.2 hybrid PDF, XRechnung (UBL) and PEPPOL BIS
- E-invoice inbox: import, parse and process incoming XRechnung / ZUGFeRD files
- Auto-attach the e-invoice to outgoing invoice emails, per invoice or globally
France (Factur-X), ahead of the September 1, 2026 mandate:
- SIREN / SIRET customer fields, with an Annuaire reachability check
- French buyer IDs emitted in Factur-X
- Franchise en base VAT exemption (art. 293 B CGI)
- Network-aware transport selection, plus a warning when a French buyer has no SIREN
PEPPOL transport, provider agnostic:
- Send invoices and credit notes over the PEPPOL network (a peppol.sh driver ships with bring-your-own credentials)
- Receive inbound PEPPOL documents straight into the e-invoice inbox
- Delivery state machine with retries and a per-attempt audit trail
- Register your business as a PEPPOL receiver, with conflict detection so you can't accidentally take over an access point
SSO / OIDC
- Sign in with any OIDC provider: discovery,
id_tokenvalidation, JWKS caching - JIT provisioning, so accounts are created on first sign-in
- SSO button and error handling on the login page
- Hardened: signed state cookie, issuer normalization, and an SSO-bound account can never be rebound through a verified email
Billing and invoicing
- Instalments: convert a quote straight into an instalment invoice
- Skonto: early-payment cash discounts
- Late fees: applied automatically to overdue invoices
- Customer credit: record payments as credit, with alerts when a customer is in credit
- Consolidation: merge several draft invoices into one, grouped per source on the PDF
- Tags: free-form tags on invoices and customers
- Configurable quote and credit note number patterns
- Payment breakdown rendered on the invoice PDF
Security
JWT_SECRETis now required indocker-compose.yml, with no shipped default (see upgrade notes)- Payment gateways now require webhook credentials before they can be enabled
- nodemailer bumped to 9.0.5 (GHSA-p6gq-j5cr-w38f)
Fixes
- Number sequences now pick numerically, look up by rendered prefix, skip foreign matches that share a prefix, and reject patterns with no sequence token
- The e-invoice PDF routes through the currency fallback and keeps its number formatting
- Quote currency uses the same dropdown as invoices
- Demo mode: the seeded admin account is protected from lockout
Upgrade notes
Database migrations 18 through 26 run automatically on boot. Back up data/invoice.db before you upgrade.
Breaking: docker-compose.yml no longer ships a fallback JWT_SECRET. Compose will refuse to start until you set one:
JWT_SECRET=$(openssl rand -base64 48)
That is deliberate. Any secret shipped in a public repo is public knowledge, so if you were running on the old default, rotating it is the whole point. Changing it signs out every existing session.
Also removed: the dead CHROME_PATH setting. Drop it from your environment if you had it set.
Run it
docker pull ghcr.io/pigontech/inkvoice:0.2.0
Full instructions for Docker Compose, Dokploy and Coolify are in the README. Live demo, no signup needed: demo.inkvoice.app with demo / demo.
MIT licensed.