Second alpha of Invoicerr v2. Pre-release: not pulled by latest, not for production invoicing.
What's Changed
- ci: stop running the whole suite twice on every push to dev by @Impre-visible in #405
- docs: robots.txt and llms.txt for docs.invoicerr.app by @Impre-visible in #407
- fix(deps): override transitive versions flagged by Dependabot by @Impre-visible in #408
- chore: refuse to commit a credential by @Impre-visible in #413
- feat(received-invoices): run OCR in a background job, capped cluster-wide by @Impre-visible in #409
- fix(auth): rate limits per client, not per instance by @Impre-visible in #411
- fix(chart): the bundled Postgres and Redis can actually start by @Impre-visible in #412
- test(load): measure what a node costs per active user by @Impre-visible in #410
- fix(lint): format the rate-limit proof script, and add the v2 changelog entry by @Impre-visible in #414
- fix(e2e): explicit 10s timeout for time-tracking dialogs closing after a write by @Impre-visible in #425
- fix(documents): drop empty line items on save instead of blocking or persisting them by @Impre-visible in #422
- Warn before an invoice send locks the document (#322) by @Impre-visible in #423
- Configurable Reply-To address on outgoing mail by @Impre-visible in #424
- feat: show installed version and check for updates on GitHub by @Impre-visible in #426
- Optional work date per invoice/quote line (issue #145) by @Impre-visible in #428
- fix: two CI flakes unrelated to the code under test by @Impre-visible in #429
- Settings navigation as a grid of tiles instead of a list by @Impre-visible in #427
- fix(i18n): restore the 353 translated strings stranded by the closed PR #439 by @Impre-visible in #440
- test: drop the wall-clock and render-race dependencies from two specs by @Impre-visible in #442
- The waiting list is a named processing purpose in the privacy policy by @Impre-visible in #441
- feat(transports): add Invopop as a transmission platform by @Impre-visible in #443
- fix(lint): use Number.isNaN in the credential access audit spec by @Impre-visible in #447
- fix(ci): the nightly live job runs Vitest, and fails when it ran nothing by @Impre-visible in #449
- test: wait for what is actually in flight, in three tests that raced the app by @Impre-visible in #450
- feat(transports): add A-Cube as a transmission platform by @Impre-visible in #444
- feat(transports): add Iopole as a transmission platform by @Impre-visible in #446
- fix(peppol): Peppol billing profile URN in cbc:ProfileID for French sellers by @Impre-visible in #452
- feat(transports): add Billit as a transmission platform by @Impre-visible in #445
- fix(xrechnung): the French BT-23 code does not belong in cbc:ProfileID here either by @Impre-visible in #453
- fix(documents): a national channel mandate governs domestic operations only by @Impre-visible in #454
- test(e2e): clear the rest of the layer-teardown and descriptor-rebuild races by @Impre-visible in #455
- fix(brand): centre the lockup mark on the wordmark's optical centre by @Impre-visible in #458
- chore(brand): fix the documentation's social card and point brand images at invoicerr-app/brand by @Impre-visible in #457
- fix(ui): don't let a deferred focus restore steal focus from a layer the user already opened by @Impre-visible in #456
- test(e2e): fix the two flakes of #459 at their cause (02 invalid email, 43 KOR date picker) by @Impre-visible in #460
- feat(dashboard): metric tiles open the filtered list behind them (#419) by @Impre-visible in #461
- feat(dashboard): period filter every dashboard widget respects (#418) by @Impre-visible in #462
- feat(dashboard): "Collections" tile for cash actually received (#417) by @Impre-visible in #463
- feat(documents): let the issuer mark a sent quote accepted manually (#421) by @Impre-visible in #465
- feat(clients): import clients from CSV (#204) by @Impre-visible in #466
- fix(documents): refuse save-draft on issued documents in code, not country data (#468) by @Impre-visible in #469
- Merge main into dev: bring back the 355 translations #440 restored by @Impre-visible in #470
- Adopt the Wyro architecture check: wyro.json and a note under Security by @Impre-visible in #476
- fix(documents): give issued credit notes a legal number of their own (#471) by @Impre-visible in #473
- feat(clients): several contacts per client, one primary (#415) by @Impre-visible in #474
- feat(quotes): quotes with options, chosen at acceptance (#373) by @Impre-visible in #475
- test(documents): fix dev red after #473 + #475 (approval spec mock) by @Impre-visible in #481
- dev to main (permanent PR: keeps dev under test) by @Impre-visible in #480
- i18n: Kabyle translation into dev (supersedes #464) by @Impre-visible in #483
- fix(clients): legacy contact clear and concurrent contact saves (#478) by @Impre-visible in #485
- fix(quotes): accepted option's total everywhere, and no sibling subscription for plain text fields (#479) by @Impre-visible in #486
- fix(signatures): bind an e-signature to the exact version the client read (#477) by @Impre-visible in #489
- fix(documents): serve an archived PDF only while it matches the document (#490) by @Impre-visible in #492
- perf(documents): stop re-rendering every field on each keystroke (#488) by @Impre-visible in #491
- fix(quotes): totals and settlement never sum a quote's options (#487) by @Impre-visible in #493
- feat(formats): produce credit notes in every e-invoicing format (#472) by @Impre-visible in #495
- fix(documents): a delivered PDF prints no transient status (#494) by @Impre-visible in #498
- feat(pt): ATCUD on credit notes from their own NC series; never declare an unnumbered document (#497) by @Impre-visible in #500
- feat(pt): declare the real ATCUD, and declare credit notes to the AT (#501) by @Impre-visible in #505
- test(e2e): read every stack URL from cypress.config.ts, guard literal ports (#502) by @Impre-visible in #503
- fix(credit-notes): price and render a linked credit note from the invoice it corrects (#507) by @Impre-visible in #508
- feat(numbering): fix number formats per country and document type (#496) by @Impre-visible in #504
- fix(settings): number formats card no longer shifts the page on load by @Impre-visible in #513
- fix(documents): archive and deliver an issued credit note (#499) by @Impre-visible in #506
- test(e2e): scroll to the signing page option chooser before asserting it visible (#509) by @Impre-visible in #511
- test: 60 s timeout for the dangling file references scan by @Impre-visible in #510
- fix(signature): keep the next required step in view on the signing page by @Impre-visible in #514
- feat(numbering): restart document numbers yearly where the law allows it (#515) by @Impre-visible in #518
- Currency: dated dashboard consolidation and a cashed-revenue view per period by @Impre-visible in #521
- chore: remove em dashes added by #518 by @Impre-visible in #523
- feat(address): address autocomplete through a self-chosen Photon server (#197) by @Impre-visible in #520
- feat(documents): VAT in the national currency on foreign-currency invoices (#517) by @Impre-visible in #522
- fix: fall back to the statutory rule wording when France's late-fee rate table runs out by @Impre-visible in #524
- Operator catalogue: which operators implement each legal channel by @Impre-visible in #528
- docs: catch up on the merges of 2026-09-27/28 by @Impre-visible in #529
- Channels settings screen: legal channel, then operator (design C) (#527) by @Impre-visible in #530
- fix(e2e): stub the live company-lookup call flaking the pl-de scenario by @Impre-visible in #532
- ci: build and push a dev image on every push to dev by @Impre-visible in #538
- Sign-up: hide the invitation code behind a discreet toggle (#534) by @Impre-visible in #541
- fix(billing): pin Polar-Version 2026-04 on every Polar API request by @Impre-visible in #540
- fix(numbering): a kept running series without {year} never restarts by @Impre-visible in #544
- fix(billing): a company-less sign-up never sees the seat-check error; Polar provisioning logs its real cause by @Impre-visible in #542
- Settings: bring back the sidebar navigation by @Impre-visible in #545
- feat(demo): DEMO_MODE flag, seed/reset script, and account lockdown (#533) by @Impre-visible in #546
- dev to main by @Impre-visible in #484
Full Changelog: v2.0.0-alpha.1...v2.0.0-alpha.2