← Projects
AgentRunner icon

AgentRunner

Active

A macOS app that runs AI agents on a schedule — process lifecycle, live output, captured artifacts, and a history of every run.

aiagentselectronreactsqlitemacostypescript

An agent that you have to remember to run is a script, and an agent that runs on its own schedule, and that keeps its output, and that tells you when it has failed, is infrastructure, and AgentRunner is the difference between the two of them.

It is a macOS desktop app, and it is built on Electron, and React, and SQLite, and node-cron, and in it you define an agent as 3 things, which are a command to execute, and a prompt, and a cron schedule. It handles everything that comes after that.

What running an agent actually requires

Scheduling is the easy part of it, and what makes this a real application is everything that sits around the schedule, which are the same problems that any long-running process has, and nobody wants to solve any of those problems twice over:

  • Process lifecycle, which means starting the process, and monitoring it, and capturing its exit codes, and surviving the agent itself when it misbehaves
  • Live output streaming, so that you can watch the stdout, and the stderr, in real time rather than reading a log afterwards
  • Artifact capture, which detects the files created, or modified, in the working directory during a run, and copies them into a per-run folder, so that the output of a run is preserved rather than overwritten by the run that follows it
  • Run history, which is every past run with its status on it, and its duration, and its exit code, and its logs, and its artifacts
  • Notifications, because it lives in the menu bar, and it tells macOS when a run has finished, or failed

Artifact capture is the piece that I would point at. An agent that writes files is only useful if you can tell which files it wrote, and when it wrote them, and so diffing the working directory around each run is what turns a pile of output into an auditable record.

Prompts are source code

The prompts get a split-pane markdown editor, and they get version history with restore, and all of that follows from taking seriously the idea that the prompt is itself the program. If changing a prompt changes behaviour, and it does change behaviour, then a prompt needs the same treatment as any other source file, which is to say that it should be editable, and reviewable, and revertible when a change makes things worse.

The markdown artifacts render inline with syntax-highlighted code blocks, because most of what these agents produce is meant to be read by somebody.

Deliberately inspectable

The agents.json file and the config.json file are both of them hand-editable, and both of them human-readable. There is also agentrunner-cli, so that the agents can be managed, and triggered, and inspected from a terminal, and that matters when the machine running them is a machine that you reach over SSH.

A desktop app that can only be driven by its own UI is a dead end for this kind of tool, and so the GUI ought to be the convenient path through the software rather than the only path through it.