# Taskhold, One Task List For Me And My Agents

> Source: <https://deallocatedobjects.com/posts/taskhold-one-task-list-for-me-and-my-agents>
> Published: 2026-10-08 13:00:00+00:00

# Taskhold, One Task List For Me And My Agents

[Jake Marsh](https://deallocatedobjects.com/about)

## In this post

Most days I have a few coding agents going at once, each in a different repo. For a long time the list of what they should do next lived in my head, in scratch files and in whatever I typed into each terminal. When an agent found something it wasn’t going to fix right now, it either mentioned it in a reply I’d scroll past or wrote a TODO comment nobody would read again.

So I made [Taskhold](https://taskhold.com). It’s one task list that I share with my agents. I add tasks in a web app, and Claude Code, Cursor, Codex, Windsurf or anything else that speaks MCP reads and updates the same list. It went live today.

## How the Sharing Works[#](#how-the-sharing-works)

Every task has a status (todo, in progress, blocked, done), a priority, an optional project and labels. Every change records who made it: me or an agent, and for agents, which one. When an agent starts a task it passes a name like “Claude Code in api-server”, so on the board I can see which session is working on what.

The agent side follows a short routine that ships with the server as its instructions:

1. At the start of a session, check whether a task is already in progress, and catch up on anything I changed while it was away.
2. If nothing’s in progress, list the todo tasks and take the highest priority one.
3. Mark it started, then work.
4. For anything with more than a couple of steps, write a plan. Each step becomes a subtask, and the task’s progress bar fills as steps finish.
5. Leave notes with findings and decisions along the way.
6. If it can’t continue, block the task with a clear reason.
7. When it’s done, complete it with a short summary.

The blocked state is my favorite part. An agent that needs a product decision from me doesn’t sit there waiting in a terminal I’m not looking at. It blocks the task with its question, and that shows up under “Needs human attention” on the Agent Activity page.

It goes the other way too. When I reply, reprioritize something or unblock a task, the agent finds out through `taskhold_updates`. That tool takes a cursor from its previous call and returns only what changed since then, filtered to my changes by default, so an agent can check between steps without rereading the whole list.

Agents also add tasks. If one spots a bug it isn’t going to fix in this session, it files it. If it finds a TODO in the code, `taskhold_create_from_todo` turns it into a task with the file path and line number attached, so the next agent (or me) can jump right to it.

## The Tools[#](#the-tools)

There are 19 tools, all prefixed `taskhold_` so they’re easy to tell apart from everything else an agent has loaded: list, get, search, create, start, plan, progress, add a note, block, unblock, complete, set priority, updates and a few for projects, labels and a summary.

Their output is written for a model to read. A task list comes back grouped by status with little text checkboxes, and progress is drawn as a plain text bar:

The tool definitions live in one file that imports nothing at runtime. The web app’s remote endpoint and a stdio package both pass in their own copy of zod and their own MCP server object, so the same tools behave the same way no matter how an agent connects.

## Setup Is One Link[#](#setup-is-one-link)

The setup is the part I spent the most time on. I didn’t want anyone copying API keys into JSON files by hand.

Each person gets a setup URL that ends in `.md`. You paste it into your agent and say “set this up.” When the agent fetches it, the server mints a fresh API key and returns markdown written for an agent to follow: the exact `claude mcp add` command for Claude Code, a JSON block for Cursor and Windsurf, a TOML block for Codex CLI, a short section to add to the project’s `CLAUDE.md` or `AGENTS.md`, and a last step that checks the connection by listing tasks. A new account starts with a task called “Connect your coding agent,” and the agent’s first real job is to complete it.

Generating a new key per link means a setup URL never has to embed an existing key. The server keeps a sealed copy of the new key (AES-GCM, with a key derived from the app’s secret) only until the link expires, 72 hours by default, and a daily job deletes the expired copies. After that the link stops working, and you can make another one from settings whenever you set up a new machine.

Connecting is a remote MCP server over Streamable HTTP at `/api/mcp`, with the key as a bearer token. It’s stateless, so there’s nothing to keep alive between calls and nothing to install on your machine.

## Watching It Live[#](#watching-it-live)

The web app has a live board. It listens to a Server-Sent Events stream of every task event on the account. Writes from the same server wake the stream right away, and it also checks the database every few seconds so nothing is missed. Every 15 seconds it sends a keep-alive comment so proxies don’t close the connection, and after 10 minutes the server ends the stream on purpose. The browser’s `EventSource` reconnects with the last event id it saw and picks up exactly where it left off, which keeps long-open tabs from piling up on the server.

The same stream works with an API key, so `curl -N` against it from a terminal gives you a running log of what your agents are doing.

## What I’ve Learned Using It[#](#what-ive-learned-using-it)

The biggest change for me is that I stopped holding the plan in my head. I write tasks when I think of them, and the next free agent picks up the most important one. When I come back to my desk, the Agent Activity page tells me what got done, what’s in progress and which questions are waiting for me, with the agent’s notes right there.

The second thing is how much better agents work when they write their plan down first. Seeing five steps with a progress bar makes it easy to spot when an agent has wandered off the plan, and easy to stop it early.

If you run more than one agent at a time, give [Taskhold](https://taskhold.com) a try. It’s the list I keep open all day now.
