Repository navigation
v0.3.0
Two weeks and 81 commits since v0.2.0. The headline: saved cards with auto-billing, and a plugin system that ships its first plugin, Time Tracking.
Saved cards and auto-billing
Stripe only for now; PayPal checkout doesn't support it.
- Clients can tick save this card at Stripe Checkout, and the consent text they agreed to is stored with the card
- Inkvoice keeps the card's brand, last 4 and expiry plus a Stripe reference, never the card number
- Auto-bill on a recurring profile charges the customer's default saved card when the invoice is generated
- Soft declines retry on a schedule: at generation, then 1 day later, then 3 days after that. SCA-required and hard declines are final straight away
- A charge that fails, or can't be attempted, never fails silently: the client is emailed a payment link, and you can opt in to a copy
- Clients see and remove saved cards from their client portal, admins from the customer page. Removing a card detaches it at Stripe too
- Turning Stripe off under Settings → Payments stops auto-billing as well
Recurring invoices that send themselves
- Auto-send on a recurring profile emails each generated invoice to the client instead of leaving a draft
- Profiles left at their defaults behave exactly as before: nothing is sent or charged until you act
Plugins, starting with Time Tracking
- Optional features now ship as plugins, compiled into the app and switched on or off per install under Settings → Plugins. Nothing is downloaded at runtime
- Time Tracking: projects linked to customers with default rates, a per-user timer, billable entries, per-project summaries, and a draft invoice from unbilled time in one step
- Disabling a plugin hides it and keeps its data. Backups include plugin data, and plugin migrations run on restore
About the plugin catalog. The Plugins page describes available and planned plugins from a small static catalog at inkvoice.app/plugins/catalog.v1.json, plus vote counts for the planned ones. Your server fetches it at most every 6 hours while the app is in use, never from a background job, with no instance ID or user data in the request, and falls back to a copy bundled in the image. A vote carries an opaque per-user hash, not your user ID. Settings → Plugins → Turn off stops all of it.
SEPA payment QR code
- Optional EPC / GiroCode QR on unpaid EUR invoices: European banking apps scan it to pre-fill a transfer with your IBAN, the outstanding amount and the invoice number
- IBAN and BIC are validated when you save your bank details, since a typo there would misdirect a payment
Smaller things
- The template editor's live preview keeps its scroll position while you type
docker-compose.ymlnow re-pulls the image on everyup, so a redeploy that trackslatestreally gets the new build
Fixes
- The Swiss and Editorial templates now embed their fonts. They linked Google Fonts, which the app's content security policy blocks, so they had been rendering in fallback fonts. Builtin templates update on the next boot; copies you duplicated from them keep the old link
Upgrade notes
Database migrations 27 through 30 run automatically on boot, and plugins track their own migrations. Back up data/invoice.db before you upgrade.
Run it
docker pull ghcr.io/pigontech/inkvoice:0.3.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.