Zimer changelog
2026-10-07
- Changelog renders inline code. Backticked names (like
--primary) used to show the literal backticks on the changelog page — they render as code spans now.
2026-10-06
- One place to change the color scheme. The theme colors now live as CSS variables (
--primary,--on-primary,--primary-container,--on-primary-container) defined once in:root— no more hardcoded hexes scattered across the stylesheet. Calendar time slots stored under the old gold default now follow the theme too. - Pumpkin is the primary color now. The October theme's decorations are gone, but the pumpkin orange (#fb923c) stays as the permanent primary color — buttons, badges, the logo, and invoice accents.
- Whole-hour durations read cleaner. A one-hour entry now shows "1h" instead of "1h 00m" — in the Today list, on the calendar, and everywhere durations render.
- One gold action on the demo banner. The "Zinvoice the sample week" link in the timer page's demo banner is a text button now, so Start stays the screen's only emphasized action.
- Update-check wording fixed. Settings > Updates said to press "the button below" — the button sits beside the text. It says "the button" now.
2026-10-05
- Downloads and backups carry the Zimer name. CSV exports and on-disk backup files that still said timekeep-* are named zimer-* now.
- List panes open with the first item selected. On desktop, the Zinvoices and Clients pages preselect the first row so the detail pane has content on load — phones still open on the list.
- The logo lost its witch hat. The app-bar mark is the plain cupped-hand clock again.
- Demo banners say zinvoices. The last "invoice" wording in the demo-data banners now reads zinvoices.
2026-10-02
- One emphasized action per screen. "Load demo data" was a second filled gold button on the timer banner and the invoices empty state, competing with Start and New invoice — it's a text button now. Each screen has exactly one gold action.
- Tracking label keeps the project name whole. The timer card's TRACKING · project label split the project name across lines next to Stop on narrow screens — it now stays on one line with an ellipsis.
- Nudge chip holds together on phones. The calendar's "not yet invoiced" pill broke "Invoice this week" across two lines on narrow screens — the link now stays on one line and the chip wraps between its two parts instead.
2026-10-01
- Running entries grow out of their pill. On the calendar, a timer started minutes ago kept its squashed pill shape and stretched into an oval as the minutes piled up — the running entry now reshapes into a normal card once it's tall enough.
- Page titles are real headlines. App page titles are now the page's h1, so screen readers announce the page correctly.
- Wizard notes are labeled for screen readers. The new-invoice wizard's Notes and Internal notes text areas now carry accessible names.
- Labels click through to their fields. The edit-entry page and the invoice wizard's date/number fields had floating labels that weren't wired to their inputs — screen readers skipped them and clicking a label didn't focus the field. They're wired now, like the calendar dialog's.
2026-09-30
- Extension suggestion card has a real headline. The autotracker's "Start X?" line rendered as plain body text next to the styled eyebrow and description — it now reads as the card's title.
- One-hour line items read "hr". On phone-stacked public invoices, a 1-hour line now reads "1 hr × rate" instead of "1 hrs × rate".
- Paid invoices say "Total", not "Total due". Nothing is due once an invoice is paid, so the grand total row on the sheet and the PDF now reads "Total" on paid invoices.
- Settings has a real page now. Visiting
/settingsdirectly used to render an unstyled fragment — it now loads as a proper Settings page inside the app layout; the settings dialog itself is unchanged.
2026-09-29
- Manual line items on new invoices. Step 2 of the new-invoice wizard can now include hand-entered line items, so flat fees and anything billed outside tracked time sit alongside the hours pulled from time entries.
- Client links moved to invoice.klectr.dev. The public invoice hostname changed — new client links use the new address, and old tristonarmstrong.com links keep working.
- Online payments now reliably mark invoices paid. The Stripe webhook verifies signatures and matches payments by payment-link ID instead of fragile metadata, so paying through the client's Pay button flips the invoice to paid.
- Invoice detail starts at the top. Switching invoices resets the detail pane's scroll position instead of leaving you wherever the last invoice was scrolled.
- No more phantom scroll space. Invoices with a client link had ~900px of invisible dead scroll area below the content, caused by the link's hover tooltip; the scroll area now ends where the content ends.
- Paid PDFs drop the PAY ONLINE line. Once an invoice is paid, the PDF no longer includes the pay-online prompt.
- From email placement. On the invoice PDF, the sender email now sits below the business address instead of above it.
- Autotracker dedupes rules. Saving an autotracker rule under an existing name updates it instead of creating a duplicate.
- Top bar actions, out in the open. Settings, Export CSV, Download backup, and Log out moved from the hidden account menu to icon buttons on the right side of the top app bar.
- Public invoices fit phones. On small screens the dates stack vertically and each line item gets breathing room — the date on its own row, hours × rate next to the amount.
- Tooltips stay in the column. Calendar entry tooltips now anchor to the day-column edge instead of clipping off the first and last day columns.
- Calendar clicks work again. Clicking an empty calendar slot now opens the create-entry dialog — a regression had left clicks doing nothing.
- Invoice date separators restored. The middots between Issued, Due, and Billing period lost their spacing on desktop (and stacked as stray rows on phones); they're back.
2026-09-28
- Invoice sheet cleanup. Header layout reworked — title alignment, parties order, dates placement; the dates line now sits directly above the table, and the redundant "Billing period:" line is gone from the PDF (the per-row Date column already states it).
- Client contact details. Clients can carry email, phone, website, and a multi-line address — address and email show in the invoice Bill-to block, on screen and on the PDF.
- Client settings in one dialog. Renaming a client and editing all its details moved into a cog-opened settings dialog on the Manage page; the cog sits at the right end of the detail header.
- Copy link works everywhere. The copy-client-link button now falls back cleanly on non-secure origins (like the Tailscale URL) instead of doing nothing.
2026-09-25
- Repeat an entry. Restart any finished entry from the Today list with one tap — description and project come along.
- Confirm dialogs look like the app. The six native browser confirms (deleting entries, draft invoices, clients, projects, client links) are now the app's own M3 confirm dialog. Deleting the running entry is off the table — stop it first.
- Everything ticks. The running entry's time ticks live in the Today list, and the browser tab shows elapsed time while a timer runs.
- Keyboard and screen-reader pass. A skip link, focus stays trapped inside dialogs, and closing a dialog puts focus back where you were.
- Touch tooltips. Press-and-hold shows tooltips on touch screens; the native browser tooltips are gone everywhere else too.
- Phones. Invoice line items stack instead of squeezing, and dates stay glued to their labels.
2026-09-18
- Material 3 navigation. The four destinations moved out of the top app bar into proper M3 navigation: a bottom bar on phones, a leading navigation rail on larger screens, and a slimmer app bar with just the brand mark and account menu.
- Full-screen dialogs on phones. The calendar entry and settings dialogs now fill the whole screen below 600px, with a title/close row at the top; larger screens keep the centered dialog.
- Timer Start/Stop are card actions. They were borrowing the extended-FAB class for its pill shape; per M3 (a FAB never attaches to a card) they are now regular filled buttons. No floating FAB on the Timer page.
- License gating (dormant in beta). The groundwork for post-beta licensing is in: a one-time license key checked fully offline (Ed25519, no network calls — your data never leaves the machine), an honesty-box banner, and a License section in Settings. While
TIMEKEEP_BETAis set (the default), none of it appears and everything stays free.
2026-09-17
- Immutable invoices. Once an invoice is sent, its PDF and on-screen copy are frozen snapshots — later changes to clients or your business profile can't silently alter what a client sees.
- Internal-only invoice notes. A private notes field on invoices that appears in the app but never on the PDF or the client's page.
- First-run onboarding. Fresh installs get guided empty states and a one-click fictional workspace, with a straight path from sample data to a prefilled draft invoice.
- Invoice this period. Jump from the timer or calendar straight to a new invoice with the week prefilled — two clicks from tracked time to draft.
- Rate limiting. The public invoice page and login are now rate-limited against abuse.
- Custom not-found pages. Bad invoice links get a clean "this invoice doesn't exist" page; every other unknown address on the public subdomain gets a playful dead-end.
2026-09-16
- Public invoice links, locked down. Client links moved to invoices.tristonarmstrong.com, which serves only invoice pages — nothing else from the app is reachable there.
- Per-client payment terms. Due on receipt, Net 7/15/30/45/60, or pay-when-paid: each client can carry its own terms, and invoices pick them up automatically.
- Manage rebuilt. Clients and projects are now one clean expandable list.
- Copy link fixed. The client-link copy button works over plain HTTP without insecure fallbacks.
Shared securely via Zimer