@lamtuanvu/pacer
v0.12.0
Published
Subscription-budget-aware delegation for AI coding agents through a CLI, MCP server and desktop app.
Maintainers
Readme
Subscription budgets for AI coding agents: route and delegate coding work according to usage, pace and available executors.
A planner can spend its subscription too quickly while other coding agents have unused capacity. pacer compares usage against time until reset, learns your active hours from local session logs, and helps the planner reserve capacity for decisions and review. Claude Code can plan while Codex, Cursor, agy, BytePlus or local models execute; Codex, Cursor and OpenCode can also be planners.
Features
- Budget status, executor ranking and routing by task kind.
- Priority, even, burn-before-reset and cheapest-first pacing policies.
- Delegation, limit-triggered fallback, task tracking and explicit planner review.
- Planner skills and hooks, an optional stdio MCP server, a desktop app and a web app.
- Direct CLI execution with per-task worktree placement and automatic permission bypass.
- Rules-based classification, optional model adapters and local decision benchmarks.
Install
Download pacer for Mac.
Choose the matching desktop-pacer-<version>-darwin-<arch>.dmg: aarch64 for
Apple silicon or x86_64 for Intel. Open it and drag pacer into Applications.
On first launch, approve it once as described in
macOS desktop app.
Welcome leads to one consent screen for the background service and the terminal
link at ~/.local/bin/pacer. If needed, an optional checkbox adds
export PATH="$HOME/.local/bin:$PATH" to your ~/.zshrc or ~/.bashrc; it is
off by default. Continue to the step-by-step Setup to choose your planner,
connect agents, choose an executor and try a task. The app includes its CLI.
The pending M1 packages will contain two sibling executables: pacer (Rust) and
pacer-core (the bundled TypeScript runtime). Keep them together. The standalone
CLI can repair a missing or mismatched companion from its verified own-version
release; an incomplete desktop app must be replaced as a complete app.
Copying a source build into ~/.local/bin/pacer replaces the desktop app's
terminal command. Use a sandboxed PACER_HOME and a separate PACER_PORT for
development builds.
pacer uninstall --all removes everything setup added, including the terminal
link and the optional PATH block. Move the app to the Trash afterward. See
installation for Linux AppImage and .deb downloads, updates
and uninstall details.
Terminal and servers
Install the standalone CLI:
curl -fsSL https://raw.githubusercontent.com/lamtuanvu/pacer/main/install.sh | shThe installer verifies SHA-256 checksums; verify a downloaded binary's build provenance with gh attestation verify <file> -R lamtuanvu/pacer. PACER_RELEASE_BASE remains an override for another HTTPS or local file:// release host. See installation for source builds and installer options.
From a source checkout, use Bun 1.4.2 or newer:
bun install --frozen-lockfile
bun run build
mkdir -p "$HOME/.local/bin"
cp dist/pacer dist/pacer-core "$HOME/.local/bin/"
export PATH="$HOME/.local/bin:$PATH"
pacer --versionmacOS desktop app
Desktop releases are signed with the project's own code-signing certificate until pacer has an Apple Developer ID, so macOS blocks the first launch:
- Download
desktop-pacer-<version>-darwin-<arch>.dmgfrom GitHub Releases, open it and dragpacer.appto Applications. The.app.tar.gzbeside it contains the same app; it is the in-app update package. - Open the app once. When macOS says it cannot verify the developer, open System Settings › Privacy & Security and choose Open Anyway.
Alternatively, from a terminal: xattr -dr com.apple.quarantine /Applications/pacer.app.
This is needed once. In-app updates are verified against the same pinned certificate and a separate update signature, and install without further prompts.
The future npm package is @lamtuanvu/pacer; it is not published yet. The planned Homebrew tap is lamtuanvu/homebrew-tap; it has not been created. The command stays pacer.
Quickstart
Install and sign in to your planner and at least one executor CLI first. For example, use Claude Code as planner and Codex as executor (Codex installation requires Node.js/npm):
# Claude Code: install, then sign in
curl -fsSL https://claude.ai/install.sh | bash
claude # then type /login
# Codex: install, then sign in
npm install -g @openai/codex
codex loginSee the Claude Code install guide, Claude Code login reference and Codex CLI guide for prerequisites. In the desktop app, follow Setup to connect these tools. For terminal and server installs, install pacer and run setup:
curl -fsSL https://raw.githubusercontent.com/lamtuanvu/pacer/main/install.sh | sh
pacer initpacer init detects your tools, writes ~/.pacer/strategy.yaml, asks before installing the
background service and before connecting each agent.
Open your planner in the repository you want to work on and ask it for work —
it delegates execution through pacer. Run pacer open to watch budgets and tasks,
and pacer doctor to check the installation.
For a shell prompt, tmux or an agent status bar, pacer status --line reads the local
snapshot and prints one compact line: ▬┃ Claude 63%·77 ▸2 ⚑1. The tick turns
amber ahead of pace and red when out of quota. The needs-you flag disappears at
zero; the mode appears only outside normal mode. --width N overrides COLUMNS
(default 80): at 60 columns the mode drops, at 40 the planner name drops, and at
20 or fewer it becomes ▬┃63 ⚑1. Content shrinks further if needed to fit.
Use --no-color (or NO_COLOR) for plain text and --line --json for the same
fields as JSON. Plain status --json still returns the full budget status.
Offline it prints pacer not running · pacer serve; --line always exits zero.
Run delegation in the repository you want the executor to edit. Supply a concrete scope and verification command:
pacer delegate --goal "Improve the setup instructions" \
--kind docs --scope README.md --acceptance "test -s README.md" --jsonUse the returned id in the next commands, replacing TASK_ID:
pacer watch TASK_ID --json
pacer tasks TASK_ID --json
# Review the diff in the reported worktree and run acceptance yourself.
pacer review TASK_ID --accept --jsonUse --reject if the result does not satisfy the brief. For structured briefs, use pacer delegate --brief-file brief.json --json or pipe JSON to --brief-file -. CLI and brief reference.
How it works
The planner owns planning, decisions and review. route ranks configured, installed executors using usage readings and your strategy. delegate starts an executor, records its result and runs any supplied acceptance command. Provider limits can trigger fallback to another executor. The planner checks the diff and acceptance result before recording review; settlement alone is not acceptance.
| Mode | Planner policy | | --- | --- | | relaxed | Execute directly or delegate when useful; budget is behind pace or expiring. | | normal | Delegate substantial execution; budget is on pace or unknown. | | strict | Delegate execution and preserve capacity for decisions and review; budget is ahead of pace or near a limit. | | emergency | Delegate execution; the planner's reserved budget is exhausted. |
Pace uses learned active hours, falling back to calendar time until enough history exists. Modes guide installed planner policies; supported hooks can guard planner subagent execution. PACER=off disables pacing enforcement for a session (for example,
PACER=off claude). To pause new delegation, use pacer pause <duration>
(for example, pacer pause 1h) or choose Pause 1h in the tray menu. Running
tasks continue; pacer resume ends the pause early.
Configuration and executors
pacer init creates ~/.pacer/strategy.yaml from detected tools. Edit providers, pacing and routing there; PACER_HOME overrides the state directory. See configuration and the starter strategy.
Native executor launchers support Codex (codex), Cursor (cursor-agent), agy and Claude Code (claude). OpenCode runs configured provider/model IDs, including BytePlus Coding Plan and local Ollama or LM Studio models. Usage support differs by provider; see executors.
The CLI is the primary agent interface. pacer install <planner> --mcp optionally registers pacer mcp, exposing budget, routing, delegation, task and review tools over stdio.
App
With the service running, pacer open opens the pacer app in your browser.
Track budgets and pace, delegate and review tasks, manage executors and accounts,
and change strategies, hosts and settings. Until setup is done, the Setup screen
lists each step with one action (install the service, connect your planner, add
an executor) and ends with a guided first delegation you review; provider sign-in
shows the command to run in a terminal.
The app is served locally by the daemon and signs you in through a one-time link.
Use pacer open sessions to open a screen, pacer open --print to print the sign-in
link, or pacer open --logout to sign out all browser sessions. See the
app guide for screens, security and troubleshooting.
Agents settings lists executors in priority order. Use an executor's More actions button to edit Priority and Parallel tasks, then save the page draft; Takes work saves immediately. Narrow settings containers show labelled cards with all actions visible. The Add agent wizard wraps its steps above the form when space is limited and keeps your draft if you leave. Machines cards and rows adapt to their available width.
Uninstall
pacer uninstall --allIt lists everything it will remove (agent integrations, restoring their backups;
the login service; a leftover Orca plugin from an earlier pacer; ~/.pacer or
PACER_HOME), asks once, then removes it. Add --binary to delete the pacer
binary too, and --yes to skip the question in scripts. pacer no longer ships an
Orca plugin; if you installed it earlier, also remove pacer from Orca Settings >
Plugins. To disconnect a single agent, use
pacer uninstall <agent>.
Privacy
pacer sends no telemetry. Its budget and activity readers use these local sources:
- Claude rate-limit caches:
~/.pacer/cache/claude-rate-limits.jsonand~/.claude/state/budget/claude.json(the newest available file). - Codex rate limits: tails of recent
~/.codex/sessions/**/rollout-*.jsonlfiles. - Active-hour learning: timestamps extracted from
~/.claude/projects/*/*.jsonland Codex rollout logs over the last 28 days. The files themselves are read locally, including their other contents; the activity profile retains hour counts. - pacer's own strategy, caches, limit/block marks, task records, executor output logs, decision logs, installation manifests and local link/service state under
~/.pacer(orPACER_HOME).
BytePlus usage is read through arkcli usage plan --product coding-plan; metered OpenCode usage through opencode stats --models --json --days 7. Setup detects installed CLIs and may list local models with ollama list or lms ls --json. Integration commands inspect and edit planner configuration, skills and hooks, keeping backups. Delegation reads the supplied brief, repository Git state and executor reports; verification runs your acceptance command. Orca integration reads local runtime/worktree state and the bearer token for loopback HTTP.
pacer starts agents with permission bypass enabled (Codex and Claude bypass flags, Cursor force mode with its sandbox disabled, Antigravity permission bypass, and OpenCode auto-approval). This applies to headless, interactive, resumed and strategy-planning sessions. Before an interactive Claude Code launch in a pacer-created task worktree, pacer marks that worktree as trusted in the selected account's Claude state (.claude.json), so Claude's folder-trust and external-import prompts do not block unattended tasks. Unattended task launches also approve project MCP servers for that launch only; servers you rejected in the source checkout stay off, and takeovers and conversations keep Claude's MCP prompt. Executor sessions start from your login shell's environment, as a new terminal would; see Session environment. OpenCode and Cursor still honor explicit deny rules. Orca worker execution falls back to direct execution because its launch API cannot enforce a permission policy. Executors receive your brief and can access files and commands with your user permissions; their services have their own data policies. Optional ollama and jev classifier adapters send decision state to their configured endpoints. The default classifier is local rules; external shadow calls require classifier.shadow_external: true. Classifier keys may be read from environment variables or ~/.pacer/secrets. Release install/update commands download from GitHub Releases by default, or from your PACER_RELEASE_BASE override. No usage logs are uploaded for analytics.
Star history
Community
Read Contributing, the Code of Conduct, Support, Security, Governance and the Changelog. GitHub community channels will become available when the public repository launches.
Licensed under Apache-2.0; see NOTICE.
pacer is an independent project and is not affiliated with Anthropic, OpenAI, Cursor, BytePlus or Orca. Product names are used only to describe compatibility.
