No screenshots. Ever.

Your day,
as you approved it.

Standup watches what you actually work on — locally, on your machine — then shows you the day it assembled. You edit it. Only then does a report reach your manager.

Windows 10 or later · x64·macOS 12 or later · Apple silicon & Intel

Linux is not supported. Wayland cannot give window titles to an unprivileged app, and a tracker that silently records nothing is worse than none.

Work in the browser? Add the Standup extension.

It tells the desktop app which site is in front — jira.com/browse/PROJ-42 rather than just “Chrome”. Only the address, never the page, and it stays on your computer.

How to install it
  1. Install and open the Standup desktop app — the extension needs it.
  2. Unzip the download. Open chrome://extensions (or edge://extensions) and switch on Developer mode.
  3. Click “Load unpacked” and choose the unzipped folder.
  4. To get updates automatically, open the desktop app, go to Settings → Privacy → Browser extension, choose “Keep it updated”, and load the folder it opens instead. Browsers never update an extension added by hand; that copy is the one Standup keeps current.

Write code? Add the Standup extension to your editor.

It tells the desktop app which project, file and branch you are on — even when the window title does not say. File names only, never your code, and it stays on your computer.

How to install it
  1. Install and open the Standup desktop app — the extension needs it.
  2. In VS Code, open the Extensions view, click the “…” menu at its top and choose “Install from VSIX…”. Pick the file you downloaded.
  3. Or in a terminal: code --install-extension <file>.vsix
  4. Cursor, Windsurf and VSCodium install it the same way.
  5. Updates: when a new version is out, the status bar in your editor says so. One click installs it.

Already have it running? Sign in to the web companion to check today from your phone.

You forget what you did.

You write it up at 9pm, from memory.

Your manager reads fiction.

It watches. You approve. Then it sends.

The middle step is the entire point. Every other tracker goes straight from the first to the third.

1On your machine

It notices what you were doing.

A background agent samples the foreground application and window title every thirty seconds, into a SQLite file on your own disk. Not a server. Yours.

Idle time is recorded as idle — never deleted. A meeting, a phone call and a coffee break look identical to a sampler, so it surfaces them as time for you to explain rather than quietly erasing the part of the day you most need to describe.

Tracking · this machine only
09:12Code.exeinvoice.ts — billing-service
09:12→ sqlite~/.standup/local.db
09:42Code.exetax.ts — billing-service
10:04Chromeunticked — not in your report
10:04→ report(not sent)
  • No screenshots. The app never captures your screen — there is no code path that can.
  • Nothing is sent until you tick it. Your day arrives as a list with a checkbox on every line. Only the ticked lines leave the machine.
  • Raw samples never leave. There is no endpoint that accepts them — not behind a flag, not for support.
2Before anything is sent

You edit the day it assembled.

At a time you choose, the agent shows you the day it built — alongside any commits still sitting unpushed on that laptop.

Rename things. Merge them. Split them. Delete what is nobody’s business. Add the two hours of whiteboard work no tracker could ever see. What you submit is the report; what you did not approve does not exist.

An empty day is a legal answer. Submitting nothing means nothing gets sent — even if you committed code.

Tuesday, 11 August
4h 10m across 5 entries
  • 09:12 – 10:40
  • 10:40 – 11:25
  • 11:26 – 11:26commit
  • 11:30 – 12:12
  • 13:05 – 14:20

Try it — rename an entry, merge two, delete one.

3At the time you set

It writes it up and sends it.

Your approved day is merged with the day’s commits, written into a narrative by your own AI key, appended to your Google Sheet, and emailed from your own Gmail with your own template.

Every one of those is a row in a database, not a line of code — which sheet, which columns, which recipients, which prompt, which schedule, in which timezone.

Team standup — AugustA2:D2
Date
Name
Summary
Hours
2026-08-11
Priya R.
Prorated mid-cycle plan changes…
6.2

Reads back the range the append returned — never “the last row”, which a colleague’s concurrent append would corrupt silently.

From your GmailSent 21:00 IST

To manager@acme.com

Subject Daily report — Priya R. — 11 Aug

Spent the morning on mid-cycle proration in the billing service, landing a fix for plan changes that previously double-charged…

The part that matters

A tracker your team will actually install is one that reports to you first.

Surveillance software fails for a simple reason: the person being measured has no reason to keep it running. Standup inverts that. The evidence is yours, it stays on your disk, and nothing is reported that you did not read first.

01

No screenshots. No keystrokes.

The agent samples which application is in front and what its window is called. There is no screen capture in the product — not disabled, not gated behind a setting. It does not exist.

02

Raw samples never leave your machine.

No endpoint accepts them. Not behind a feature flag, not for support, and not “for AI context” — which is the version somebody will eventually propose, because it would genuinely produce better reports.

03

You choose what goes in, line by line.

Every entry your day is made of arrives with a checkbox. Untick it and it is not in the report — no explanation owed, no trace of what you left out. Nobody else can tick it back on.

04

Window titles are never logged.

Not to a log file, not to a crash report, not to telemetry — on either side. One helpful console line while debugging would undo the entire model, so the error paths deliberately swallow the object they were reading.

05

Your manager sees the day. Never the detail.

There is no permission that grants anyone a view of another person’s activity entries, because there is no screen, export or endpoint that renders them. An admin can see that Tuesday was missed. Never what Tuesday held.

Your accounts. Your keys.

The report is written with your AI key, appended to your spreadsheet, and sent from your address. Standup holds no shared credential that could send mail as you.

Google SheetsGmailGitHubGoogle GeminiOpenAIAnthropicLocal gitGoogle Workspace

Nothing is hardcoded.

Every value below is a row in a database, not a line of code. Onboarding a new team never means a deploy.

Which sheet

and which tab, and which column holds what

Which repositories

across all branches, by author date

Which recipients

with your own subject and body template

Which AI

your key, your provider, your prompt

Which times

review and send, in your own timezone

Which days

any subset of the week

Under the hood

The boring guarantees.

The ones that decide whether a manager gets one correct report or two contradictory ones.

Credentials at restAES-256-GCM

Versioned envelope, per-record IV. OAuth tokens are ciphertext in the database — a dump contains no usable key.

SchedulingIANA zones only

A fixed offset is rejected outright. An offset works until the region next changes its clocks, then fires an hour wrong forever.

PipelineCheckpointed

Each stage persists its result. A retry resumes at the first incomplete one — never a second sheet row, a second AI charge, or a second email.

Duplicate runsImpossible

One unique constraint on (schedule, date), and the row is inserted before the job is enqueued. A second dispatcher loses the race quietly.

A day nobody submittedRecorded, not skipped

It becomes a `missed` row with a reason, and you are told. Skipping quietly is the failure a broken agent would hide behind.

CorrectionsUpdate, never append

Amending a sent day rewrites the existing sheet row and threads the correction onto the original email. One row per person per date, always.

The questions people actually ask.