Timer & entries

The timer bar, several timers at once, the picker, manual entries with free-text dates, editing and bulk actions.

The timer bar

A sticky timer bar sits at the top of every page. Its parts, left to right:

  1. Description input — "What are you working on?". Pressing Enter starts the timer; pressing Enter while it runs stops it. Edits while running sync to the server.
  2. Chain chip — appears once something is attached, showing the whole derived chain (Task · Project · Client) as a single removable chip. Removing the chip returns the entry to "simple".
  3. Running count — "2 running", shown as soon as anything is tracking. It opens and closes the running list.
  4. Add a timer — hands the bar over to a blank description, 00:00:00 and a play button, with the cursor already in the field. Nothing starts until you press play. The timer you were looking at drops into the running list, which opens underneath so it stays in view. While you are composing, the same button is a ✕ — Cancel new timer — that discards the draft and hands the bar back; Esc in the field does the same.
  5. + button — opens a menu (Client / Project / Task, each with counts) that leads into the picker.
  6. Billable toggle — shows the resolved rate ("$110/h") when billable, "Not billable" otherwise. The rate comes from the server via rate inheritance.
  7. Clock — HH:MM:SS, tabular numerals, accent-colored while running.
  8. Start/stop — an outlined circular button; it glows softly while the timer runs.

Items 3 and 4 appear only while something is running — with nothing tracking, the bar is exactly the six-part bar above.

Rules worth knowing:

  • A running timer is just a time_entries row with end IS NULL.
  • Stopping with less than one second elapsed discards the entry rather than logging noise.
  • Stopping from the bar inserts the entry at the top of Today and takes you to the Time page.
  • The server is the source of truth: reload the page mid-timer and the clock picks up where it was. Start a timer on your laptop and it shows up on your phone.

Simple ↔ project mode

There is no mode switch. Every entry is "simple" until you attach a client, project or task via the + button. Attach a task and the project and client come along automatically (they are derived, not copied — see Rule 1).

Several timers at once

You can run up to 10 timers at the same time — a call that overlaps deep work, two clients in the same hour, a build that has to be tracked while you carry on. Every ▶ button in Tick (entry rows, task rows, calendar blocks) now adds a timer instead of replacing the one already going.

The running list opens on its own whenever a timer leaves the bar — when you press Add a timer, or start another one from an entry, a task or a calendar block while something is already running — so the one you were watching is always still on screen. The count chip in the bar opens and closes it any time, and so does a click anywhere else on the page (on a phone, the same chip in the docked card, where the list floats above the dock and carries its own ✕). Each row shows the timer's description, its chain and a live clock:

  • Tap a row to show that timer in the bar. A timer you start here always takes the bar; one that starts elsewhere (another tab, your phone) goes to the list and leaves your selection alone. Until you've picked one, the bar follows the most recently started timer. The selection is per-browser, like the theme — it is not shared between your devices.
  • Stop (the ■ at the end of the row) stops just that timer. The others keep running, and you stay on the page you were on.

The row the bar is showing is outlined in the list; rows never change position, so one can't move under your finger when another timer starts.

Ten is a guardrail, not a target. Starting an eleventh returns HTTP 409 and Tick tells you the limit is reached instead of quietly tracking it — "Add a timer" is already disabled at that point.

The dashboard's "Today" card adds up every running timer, and its caption reads "3 timers running" once there is more than one.

The picker

One dialog serves the timer bar, the manual-entry dialog and the selection bar's Move to…:

  • Tabs Client / Project / Task (done tasks are hidden).
  • Search is autofocused; rows show a client color dot, the name, and a context sub-line (task → "Project · Client", project → its client, client → project count) plus rate or estimate on the right.
  • No match? A dashed Create "{query}" row creates the item inline and picks it immediately.
  • Full keyboard support: ↑ ↓ move, ↵ picks, esc closes.
  • Long lists paginate at 50 rows with an "n more…" row.

Manual entries

Manual entry (button in the Time page header) opens a dialog with description, an attach field (opens the picker), a billable toggle with the resolved rate, Start date / Start / End date / End / or Duration fields, and comma-separated tags. Leave End date blank for a same-day entry; give it a later day for an entry that crossed midnight (a timer left running overnight opens for editing with it filled in), and the entry's time range then carries a day count — 11:30pm – 1:15am +1.

All five date and time fields accept free text and parse live. A status line under the fields shows the interpretation ("Sat, Mar 14, 2025 · 9:00am – 11:30am · 2h 30m") and turns accent-colored when valid; Add entry stays disabled until the fields resolve. A duration without a start time logs from 9:00 and says so.

Date, time and duration formats

FieldAccepted formsExamples
DateISO2025-03-14
US numeric, / or ., year optional (2-digit = 20xx)3/14/25 · 3.14.2025 · 3/14
Month-day, year optional, ordinals OKmar 14 · march 14th, 2025
Day-month14 mar · 14th march 2025
Relative wordstoday · yesterday
Weekday = most recent past occurrencetue · last tue · tuesday
Emptymeans today
Start / End24h or 12h clock, minutes optional, a/p shorthand9 · 9:30 · 2pm · 14:15 · 2:30 pm · 9a
DurationHours (decimal OK), minutes, combos, h:mm2h 30m · 1.5h · 90m · 1:30 · 2 (= 2h)

Unparseable input gets an explicit error ("Couldn't read “…” as a date.") instead of a silent guess, and impossible dates like Feb 30 are rejected rather than rolled over. Project and task estimates use the same duration grammar (40h, 2h 30m).

The Time page

The header shows the week at a glance ("12h 40m this week · 9h 10m billable · $840 unbilled"). Entries are grouped By day (Today, Yesterday, weekday names, then "Wed, Sep 2") or By project, switched with the segmented control.

The filter input matches free text against entry names and understands two prefixes:

  • #tag — entries carrying that tag
  • @name — entries whose chain contains a matching project, client or task

Each row shows the name with its tags, the derived chain, the time range, a per-row billable toggle (with "Billable at $…/h" tooltip), duration and amount, and hover actions:

  • ▶ Start again — copies name, reference and billable flag to a new timer and starts it, alongside anything already running.
  • ✎ Edit — opens the manual-entry dialog prefilled; saving PATCHes the entry (removing the chain clears the reference).
  • 🗑 Delete — soft-deletes with an undo toast that counts down visibly.

Bulk actions

Row checkboxes accumulate a selection; a bar appears above the groups with:

  • Clear — drop the selection.
  • Mark billable — set the flag on every selected entry.
  • Move to… — opens the picker in bulk mode and reassigns every selected entry to the picked client/project/task (or a "No client / project / task" row to clear references). Comes with an undo toast.
  • Delete — a confirmation dialog states the count, then everything moves to trash with an undo toast.

Undo restores exactly the removed rows. Deleted entries stay in the 30-day trash like everything else.

On a phone (<1024px)

Rows collapse to name+chain · duration+range · a single ▶ button, and a Select toggle appears in the header (next to Manual entry). Turning it on adds a checkbox to every row and turns off the swipe gestures (a checkbox tap must never be read as a swipe); the bulk bar then shows exactly as it does on desktop, pinned above the docked timer card and tab bar so it's always reachable. The button reads Done while active. Turning Select off, or leaving the Time page, clears the selection — it's not saved between visits.

Swipe gestures (left reveals Delete, right starts the entry again) work only outside Select mode.

The undo window

Every undo toast in Tick — entry delete, bulk delete, bulk Move to…, tag delete, cascade delete — shares one setting: Settings → Profile → Undo window, default 8 seconds, adjustable from 3 to 30. The toast shows the remaining seconds as it counts down, and the action is already committed on the server: undo restores, it does not "cancel".

The undo window is stored in the browser's localStorage, not on your user row, so it is per-browser rather than per-account. Everything else in Settings → Profile (name, email, default rate) is server-side.