Punchcard resolves each entry against a real repository and issue before it's written — never typed, never guessed. What lands on a client's report is what actually shipped.
Free-text time entries drift the moment someone mistypes an issue number, forgets the repo, or writes "misc." A client report built on that is a report you have to re-verify before you can send it — every week, forever.
Once, per org. It reads issue titles and repository membership — nothing writes to GitHub, and nothing is logged until it's installed.
A repo dropdown, an issue autocomplete. No owner/repo#123 ever typed by hand, from the dashboard, an import, or /spend.
Only active, billable entries reach a client, rounded per line at export time — the total is the sum of rounded lines, not a rounded sum.
Issue titles and node IDs are never accepted from a client. An issue that can't be resolved writes nothing and fails loudly.
An edit inserts a new line pointing at the old one. Nothing is ever overwritten in place — the ledger remembers what a number said last week.
Every query carries its org as a required argument, so leaking another org's data isn't a bug you can accidentally skip — it's a compile error.
Internal rework and estimation get logged like anything else, then quietly excluded from anything a client sees.
A running total and the days with nothing logged, front and center — the only thing that decides whether a timesheet system actually gets used.
The extension reads owner/repo and the issue number straight off the GitHub page — nothing to mistype, nothing to switch tabs for.
Punchcard installs on your GitHub org in a few minutes and starts every entry from an issue that's already real.