← 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`)