Changelog
All notable changes to Generous.nz are recorded here, grouped by version. Every deployed build has a version number, a git tag, and an entry below.
Versioning scheme
Versions follow MAJOR.MINOR.PATCH:
- 0.x — pre-launch. Minor bumps mark a completed build phase or major feature set; patches are bug fixes on the current build.
- 1.0.0 — first public launch.
- 1.x+ — post-launch: minor = new features, patch = fixes, major = breaking changes or significant re-architecture.
Each version is tagged in git (v0.2.0) and the current version is kept in
package.json. See docs/version-control.md for how to cut a release.
[0.9.285] — 2026-08-31
Fixed
- The audit archive job connects to the Dedirock backup server as the
gnzbackupSFTP user (matching the live offsite backup), and creates the remoteaudit/directory in a tolerated pre-step so an "already exists" reply never aborts the upload.
[0.9.284] — 2026-08-31
Added
- Audit-log archive and retention job (
scripts/audit-archive.sh+audit-archive.mjs): logs older than 30 days are exported to a gzipped TXT archive, pushed to the Dedirock off-site backup server over the restricted SFTP channel, verified, and only then deleted from the database. Scheduled daily so the live audit log keeps a rolling 30-day window.
[0.9.283] — 2026-08-31
Fixed
- Blog full-text search now passes the language config as a fixed SQL literal (the previous build parameterized it, which Postgres rejected with "function plainto_tsquery(text, text) does not exist").
[0.9.282] — 2026-08-31
Changed
- Blog search now uses Postgres full-text search (tsvector column + GIN index
via migration 0057) ranked by relevance, replacing slow
ILIKEtext scans over title/excerpt/content — it stays fast as the blog grows past a few thousand posts. English stemming means "voucher" and "vouchers" now match each other. - The public blog API is paginated (
page,pageSizeup to 50,q) and returnsposts,total,pageandpageCountinstead of every post at once.
[0.9.281] — 2026-08-31
Changed
- The XML sitemap now caches its generated result for 6 hours instead of re-querying every fundraiser, blog post, organisation, wholesale product and P2P page on every request. Concurrent crawls share one generation, and the cache clears automatically if a generation fails.
[0.9.280] — 2026-08-31
Fixed
- The admin transactions page is now paginated (100 per page with Previous/Next controls, a page counter and live totals) instead of showing only the newest 100 with no way to browse further. Type, status, date-range and search filters carry across pages.
- The admin audit log (already paginated at 50 per page) now clamps
out-of-range page numbers before querying, so
?page=Nbeyond the last page shows the final page instead of an empty list.
[0.9.279] — 2026-08-31
Fixed
- Product pagination on the wholesale catalogue and fundraiser store pages
now clamps out-of-range page numbers before querying, so
?page=2(or beyond) on a store with fewer than 60 items shows the catalogue instead of an empty page.
[0.9.278] — 2026-08-31
Fixed
- The wholesale catalogue is now paginated (60 items per page with Previous/Next controls and a page counter) instead of capping at the first 60; search carries across pages.
- Fundraiser store pages no longer load every product at once — products are paginated 60 per page, so stores with large catalogues load fast and browse cleanly.