@@ -17,9 +17,12 @@ up` away from running.
1717 marker and an optional hourly rate.
1818- ** Manual time entries** — pick a date, start and end time; duration is
1919 computed automatically.
20- - ** Live timer** — one-click start/stop on the dashboard, with a live JS counter
21- in the navbar. Only one timer runs at a time; starting a new one stops the
22- previous.
20+ - ** Live timer with pause/hold** — start a timer on any project from the
21+ dashboard, with a live JS counter. Only one timer runs at a time; starting or
22+ resuming another automatically puts the running one ** on hold** instead of
23+ stopping it, so you can switch between projects with a single click and resume
24+ later. Each timer has pause / resume / stop controls, and worked time is
25+ tracked across segments (paused gaps are excluded).
2326- ** Dashboard** — today / this week / this month totals per project, plus the
2427 most recent entries.
2528- ** PDF report** — generated server-side with WeasyPrint. Filter by date range
@@ -98,9 +101,12 @@ full list of variables; the most important ones:
98101### Live timer
99102
100103From the dashboard, click ** Start Timer** on any project card. The timer ticks
101- live in the navbar; click ** Stop & Save** to write the entry, or ** Discard** to
102- throw it away. Starting a timer on a different project automatically stops the
103- running one.
104+ live; use ** Pause** to put it on hold (it stops counting but stays open),
105+ ** Resume** to continue, ** Stop & Save** to write the entry, or ** Discard** to
106+ throw it away. Starting or resuming a timer on another project automatically
107+ puts the currently running one on hold, so you can hop between projects with a
108+ single click. Held timers are listed in an ** On hold** section on the
109+ dashboard; only one timer runs at a time.
104110
105111### Manual entry
106112
@@ -206,12 +212,18 @@ flow, redirect safety, and PDF/CSV report generation.
206212
207213- ** Project** : ` name ` (unique), ` description ` , ` color ` (validated hex),
208214 ` hourly_rate ` (optional), ` is_archived ` , ` created_at `
209- - ** TimeEntry** : ` project ` (FK, CASCADE), ` date ` , ` start_time ` , ` end_time ` ,
210- ` duration_minutes ` (auto-calculated when both timestamps set),
211- ` description ` , ` created_at `
212-
213- A running live timer is simply a ` TimeEntry ` with ` start_time ` set and
214- ` end_time = NULL ` .
215+ - ** TimeEntry** : ` project ` (FK, CASCADE), ` date ` , ` start_time ` (first start),
216+ ` end_time ` (final stop), ` status ` (` running ` / ` paused ` / ` completed ` ),
217+ ` accumulated_minutes ` (worked time from completed segments),
218+ ` segment_started_at ` (start of the live segment; ` NULL ` while paused),
219+ ` duration_minutes ` (worked total, excludes paused gaps), ` description ` ,
220+ ` created_at `
221+
222+ An open timer is a ` TimeEntry ` with ` end_time = NULL ` and a ` status ` of
223+ ` running ` or ` paused ` . While running, worked time is ` accumulated_minutes ` plus
224+ the live segment since ` segment_started_at ` ; pausing banks the live segment
225+ into ` accumulated_minutes ` . Stopping writes the worked total into
226+ ` duration_minutes ` . At most one entry is ` running ` at a time.
215227
216228## Troubleshooting
217229
0 commit comments