Changelog
What's new in Deski, release by release.
0.1.13
18 August 2026Added
- The timesheet can be a real invoice. It now carries an invoice number, an issue date and a due date from standard payment terms (on receipt, net 7, 14, 30 or 60), a Bill to address, and an optional tax line with your own label — VAT, GST, sales tax — turning the single Total into the Subtotal / Tax / Amount due stack an invoice ends on. Give it a number and the heading changes from Timesheet to Invoice. Printing advances the number for you: INV-001 becomes INV-002, keeping your padding and incrementing the last run of digits, so 2026-014 does not roll the year over.
- Your own letterhead. A logo, business name, address and contact block, a footer note for payment terms and bank details, and one accent colour. The sheet sits under the controls as a live preview. The logo never leaves your machine — it is read from disk, checked on the file's actual bytes rather than its extension, and embedded in the sheet. The accent tints your business name and the rule under each heading, and deliberately never a figure: an invoice gets printed on somebody's black-and-white office printer, so no number on it may depend on colour to be read.
- Choose what the sheet breaks down by — By tag, By name, By day, By week — with By tag alone as the default, which is the shorter document most invoices want. By name groups by what each block was called and behaves like invoice line items, so it is the one that can carry a rate per line: set a different rate for any description and the invoice is priced from those lines.
- Up to three default tags, not one — the same limit a block itself has, so with Apply them automatically switched on a new block can be fully tagged.
Fixed
- The By tag column now adds up to the total. A block was counted in full under each of its tags, so anything multi-tagged inflated the column — 29.06 hours listed against a stated total of 28.54 on a real sheet. A block's time is now split across its tags, so the column partitions the range and prints its own total. If you have already sent invoices broken down by tag, those per-tag hours were overstated wherever blocks carried more than one tag.
- Every column sums to the printed total exactly. Rounding each row on its own does not guarantee it — three rows of 1.005 hours each print as 1.01 and add to 3.03 against a total of 3.02. Rows are apportioned so the column reaches the total, with no row moving by more than a hundredth of an hour, and amounts are calculated from the hours actually printed. So multiplying the row in front of you gives that row's amount.
Changed
- Amounts carry thousands separators — "TZS 299,985.00" rather than "TZS 299985.00".
- A tidier sheet. Issuer and client face each other as From and Bill to; the top of the page is a centred "Report generated by Deski at…" with the tamper badge beneath it; and tag names are capitalised in print, leaving words you capitalised yourself — iOS, eBay — exactly as typed. The headline hours line and two method notes are gone, since every table now states its own total.
- Tag pickers list your ten newest tags, with the rest behind their search box, on a block and on the bar that tags a whole selection.
0.1.12
15 August 2026Added
- Tags can be recoloured. A colour was fixed at the moment you created the tag, and the only way to change it was to delete the tag — which took its history with it. Click any tag in Settings → Tags and the colour picker below it applies to that tag instead. Only the colour: a tag's name is part of what a timesheet's tamper check commits to, so renaming one would silently change the check on every block that ever carried it.
- A default block name and default tag, for anyone working on the same thing day after day. They pre-fill and nothing more — an unnamed block opens the rename box already filled in, and your default tag is offered first — so work is still labelled only when you confirm it. Apply them automatically turns that into no work at all, and ships switched off on purpose: a block labelled that way carries a claim you didn't look at, so a default left over from last month gets written onto this month's work.
- The last three names and tags you used are offered as one-click chips, so repeating yesterday's label doesn't mean retyping it.
Fixed
- The Insights charts were only ever showing your 50 most recent blocks, while telling you they covered "all time", "the last 6 months" and "the last 14 days". Everything older was missing with nothing on screen to say so — on a 93-block history that hid 43 blocks and 22.9 hours, and drew a month containing 13.4 tracked hours as empty. It looked correct up to your 50th block, then lost a little more history with every block after that. The charts now read your whole history. If yours have looked thinner than your week felt, this is why, and updating fills them back in — nothing was lost, the blocks were always in the database.
Changed
- The activity card says which of its six views you are looking at, and the ⓘ beside it explains that view. The heading was a fixed "Daily Activity", true of one of them; the help text described bars split by tag even over the heatmaps, which shade by total time and know nothing about tags.
- The heatmap tooltips say what they are counting. In the weekday view each row stacks every occurrence of that weekday, so today's row legitimately shows hours still ahead of the clock — which reads as a bug and is not one. A cell now says "Every Saturday, 16:00–17:00 — 120 min across 4 days". Dates in the other heatmaps follow the format chosen in Settings, which they previously ignored.
- Rounder input boxes throughout, and a tidier tag manager: one coloured pill per tag, the ten most recent listed with the rest behind the search box.
- Session cards show when a block started and finished — 11:26 → 11:39 — rather than a single time.
0.1.11
11 August 2026Added
- Rename a whole selection at once. Ticking blocks gave you Tag and Merge but no way to name them, so putting the same label on twelve blocks meant twelve clicks. The bar now has Rename between the two: type one name and it goes on every selected block. Leave the box empty and it clears their names instead, which is the quickest way to undo a rename you regret. Renaming replaces whatever was there — unlike a tag, which is added alongside the others — so the confirmation says how many existing names it overwrote, not just how many blocks it touched.
Changed
- The efficiency score now shows what it is a percentage of. The ring gave you a figure with no denominator: 72% of what? Underneath it now sits the day's span — 09:12 → 16:09 · 6h 57m — so you can see the whole working window the score divides, and when it ran. Focus time and Breaks are the two halves of that span, which the card never quite said. The explanation behind the ⓘ is also more honest about where that window comes from: it runs between the blocks Deski actually recorded, not your first and last minute of work.
0.1.10
8 August 2026Added
- Timesheets now carry a tamper-check badge. Deski keeps a running record of every time block as it writes it, each entry sealed against the one before. Printing a timesheet re-checks every block in the range against that record and prints one of three results: nothing was changed outside Deski, something was, or it cannot tell for that period. What the badge claims matters, so here it is exactly: a green tick means the blocks have not been casually edited since Deski started recording — someone opening the database in a spreadsheet tool and changing a number gets caught. It does not mean the hours were worked, and it cannot: no software on your own machine can prove that to someone else. Anything already in the file when you upgrade is taken as genuine, because the record has to start somewhere. The grey "cannot check" result is not a pass.
- A flagged timesheet has two totals instead of one. Hours that passed the check are totalled as verified and invoiced; hours that failed are listed underneath with the reason and are deliberately not added to that total. The part worth knowing before you need it: a flagged sheet is still sendable. You are not blocked from billing and you do not have to fix anything first — the client pays the total that is certain and can ask about the rest.
- Check and fix, for when a check does fail. In Settings → Data, it says what each option costs before you pick one. Restore puts a block back to the figures Deski originally recorded — it can only write back what the record already holds, so it can never invent hours, and blocks Deski has no record of are left alone rather than removed. Confirm blocks deleted outside Deski records that hours already gone from the file were removed, so reports stop flagging them; it does not bring them back. Delete removes the flagged blocks permanently, and is never the default.
- Add a past entry, for hours you worked without the timer running — a session you forgot to start, or work away from the machine. Pick the date and times, name it, tag it. These hours count towards your totals and are billable. Because Deski wasn't watching the clock for them, a timesheet lists them separately as untracked, alongside the hours it recorded automatically and the ones you timed by hand.
- A timesheet shows where its hours came from: recorded automatically from keyboard and mouse activity, timed by hand with the stopwatch, or added afterwards as untracked.
- Select all, and tag many blocks at once. Selecting blocks in Insights now has a Select all control, and tags apply to the whole selection in one go rather than one block at a time.
Fixed
- Long timesheets print properly across pages. A report spanning more than a page lost its margins on every page after the first, ran the logo off the edge of the paper, and printed the browser's own header on top of Deski's. Each page now has its own margins, the logo sits inside them, and pages are numbered.
- A backwards date range no longer produces an empty sheet. Setting the end date before the start date now nudges the other end along instead of quietly returning nothing.
0.1.9
6 August 2026Fixed
- Opening Deski twice no longer double-counts your time. Nothing stopped a second copy of Deski from starting — from the tray icon, a shortcut, or forgetting one was already running. Both copies then wrote to the same database at once: two blocks for the same stretch of the day, and every click and keypress tallied twice. Launching Deski again now brings the window you already have back to the front, including from the tray. If you have been running two copies, the duplicate sessions are already in your history and can be deleted from Today's Sessions or Insights.
- Deski no longer contacts Google when it starts. The app loaded its typeface from Google's font servers, so every launch told Google your IP address and the time you opened Deski — which contradicts the promise this app is built on. The font now comes from your own system and nothing is requested. Text may look slightly different; that is the same font Deski already used whenever you were offline.
Changed
- Sign-in leads with your email address. The sign-in screen used to open on the licence-key box, with email tucked underneath as a smaller link. Typing your email and a 6-digit code is easier than finding a 128-character key in a purchase email, so that comes first now. The licence key is still one click away, and both work exactly as before.
Security
- The app now runs under a content security policy. Deski's window is a webview holding your sign-in token, and nothing prevented injected code from running inside it and reading that token. The app is now restricted to its own bundled files: no remote script, style, font or image can load. No visible effect — it closes a door rather than changing a behaviour.
0.1.8
3 August 2026Fixed
- A schedule is no longer ignored in Auto mode. You could select Tuesday only, turn on "Start tracking on startup", and Deski would still start tracking on a Monday. Auto records continuously whenever it's selected, and that behaviour predated scheduling — it armed tracking at every launch without ever consulting the days you'd picked. Auto now checks the schedule first, so the days mean what they say. On a day outside your schedule Deski won't begin tracking on its own; start it by hand if you need to, and a session you start yourself is still never stopped by the schedule.
- Beta testers stay signed in offline. Deski caches a signed entitlement so it keeps working without a connection, but the check that opened that cache didn't recognise beta access — so a tester's own valid pass was turned away, and Deski had to reach the server on every launch. Trials and subscriptions were never affected.
- Timesheet totals add up to their own columns. Days printed as 0.59 + 4.28 + 0.67 sat under a total of 5.55 rather than 5.54, because the total was rounded once at the end instead of summing the printed rows. Both the table total and the "hours tracked" line now match what's above them.
Added
- Bill from the timesheet. An optional Rate / hour and Currency add an Amount column to the By day table and a grand total to the sheet. Currency is a free-text box, so a symbol or a code both work. Every figure is derived from the rows printed above it, so whoever adds up the column gets exactly the total shown. Leave the rate blank and the report looks as it always did.
- A weekly cap on billable hours. For a retainer or a contract ceiling: give a maximum per week and the report adds a By week table showing what you tracked next to what may be billed. Each week is capped on its own, so a quiet week never creates room in a busy one, and the weeks follow your start-of-week setting. Hours above the cap are still printed, with a line saying how many weren't billed.
- "Prepared by" is now a box you can fill in, instead of always printing your account email. Signature lines can also prefill your name and the sheet's date, leaving only the signature to add by hand — the Approved by line is never prefilled, since that one belongs to whoever signs it off.
- Remember the details you type. One tick keeps Prepared for, Prepared by, the rate, the currency and your signature-line settings for next time. Off by default, and unticking it erases what was stored rather than leaving it behind.
- The timer says when the schedule is what's stopping it. A line under the clock reads Outside your scheduled hours — or Today isn't a scheduled day — instead of leaving the timer sitting silently at zero. It clears itself the moment tracking resumes, however you resume it.
Changed
- The timesheet has its own header — a generated stamp on the left, the Deski name on the right — and Deski now suppresses the browser's own print header, which used to put a timestamp, the window title and the app's internal address along the edges of a sheet going to a client. The stamp uses a year-month-day date and a 24-hour clock, so it can't be misread: 03/08/2026 means 3 August to one reader and 8 March to another.
- The Daily Activity heatmap starts with today. Both views put the most recent row on top: By day runs today back through the fortnight, By hour starts on today's weekday. Every By hour row is now labelled, and hours that haven't happened yet are left blank.
- The "Check for updates" button is gone (Settings → Account → About). Deski already checks on every launch, so pressing it re-ran a check that had just run. When a newer version exists, a Download button appears there on its own.
0.1.7
2 August 2026Added
- Scheduling (Settings → Startup). Pick the days of the week, then choose whether Deski starts tracking when it opens, between a set From/To time, or both. Everything here is off by default — Deski never starts tracking on its own unless you ask it to. On a day you haven't selected nothing automatic happens, though you can still start and stop tracking yourself. A window that runs overnight belongs to the day it starts on, so a Friday 22:00–02:00 window carries into Saturday morning.
- Create a tag straight from a time block. The + Tag menu now lets you type a name and create it on the spot, so tagging no longer means a trip to Settings.
- Search your tags — in both the block's tag menu and the Settings list, once you have more than a handful.
- Ten saved colour slots (Settings → Tags). Pin the colours you reuse, apply one with a click, and clear a slot without disturbing the others.
Changed
- Settings is now a list of six sections — Tracking, Tags, Startup, Appearance, Data, Account — instead of four pages you flipped between with arrows. The old pager named nothing, so no setting had a fixed home and things drifted between pages every time something was added. Reopening Settings lands on the section you were last in.
- The tag limit is now 100, up from 10, with names up to 30 characters. The limits are stated on the page rather than only appearing when you hit them.
Fixed
- Minimizing and restoring quickly no longer leaves the window the wrong size. Minimizing looks like a window move on Windows, which triggered Deski's fit-to-screen logic against a window that wasn't on screen; the resize it started then fought the restore. Deski now ignores a minimized window and cancels any resize already under way.
0.1.6
30 July 2026Fixed
- The window closes when you click the X. In 0.1.5 it didn't: the click looked like it had reset the open block and the window stayed put. Quitting now works from the X, and still finishes saving the open block first.
- Printed reports are no longer cramped. A report printed from a smaller window came out with tiny text squeezed into part of the page. The printed sheet is now laid out in physical units, so it looks the same whatever size the window is.
Added
- Back up your database (Settings → Data). Writes your whole history to a single file you choose. It's an ordinary SQLite database, not a Deski-only format — open it in any database tool, move it to another machine, or keep it as an archive. It isn't encrypted, so treat it as carefully as the original.
- Restore from a backup. Replaces everything currently in the app, after a confirmation. Deski checks the file is a real Deski backup first and refuses anything else, leaving your data untouched.
- Printable timesheet report (Settings → Data). Pick a date range and get a clean sheet: total hours, a breakdown by tag and by day, and every block listed. Optionally add a "Prepared for" name and a signature block for client sign-off. Print it, or use your system's "Save as PDF" to get a file.
- Support address in Settings → About, so you don't have to go looking for it on the website.
Changed
- Every text field now has a length limit. Block names, tag names and the rest were unbounded, and a long enough paste could break the layout of the row it sat in.
0.1.5
29 July 2026Added
- Full block length. Auto mode now cuts a block once it holds this much tracked time — 10 minutes by default, adjustable from 1 to 60 in Settings → Timing. The timer shows a progress bar towards it.
- Pause button. Pausing keeps your session and its block open, stops the clock, and leaves the break out of the block's duration. Off by default; turn it on in Settings → Timing.
- Delete a block from Insights. Recent Activity had rename and tagging but no delete — it's now on every row.
- Merge blocks anywhere in the day. Merging used to be reachable only after drilling into a single hour, so two blocks in the same day but different hours could never be merged. The day view now has a By hour / All blocks toggle; "All blocks" lists the whole day flat, with the same checkboxes and merge bar.
Changed
- Idle no longer cuts your session in two. One setting used to do two jobs, which is why a stretch of work could end up as a string of 9- and 10-second slivers. They're now separate: the idle gap decides what counts as tracked time, and full block length decides where blocks are cut. Reading or thinking for a minute no longer ends your session — it just isn't counted.
- Block durations exclude idle time. A block records how much idle it holds, and its duration is the span minus that. The efficiency ring accounts for it proportionally. Existing blocks are unchanged.
- The timer's controls are hidden by default. Start/stop and the Auto/Manual switch join pause as opt-in — Auto is how Deski is meant to be used. All three are in Settings → Timing.
- "Check for updates" no longer starts a download by itself. It now only reports: a Download button appears when there's an update, and a failed check says so.
Fixed
- Quitting no longer throws away the open block — Deski finishes saving before it exits.
- The pause button stayed invisible even when switched on.
- The Insights card heading no longer breaks apart in a narrow window.
- The date-format setting no longer splits its preview mid-phrase.
0.1.4
21 July 2026Signing up & signing in
- The welcome screen now offers a clear choice: Sign up or Sign in. New to Deski? "Sign up" starts your free trial. Already a subscriber? "Sign in" takes you to license-key entry, with a more prominent link to sign in by email instead.
- Sign up now always opens the right checkout for your account, so a sign-up never lands on the wrong page.
0.1.3
21 July 2026Account & subscription
- Sign in with your Deski license key instead of an emailed code. Paste the key from your purchase confirmation email to sign in — it proves who you are and unlocks your subscription in one step, with no email round-trip. Your tracking data still never leaves this device.
0.1.2
20 July 2026Fixed
- The timer no longer keeps counting while paused. After the once-a-day subscription re-check (or any moment tracking was disarmed), an open time block could keep running in the background even though the play button was showing. Tracking now finalizes the current block at your last activity and cleanly resumes.
Account & subscription
- Billing is now handled by Freemius as Merchant of Record — checkout, payment, invoices and cancellation. Subscription status in the app is unchanged.
- The free trial is now 14 days (previously 30). A card is collected at checkout and $0 is charged during the trial.
- Invited beta testers with allowlisted accounts get full access without a subscription.
Settings & UI
- Custom tag colors. Beyond the presets, pick any color from a color wheel or type a hex code when creating or editing a tag.
0.1.1
14 July 2026Account & subscription
- Sign in with just your email — a 6-digit code is sent to your inbox, no password. Up to 3 devices per account.
- 30-day free trial and $5/month subscription, handled by Paddle. Subscription status (and days left) shown in Settings → Account and the status bar.
- Cancel any time from inside the app — with a Resume button if you change your mind before the period ends. After cancelling a trial, the end date is shown.
- Optional one-click account-data deletion during cancellation; otherwise account data is removed automatically after 90 days of inactivity.
- Your subscription is verified online once a day; in between, the app starts instantly using a signed offline check and keeps working offline for up to 3 days.
- Welcome card on first sign-in and a short walkthrough of the UI.
Updates
- The app now tells you when a new version is available, with a download link — plus a manual "Check for updates" button in Settings.
Settings & UI
- System/Light/Dark theme mode (follows your OS by default).
- Launch-at-startup and minimize-to-tray options.
- Configurable week start and date format.
- About section with version, changelog and user-guide links.
- Efficiency Score info button explaining how the score is computed.
Privacy
- Mouse positions are no longer stored at all — only the event type and time.
- Cleared data is securely purged from disk, not just marked deleted.
- The sign-in service stores only your email and sessions, in the EU, with automatic expiry. Signing out revokes the session server-side.
0.1.0
19 June 2026 — first releaseTracking
- Background tracking of global mouse activity (clicks + movement) — private by design: no screen positions, ever.
- Auto and Manual modes: Auto opens a time block when activity is detected and closes it after an idle gap; Manual is a simple Start/Stop stopwatch.
- Optional keyboard tracking, stored as a count only — the keys pressed are never recorded.
- Configurable auto-block idle gap (10 seconds to 5 minutes).
Timer page
- Circular timer with status, Start/Stop and discard controls.
- "Today's Sessions" list and a "Total Today" summary.
Insights
- Daily Activity chart with Heatmap/Bar types and hour/day/month granularity, including a GitHub-style contribution calendar and weekday×hour punch cards.
- Efficiency Score ring (focus time vs. breaks).
- Recent Activity drill-down: day → hour → individual blocks.
Organization & appearance
- Color-coded tags (up to 3 per block), per-block rename and delete.
- "Clear all" for today or for all history — securely wiped from disk.
- 8 light/dark themes, persisted across restarts.
Storage & privacy
- All data lives in a local SQLite database on your device. Nothing is uploaded anywhere.
- Frameless window that auto-fits your screen, with sidebar navigation.
Deski follows semantic versioning. New releases appear here as they ship.