skip to content
easldownload

easlmac app for coding agents

the board your agents build on.

hold ⌃⌥⇧⌘ and click a box in a diagram, an element on a page or an item in a note, and your agent gets it with the next prompt. agents run in real terminals on one infinite board, beside your code, call graphs, a browser and html pages. native mac app. free, mit.

macos 14 or later on apple silicon

works with
  • claude code
  • codex
  • omp
  • opencode
  • gemini cli (before 0.60)
  • aider and any cli

click what you mean into the next prompt

A drawn red ellipse, “lost on crash?”, with an arrow to a code tile, mentioned to Claude Code in a terminal tile. A white arrow labelled “[1] shape” runs from the shape to the terminal.

a shape in a diagram

The ellipse points at the spool in report.ts. Claude Code reads what it points at and says when a crash loses a report.

Claude Code in a terminal tile, answering about line 36 of extensions/agent-hooks/report.ts, mentioned from a code tile. A white arrow labelled “[1] report.ts:36” runs from the line to the terminal.

a line of code

Claude Code on report.ts:36: when easl is away, the hook writes its report to a spool file, and easl replays it on reopen.

one chord: ⌃⌥⇧⌘ and click

Hold ⌃⌥⇧⌘ and click a shape, a page element, a note item, a line of code or a command’s output. Karabiner-Elements can map Caps Lock to all four.

  • ⌃⌥⇧⌘-click adds it to the tray at the bottom of the window
  • ⇧⌘Madds whatever the keyboard is on
  • ⌃⌥⇧⌘Vpastes them into an agent without easl hooks, like aider
A shell tile that ran bun test extensions/agent-hooks/report.test.ts, its output mentioned to Claude Code in a terminal tile. A white arrow labelled “[1]” runs from the output to the terminal.

a command’s output

The bun test run’s output goes with the prompt, with its command and exit code. Claude Code finds no test for a crash; report.test.ts:93 comes closest.

what agents build beside their terminals

A terminal that ran git diff --stat, with an arrow labelled git diff to a review group: a changes tile of an uncommitted edit beside the code tile it touches.

a terminal beside a review

git diff in the terminal, and beside it the changes tile and the code it touches.

Claude Code’s terminal beside its follow tile: AgentReportSpool.swift from line 55, the lines it last read, with a strip of its earlier reads.

the file the agent last read or edited

Claude Code reads AgentReportSpool.swift, and its follow tile shows those lines beside its terminal.

A call graph tile, “Callers of AgentReportSpool.read”, computed by sourcekit-lsp: open(root:) calls replayAgentReports(on:), which calls read(from:tiles:).

call graphs from your language server

Who calls AgentReportSpool.read, computed by sourcekit-lsp. Each node is a real symbol; + opens the next level.

A walkthrough: four captioned code tiles in a group, joined by numbered arrows.

a walkthrough, in order

Captioned code tiles joined by numbered arrows. ⌥⌘→ goes to the next stop.

A browser tile on the site’s docs page, with the docs index in a WebKit page.

a browser your agents drive

A WebKit page on the board. Agents open, snapshot, click and type in it with easl browser.

what else is on the board

A changes tile reviewing an uncommitted edit to SocketServer.swift, with Stage and Discard buttons on each hunk.

review what the agent changed

Stage, unstage or discard files, hunks and lines, like a PR.

A note whose code fences are live excerpts of report.ts and the replayAgentReports symbol, with a link to the file.

notes that quote real code

A code fence shows the file as it is now and follows its lines as they move. When that code is gone, it says stale.

A terminal tile on the easl repository showing git log, git diff --stat and the output of bun test.

agents in real terminals

Your own claude, codex or any CLI, logged in as you. libghostty draws them with your Ghostty config.

A code tile of SocketServer.start with the git gutter marking an uncommitted edit.

the whole file, with a git gutter

Read-only, with your language server. The gutter marks changes against your branch; click a mark to see the old lines.

  • language servers ›
The whole board: a terminal, a walkthrough, a review group, a call graph, a note, browser tiles and an HTML page.

a board after a session

A terminal, a walkthrough, a review, a call graph, a note, two browser tiles and an HTML page. A script laid out the tiles.

An HTML page tile with two panes of code excerpts from the repository.

html pages your agents write

Sandboxed, network off by default, with Tailwind, Mermaid and code excerpts read from the real files.

agents

  • claude code

    No setup. A wrapper on the tile’s PATH runs your claude with easl’s hooks for that session: a state dot, your clicks in its next prompt, a follow tile, and its session back after a reboot.

  • codex

    Same as Claude Code.

  • omp

    One symlink to easl’s omp extension, then the same as Claude Code. omp’s own browser tool drives browser tiles.

  • opencode

    No setup: easl adds its plugin per session. A state dot, your clicks in its next prompt, and a follow tile.

  • gemini cli

    Before 0.60: no setup, a state dot, your clicks in its next prompt and a follow tile. 0.60 and later runs as a plain terminal, and ⌃⌥⇧⌘V pastes your clicks in.

  • aider and any other cli

    Runs in a tile, and ⌃⌥⇧⌘V pastes your clicks in.

agent setup and reboots ›

the agent api

Agents reach the board over a local socket with a JSON schema: the easl CLI, on PATH in every terminal tile, or the Python and TypeScript clients. They create tiles in atomic batches, render a region without moving your view, and send each other board objects with easl agent.prompt.

api docs

the basics

  • keeps running when you quit

    Terminals live in zmx sessions, so quitting or crashing easl stops nothing. After a reboot, Claude Code, Codex and omp tiles relaunch with their session.

    more

  • review any branch

    A changes tile shows any branch or fetched pull request against its base, without checking it out.

    more

  • one board per repository

    Every worktree and branch opens the same board. Terminals remember where they started.

    more

  • tells you when an agent needs you

    An orange dot on its tile, ⌘J to jump there, and a macOS notification when easl isn’t in front.

    more

  • ⌘Z undoes what an agent did on the board

    It says what it undid: “Undid omp: created 9 code tiles, 6 arrows”.

    more

install

  1. Install it with Homebrew. brew upgrade --cask easl updates it:

    brew install --cask twaldin/tap/easl
  2. Or paste this in Terminal. It downloads easl-0.2.3.zip, checks its SHA-256 and moves easl.app to Applications (read the script):

    curl -fsSL https://easl.sh/install | sh
  3. Or download easl-0.2.3.zip from GitHub Releases, unzip it and move easl.app to Applications. It’s notarized by Apple, so it opens like any downloaded app.

  4. Install zmx (terminal tiles run in it) and bun (the agent hooks, the easl CLI and the omp extension run on it):

    brew install neurosnap/tap/zmx oven-sh/bun/bun

faq

how is this different from the claude desktop app, the codex app, cursor or cmux?

Your own claude or codex runs in a real terminal, in its own TUI, logged in as you, with easl’s hooks added for that session. Code, call graphs, browser pages and HTML pages open beside it on one board, and a ⌃⌥⇧⌘-click puts any piece of them in the next prompt. Code tiles are read-only, so you keep your editor.

You type to each agent in its own terminal. easl has no AI of its own.

does macos block the first launch?

No. easl is signed with a Developer ID and notarized by Apple, so it opens like any downloaded app, however you install it.

Or build it from source.

does it need an account or an api key?

No. Your agents use the accounts they’re logged into.

what does it cost?

Nothing. It’s free and MIT licensed. No sign-up.