← Home
Changelog
v0.10.1-alpha.12026-04-08
Fixed
- PDF now correctly halves period hours for semi-monthly billing cycle in percentage mode (was using full monthly hours)
- `getHourlyRate` guards against NaN from corrupted localStorage values
- `formatPeriodLabel` validates ISO date format before parsing — returns empty string on malformed input
- Billing period suggestion validates date string format before date arithmetic
Security
- `JSON.parse` reviver in storage blocks `__proto__`, `constructor`, `prototype` keys (prototype pollution protection)
- `X-Frame-Options` tightened from `SAMEORIGIN` to `DENY`
- Added `Strict-Transport-Security` (HSTS) header
- Added `Permissions-Policy` to restrict geolocation, microphone, and camera access
- CSP `default-src` narrowed from `'self'` to `'none'`
- CSP adds explicit `connect-src 'self'`
v0.10.0-alpha.12026-04-08
Added
- Per-invoice Payment Link field — paste a Wise link (or any URL) on the invoice builder; the PDF footer shows the link instead of bank details when filled in; leave blank and bank info appears as normal
v0.9.0-alpha.12026-04-08
Added
- Biweekly billing cycle — every exactly 14 days; period suggestion rolls forward by 14 days from last period end
- "Required Hours per Biweekly Period" label replaces "Required Monthly Hours" when biweekly is selected, so users enter expected hours per period directly (e.g. 50 for 5 hrs/day × 5 days × 2 weeks)
v0.8.0-alpha.12026-04-08
Changed
- Rate settings (billing cycle, rate mode, monthly pay / hourly rate) are now scoped per recipient instead of globally — each client can have a different rate
- Invoice builder derives hourly rate, billing cycle, and period hours from the selected recipient's rate settings
- PDF output uses the selected recipient's rate (not a global profile rate)
- Profile page: global Rate Settings section removed; rate settings now appear inside each recipient card
v0.7.0-alpha.12026-04-08
Added
- Optional CAD equivalent display, toggled and configured per client; shows alongside USD in line items, totals, and PDF output
- Saved projects are now scoped per client — each recipient has its own project list; the invoice builder dropdown only shows projects for the selected client
- Unit tests for all `src/lib/` modules: `rate`, `format`, `storage` — 41 tests via Vitest
- GitHub Actions CI workflow: runs lint, typecheck, and tests on push/PR to `staging` and `main`
- Husky + lint-staged pre-commit hooks: enforce ESLint and `tsc --noEmit` before every commit
- Content-Security-Policy header in `next.config.ts`
- Bank information section now shows a privacy note ("Stored locally in your browser only.")
Changed
- Invoice page refactored: draft state extracted to `useInvoiceDraft` hook; line items and totals extracted to dedicated components (`LineItemsTable`, `InvoiceTotals`)
- Profile page refactored: `RecipientCard`, `ProjectCard`, and `RateSection` extracted as sub-components
- PDF generation logic extracted to shared `src/lib/generatePdf.tsx` utility; both invoice and history pages now use it
- History page: PDF generation errors now shown as inline banner instead of `alert()`
- `ThemeToggle` and `SettingsPage`: replaced `setState`-in-effect pattern with lazy `useState` initializers (lint fix)
- `loadHistory()` on invoice page mount deduplicated — single call shared between period and invoice number suggestions
Fixed
- `addLineItem` and `removeLineItem` now propagate storage failures via `setStorageFailed`
- `parseFloat` calls guarded against `NaN` with `|| 0` fallback in line items, totals, and rate inputs
- `Date.now()` IDs replaced with `crypto.randomUUID()` for recipients and projects in profile
- `InvoiceLineItem` now has an optional `id` field; line items use stable keys (`item.id ?? index`) in React lists
- Backup restore validates that `invoicer:profile` and `invoicer:draft` are plain objects (not arrays) before accepting import
- Removed 5 unused Next.js scaffold SVGs from `public/`
v0.6.0-alpha.12026-03-31
Added
- Semi-monthly billing cycle support — set "Semi-monthly (1–15 / 16–last)" in Profile → Rate Settings
- Billing period auto-suggestion now alternates between 1–15 and 16–last-day when semi-monthly cycle is active
- Expected hours and line item totals automatically halved for semi-monthly periods (80 hrs instead of 160)
- Automatic migration for existing profiles (defaults to monthly, no action required)
v0.5.2-alpha.12026-03-16
Fixed
- Settings page prerender crash — `localStorage` access moved into `useEffect` to prevent `ReferenceError` during Next.js static generation
v0.5.1-alpha.12026-03-16
Changed
- README updated to reflect current feature set — workflow, input modes, invoice history, and data backup
v0.5.0-alpha.12026-03-16
Added
- Auto-fill invoice date (today) and due date (+30 days) on fresh invoices
- Invoice number auto-suggestion based on last entry in history (e.g. INV-004 → INV-005)
- Billing period auto-suggested on fresh invoices based on last history entry
- `/settings` page with JSON export and import for full data backup and restore
- Settings link added to home page and footer
- History page filterable by recipient name or invoice number
- Rate display on invoice builder — shows computed hourly rate with derivation breakdown
- PDF filename now includes invoice date (e.g. `INV-005-2026-03-16.pdf`)
- Storage usage section on Settings page — progress bar and per-key breakdown (~5 MB limit)
- Dark mode toggle on Settings page — persists preference to localStorage, no flash on load
- Profile page warns before navigating away with unsaved changes (`beforeunload`)
Changed
- Adjustments label highlights amber with ⚠ indicator when non-zero
Fixed
- PDF now shows percentage values (e.g. "27%") in percentage mode instead of converting to hours; column header changes from "Hrs" to "%" accordingly
v0.4.0-alpha.12026-03-15
Added
- Invoice history — invoices auto-saved on PDF download; browse, re-download, load into draft, or delete from `/history`
- Getting Started page expanded with "What this app does" summary, percentage mode explanation, and invoice history section
v0.3.1-alpha.12026-03-15
Added
- Security headers (`X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy`) via `next.config.ts`
- Storage failure banner on invoice and profile pages when localStorage is full or unavailable
- PDF generation error message shown inline when generation fails
- Shared `INPUT` class constant extracted to `src/lib/styles.ts`
Changed
- "Clear Draft" now requires confirmation before wiping the draft
- "Saved" indicator on profile page auto-dismisses after 2 seconds
- `saveProfile` and `saveDraft` now return a boolean indicating success
- Input clamping on hours (min 0) and percentage (0–100) in invoice line items
- `Field` component accepts optional `htmlFor` prop for label-input association
- Getting Started page updated with accurate notes on rate setup, percentage mode, and save behavior
- Recipients and projects lists use stable `id`-based keys instead of array index
v0.3.0-alpha.12026-03-15
Added
- `/getting-started` page with quick-reference onboarding guide; linked from footer
v0.2.5-alpha.12026-03-15
Changed
- Versioning rules added to AGENTS.md — patch for fixes/docs, minor for new features, major for breaking changes
v0.2.4-alpha.12026-03-15
Fixed
- Changelog page no longer displays the `[Unreleased]` entry
v0.2.3-alpha.12026-03-15
Added
- Percentage input mode on invoice builder — invoice-wide toggle (Hours / Percentage) lets users enter allocation as % of required monthly hours; PDF always shows resolved hours
v0.2.2-alpha.12026-03-15
Added
- Dedicated `/changelog` page showing full history parsed from `CHANGELOG.md`
- Shared `Footer` component with changelog link, rendered on all pages via root layout — expandable for future links
- `AGENTS.md` as single source of truth for AI agent SOPs; `CLAUDE.md` and `.github/copilot-instructions.md` reference it for cross-agent compatibility
Changed
- Inline changelog widget on home page replaced with footer link to `/changelog`
Fixed
- SOPs simplified to single-word keywords: save, release, deploy, ship
- ship now checks staging is ahead of or equal to main before proceeding — warns and stops if misaligned
- 2-branch strategy established: `staging` (Vercel preview) and `main` (Vercel production)
- Footer no longer overlaps page content — switched from fixed positioning to flex column layout
- Changelog parser now handles dateless `[Unreleased]` header
- Hours warning threshold was hardcoded to 80 instead of reading `profile.requiredMonthlyHours` — warning now reflects the user's actual required hours setting
v0.2.1-alpha.12026-03-15
Changed
- Documentation now explicitly defines release channels (`Alpha`, `Beta`, `Stable`) and marks the current stage as Alpha.
- Next version guidance clarified: keep `0.2.0` as-is and start pre-release channel tagging on the next release (for example, `0.2.1-alpha.1`).
v0.2.02026-03-08
Added
- Recipient management in profile with invoice-side dropdown selection
- Saved project catalog in profile with per-line-item project dropdown autofill
- Template asset added for PDF output customization (`public/jibe_022726.pdf`)
Changed
- Invoice PDF layout and styles updated to match the provided template
- Bank section labels and invoice metadata styling/alignment improved
v0.1.02026-03-05
Added
- Next.js project scaffold
- Tailwind CSS setup
- Documentation: `README.md`, `docs/template-map.md`
- Initial repository structure (`src/lib`, `src/pdf`, `src/components`, `docs`)