Development notes, guides, and announcements about WarmDesk.
Customers can now have multiple locations — each with a full address, a contact person, and a standard travel distance. Time tracking picks up on that: a Location dropdown in the weekly grid and the calendar view auto-fills an entry's distance, and stays freely editable for the day-to-day reality of traffic and detours.
The header search bar now also matches ticket subjects and time-entry descriptions, and clicking a result jumps straight to it instead of just its container. A new Search & Replace mode lets you find and replace text across cards, comments, direct messages, tickets, and time entries, with a permission-aware preview before anything changes.
Spinning up a throwaway MySQL-backed test instance surfaced a chain of bugs — startup validation, auth errors masking real database failures, reserved-word quoting, non-nullable card-history columns, SQLite-only SQL syntax, and a --reset that never actually cleaned up — every one of them invisible against SQLite. v0.17.0 also adds a test-instance branding mode and multi-instance deployment templates.
v0.16.4 fixed SVG logos being rejected outright and PNGs sometimes rejected for no reason, plus a bug that left every replaced avatar or logo behind on disk forever. v0.16.5 adds a gc-uploads CLI to reclaim the files that bug left orphaned.
Three releases of polish for the time-tracking calendar view introduced in v0.16.0: a fixed color bug for hidden customers, a new color-by-project option, a calendar that fills the available height, and correct handling of overnight entries.
Time tracking now has a full drag-and-drop calendar view alongside the weekly grid — move entries between days, resize by dragging an edge, right-click or click-drag to create, color-coded by customer. v0.16.1 fixes a bug that made resizing fail.
Backups previously covered only the database, silently leaving out every attachment, avatar, and logo. Backups now bundle the upload directory too, and can be imported from another WarmDesk server and merged in without wiping existing data.
Passkey login was failing for essentially every modern synced passkey — Windows Hello, iCloud Keychain, Google/Bitwarden/1Password — because a security flag was never persisted at registration. Existing passkeys self-heal automatically.
A reactive watcher could fire mid-week-switch with the new week's identity paired with the old week's still-unrefreshed data, occasionally saving the old week's rows into the new week. This closes the window for good.
A deleted time-tracking row could reappear after switching weeks, because a pending background save for the old week was cancelled instead of flushed. Also fixes the admin backup list's missing date, broken download, and broken restore button.
A debounced background save in time tracking could write the wrong week's row layout into a different week, corrupting its saved data. This is the third and final fix in the same week-switching saga.
Switching to a time-tracking week you hadn't customized before could show the full row set from whatever week you last edited, with no matching entries. Fixed by scoping the row-layout lookup strictly to each week.
A rapid-week-switching race condition in time tracking could leave a week's rows visible with no matching time entries. Fixed with a request-ordering guard.
Report charts no longer let near-duplicate activity names pad out "Other", ten activities now get their own color instead of seven, the pie chart finally uses the space it's given, and the admin Settings tab is as wide as every other admin page.
Bar and stacked-bar chart tooltips could highlight the wrong bar whenever the app was zoomed in or out. Chart canvases now render at a fixed size regardless of zoom, so hover detection stays accurate.
The time-tracking report chart gains an Undeclarable time basis, admins can see passkey status right in the Users table, and a couple of auth rough edges around passkey errors and rate limiting are smoothed out.
See whether your account (or any user's, as an admin) has passkeys registered, a hover tooltip confirming who you're logged in as, and admin controls to revoke a user's passkeys.
Admins can now force a password change on a user's next login, with a built-in password generator. Plus a full localization pass brings all 11 non-English locales to complete, translated coverage.
The time-tracking Report tab gains a Chart view with bar, pie, and stacked-bar charts, a declarable/total time basis switch, and a server-side chart PDF export.
Time-tracking reports gain a custom start/end date range and per-row distance and billable-time columns, and the desktop app adds a system tray icon with unread badges and close-to-tray.
Time macros sync to your account, the bottom bar runs them on any start day, and the top bar opens the editor — with full translations.
Time macros now default to the same values every weekday, with an optional alternating A/B pattern when you need it.
Save recurring weekly patterns as time macros — teaching, travel, preparation — and apply them in one click. Plus cut/paste across rows and weeks, double-click row editing, and show/hide closed on boards and tickets.
See all invoices across every customer in one place, navigate account settings via tabs, and automate your helpdesk billing resources with three new Ansible modules backed by a full Molecule test suite.
Patch release: the CustomerContact model was missing from AutoMigrate, so the customer_contacts table was never created and every save attempt failed.
A complete invoicing suite with email sending, credit notes, payment recording, line-item editing, contact persons per customer, and a tabbed layout that keeps long customer pages manageable.
A new clock-on-desk logo for the time-tracking module, and automatic logo swapping when the server runs in --mode=timetracking.
Delete and revoke flows get a red Delete button, guide PDF downloads include the release version in the filename, and the release helper keeps doc revisions in sync.
Download user and admin guide PDFs from the avatar menu, confirm before copying the previous week’s rows, and clearer undeclarable-time styling in the time-tracking grid.
Small refinements to the --mode=timetracking experience: Board tab removed, browser tab title updated, and a fix for mode detection after server switching in the desktop app.
Run a full WarmDesk instance and a time-tracking-only instance from a single config file, sharing the same SQLite database safely.
Select multiple weekdays per contract time slot, and run a stripped time-tracking-only server instance that shares a database with full WarmDesk.
All time slots on a contract now show their week preview, each in a distinct colour. Equal start/end times are treated as 24-hour coverage.
See all standby and after-hours rates across every customer at a glance — no more clicking through each contract to find what rate applies.
Full login and activity history per user in the admin panel, three security fixes, new Ansible modules for epics, sprints, and checklist templates, and a flexible modal width API.
Select a contract when adding time entries, fill the week automatically from contract slots, and see per-day duration totals right in the contract editor.
Trust your MFA device for a week or a month, let admins control the policy, fix undeclarable time alignment on the weekly sheet, and log in reliably behind an HTTP reverse proxy.
The WarmDesk desktop app now supports named profiles. Each profile has its own isolated login session, localStorage, and settings — so you can run separate instances for every customer without ever logging in and out.
WarmDesk now has a built-in help system. Click the ? button in the header for a page-level guide that follows you as you navigate, or click the ⓘ icons next to specific fields for a quick inline explanation — no documentation tab required.
Two new features land in WarmDesk: threaded replies inside helpdesk tickets, and an Epic layer for Scrum projects that groups cards into colour-coded milestones with burndown charts.
Apply reusable macros to tickets in one click, mark incoming email as spam to close and hide it, and enjoy a taller reply box with a Cancel button.
Incoming email creates helpdesk tickets automatically, replies thread onto existing tickets, Gmail and Office 365 authenticate via OAuth2, and the inbox updates live via WebSocket.
Board report consolidated into Time Tracking as a third tab, PDF page-number and undeclarable-time toggles, and a cleaner filter bar on HD screens.
WarmDesk now ships a complete helpdesk module: customer-scoped tickets with SLA policies, priority workflow, linked board cards, internal messages, and time tracking — all Ansible-automatable.
Comprehensive test armoring: JWT/bcrypt/TOTP verification, HTML email rendering, CORS parsing, WebSocket message types, date/time utilities, emoticons with gemoji, and CI integration via GitHub Actions.
Two Go standard-library CVE patches, a Content-Security-Policy tightening, keyboard access for board cards, and i18n-aware aria-labels across the board UI.
A broad security pass covering JWT token-type confusion, SVG upload XSS, webhook token hashing, SSRF prevention, and more — alongside a full WCAG 2.1 AA accessibility sweep across every view in the application.
Multi-day contract rate tiers, standby shift logging, spreadsheet-style cell selection and multi-paste, Ctrl+Z undo on Firefox, and XLSX slot breakdowns.
Named rate tiers on contracts, wall-clock start/end time per time-tracking cell, inline PDF slot breakdown, Ctrl+C/Ctrl+V cell copy, deleted card restore, per-user working hours, and time notation choice.
Every card now keeps a complete audit trail of who did what and when. A new Ansible module lets you manage card comments from your playbooks. Two bug fixes land alongside: a server crash on IPv6 avatar hosts and missing avatars in development mode.
Time-tracking projects now support an undeclarable minutes field. Reports, PDFs, and XLSX exports automatically subtract non-billable time. The PDF export also gains a per-customer page-break option.
Three small quality-of-life improvements to the time-tracking module: blank cells instead of 0:00, a clickable week label that opens a calendar date-picker with week numbers, and CSS flag badges that work everywhere.
WarmDesk v0.9.37 ships a comprehensive WCAG 2.1 AA accessibility pass — skip navigation, focus management, ARIA roles, keyboard shortcuts, and more.
How warmdesk-seed works, what it creates, and example command output—run it once for a full demo workspace.
The repository now ships a Postman Collection v2.1 export under docs/postman alongside the Bruno files — identical requests, usable from Postman on any platform.
The repository now ships a Bruno collection under docs/bruno — a practical, version-controlled way to call every major WarmDesk API from your desktop.
WarmDesk now shows CFD, Cycle Time, Lead Time, and Throughput charts on all Kanban projects — no sprints required.
Every WarmDesk release artifact now ships with a detached GPG signature so you can verify downloads before installing.
Camera and microphone support is fully working in the WarmDesk Linux AppImage, and group video is now available in all group conversations.
WarmDesk now supports group video calls in direct-message group conversations.
A deep dive into WarmDesk — what it is, why it exists, and how it was built almost entirely with AI assistance.