Profile
Back to NewsBack
GitHub Trending 12 min
Reader Mode
ukanwat/overtime: Give a coding agent a brief, not a chat, and it works on its own across sessions. Includes an example run: an open-world city built in a real game engine with no human help. In early development.

ukanwat/overtime: Give a coding agent a brief, not a chat, and it works on its own across sessions. Includes an example run: an open-world city built in a real game engine with no human help. In early development.

6 hours ago

Overtime

Agents that exist, not sessions.

CI npm licence: MIT status: early protocol: ACP

Built by Utkarsh Kanwat · 𝕏

Today's coding agents work like a junior or a student. You sit with them and chat through every step, and the moment you stop talking, the work stops.

Overtime agents work like a senior. You brief them once. They plan the work, do it, keep their own notes, check their own results, and come back only when something is really yours to decide. You can steer whenever you like, but you don't have to.

Each agent has a name, a folder, a job and a clock. It keeps going between conversations, wakes itself up when there is something to do, splits big work across helpers, and sleeps for free when there isn't. Sessions with the model come and go underneath; the folder is what carries the agent from one to the next.

Overtime has no model and no agent loop of its own. It drives the coding agents you already use, through the Agent Client Protocol: Claude, Codex, Gemini CLI, GitHub Copilot, OpenCode, and the rest.

Quick start

npm install -g @ukanwat/overtime
overtime

overtime opens a full-screen app in your terminal. Arrow down to + New agent, type a name and press Enter (its backend, model, budget and workspace are shown before it's made; Enter again keeps the defaults), and tell it in plain words what it's for. That's the whole setup: it writes its own job description and gets to work.

◆ overtime    1 needs you  │  repo-keeper  ○ asleep · wakes 18:00                     ⚙ Settings
                            │  CI green; watching the dependency PR     $1.20 of $100 today
▌ repo-keeper             1 │──────────────────────────────────────────────────────────────────
▌   ○ asleep · wakes 18:00  │
  game-builder              │  ▣ CI is green again on main
    ● working · lighting th…│  The flaky test was a timing race; fixed in 3f2a1c.
  scout                     │
    ◇ new · waiting for its…│  ┃ ? Merge the dependency fix?
                            │  ┃ Recommended: merge it now and release tomorrow.
  + New agent               │  ┃  1  Merge it      2  Wait for 1.35      3  Close it
                            │
  › Press 1–3 to answer, or type a message
 claude                        1–3 answer  ·  ↑↓ agents  ·  ⇧↑↓ scroll  ·  → settings  ·  ? keys

Your agents are on the left, like DMs. On the right is your conversation with the selected agent, and nothing else: its messages, its reports, its questions (answer with a number key), and yours. No tool calls, no logs. While it's answering you, its reply streams in as it writes.

  • Move with ↑↓; the conversation follows. Just type to message the selected agent.
  • Attach a file or image by dragging it into the terminal. It's copied into the agent's folder,
and the agent opens it with its own tools when it needs to.
  • Settings (→ or Tab, ← to go back): backend and model (picked from what the backend offers), daily budget,
token budget, workspace, plus wake, stop, archive, and its folder and transcripts.
  • The mouse works too: click agents, options, links and files.
Quitting the app changes nothing. A small background process keeps your agents running; on first run, Overtime asks whether to start it when you log in.

How an agent works

It is a folder. ~/overtime/agents// holds two files with fixed names and whatever else the agent decides to keep:

  • AGENT.md: who it is, its job, its rules and how you like things. The agent writes it from your
first conversation and keeps it current. Its settings (backend, model, daily budget, where the work lives, protected paths) are shown at the top for reference. They're yours and change only in the app, with overtime set, or in the agent's .overtime/settings.json (the copy that counts): if anything else changes that block (the agent, a script, git, or an edit by hand), Overtime puts it back, so no agent can raise its own budget or unprotect a path.
  • INDEX.md: the agent's own map of its folder. It's shown to the agent at the start of every
session, so it always knows where to look.
  • memory/: what it has learned, one small file per memory (a fact about you, a correction, a
decision), with memory/MEMORY.md as the index: one line per memory that states the rule itself. The index is shown at the start of every session, and again when it changes. How-tos go in skills/ instead. Overtime's own memory replaces the backends' (Claude's auto-memory and Codex's memories are turned off for agents; Claude's existing memories for the folder are copied in once, and the originals are kept).
  • Everything else (notes, data, decisions, scripts, archives) is organised by the agent, the way
a senior keeps their own desk.

It learns, and you can see what it learned. Besides what the agent saves itself, Overtime runs a short reflect pass for it while it's idle. Each pass reads the next part of what the agent did, oldest first, from where the last pass stopped, so every turn is read once: when enough has piled up, after its backend compacts the session, or after an hour idle, never within a few minutes of a turn or while offline (at most 10 passes and a tenth of its budget a day). It notes what the agent was corrected on, what it worked out and what's gone stale, as small edits to memory/, each citing the run it came from. It can change nothing else: AGENT.md and skills are shown to it read-only, and what it thinks they lack becomes a memory for the agent to fold in. It counts toward the budget and says nothing to you. It runs on the agent's own model unless you give it another (overtime set reflectModel=…), and overtime set reflect=off (or "reflect": false in settings.json, for every agent) turns it off.

It manages its own time. When a stretch of work is done, it decides when to wake next, between one minute and three days ahead. It can wake on a schedule ("every day at 9") or on events: a watch is a small script that Overtime runs without the model, and every line it prints wakes the agent, so tail -F app.log | grep ERROR reacts within moments and costs nothing while quiet. Messages from you, answers and finished helpers always wake it early.

It never stops to wait for you. When something is genuinely yours to decide, the agent asks, with its recommendation and short options you can answer with one key, and carries on with everything else meanwhile. It's fully autonomous otherwise. It asks first only before destroying things outside its folders, spending money, or acting publicly or as you. Overtime answers every permission request the backend makes itself, instantly, so no session can ever hang on a permission prompt.

It has full access, except what you protect. An agent can do anything your user account can: install packages globally, use any tool, write wherever its work needs. If there's something no agent should ever change, list it under protect in ~/overtime/settings.json (for every agent) or in an agent's settings (overtime set protect=…), for example ~/Documents or ~/.ssh. Those paths become read-only for the agent's backend and everything it starts, scripts and programs it wrote included, enforced by the operating system (Seatbelt on macOS, bubblewrap on Linux). Nothing is protected unless you list it.

Agents are public unless you make them private. Public agents see each other (their job, AGENT.md and conversation) and can message each other. overtime set visibility=private (or the toggle in its settings) takes one out: it gets no message tool, nobody can message it, and on macOS other agents can't read its folder at all (on Linux they still can).

Trust grows. Overtime notices when you keep giving the same answer to the same kind of question and tells the agent, which can then propose deciding those itself. If you agree, the rule goes into its AGENT.md, where you can see every freedom it has been given.

It builds its own team. For big work, the agent splits the job and runs helpers in parallel, each a separate session with only what it needs, in its own git worktree, on whichever backend and model suits it. The agent reviews what comes back before accepting it. Helpers are never black boxes: each one has its own transcript you can open.

It stays within a budget, $100 a day per agent unless you set another. Spend is what the backend itself reports. On a Claude subscription your real limit is the plan's usage window, so Overtime reads that too: when you hit it, agents on that backend pause until the exact reset time instead of failing.

Skills

A skill is written-down know-how: a folder with a SKILL.md (a name and a one-line description at the top, then the instructions) and any scripts or references it needs. Agents see the list of their skills every session, by name and description only, and load one with the skill tool when it's relevant, so skills cost almost nothing until they're used. They come from three places:

  • Built in. The overtime-docs skill is Overtime's own manual: where settings, MCP servers, budgets,
files and logs live, what each tool does, and the exact commands you run. Ask an agent "how do I give you a GitHub MCP server?" and it answers from this, not from guesswork.
  • Yours, for every agent: ~/overtime/skills//SKILL.md.
  • Its own: skills//SKILL.md in the agent's folder. When an agent works out how to do something
it will do again, it writes it down as a skill, so later sessions and its helpers reuse it.

An agent's own skill replaces one of the same name from you or Overtime. You can see an agent's skills in its settings (→), and open each one.

The tools Overtime gives agents

Deliberately few, because every tool costs context on every turn:

| Tool | For | |---|---| | wake | when to wake next: at a time, after a delay, repeatedly, or on a watch | | cancel | stop a repeating wake-up or a watch | | ask | a question for you, without stopping work | | send | message you (a reply, a report, files to share), or set the one-line status next to its name | | spawn | start a helper | | message | message another agent, when you asked it to or its AGENT.md says when (public agents only; at most 20 a day between any two, then you're alerted) | | done | (helpers only) hand the result back | | skill | load a skill (or list them) |

Everything else is plain files the agent reads and writes with the tools its backend already has.

Backends, models and MCP

New agents use your default backend and model. Change them per agent in the app (→ or Tab opens its settings, where you pick a backend and then one of its models) or with overtime set backend=codex model=…. The model list comes from each backend through ACP, so new models appear without an Overtime update. If a backend won't use the model you chose, the agent runs on its default and Overtime tells you; a model name the backend doesn't offer is refused when you set it. Built in: claude (bundled, uses your Claude Code login), codex (through its ACP adapter, uses your Codex login), gemini and opencode (each needs its CLI installed and signed in). Any other coding CLI that speaks ACP works too: add its command under customBackends in ~/overtime/settings.json, for example "goose": { "command": "goose", "args": ["acp"] }.

Overtime adapts to each backend rather than assuming Claude: it picks the backend's mode that asks before risky actions (so Overtime's check sees them), gives Overtime's tools through a local bridge to backends that can't reach MCP servers over HTTP, reads cost when the backend reports it (and tokens when it doesn't), and if an agent answers without using its tools, its final words still reach you.

MCP servers you list in ~/overtime/settings.json under mcpServers are given to every agent; switch one off for a single agent in the app (its settings, "MCP servers"). To give one agent a server of its own, add it under mcpServers in ~/overtime/agents//.overtime/settings.json (same shape; keep the file valid JSON): it's used from the agent's next turn, and its AGENT.md shows it. An agent can also add servers for itself in mcp.json in its folder. Agents don't inherit your personal Claude Code settings, instructions or MCP servers: they get exactly what Overtime gives them.

In your editor

Overtime is also an ACP agent. Add overtime acp as an external agent in Zed, JetBrains, VS Code (ACP extensions) or Neovim, and your agents appear as modes; an editor chat talks to that agent's conversation.

Command line

overtime                            the live app
overtime new <name> [key=value…]    create an agent, with the same keys as set (e.g. backend=codex)
overtime ls                         list agents
overtime send <name> "…"            message an agent (--attach <file>, repeatable)
overtime messages <name>            read your conversation with it
overtime answer <name> <n> [note]   answer its open question with option n
overtime settings <name>            show its backend, model, budgets and workspace
overtime set <name> key=value…      backend=  model=  budget=  tokens=  workspace=  visibility=
overtime models [backend]           the models a backend offers
overtime stop|start|wake <name>
overtime archive <name>             stop an agent and move its folder away
overtime acp                        ACP on stdio, for editors
overtime daemon [stop|install|uninstall]

Examples

agent, one brief, a real game engine, no human help.

Design

Overtime borrows its philosophy from pi: keep what you inject small and stable, keep state in plain files, give the model few tools, and make everything inspectable. Its terminal app is built on pi's TUI library. Where Overtime differs is the point of it: agents that persist, keep their own time, and delegate.

Status

Early. Claude is the backend tested most; Codex and Gemini are wired up through their ACP adapters and need wider testing. Agents run with your user's access, so treat a long-running agent like a colleague with access to your laptop, and protect anything that must never change. Later: answering from your phone, quiet-time tidying, agents talking to each other, a morning standup, sharing agents, and running Overtime on a server for around-the-clock watches.

MIT licence.

Chat with me