Privacy-first time tracking

Every billable hour, attributed automatically.

Noesa watches your work on-device, maps it to the right client and project, and exports clean billable hours. No timers. No manual entry. Nothing leaves your machine.

Free & open source · macOS and Windows · MIT licensed

Timeline · Today Tracking
VS Code Noesa 2.4h
Ghostty · repo:noesa Noesa 0.8h
Linear Acme Web 1.1h
Meet · call Acme Web 0.5h
Billable today 4.8 h · $720

Understands your dev stack

VS Code Cursor Ghostty JetBrains Zed Vim

Why Noesa

Accurate billing, on autopilot.

A deterministic signal cascade attributes your activity to the right project — most of it without ever calling a model.

Private by design

Your screen never leaves the device — Noesa reads only the foreground app and window title and OCRs frames on-device. Only redacted text (titles + intent) reaches the AI, and only through our key-custody proxy — no API key ships in the app.

On-device No screenshots Secrets redacted

Git-aware attribution

The active repository maps straight to a project — the strongest signal a developer can give. Deterministic. No LLM, no guessing.

repo:noesa → Noesa

Smart capture

Content-change sampling, not a blind timer. Step away and idle time is never billed.

macOS & Windows

One project, tracked across both machines. Native capture on each, shared billing.

Reports & export

Hours per client × rate, reconciled to the cent. Copy clean CSV straight into your invoice.

How it works

Three steps, zero timers.

1Capture

Noesa notes the foreground app, window title, and active git repo — entirely on-device — only when the activity actually changes.

2Attribute

A cascade resolves the project: repo and hint matches first, a cheap text model only for the ambiguous leftovers.

3Review & bill

Confirm or adjust blocks in the timeline, then export billable hours per client as CSV. Nothing is billable until you say so.

Privacy

What leaves your machine is what you'd put on an invoice.

Raw activity stays in a local store. The only thing that ever syncs is the sanitized work block — a project id, a time range, and the evidence that earned it.

No API key needed Local model via BYO-endpoint
// the entire payload that syncs
{
  "projectId": "noesa",
  "start":  "09:12",
  "end":    "11:36",
  "billable": true,
  "evidence": ["repo:noesa"]
}
// no screenshots · no titles · no keystrokes

Bill what you actually worked.

Install Noesa, define a client and project, and let the hours attribute themselves.