# Summarize a Timestamped Worklog

Paste a timestamped worklog and total time by project, tag, day, or entry. Supports date ranges, CSV/JSON export, rounding, and open-entry handling.

## Run it

- **CLI:** `gizza tool worklog-summarizer "2024-01-15 09:00 @acme +dev writing the parser
2024-01-15 10:30 @acme +review code review
2024-01-15 12:00 lunch
2024-01-15 13:00 @beta +dev bugfix
2024-01-15 17:00 done"`
- **Web:** https://gizza.ai/tools/worklog-summarizer/
- **Agents:** machine-readable descriptor (parameters JSON Schema) at https://gizza.ai/tools/worklog-summarizer/tool.json

## Inputs

- `log` — Timestamped worklog _(field)_
- `group_by` — Group by _(field)_
- `output` — Report format _(field)_
- `units` — Duration units _(field)_
- `round` — Round each entry to minutes _(field)_
- `max_entry` — Cap a single entry at minutes _(field)_
- `end_time` — Close final open entry at _(field)_
- `from` — From date _(field)_
- `to` — To date _(field)_
- `filter` — Only these projects/tags _(field)_
- `default_project` — Default project label _(field)_
- `sort` — Sort rows by _(field)_

## Output

- Worklog report (text)

## Query parameters

Open the tool pre-filled and auto-run via URL:

- `log` — Timestamped worklog
- `group_by` — Group by
- `output` — Report format
- `units` — Duration units
- `round` — Round each entry to minutes
- `max_entry` — Cap a single entry at minutes
- `end_time` — Close final open entry at
- `from` — From date
- `to` — To date
- `filter` — Only these projects/tags
- `default_project` — Default project label
- `sort` — Sort rows by

Example: `https://gizza.ai/tools/worklog-summarizer/?log=2024-01-15%2009%3A00%20%40acme%20%2Bdev%20writing%20the%20parser%0A2024-01-15%2010%3A30%20%40acme%20%2Breview%20code%20review%0A2024-01-15%2012%3A00%20lunch%0A2024-01-15%2013%3A00%20%40beta%20%2Bdev%20bugfix%0A2024-01-15%2017%3A00%20done&group_by=all&output=summary&units=hm&round=0&max_entry=0&end_time=17%3A30&from=2024-01-15&to=2024-01-31&filter=%40acme%2C%20%2Bdev%2C%20beta%2A&default_project=%28untagged%29&sort=duration`

---

## About this tool

Worklog Summarizer turns a plain timestamped activity log into a time report. Paste lines such as `09:00 @acme writing`, `2024-01-15 10:30 +review code review`, or `[2024-01-15 17:00] done`; each entry runs until the next timestamp, so you do not need explicit start/stop pairs.

Use `@project`, `+tag`, or `#tag` tokens to group work. The default report shows totals by project, by tag, and by day with percentages and ASCII bars. Switch to entry mode for a line-by-line timesheet, or export TSV, CSV, or JSON for spreadsheets and scripts.

Example input:

```text
2024-01-15 09:00 @acme +dev writing the parser
2024-01-15 10:30 @acme +review code review
2024-01-15 12:00 lunch
2024-01-15 13:00 @beta +dev bugfix
2024-01-15 17:00 done
```

Expected summary: 8h tracked, with `@beta` at 4h, `@acme` at 3h, the untagged lunch entry at 1h, and `+dev` totaling 5h 30m. The final `done` line closes the day and is not counted as its own task.

## Limits and edge cases

- Maximum pasted log size is 5,000,000 bytes.
- Blank lines plus lines starting with `#` or `//` are ignored.
- Supported timestamps include `YYYY-MM-DD HH:MM`, `YYYY/MM/DD HH:MM`, ISO `YYYY-MM-DDTHH:MM`, bracketed timestamps, bare `HH:MM`, compact `0900`, and 12-hour `9:00am` / `5:30pm`.
- Undated lines inherit the current day. If the clock goes backwards, the parser treats that as crossing midnight.
- A final open entry contributes zero extra time unless you set an end time. This avoids guessing that a forgotten entry ran overnight.
- Date filters only apply to dated entries. Undated entries are excluded when `from` or `to` is set.
- Rounding is applied per entry before totals are computed, matching billing-increment workflows.

## FAQ

<details>
<summary>What log format should I paste?</summary>

Start each activity line with a timestamp, then write the task text. Tags are optional but useful: `09:00 @client +dev build parser`. A later timestamp ends the previous entry.

</details>

<details>
<summary>How does the tool know when an entry ends?</summary>

Each entry runs until the next timestamped line. A line such as `done`, `end`, `stop`, `off`, or `---` closes the previous entry without adding a new task.

</details>

<details>
<summary>What happens if my last entry is still running?</summary>

The report marks it as open and does not add guessed time. If you know the real cutoff, set “Close final open entry at” to a time such as `17:30`.

</details>

<details>
<summary>Can I export the report?</summary>

Yes. Choose `table` for tab-separated rows, `csv` for spreadsheet import, or `json` for scripts. The readable summary is best for quick inspection.

</details>

## Related tools

- [Turn Tracked Hours Into an Invoice](https://gizza.ai/tools/timesheet-to-invoice/): Turn tracked hours and an hourly rate into a client-ready invoice with line items, totals, tax, discount and Net terms. Markdown, plain text, CSV or JSON.
- [Article to EPUB](https://gizza.ai/tools/article-to-epub/): Turn article text or cleaned HTML into a valid EPUB 3 ebook with metadata, chapter splits, and a real table of contents. Runs in your browser.
- [Preview a Bulk File Rename](https://gizza.ai/tools/bulk-file-renamer/): Preview old-to-new filename mappings with find/replace, regex, numbering, case conversion, prefix/suffix, and collision warnings.
- [Citation Generator](https://gizza.ai/tools/citation-generator/): Free APA 7, MLA 9, Chicago and Harvard citation generator — format author, title, year, journal and URL into a correct reference right in your browser.
- [Config Merge Tool](https://gizza.ai/tools/config-merge/): Merge layered JSON, YAML, TOML and .env configuration files with override precedence, array strategy, null deletion and variable substitution.
