Monorepo containing BE and FE for faktorio.cz app. A free open source app for invoicing targeted at self-employed OSVČ or tiny companies.
- generate invoice PDF
Public URL format: https://faktorio.cz/shared-invoice/:invoiceShareId
Backend stores share records and tracks events (view, download, copy) including IP, UA, and country when available.
Frontend env:
- VITE_PUBLIC_API_URL points to the public API worker (defaults to production when missing).
- extract entire invoice from any JPG/PNG/BMP or PDF
- search through invoices
- contact management(integrated with ARES)
- support for foreign currencies
- export invoices to Excel, CSV, ISDOC
- export invoices to XML for Czech tax authorities
| Feature | Faktorio.cz | Fakturovac.cz | Fakturoid.cz | iDoklad.cz |
|---|---|---|---|---|
| Generate invoice PDF | ✅ | ✅ | ✅ | ✅ |
| Extract invoice from a raster image | ✅ | ❌ | ❌ | ❌ |
| Search through invoices | ✅ | ✅ | ✅ | ✅ |
| Contact management (integrated with ARES) | ✅ | ✅ | ✅ | ✅ |
| Support for foreign currencies | ✅ | ❌ | ✅ | ✅ |
| Export invoices to Excel, CSV, ISDOC | ✅ | ✅ | ✅ | ✅ |
| Export invoices to XML for tax authorities | ✅ | ✅ | ✅ | ✅ |
| Send invoices to an email from the app | ✅ | ✅ | ✅ | ✅ |
| API for integrations | ✅ | ❌ | ✅ | ✅ |
| Push notifications in web app | ✅ | ❌ | ❌ | ❌ |
| Mobile app | ❌ | ❌ | ✅ | ✅ |
| English UI | ❌ | ❌ | ✅ | ✅ |
| Render invoices in english | ✅ | ❌ | ✅ | ✅ |
| Support reverse charge invoices(both domestic and abroad) | ✅ | ❌ | ✅ | ✅ |
| Share invoice publicly through a public link | ✅ | ❌ | ✅ | ✅ |
| Multiple bank accounts | ✅ | ✅ | ✅ | ✅ |
| Keep account without logging in every 12 months | ✅ | ✅ | ❌ | ✅ |
| Run locally without sending data to the cloud | ✅ | ❌ | ❌ | ❌ |
Note: Feature information for Fakturoid.cz and iDoklad.cz is based on common commercial offerings and may require verification.
Project is mostly feature ready so we're mostly supporting bugs. No big features planned for the near future. The aim is to be a number one open source invoicing app in Czech republic for freelancers and small companies. If you have migrated to another open source because faktorio is missing a feature please let me know in the issues or in a X.com DM.
are all listed in roadmap.md
- Typescript
- Shadcn components
- React.js
- TRPC api
- Drizzle ORM
- Turso(sqlite)
- Cloudflare workers
- Muse models over OpenRouter for AI data extraction
You will need accounts/keys for these services before deploying your own instance:
- Cloudflare Workers for
faktorio-api(tRPC backend, cron) andfaktorio-public-api(public/shared invoice endpoints) - Cloudflare Pages (or another static host) for the
faktorio-feVite build - Turso / libSQL for the primary database
- Google Gemini API for invoice extraction and AI features
- Cloudflare Email Service for password-reset emails through the
SEND_EMAILWorker binding - Google Cloud OAuth Client to obtain
VITE_GOOGLE_CLIENT_IDfor Google sign-in - Web Push VAPID keys (generate locally with
pnpm --filter faktorio-api tsx scripts/generate-vapid-keys.ts; no external service required)
Invoice details include an email composer for invoices and payment reminders. It defaults to the contact's Czech/English language, allows editing the recipient, subject and body, and lets you change the language for one email without changing the contact or invoice. Emails contain a revocable public invoice link with PDF download, and replies go to the issuer's invoicing email (falling back to their account email). Successful sends update the invoice's sent/reminder date. This feature requires a hosted account, not browser-only local mode.
Set the API Worker's PUBLIC_APP_URL to the frontend origin used in email links (defaults to https://faktorio.cz; use http://localhost:5173 locally). Do not use the API Worker URL here.
Environment configuration:
- API Worker (
faktorio-api):TURSO_DATABASE_URL,TURSO_AUTH_TOKEN,JWT_SECRET,OPENROUTER_API_KEY,VAPID_PUBLIC_KEY,VAPID_PRIVATE_KEY,VAPID_SUBJECT;SEND_EMAILis a Worker binding configured inwrangler.toml, not an environment secret - Public API Worker (
faktorio-public-api):TURSO_DATABASE_URLand optionallyTURSO_AUTH_TOKENfor Turso access - Frontend (
faktorio-fe):VITE_API_URL(points tofaktorio-api/trpc),VITE_PUBLIC_API_URL(points tofaktorio-public-api),VITE_GOOGLE_CLIENT_ID,VITE_VAPID_PUBLIC_KEY
Before deploying email sending, onboard faktorio.cz in Cloudflare's Compute > Email Service > Email Sending dashboard and wait for its DNS authentication records to be verified. The domain must use Cloudflare DNS and belong to the account hosting the Worker. Email Sending must be enabled for transactional delivery to users; Email Routing alone is not sufficient. The sender is Faktorio <no-reply@faktorio.cz>. Self-hosters must update both the sender in faktorio-api/src/sendEmail.ts and allowed_sender_addresses in faktorio-api/wrangler.toml to their onboarded domain.
Local wrangler dev (including --env e2e) simulates delivery without sending real mail. After onboarding and deploying, verify a password reset reaches a controlled mailbox and its link works before closing issue #66. Once the migration is verified, revoke the old Mailjet credentials and remove MAILJET_API_KEY / MAILJET_API_SECRET from GitHub Actions secrets, Worker secrets, and any local .dev.vars files; they are no longer used. No replacement email API secret is required.
