---
title: "Changelog"
description: "What changed in each release of Nuits Receipts, from CHANGELOG.md."
---

> Documentation Index
> Fetch the complete documentation index at: https://receipts.nuits.net/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

This page is built from `CHANGELOG.md` in the repository by `docs-site/scripts/sync-changelog.mjs`, with commit and compare links removed. `scripts/version.mjs` generates the entries from Conventional Commits on every release. The first release run planted the `v0.1.0` baseline from `package.json`; entries start after it.

To read the releases as a comic, one receipt slip per release, see the [changelog on the project site](https://receipts.nuits.net/changelog/).

## 2.2.3 (2026-10-31)

### Hotfixes

- **ui:** clarify folder and month navigation
- **ui:** address medium design audit findings
- **ui:** phone viewer keeps a word on every control, opaque bar keeps its sticky rule, spacing from tokens
- **viewer:** desktop toolbar keeps its order, phone toolbar is five even 44px buttons
- **ui:** address low priority design audit findings
- **ui:** only unknown routes say Nothing here, shared CSS is one cached stylesheet, bank rows skip a repeated payee line
- **ui:** Didrik's round 2 look-check and a centred Add pill on phones
- **ui:** one more spacing step under the check bar so the last card clears it

## 2.2.2 (2026-10-31)

### Hotfixes

- **archive:** a seller with one month of data draws one normal bar, not one across the card
- **pwa:** the shared-files message names the Upload button

## 2.2.1 (2026-10-31)

### Hotfixes

- **pwa:** the home screen name is the full app name, Nuits Receipts

## 2.2.0 (2026-10-31)

### Features

- **site:** the pile files itself, a home page rebuilt around the archive

### Hotfixes

- **deploy:** pass the config's account to wrangler, so deploy works with several accounts
- **pwa:** serve the manifest without sign-in and add the iOS home screen tags

## 2.1.1 (2026-10-31)

### Hotfixes

- **ui:** every block keeps an 8px gap, and ui-lint now checks gaps on every page

## 2.1.0 (2026-10-31)

### Features

- **add:** one Add button in the same place on every page, phone and desktop (#58)

## 2.0.1 (2026-10-31)

### Hotfixes

- **home:** open a document without the slow transition, and keep the list's place (#57)

## 2.0.0 (2026-10-31)

### Breaking changes

- **home:** Home becomes the archive of every finance document (#56)

## 1.16.0 (2026-10-31)

### Features

- **scripts:** ui-lint, a rerunnable lintapple check of the rendered pages
- **mockups:** generator for the two v4 directions
- **mockups:** Native app and Warm paper pages
- **mockups:** Mix direction, paper look on the native layout with glass
- **todo:** only required facts put a receipt in To do
- **discard:** one click, no reason
- **bulk:** checkboxes are always visible, Select mode is gone
- **parts:** hide Part while there is only one part
- **pwa:** render install icons from the app glyph
- **pwa:** manifest, offline-only service worker, Android share target
- **bank:** To do | All, open payments first, no offset
- **worklist:** one model for list state, the next open row and return URLs
- **worklist:** every action returns to its list at the next open row
- **worklist:** overdue sales invoices join Receipts To do
- **receipts:** Review merges into Receipts To do, with All beside it
- **settings:** one Email senders list holds allowed, ignored and mail we didn't keep
- **db:** undo_log table for one generic Undo
- **undo:** registry of undoable actions with same-batch snapshot and guarded restore
- **undo:** every resolving action leaves the list with one Undo
- **import:** one-step bank import with skip, Import anyway and an import Undo
- **tokens:** warn and info colour roles from the Mix mockup
- **tokens:** the Mix palette, glass at the lowest readable alpha, DM Mono
- **settings:** five sections and one Save
- **forms:** show a refused form in place on every route that takes typed input
- **home:** fold done setup steps, and skip a month held open only by a doubtful date
- **receipt:** fields to fill, a two-group More, and Approve above the phone keyboard
- **app:** every screen has a way back, and files and the OneDrive return work standalone

### UI enhancements

- **ui:** Match, one Matched status, lighter Bank rows, fewer folds
- **ui:** ask before Move and OneDrive Disconnect, which have no Undo
- **ui:** a resolved row leaves by cross-document view transition, with the next row focused and described
- **ui:** Lucide icon sprite generated from lucide-static 1.65.0
- **ui:** ACTIONS and STATUS registries; every control renders from them
- **ui:** one row() for every list, and the Mix look on the Native layout
- **ui:** keyboard shortcuts, the ? sheet and a pending cue on submit

### Hotfixes

- **bulk:** Discard still asks before it removes a match
- **receipts:** search with instr so a long query no longer fails
- **worklist:** move on from where the acted-on row stood, and land an Undo on what it restored
- **bulk:** refuse a bulk post whose list state is missing or invalid
- **lists:** true totals above 500, and select-all takes the first 500
- **receipt:** every receipt page form keeps the list it was opened from
- **bank:** an own transfer returns to the Bank view it was made on
- **review:** Merge duplicates returns to the To do it was offered on
- **receipt:** start the tab counts with the receipt read
- **receipts:** the To do header counts the list, and the old Merge form still merges
- **import:** a transfer paired across imports stops the import's Undo
- **bulk:** never follow a redirect from the bulk post
- **invoices:** the sales All view waits on D1 once, not five times
- **invoices:** the older-invoices note counts other months only
- **ui:** the finished-steps fold sits 8 px from the panel edge

## 1.15.0 (2026-10-29)

### Features

- **app:** bulk select and bulk actions on receipt lists
- **bank:** bulk actions on Bank, held mail and senders

### Hotfixes

- **app:** pass bulk receipt ids as one bound parameter
- **ui:** align the bulk bar and keep focused rows clear of it
- **app:** add bulk-allowed senders in the order they were picked
- **ui:** accent the bulk checkboxes and trim the discard confirm
- **ui:** keep bulk runs honest: caps in all mode, Escape, chunk totals, no resubmit
- **app:** bulk totals, FX on approve, batched held mail, own-key checks
- **ui:** give the bulk checkboxes the app accent

## 1.14.0 (2026-10-28)

### Features

- **match:** mark food delivery as not a purchase

### Hotfixes

- **match:** match every receipt that exists and mark obvious non-purchases

## 1.13.0 (2026-10-28)

### Features

- **imports:** XLSX statements, preamble header detection, stated totals and AI column mapping
- **imports:** PDF bank statements, Holvi by layout and other banks through Clairic

### Hotfixes

- **imports:** scan XLSX XML in one linear pass under one 16 MiB inflate budget

## 1.12.4 (2026-10-25)

### Hotfixes

- wait on the database about once per page

## 1.12.3 (2026-10-25)

### Hotfixes

- load each page with fewer database round trips, and fetch tabs ahead

## 1.12.2 (2026-10-25)

### Hotfixes

- **ui:** spacing, font and tap-target pass across app, site and docs (#20)

## 1.12.1 (2026-10-24)

### Hotfixes

- Check waits for undated receipts, mapping before row errors, Needs you on Bank (#18)

## 1.12.0 (2026-10-24)

### Features

- **settings:** show mail we didn't keep, with Allow this sender (#16)

## 1.11.0 (2026-10-24)

### UI enhancements

- **ui:** restyle the app to the Swiss workbench direction (#15)

## 1.10.0 (2026-10-24)

### Features

- **setup:** a checklist that stays until done, /help glossary, plain Settings words (#14)

## 1.9.0 (2026-10-24)

### Features

- **nav:** open on the oldest unsent month, one primary action, Undo for mark sent, Receipts and Invoices tabs (#13)

## 1.8.0 (2026-10-24)

### Features

- **bank:** likely-match rows, Match all with Undo, searchable picker, one status vocabulary (#12)

## 1.7.0 (2026-10-24)

### Features

- **review:** split view, two tiers of flags, sticky Approve, hand-off after the last receipt (#11)

## 1.6.0 (2026-10-24)

### Features

- **app:** UX v3 foundations: tokens, feedback with Undo, plain errors shown in place (#10)

## 1.5.1 (2026-10-24)

### Hotfixes

- **receipts:** saving a receipt keeps its manual bank match (#7)

## 1.5.0 (2026-10-24)

### Features

- Discard receipts in Review, with undo, restore and bulk select (#6)

## 1.4.1 (2026-10-24)

### Hotfixes

- strip account-holder labels from vendor names, and keep the docs changelog in step with releases (#4)

## 1.4.0 (2026-10-24)

### Features

- one receipt per email, and better reading of email bodies (#3)

## 1.3.0 (2026-10-24)

### UI enhancements

- One app shell, quiet statuses and a one-line footer notice on every page.
- Home shows the month as three steps (Check, Match, Send). Review is a plain list, and the receipt page puts the fields to fix first.
- Receipts, Invoices and Bank are quiet lists with one search field and one More menu per row. Statements are folded.
- Settings has one fold per section and an About section with the full notice, licence and trademark lines. The docs match the new screens.
- Much less text on every page.

## 1.2.0 (2026-10-24)

### Features

- One five-item navigation: Home, Review, Receipts, Bank, Settings. Home closes the month.
- Bank holds the bookkeeping (statements, matching, transfers). Settings holds the configuration. Old addresses redirect.

## 1.1.0 (2026-10-24)

### Features

- Mail from unknown senders is held for your approval. A new All receipts page.

### Fixes

- Docs: the Cloudflare analytics script is allowed by the docs Content-Security-Policy.

## 1.0.2 (2026-10-23)

### Fixes

- Settings: a list of allowed senders is limited to 75 addresses, so the longest list always fits the stored-setting limit. A value that is too long is refused with a clear message instead of failing on save.
- Month package: the "changes" package no longer replaces the full month index.
- Bank matching: a seller name that reduces to nothing never matches a payment.
- The app has a tab icon.

### Documentation and project site

- The docs changelog no longer links to commits that are not in this repository.
- The docs site sends security headers, including a Content-Security-Policy.
- The phone tab bar and the More page are documented, and the deploy tutorial lists the right navigation.
- The project site has a Docs link, a 404 page and a sitemap.

## 1.0.1 (2026-10-23)

First public release. Earlier development history is not part of this repository.

### Features

- Self-hosted receipt and invoice reader that runs on Cloudflare Workers: PDF and image uploads, optional email ingestion with an allowlist and SPF check, private R2 storage of originals, D1 storage of extracted rows.
- Extraction with Cloudflare's Clairic model on Workers AI (preview), VAT arithmetic checked in code, review flags for uncertain rows.
- Vendor rules with a Clef fallback for product and expense type.
- Bank CSV import with a column mapping, payment matching suggestions and a list of payments with no receipt.
- Monthly package: costs in EUR by product and type, CSV or ZIP with every original and an index spreadsheet, optional OneDrive upload.
- Sales invoices you send, matched to money coming in.
- In-app settings, Cloudflare Access sign-in, compact mobile layout with a bottom tab bar.
- Project site in site/ with a demo video, and a documentation site in docs-site/.
- Apache License 2.0, no-warranty notice in the README and in the app.

Source: https://receipts.nuits.net/docs/reference/changelog/index.mdx
