Skip to content

How it works

Demo

Claude Code · acme-web

Add password reset to the login flow

Running
Elapsed time
00:00
Estimate
About 7–9 minA few minutes
Prediction confidence
Medium

The agent accepts the prompt. runmarq classifies it locally and makes a first estimate.

Starting · 0 tool calls

0:00 Prompt submitted

From a hook to a notification

  1. The agent reports what it is doing

    Claude Code, Codex and Cursor each run runmarq's hook when something happens: a prompt is accepted, a tool starts or finishes, approval is needed, the turn ends. The hook prints only what the agent's hook protocol requires and always exits successfully.

  2. The hook keeps only timing and categories

    In the hook process, the prompt is classified (bug fix, feature, migration…) and dropped. Commands are inspected only to tell tests from builds and to recognise a repeated command by a salted hash. What leaves the hook is a small event: times, types, tool names, categories and salted hashes, never prompt text.

  3. The collector follows the run

    A background process on this computer turns events into runs with an explicit state: running, waiting for you, finished, failed, cancelled or unknown. It separates active time from time spent waiting for you, and never marks an unclear ending as finished.

  4. The estimator predicts what is left

    Each meaningful event, and every fifteen seconds of quiet work, produces a new estimate: an answer to whether to wait, and a likely range for the time left. Several models trained on this machine's runs contribute, weighted, once enough runs have finished, by how well each has predicted your recent ones. When the work checks out, the agent stops starting tools and your earlier runs show what that means, it says “Finishing up”. Nothing is sent anywhere to compute it.

  5. You find out without looking

    The tray shows every active run's estimate. A notification arrives when a run finishes, fails, needs your approval or looks stuck, and each run's timeline stays in history. In a terminal, runmarq wait returns when the run ends and runmarq statusline keeps it in your prompt.

This computer

  1. Claude Code, Codex, Cursor

    official hooks

    then
  2. runmarq emit

    normalize, minimize, spool if offline

    then
  3. Transcripts, git

    counts only, no text

    then
  4. Collector

    run state, estimator, SQLite history, local API

    then
  5. Desktop app, tray, notifications

Setup

Connecting an agent means adding a few hook entries to its configuration. You see the file and the exact entries before anything is written, a backup is kept, and removal takes out only what was added. The desktop app does the same on first launch.

Integration guides
runmarq integrations setup claude --dry-run
runmarq integrations setup claude
runmarq integrations remove claude

What “finished” means

runmarq can tell when an agent's turn has ended. It cannot tell whether your broader goal was met. So the app says “Run finished” when the agent reports the end of its turn, “Failed” when it reports an error, “Cancelled” when you interrupted it or closed it, and “Status unknown” when it cannot tell.

How estimates work