git log --oneline
Changelog
A running log of what shipped. Features, fixes, and performance improvements, documented as they land.
changelog.log
verification-link-fix2026-05-26
~fixSign-up, magic-link, and password-reset emails now log you straight in. The verification links had started landing on a page that couldn't finish signing you in, so they'd show "the link may have expired" even right after you requested them — that's resolved, and clicking the link now completes sign-in as expected
~fixThe "Resend email" button on the confirm-your-email and magic-link screens now keeps working. It used to stop sending after a couple of tries (the security check behind it needed a moment to reset between sends); the button now waits for that and shows "Preparing security check…" instead of quietly doing nothing, and it tells you honestly if a send couldn't go through
~fixChanging your account email now sends confirmation links back to the same app environment you started from, and dragging template tokens between fields now behaves honestly: moving inside one field moves, dragging to another field copies
faster-invoice-send2026-05-24
*perfSending from the invoice wizard is quicker: Review now prepares the PDF in the background, and Send reuses that prepared PDF when nothing changed
~fixThe wizard now locks the final invoice number before creating the PDF, then marks the saved draft as sent without rewriting the whole invoice again
review-polish-i18n-security2026-05-22
+newInternational bank details: each bank account now has optional IBAN and SWIFT/BIC fields, so clients abroad can pay you by international transfer. They appear on your invoices alongside your local account details and are one tap away under "Add IBAN / SWIFT"
+newTax treatments per line item: as well as a rate, you can now mark a line as Reduced, Zero-rated, Exempt, or Reverse charge — so a zero-rated line reads as "Zero-rated" rather than a blank 0%, and reverse-charge invoices print the standard note automatically. Adding tax to a line now pre-fills your account's default rate
^improvedSetting your invoice number format is friendlier: pick a plain-English option like "Sequential (INV-0001)" or "Year + number" with a live example, and the technical template syntax now lives behind an optional "Advanced" section instead of greeting you with [NUM:4]
^improvedThe email template editor's token chips (like client name and due date) are now proper pills you can drag straight into the subject or body — and a token at the very end of a line can finally be deleted or typed after
^improvedSecondary text across the app is a little darker and easier to read, especially form placeholders and hints that previously looked washed out
^improvedChanging your password now asks for your current one first, so an unattended, signed-in browser can't be used to lock you out of your own account
^improvedNotification toasts stay on screen a bit longer, so the confirmation after creating or sending something is easier to catch
~fixDropdowns (like Country) now close when you tab away with the keyboard, instead of lingering over the next field — matching what already happened when you clicked elsewhere
~fixYour dashboard's getting-started steps now tick off as you complete them: once your business profile and first client are set, the highlight moves on instead of staying stuck on "Step 01"
follow-ups-always-cc2026-05-19
~fixAlways CC in Email settings now applies to every email your clients receive — not just the initial invoice. Reminders (manual, bulk, and scheduled), payment receipts, and cancellation notices all carry the CC list too, so your accountant or partner inbox sees the full conversation without any extra setup
^improvedAfter sending a follow-up, the row in the follow-ups list no longer carries a green sidebar — the Sent pill already signals the state, and the extra accent read as accidental selection
homepage-hero-lazy2026-05-15
*perfThe homepage now ships about a third less JavaScript on first load. The animated invoice mockup in the hero loads after the headline and CTA, so the marketing message paints faster on slow connections — the mockup still appears, just a beat later
router-hardening2026-05-15
~fixSessions that expire while a page is open now bounce you to the sign-in screen instead of showing a generic error — so leaving the invoice editor open over lunch and coming back to send doesn't end on a stuck toast
~fixStale or hand-edited URL parameters (a deleted follow-up id, an old invoice highlight, a malformed sign-in mode) no longer crash the page — the app now drops the bad value and keeps loading the route
*perfSwitching from the invoice editor to the read-only invoice preview no longer re-fetches the full wizard payload, so the preview opens cleanly when bouncing between the two views
activity-feed-tab-counts2026-05-14
~fixActivity feed tab badges now show consistent numbers. The All tab shows your real total, the Unread tab matches the bell badge and the Mark all as read pill exactly, and the smaller filters (Payments, Views & opens, Overdue) don't carry badges at all — so the header never shows two different counts for the same scope
^improvedActivity feed CC rows now lead with the recipient's email address itself instead of a generic "A CC recipient" label, rendered in monospace so it sits in the same typographic register as the invoice number — clearer at a glance, and the redundant secondary line is gone
client-view-history2026-05-14
+newFollow-ups now shows when the client last opened the invoice ("2h ago") with a small counter when they came back more than once. Repeat visits within 30 minutes collapse so a refresh doesn't pile up rows
+newThe invoice preview timeline records every client visit, not just the first. Subsequent visits collapse into one "Viewed again N more times" entry that expands to show each timestamp
activity-feed-recipient-attribution2026-05-14
~fixThe activity feed and follow-ups now know which recipient opened or clicked your invoice email — a CC opening it no longer counts as the client opening it, and CC'ing yourself and clicking the link no longer logs as a client click. CC engagement still appears in the feed, surfaced as the recipient's email address, so the primary client signal stays clean
~fixRenamed the misleading email status copy: the activity feed and follow-ups badge now say "opened" instead of "received" / "Delivered" — Resend's open event reflects the inbox open-pixel firing, not the delivery receipt
invoice-wizard-email-preview2026-05-12
+newThe invoice wizard preview can now switch between the PDF and the outgoing email, so you can review the exact client email before sending
client-line-item-suggestions2026-05-12
+newNew invoices now suggest recently used line items for the selected client as you type, so repeated client work can be filled without rebuilding the same rows
tanstack-boundary-hardening2026-05-12
~fixPublic invoice links and PDF endpoints now reject malformed invoice IDs earlier, unsupported API methods now return the right status, and loading states avoid hydration drift
dashboard-navigation-warmup2026-05-10
*perfDashboard sidebar pages now warm in the background after the app is idle, so moving between dashboard, invoices, clients, recurring, follow-ups, and reports feels quicker
dashboard-invoice-send-performance2026-05-10
*perfDashboard invoice actions now feel snappier because sending, scheduling, and status changes no longer wait for analytics bookkeeping before the app responds
*perfLarge invoice lists now paint less off-screen work, and the dashboard overview avoids unnecessary refreshes during quick route hops
dashboard-chunk-recovery2026-05-10
~fixDashboard navigation now recovers from stale deployment chunks by refreshing once instead of leaving users on an import failure
login-security-check2026-05-10
^improvedLogin now shows a clear security-check block when Cloudflare needs verification, with specific messages for loading, expired, timed out, and blocked states instead of a vague verification error
pdf-download-fast-path2026-05-04
*perfPDF downloads now serve cached R2 files from lightweight invoice metadata and only hydrate or rate-limit the full invoice when a render is actually needed
^improvedDownload PDF now retries briefly when the file is already being prepared instead of immediately making you click again
dashboard-invoice-loading2026-05-03
*perfDashboard invoice links now preload edit and preview routes, keep recently loaded invoice details warm, and skip an extra redirect from reports while new invoice numbering stays fresh
*perfInvoice edit and preview pages now load the invoice, client, and line items through one scoped query
invoice-pdf-generation2026-04-28
~fixFreshly sent invoices can generate and download their PDF from the preview instead of spinning while waiting for a missing stored file
~fixPDF readiness now checks the stored file exists, and invoice emails get a server-side PDF fallback if the browser upload does not finish quickly
payment-method-overrides2026-04-27
~fixThe invoice wizard now loads each client's brand color, invoice prefix, payment terms, and due date before the preview renders, so Ramsalt Lab starts pink with its SALT invoice number immediately
~fixInvoice previews and PDFs now show due date only across all five templates, keeping payment terms as editor logic instead of repeated client-facing metadata
~fixClient-specific payment method choices now keep working for older saved accounts and wallets, even before you resave Settings
~fixAn account kept on file but hidden from normal new invoices can still be pinned to one client when that client should use it
~fixBank and crypto labels now stay internal to Settings and pickers; invoice previews and PDFs show only payment details clients should see
dashboard-route-maintenance2026-04-25
~fixDashboard client creation now keeps the clients list responsive after adding a client, and dashboard route code splitting is configured for the current TanStack Start version
^improvedClient detail invoice links now stay inside the app instead of forcing a full page navigation
home-js-regression2026-04-23
~fixThe homepage no longer bloats its main JavaScript chunk with the full base stylesheet, so the public shell keeps SSR-inline styles without tanking mobile Lighthouse again
home-critical-path2026-04-23
*perfThe homepage now ships its base styles inline on first load and avoids pulling the IBM mono webfont into the marketing shell, trimming the remaining blocking CSS and font request chain on the public site
blog2026-04-22
+newWriting — a new blog at /blog with short essays on invoicing, freelancing, and getting paid on time
seo-hardening2026-04-19
^improvedThe public site now has cleaner search metadata, stronger social previews, a tighter sitemap and robots setup, and clearer crawler guidance for AI tools
posthogdeployenv2026-04-19
~fixBrowser analytics now initialize again in production, so visits can show up in the dashboard instead of silently stopping after deploys
~fixDeploy builds now use the real production public env values instead of leaking local-dev values like localhost into the shipped client bundle
playwright-artifacts2026-04-18
^improvedTesting docs now explain how to watch Playwright runs in a visible browser, where reports and retained debug files are saved, and how to delete them when you want the disk space back
legalcopy2026-04-15
^improvedThe Privacy Policy now matches the app's real data flows more closely, including analytics, error reporting, billing metadata, signature IP capture, export contents, and staged account deletion
^improvedThe Terms now explain auto-renew and cancel-at-period-end billing more clearly and make the customer-data controller/processor split explicit
billinglive2026-04-15
~fixBilling now reads the live Polar subscription, so switching between monthly and yearly actually updates the current-plan card
~fixThe billing page now shows the current period end date and makes cancel-at-period-end obvious, so there is no ambiguity about when access ends or whether auto-renew is still on
~fixThe billing page now refreshes when you return from Polar, so checkout and portal changes show up without a manual reload
polarsync2026-04-15
~fixThe Polar checkout return page now waits for the workspace to actually switch to Pro before showing the upgrade success state
~fixBilling-sensitive dashboard loads now fetch fresh plan data so successful upgrades stop getting stuck showing stale TRIAL or FREE badges
pdfprobe2026-04-15
~fixSent invoice downloads now wait for the same saved PDF copy used for email attachments, so public invoice links stop failing while that file is finishing in the background
~fixDownload buttons now check PDF readiness with a normal request path instead of the flaky HEAD probe, so invoice PDFs recover cleanly instead of erroring mid-click
8c4f2ad2026-04-13
~fixInvoice emails and follow-ups no longer get stuck when PDF attachments are unavailable; the app now keeps delivery working instead of hanging
typedrt12026-04-08
~fixTanStack Router bootstrap now derives its concrete router type before Sentry setup, fixing the router-side type mismatch in the app shell
^improvedThe login route now validates its mode and error search params instead of relying on loose client-side casts
~fixOAuth callback redirects now only target known internal routes instead of forwarding arbitrary next strings
~fixBrowser-only PostHog timer and key typings were tightened so the TypeScript check is clean again
~fixServer functions now use real runtime parsers across auth, onboarding, clients, invoices, follow-ups, settings, billing, search, activity, and public invoice signing instead of type-only validators
~fixDashboard snapshot failures now reach the route error boundary instead of falling through to the empty dashboard state, and public signature uploads measure the actual decoded payload against the 150 KB limit
*perfRoute-local server functions were moved into src/server/functions and TanStack Start route code splitting is now enabled via router.experimental.enableCodeSplitting; /dashboard/reports also canonicalizes search params before loaderDeps so invalid URLs reuse one cache key
4a7f1cd2026-04-05
^improvedHomepage hero rebuilt as a wide invoice-workspace product stage that now breaks out beyond the desktop content container, with the first feature section cutting through the lower part of the frame instead of the hero ending as a boxed card
^improvedHero frame, layered PDF template previews, and activity toasts now have subtle pointer-reactive motion and proper entrance animation
ccbd2e82026-04-03
+newPayment receipt emails — clients now get a confirmation when you mark an invoice as paid
^improvedHomepage redesign with narrative feature sections and scroll-driven animations
^improvedFooter CTA redesigned with bolder copy and streamlined link columns
^improvedEmail settings — per-event inline Preview and Test buttons replace global controls
*perfDashboard follow-up requests removed from initial route load
f9d18902026-04-02
^improvedDashboard redesign with past due invoices, upcoming payments, recent activity, and upcoming recurring sections
*perfShared client entry bundle cut by ~62% — main chunk dropped from 789KB to 309KB gzip
^improvedComprehensive responsiveness pass across all routes for mobile, tablet, and desktop
^improvedFeature documentation overhaul with 16 features covering the full product surface
~fixReports auth — server function now checks authentication and redirects properly
*perfInvoice and dashboard cache TTL raised from 15s to 120s, matching route staleTime
a5271582026-04-01
+newRecurring invoices — set frequency, auto-generate drafts on schedule
+newBulk actions — mark paid, delete, and export multiple invoices at once
^improvedClient detail page with invoice history, revenue stats, and quick actions
~fixClient delete/restore race condition — added disabled state and useTransition
7575ecf2026-03-31
+newFollow-up reminders — schedule and send payment reminders to clients
+newPDF invoice generation with three professional templates
^improvedInvoice preview with live A4 paper simulation and tilt effect
*perfPlan usage store rewritten with useSyncExternalStore — tear-free reads, SSR-safe
e3f4a012026-03-28
+newPublic invoice sharing via unique link — clients view and download without an account
+newActivity feed with real-time updates via Supabase realtime channels
^improvedGlobal command palette search for invoices, clients, and navigation
b2c8d472026-03-25
+newReports dashboard — revenue charts, client breakdown, and export to CSV
+newMulti-currency support with automatic formatting per client locale
^improvedOnboarding flow redesigned with progressive disclosure and instant org setup