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.49] — 2026-08-24
Wholesale catalogue form reworked (selling price + fundraising discount).
Changed
- The "Add a catalogue product" form is reorganised: Title, Description and Image URLs each take a full line; SKU / code sits beside Stock / units available; Category (dropdown) beside Type; voucher fields appear for vouchers; Delivery coverage, Metro and Rural delivery charges sit on one line for physical products.
- "Wholesale unit cost (NZD)" is now Selling price (NZD), and "Minimum commission (%)" is now Fundraising discount (%) — the fundraisers' share of each sale. The business's share is derived the same way as before, so nothing downstream changes.
- A live "Estimated money you receive" box appears under the price as you type: selling price − fundraising discount − 3% Stripe − 5% platform, with a small breakdown.
[0.9.48] — 2026-08-24
One fundraiser per organisation + wholesale product categories.
Changed
- Organisations run one campaign at a time. An organisation can no longer create a second fundraiser: the "+ New fundraiser" and "Campaign builder" options disappear from the organisation page once one exists, the campaign builder page shows a notice instead of the form, and the API enforces the limit server-side. Wholesale was already one-per-organisation — that limit is unchanged.
Added
- Wholesale product categories: pick a category (Food & beverage, Home &
living, Fashion & accessories, Beauty & health, Sport & outdoor, Kids &
toys, Gift vouchers & experiences, Services, Other) when adding or editing
catalogue products. The catalogue management page shows each product's
category badge and has a category filter. Bulk CSV imports accept a
categorycolumn. - New
WholesaleCategoryenum and column (migration0033_wholesale_categories).
[0.9.47] — 2026-08-24
Blog dates removed from the front end.
Changed
- The public blog index and individual blog posts no longer show publish dates. Posts still sort newest-first, and admin views keep their dates.
[0.9.46] — 2026-08-24
Clear duplicate-SKU error for wholesale products + admin error log.
Fixed
- Adding or editing a wholesale catalogue product with a SKU/code already used in your catalogue now shows a clear message ("That SKU/code is already used in your catalogue…") instead of the generic "Something went wrong". The same applies to bulk CSV imports, which now label the offending row with the duplicate SKU.
Added
- Admin → Error log: unexpected server errors are recorded with the
route, error code, user, time and stack trace, and are browsable from the
admin sidebar (next to the email log). New
SystemErrorLogtable (migration0032_system_error_log).
[0.9.45] — 2026-08-24
Fundraiser (donation page) expiry with a no-expiry option.
Added
- New Fundraiser expiry choice when creating a fundraiser: No expiry (default), 15, 30, 45 or 90 days. Pages with an expiry auto-close on that date; pages without one stay open indefinitely.
- Dashboard fundraiser cards now show the current status ("No expiry",
"Expires
" or "Closed ") with a control to set, extend or remove the expiry — including reopening a closed page. - Public fundraiser pages show "Accepting donations until
", and once closed display a "This fundraiser closed" notice with donations, orders, tickets and supporter-page signups switched off.
Changed
- Closed fundraisers stop accepting donations, purchases, raffle/event tickets, subscriptions and new supporter pages (enforced server-side, not just hidden in the UI).
- Closed fundraisers are filtered out of the public fundraiser list, Explore results and the wholesale store picker, and can't have new wholesale items added to them.
- New database column
Fundraiser.expiresAt(migration0031_fundraiser_expiry).
[0.9.44] — 2026-08-24
Better passkey retry UX.
Fixed
- If the passkey prompt is cancelled or fails, the login page now returns to the password step with a clear message instead of leaving the user stuck on a "Continue with passkey" button whose one-time grant was already consumed.
[0.9.43] — 2026-08-24
Enforce the password-before-passkey gate.
Security
- The Auth.js passkey provider issues an authentication challenge even when
getUserInforeturns null, which would have let a passkey be used without the password.getUserInfonow rejects (throws) any unauthenticated request that doesn't carry a valid, single-use password-verified grant, so a challenge can only ever be minted after the password is confirmed.
[0.9.42] — 2026-08-24
Fix passkey provider startup.
Fixed
- The Auth.js WebAuthn provider refused to start without
experimental.enableWebAuthn, which surfaced as a "server configuration" error on/api/auth/providers. The flag is now set, so the passkey 2FA provider loads correctly (v0.9.41's runtime fix).