# Inkvoice

One-container invoicing for freelancers: Stripe and PayPal, expenses, German e-invoicing, REST API.

Inkvoice is a Bun + Hono + React invoicing app in a single ~50 MB container with SQLite: invoices, quotes, recurring billing, online card payments, expenses, multi-currency reports and an opt-in ZUGFeRD/XRechnung/PEPPOL module for Germany. Deployment is an env table; day-to-day settings and Mustache templates are in-app. A REST API under /api/v1 mirrors the UI. MIT; a managed Cloud exists.

Alternative to: FreshBooks, Zoho Invoice

- Capabilities: adaptable, operable
- Vertical: invoicing-finance
- Shape: business-app
- Form factor: web-app
- Execution model: deterministic
- Provenance: mixed (recorded, never ranked)
- Repo: https://github.com/pigontech/inkvoice (MIT), 21 stars, last commit 2026-09-02
- Last activity: 2026-09-02
- Page: apps/pigontech--inkvoice.html
- JSON: apps/pigontech--inkvoice.json

## Use it when

- I am a freelancer who wants invoices and card payments on a €5 VPS with my data in one SQLite file
- I invoice German businesses and need XRechnung or ZUGFeRD without a per-seat subscription

## Gotchas

- COOKIE_SECURE defaults to true, so logins silently fail on plain HTTP unless you set it to false
- Keep the 512 MB memory cap or Bun grows its heap
- API tokens with scopes exist in routes/api-tokens.ts but the docs only describe JWT login
- Real-software signal is thin: 21 stars, 8 forks, issues from four people; kept on the Show HN thread, Dokploy template and hosted Cloud

## Editions

- Self-hosted: Free, open source
  - source: https://github.com/pigontech/inkvoice
  - container: docker run -d -p 3000:3000 -v invoice-data:/app/data -e JWT_SECRET=… -e ADMIN_PASS=… ghcr.io/pigontech/inkvoice:latest
  - one-click: https://dokploy.com/templates/inkvoice
- Inkvoice Cloud: Free, closed source
  - hosted: https://cloud.inkvoice.app

## Adaptable: make it yours

Effort: config-only (28 things to edit)

Set JWT_SECRET and ADMIN_PASS and you are running; add SMTP to send invoices, Stripe or PayPal keys to take payments, OIDC for SSO, and a peppol.sh key for e-invoice transport. Currency, locale, numbering, logo and email and PDF templates (Mustache) are edited in Settings, not files. That is the whole surface for a freelancer or small team.

- Env vars: ADMIN_USER, ADMIN_PASS, JWT_SECRET, DATABASE_PATH, PORT, PUBLIC_BASE_URL, COOKIE_SECURE, ENABLE_HSTS, SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM, STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET, PAYPAL_CLIENT_ID, PAYPAL_SECRET, PAYPAL_WEBHOOK_ID, PAYPAL_ENV, OIDC_ISSUER_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, PEPPOL_SH_API_KEY, PEPPOL_SH_WEBHOOK_SECRET, DEMO_MODE
- Config files: .env, docker-compose.yml
- Prompt files: none
- Accounts you'll need: Stripe or PayPal (optional); SMTP provider (to email invoices); peppol.sh (PEPPOL transport, optional); OIDC provider (SSO, optional)

## Operable: what an agent can drive

Operability: official. Interface: api at https://docs.inkvoice.app/api/ (published by the builder, local).

### Reach (complete coverage)

- Invoice lifecycle: draft, send, paid, void, duplicate: reachable. docs/api/invoices.md; /api/v1/invoices
- Quotes and conversion to invoices: reachable. docs/api/quotes.md; /api/v1/quotes
- Recurring invoices: reachable. packages/backend/src/routes/recurring.ts; not in the docs index
- Online payments with Stripe and PayPal: reachable. public /api/v1/public/invoices/:shareToken/pay; keys from STRIPE_* and PAYPAL_* env
- Expense tracking: reachable. packages/backend/src/routes/expenses.ts; not in the docs index
- German e-invoicing and PEPPOL send/receive: reachable. packages/backend/src/routes/einvoice.ts; docs/features/e-invoicing.md
- Reports and CSV export: reachable. docs/api/reports.md; routes/export.ts
- Customers and products: reachable. docs/api/customers.md, products.md
- Invoice and email templates: reachable. docs/api/templates.md; docs/TEMPLATE_VARIABLES.md
- Users and roles: reachable. routes/users.ts; multi-user with role-based permissions

## Code stack

- Languages: TypeScript
- Frameworks: Bun, Hono, React 19, Vite, Tailwind, shadcn/ui
- Package manager: bun
- Database: SQLite
- Hosting target: Docker (ghcr.io/pigontech/inkvoice), Dokploy template, Coolify

## Evidence and confidence

- formFactor: single Docker container serving API and SPA (README Tech Stack) (confidence 0.95)
- executionModel: no model at runtime (confidence 0.95)
- operability: REST API documented at docs.inkvoice.app/api by the Builder; docs/api/*.md in repo (confidence 0.85)
- effort: README Configuration table and .env.example name every variable; Settings page holds runtime knobs (confidence 0.9)
- editions: README: MIT source, Inkvoice Cloud managed; no Cloud price found (confidence 0.6)
- active: GitHub pushedAt 2026-09-02; Show HN 2026-08-11; release tag 0.1.0
- reach:  (confidence 0.8)

## Open questions

- Inkvoice Cloud pricing (site and cloud pages rendered without content for the fetcher)
- Whether API tokens are documented anywhere for agents, or JWT login is the intended path
- Gate 3 borderline; Curator to confirm

## Sources

- https://github.com/pigontech/inkvoice (sourcing:invoicing-finance:community)
- https://docs.inkvoice.app/api/ (analysis:invoicing-finance)
- https://dokploy.com/templates/inkvoice (analysis:invoicing-finance)
