Pulse

Work board for agents. A local work board that my agents and I share. I use it from a desktop app, the menu bar and Telegram, and agents use it over MCP.

Availability
Personal software
Stack
TypeScript, Electron, React, tRPC, SQLite, MCP

My agents do the work. I needed one place to keep track of it.

Too many terminalsI run several coding agents at once. Their state lived in terminal tabs, and I was the one remembering which of them was waiting on me.
One board for both sidesA task should be readable and writable by me and by an agent, with the same rules for both. Existing boards are built for people only.
Reachable when I am awayAn agent that needs a yes should not wait until I am back at the desk. I want to answer from the menu bar or from my phone.

What it does.

A board agents work from

Tasks move from Not Now to Yes, Working, Review and Done. Say yes to a task and its assigned agent starts. Every card shows who worked on it and what it cost.

Pulse board with task columns and the list of agents

Results first

A finished task opens on what was built: a summary, screenshots, the changed files and the terminal if you want it. Reply to continue the same session.

Pulse task detail showing the results of an agent run

Programs

A goal broken into tasks that depend on each other. A task starts when the ones before it are done, and the graph shows where the work is stuck.

Pulse program view with tasks drawn as a dependency graph
Also in there Menu bar orbTelegramReview agentsWorkflowsScoresRemote access through a relay

Jenny is how I talk to the factory.

Jenny is the assistant built into Pulse. To coordinate work I rarely open the board. I tell Jenny what I need, and Jenny reads and changes the board for me.

Jenny chat explaining why a run stopped, with an approval card that has Approve and Deny buttons
One shortcut awayJenny sits in the menu bar orb. Option and Space opens the chat over whatever I am working in, and I type or hold a key and talk. On my phone I reach Jenny through Telegram.
Answers from the boardI ask what is blocked, which programs are due this week or why a run stopped. Jenny answers from the tasks, the programs and the run records.
Turns a request into workA request with several steps becomes a program of tasks with their dependencies. Jenny can ask for triage and pick the agent. Nothing starts until I say yes.
Brings me the approvalsWhen an agent or a script needs my OK, the request shows up as a card in the chat with Approve and Deny. The orb carries a badge until I answer.

Only the server writes to the board.

The desktop app, the orb, Telegram and every agent talk to the same local server. Nothing else writes to the database, so a rule holds no matter who makes the change.

One writer

The app, the command line and the agents all go through the server. It enforces dependencies, review steps and schedules in one place.

Agents keep running when the app closes

A separate daemon starts and supervises the agent sessions. Closing the desktop app does not stop a run.

Secrets stay in the server

The server adds a credential at the moment a call leaves the machine. No agent and no script ever holds one.

Code mode

Pulse does not give agents one tool per action. Over MCP an agent sees two tools, search and execute. Search returns what the board can do as typed functions. Execute takes one small TypeScript module that calls them. Jenny works through the same two tools.

import type { PulseContext } from 'pulse:runtime';

export default async function run(
  input: { task: string; url: string },
  ctx: PulseContext,
) {
  await ctx.pulse.tasks.move({ task: input.task, column: 'review' });
  await ctx.pulse.tasks.linksAdd({
    task: input.task,
    kind: 'github',
    label: 'Implementation PR',
    url: input.url,
  });
  return { task: input.task, column: 'review' };
}
Several steps in one callA script reads the board, loops, filters and writes in a single call. Only what it returns goes back to the model, so a long task list does not fill the context.
A sandbox without secretsThe script runs in its own Deno process with no credentials and no network except the Pulse server. Every capability call goes back to the server, which checks what this caller may do.
Writes can wait for meAn agent may change its own task. A write beyond that parks the run until I approve it, and the run then continues with exactly that action.
Scripts become packagesA script that keeps being useful is saved as a versioned package. A package declares the capabilities it needs, and I approve them once.

Architecture

Pulse

Who uses Pulse and which outside systems it talks to. No technology yet.

Uses itThe systemIt works with Juri person Remote AI clients Claude mobile, any MCP host Pulse local work board Agent sessions Claude Code, Codex Telegram messaging GitHub, YouTube, others HTTPS APIs 1Password secret store Obsidian vault Markdown notes plans, answers, reviewsstarts agents, hears backuse the board from anywherenotifies me, takes my answeracts on my behalfreads credentialsreads notes
The same system at five levels, after the C4 model. Solid boxes are parts of Pulse, dashed ones are outside it.