What's Changed
Features
- ci(frontend): Lighthouse CI on the logged-in app screens, on dev to main by @Impre-visible in #624
- feat(documents): pre-check all original lines when issuing a credit note from an invoice by @Impre-visible in #655
- feat(documents): unit picklist on invoice lines, readable VAT rate label by @Impre-visible in #656
- feat: per-company default due date for quotes and invoices by @Impre-visible in #658
- feat: search the catalog while typing a line Designation by @Impre-visible in #659
- Quick client creation from a document, completeness enforced at invoice validation by @Impre-visible in #661
Fixes
- fix(ci): stop a countries/data race and accept the real PISTE 4xx rejection by @Impre-visible in #629
- fix: require POSTGRES_PASSWORD instead of a hardcoded compose password by @Impre-visible in #636
- test(queue): give the PDF warm-up hook room for a cold Chromium launch by @Impre-visible in #660
- test(e2e): move the fake Photon server below the ephemeral port range by @Impre-visible in #654
- fix(frontend): keyboard navigation in SearchSelect by @Impre-visible in #657
- test: give every assertion-less test a real assertion by @Impre-visible in #671
- fix: prefill the currency from the country code, whatever the interface language by @Impre-visible in #665
- test(signing): read the PAdES signature without trailing-zero trimming by @Impre-visible in #680
- test: remove duplicated fixtures from async-send and invoice mandate specs by @Impre-visible in #679
- test(pdp): rename superpdp live settings to SUPERPDP_* and resolve sandbox parties by @Impre-visible in #681
Per-country compliance
- refactor(tax): read localized invoice mentions from country data by @Impre-visible in #651
- refactor(correction-routes): move local cancel availability into the country JSON by @Impre-visible in #662
- refactor(revenue-basis): move the default revenue basis into the country JSON by @Impre-visible in #663
- refactor: drop dead draft watermark tables, derive national format fallback currency by @Impre-visible in #664
- refactor(identifiers): one translated source for identifier help text by @Impre-visible in #667
- refactor(company-lookup): read country coverage and notes from data by @Impre-visible in #668
- refactor(demo): read demo party identifiers from the country files by @Impre-visible in #670
- refactor(formats): read legal-id e-invoice schemes from country data by @Impre-visible in #666
Documentation
- docs: add Sponsor links for GitHub Sponsors by @Impre-visible in #625
- ci: add a DCO sign-off check by @Impre-visible in #649
- docs: add Discord community server links by @Impre-visible in #648
Dependencies
- chore(deps): update dependency dompurify to v3.4.16 [security] by @renovate[bot] in #645
- chore(deps): update dependency markdown-it to v14.3.1 [security] by @renovate[bot] in #646
- chore(deps): update dependency @modelcontextprotocol/sdk to v1.31.0 [security] by @renovate[bot] in #673
- fix(deps): update documentation dependencies (minor and patch) by @renovate[bot] in #653
- chore(deps): pin dependencies by @renovate[bot] in #652
- fix(deps): bump handlebars to 4.7.10 in the backend by @Impre-visible in #678
Other Changes
- fix(frontend): widen the settings content column (#560) by @Impre-visible in #561
- fix(documents): route country identifier help texts through i18n (#563) by @Impre-visible in #564
- feat(dz): add Algeria as a country, data only (#558) by @Impre-visible in #566
- fix(dz): NIF/NIS identifier formats and DZ help texts (#567) by @Impre-visible in #569
- Translations update from Hosted Weblate by @weblate in #565
- fix(e2e): assert the demo-mode send-failed row, not a clamped paragraph's visibility (#570) by @Impre-visible in #573
- feat(documents): download the original of an imported document (#549) by @Impre-visible in #571
- fix(frontend): correct the Exchange rates card's false copy (#548) by @Impre-visible in #572
- fix(e2e): stop the demo-mode status-badge check from relying on scroll position (#570) by @Impre-visible in #576
- feat(company): refresh the exchange-rate pairs a company actually uses by @Impre-visible in #575
- feat(clients): restrict a client to a subset of the company's payment methods (#416) by @Impre-visible in #577
- feat(frontend): mirror the layout for right-to-left locales by @Impre-visible in #578
- fix(documents): stop a sent quote from decrementing stock (#579) by @Impre-visible in #580
- Add a Validate action that numbers and locks an invoice without sending it (#581) by @Impre-visible in #602
- feat(documents): compose a per-country view from the existing catalogs (#603 step 1) by @Impre-visible in #614
- feat(documents): plug vat-rates into the composed per-country view (#603 step 2) by @Impre-visible in #615
- feat(documents): plug every remaining non-DB-mirrored catalog into the composed per-country view (#603 step 4) by @Impre-visible in #617
- feat(documents): plug the three DB-mirrored catalogs into the composed per-country view (#603 step 5) by @Impre-visible in #618
- feat(documents): one JSON file per country (#603 step 6) by @Impre-visible in #619
- fix(documents): ATCUD driven by the country's documentValidationCode fact (#603) by @Impre-visible in #620
- fix(documents): one reference table for EU and GCC membership (#603) by @Impre-visible in #626
- chore: Configure Renovate by @renovate[bot] in #621
- ci(release): categorised release notes and a Discord pre-release summary by @Impre-visible in #623
- chore: move builder stages to Node 24, drop 32-bit ARM from docs by @Impre-visible in #628
- ci(docker): scan published images with Trivy, fail only on fixable critical by @Impre-visible in #622
- fix(deps): bump proxy-addr to 2.0.8 for CVE-2026-90711 by @Impre-visible in #672
- ci: run required checks on merge queue groups by @Impre-visible in #674
- ci(dco): skip the dev to main promotion pull request by @Impre-visible in #675
- dev to main by @Impre-visible in #562
New Contributors
Full Changelog: v2.0.0-alpha.3...v2.0.0-alpha.4