local-first · markdown-backed · agent-native

An IDE for the agent era.

Break work into tickets, dispatch agents that each run on their own branch, in parallel, and review everything as a real pull request before it lands. Your repo stays the source of truth.

$ git clone https://github.com/guybnd/Event-Horizon.git
See it work →
not another chat window

One chat can’t ship a product.

A coding agent in a terminal is one conversation wide. Event Horizon runs the work as tickets: a plan up front, an agent per branch, a review gate, and a merged PR at the end.

one agent in a terminal
one conversation, one task at a time
context evaporates as the scrollback grows
you babysit every step
“done” means the model said so
a board of agents
every ticket gets its own agent, branch, and worktree
plans and acceptance criteria live on the ticket
review gates catch problems before they reach you
done means a squash-merged PR

Run it all
at once

Parallel agents. Zero collisions. No babysitting.

A sandbox per ticket

Each session gets its own branch and git worktree. Five agents build at once; your checkout stays yours.

The Furnace

Queue a batch before bed. It implements, reviews, retries, and leaves every ticket as an open PR. Never merges without you.

Minimize, keep running

Chats dock like windows in a taskbar. A minimized session keeps working and pulses when it needs you.

Collision radar

One view of every in-flight worktree. Files touched twice get flagged before they become a conflict.

All your repos, one engine

Switch boards from a tab strip. Nothing reloads, no session dies, every project keeps burning.

Groom five at once

One session plans a whole family of sibling tickets in a single sitting. Cheaper, faster, consistent.

Batches that chain

Arm a batch to ignite when a PR merges. The next wave starts itself.

A chat above the board

It sees every ticket, session, and PR. Say "split this epic" and watch the cards land.

High code
quality

Enforced on every ticket:

◇ a plan gate before code⛶ specialist review panels⚑ human checkpoints✓ CI checks on the PR

An autonomy dial

Manual, Guided, or Autonomous. You decide which gates need a human: plans, merges, or nothing.

Reviews that fan out

One diff, three specialist reviewers in parallel, one synthesized verdict posted back.

Pin notes on mockups

Agents publish clickable mockups to the ticket. Pin a note on any element; a revision comes back.

Ship from the card

Ready opens a real pull request. Review the diff, request changes, rebase, and squash-merge without leaving the board.

It asks before it guesses

When a decision is yours, the agent stops and asks. Prompts wait for you and survive restarts.

Roll your own crew

Compose personas with their own mission, model, and effort. Reuse them anywhere on the board.

Watch every move

Tool calls stream live: reads, edits, test runs. Collapse the noise; click a path to open the file.

Rewrite history, rerun it

Edit any earlier message and resend, or retry a turn. The conversation is a surface, not a log.

Ship
faster

Less ceremony where it’s safe. More throughput everywhere.

Small tickets, zero ceremony

An XS ticket grooms and builds in one session, skipping the plan gate it doesn't need.

One-tap board health

It reads staleness signals and proposes folds, archives, and moves. Approve the batch in one pass.

Epics fold their children

Subtasks stack under their epic in one deck, and a roadmap view tracks what remains.

Scratch chats

Think out loud off the board. If a scratch chat earns a card, promote it into a real ticket.

Done pile to changelog

Select what shipped, get an annotated changelog, publish the release. Tickets flip to Released.

Token spend, in dollars

Every ticket shows its spend, split cached versus fresh, ranked so you know where the budget goes.

Old tickets stay cheap

Heavy histories collapse into digests, so an agent joining a month-old ticket doesn't pay for all of it.

On your
terms

Your CLI, your repo, your machine.

Bring your own agent

Claude Code, Gemini CLI, or Copilot CLI. Same board, same tools, no second bill.

Desktop, tray, or browser

A native app, a single tray binary, or plain npm start. Local-first in every form.

A real terminal, in the board

Full PTY in a panel. Run tests and scripts next to the tickets that need them.

Plug-in superpowers

Flip on Serena for symbol-level edits, Context7 for live docs, Memory for cross-session recall.

One product, many repos

Link repos into a group. Shared docs fan out to every member, so every agent knows the whole product.

Your working tree, watched

A stoplight counts uncommitted files. Open the panel, pick diffs, commit right from the board.

Conflicts, defused

When boards diverge, pick use-local or use-remote per file in a modal. No raw merge markers.

lumen-app — LUM board · 2 agents running
done since v1.6.0 — click to include
v2.4.0 · 2026-07-13
“July drop” — Lumen’s release notes draft themselves from the completion summaries of the tickets you pick
select Done tickets on the left — each one becomes an annotated changelog entry
✓ tag v2.4.0 pushed · notes committed to docs/releases · tickets → Released
worktree slots 3/4 claimed stoker ◈ on duty — burns unattended, never merges
polish-sprint ⇉ parallel 🔥 burning burn rate 2/4retry cap 2breaker armed
LUM-236
Merchant logo fallbacks
implement → review → ready ● burning · attempt 1
LUM-237
Empty-state illustrations
implement → review → ready ● review pass
LUM-239 Settings copy pass waiting for a worktree slot ○ queued
LUM-233 Retire legacy chart library implement → review → ready ✓ Ready · PR #241 open
kyc-migrations ⇢ sequential 🔥 burning shared ⎇ furnace/kyc-migrationsone PR #244
LUM-240 Add KYC status field to accounts stacked onto shared branch ✓ committed · 1/3
LUM-241
Migrate users to v2 statuses
implement — depends on 240 ● burning · 2/3
LUM-246 Backfill for closed accounts runs after 241 lands ○ queued · 3/3
2 PRs opened3 burning2 queued parked tickets raise a hand on the board — never silently dropped
↵ send
▾ docs/
▾ api/
payments
statements
push-notifications
webhooks
▸ guides/
▸ internal/
◈ implementer session LUM-229 — writing the doc for the contract it just changed
docs / api / push-notifications.md

Push notifications

Lumen fans transaction events into per-user push digests. Clients register one device token per install.

Card transactions now batch into a 30s digest window — one push per burst of spending, not one per swipe. Consumers should prefer digest webhooks over per-event pushes.

inserted by implementer · same PR as LUM-229 · docs can't drift from code
channel: push:{userId}:digest  window: 30s  max: 20 events

the plan gate

Grooming is a conversation. The plan is what it leaves behind.

A grooming ticket is a chat with the groomer. It thinks, proposes a living HTML artifact, you annotate it directly — and every pin comes back as a new revision with new acceptance criteria. Approve, and it's a Todo ticket.

the example below: Lumen, a fictional banking app, grooming a spending-insights feature — Event Horizon is just the surface it's planned on
LUM-231 · Spending insights on the dashboard Grooming ◈ groomer session · live
file .flux/tickets/LUM-231.md1 session6 history entries
↵ send
artifact panel
the groomer hasn't proposed anything yet
Spending insights — interactive mockup rev 1
Lumen · July insights — concept Arev 1 · totals only
spent this month $2,418 ▲ 12% vs June
Food · $872 Transport · $391 Rent · $950 Fun · $205
Mar
Apr
May
Jun
Jul
stacked by category · totals only
Blue Bottle Coffee−$6.40
Metro card reload−$33.00
Kura Sushi−$58.20
annotate anywhere — pins land on the artifact itself
you · pin 1 these should be tappable filters, not just labels
you · pin 2 show it vs last month, not just the total
LUM-231 TodoM
Spending insights on the dashboard
#mobile#dashboardplan · rev 24 criteria · 6 tests
◈ implementer · dispatched
grooming collapsed into a Todo card — plan, criteria,
tests, and your pins all ride along in the markdown

chat on the left, the plan takes shape on the right — your pins become rev 2's acceptance criteria

one ticket, start to finish

Scroll. Watch a ticket live its whole life.

From + New ticket to squash-merge — the cursor does the clicking, you just keep scrolling. Scroll back up to rewind.

lumen-app — LUM board
search tickets…
⏩ catching up
keep scrolling — the story plays as you go ↓
agent types

A crew, not a chatbot.

The full roster, organized by phase — each persona briefed with exactly the context its job needs, nothing more. Below: the orchestrator assembling a scatter-gather review live.

grooming

Groomer

Turns an ask into a plan: reads the code, sizes the work, publishes mockup artifacts.

sees:codebaseboard configyour pins

Plan reviewer

The gate between Grooming and Todo — approves or sends the plan back with notes.

sees:planacceptance criteria
implementation

Implementer

Executes the groomed plan on the ticket's branch in its own worktree. Commits, validates, pushes.

sees:plan + pinsworktreevalidation cmds

Fast-path

Grooms and builds an XS/S ticket in one session — skips the plan gate structurally.

sees:ticketcodebase

🔥 Stoker

Burns batches unattended: implement → review → retry, leaving open PRs at Ready. Never merges.

sees:batch queueretry budget
review

Reviewer

Adversarial second pair of eyes — approves to Ready or sends back with the reason attached.

sees:diffplanhistory

Specialist panel

Scatter-gather: ui / state / a11y reviewers run in parallel, each through one lens.

sees:diff · one lens each
lead

Orchestrator

Your conversation above the board: triages, breaks big asks into tickets, dispatches specialists.

sees:whole boardsessionsPRs

Supervisor

Runs a scatter-gather: fans work to workers, synthesizes one result from their outputs.

sees:workers' outputs

Your own

Custom personas with their own mission, model, and effort — reused across the board.

sees:whatever you brief
scatter-gather — review of LUM-225, composed live by the orchestrator
ticket event
LUM-225 → Ready
PR #247 opened
orchestrator ⛬
Compose review
security-reviewer · export surface approve
perf-reviewer · big-account streams approve
api-reviewer · response contract 1 nit
synthesis: 2 approve · 1 nit folded into the diff — supervisor posts one review → approved to Ready
no lock-in

A ticket is just a file.

Markdown with YAML frontmatter, committed to your repo or a dedicated data branch. Which means your board:

  • versions with your code — history is git history
  • works offline — local-first, no service dependency
  • moves with you — switch machines with a git clone
  • stays greppable — search it like any other source
.flux/tickets/LUM-229.md
---
id: LUM-229
status: In Progress
branch: lum-229-push-digests
effort: M
tags: [mobile, notifications]
---

# Push notifications for card transactions

> TL;DR: batch card transactions into
> per-user push digests (30s window).

Wire the transaction stream into the
push service so bursts of spending
arrive as one digest, not five…
storage & sync

Your board is commits. You pick where they live.

Tickets are markdown — so sync is just git. Keep them next to your code, on a dedicated orphan branch that never touches master's history, or in a local store with no git at all.

where tickets live — three modes, same markdown
lumen-app/.flux/tickets/LUM-242.md
board: LUM-242 → Done board: new ticket master
  • Board changes ride your normal commits — tickets version with the code they describe.
  • A feature PR can include its own ticket's status change.
  • Best for solo repos and teams that like everything in one history.
your-repo · branch flux-data (orphan) · .flux-store/tickets/LUM-242.md
master flux-data board commits — zero noise in master
  • An orphan branch in the same repo — no shared history with master, so your code log stays pristine.
  • Board syncs with plain push / pull — same remote, same auth, no extra service.
  • Every machine that can clone the repo gets the whole board. The default for teams.
~/.flux-store/lumen-app/tickets/LUM-242.md
local markdown · no git · still greppable
  • No git at all — tickets live in a local store beside your workspaces.
  • Right for repos you can't commit board files into, or quick experiments.
  • Switch modes later — it's the same markdown either way.

same files, three homes — the orphan branch keeps the board in the repo without touching master's history

get started

Cross the horizon.

Runs alongside your IDE and terminal. Node 20+, your repo, nothing else.

$ git clone https://github.com/guybnd/Event-Horizon.git && npm start