skill
easl
the board your agents build on. native mac app for coding agents. free, mit.
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/twaldin/easl itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Oct 25, 2026the 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.
The diagram, the page and the note are each in another window. The answer scrolls away.
easl rendered this screenshot. A script laid out the tiles so they would fit the frame. Why I built easl, and a video of Claude Code explaining it on the board: the launch post.
- click what you mean into the next prompt. Hold ⌃⌥⇧⌘ and click a shape, a DOM element, a note paragraph or list item, a line of code or a command's output. It becomes a chip in the tray, and your next prompt in that terminal carries it. For an agent without easl hooks, ⌃⌥⇧⌘V pastes it.
- real terminals. Your own
claude,codexor any CLI, logged in as you, in a terminal libghostty draws with your Ghostty config. For Claude Code and Codex, a wrapper on the tile's PATH adds easl's hooks for that session only. - your code, with your language server. Read-only code tiles of the whole file, with hover, go to definition, references and a git gutter against your branch. Call graphs of who calls what, computed by your language server (it needs call hierarchy; sourcekit-lsp is verified).
- a browser your agents drive. WebKit tiles. Claude Code, Codex and any CLI use
easl browser(open, snapshot, click, type, eval, screenshot); omp uses itsbrowsertool. The page's errors show on the tile. - notes, html pages and drawing. Notes whose code excerpts follow the lines they quote, sandboxed HTML pages agents write, and shapes, arrows and ink from you or the agent.
- agents keep running when you quit. Terminals live in zmx sessions. Quit, crash or rebuild easl and they keep working.
works with Claude Code, Codex, opencode and Gemini CLI (before 0.60) with no setup, omp with one symlink, and any other CLI through ⌃⌥⇧⌘V.
A native Mac app for macOS 14 or later on Apple silicon, with no AI of its own. Free, MIT. Details on easl.sh, in the docs and in the guide.
install
Requires macOS 14 or later on Apple silicon. easl is signed with a Developer ID and notarized by Apple.
- Install it with Homebrew. Installing by the full name trusts only this cask, so there's no
brew truststep.brew install --cask twaldin/tap/easlbrew upgrade --cask easlupdates it; it quits easl first, and terminal tiles keep running. After installing, the cask clears the quarantine flag Homebrew puts on what it downloads, so easl opens without Gatekeeper's one-time "downloaded from the Internet" confirmation, also when an agent starts it. If clearing the flag fails, the install still succeeds and the first launch asks as before. - Or quit easl if it's running and run the installer. It downloads the latest release from Releases, checks its SHA-256 and moves
easl.appto/Applications(~/Applicationsif that isn't writable), with no sudo (read the script).curl -fsSL https://easl.sh/install | sh - Or download
easl-<version>.zipfrom Releases, unzip it, moveeasl.appto/Applicationsand open it. It's notarized, so it opens like any downloaded app. - Install the runtime tools. Terminal tiles need zmx. The
easlCLI, agent integrations, and host-file helpers need Bun 1.4.3 or later on each host.
The Python SDK needs Python 3.11 or later; macOS's ownbrew install neurosnap/tap/zmx oven-sh/bun/bunpython3is 3.9 (brew install pythonfor a newer one). - Optional, for omp: link the easl extension. omp then reports its state, drives follow tiles, and gets the easl skill.
mkdir -p ~/.omp/agent/extensions ln -sf /Applications/easl.app/Contents/Resources/extensions/omp/easl.ts ~/.omp/agent/extensions/easl.ts - Optional, for code navigation: install the language servers you want (sourcekit-lsp, pyright, typescript-language-server, gopls, rust-analyzer). Without one, Go to Definition, Find References and Outline answer by text search. docs/install.md has the install commands and how easl finds a server.
Updates. easl checks easl.sh a minute after launch and then daily. When a newer version is out, an Update button appears at the top right of the window (easl › Check for Updates… checks now). Update downloads the release, checks its SHA-256 as the installer does and its signature and notarization, then quits easl, replaces the app where it is and reopens it; terminal tiles keep running. A Homebrew install updates the same way, and brew outdated lists easl until brew upgrade --cask easl catches Homebrew's record up.
first steps
- Open easl. It opens a board on your home folder, with Get Started beside a practice note. Help › Get Started brings it back.
- Hyper-click the practice note: hold ⌃⌥⇧⌘ and click a paragraph. A purple chip, the mention, appears in the tray at the bottom of the window. Without a Hyper key, select the note and press ⇧⌘M, or map Caps Lock to Hyper in Karabiner-Elements: Complex Modifications › Add predefined rule › "Change caps_lock to command+control+option+shift".
- Press ⌘T for a terminal and run your agent:
claude,codex,opencode, orompwith its extension (install step 5). Codex first asks whether to trust the folder. - Ask it something, like "what does this note say?". The chip goes with your prompt, and Get Started checks off both steps.
- Open your project with File › Open Board… (⇧⌘O), open a file as a code tile with ⌘O, and Hyper-click a line of it.
To create a fresh, independent board, select a local board window and choose File › Open Board… or the tab bar's + button. Click New Folder, name a folder outside any Git repository, and choose Open Board. No existing easl data is required. A folder inside a Git repository opens that repository's board instead; it does not create an independent board. The picker operates on this Mac. While a remote board is active, New Folder is unavailable; opening existing folders keeps its previous behavior.
To start in a different folder when opening easl from Finder, and use that folder as the starting point for File › Open Board… and the tab bar's + button on local boards or with no board open, set a default board directory:
defaults write net.waldin.easl canvas.boardDirectory -string "$HOME/Developer"
Use an existing absolute path or a ~/ path. Restart easl after changing it. An explicit EASL_ROOT,
command-line folder, or shell working directory still takes precedence at launch. The setting does
not move existing boards, restrict which folders can open, or change where board data is stored.
When a remote board is active, both pickers ignore this preference and retain their existing behavior.
Unset it with defaults delete net.waldin.easl canvas.boardDirectory; missing directories, files and
relative paths fall back to the usual home-folder launch and active-board picker behavior.
uninstall
End the terminal sessions first, or they keep running: zmx list, then zmx kill <name> for each canvas-obj_… session. Then delete /Applications/easl.app (with Homebrew: brew uninstall --cask easl) and the files easl writes, listed step by step in docs/install.md. easl edits no shell, agent or Ghostty config.
build from source
The Command Line Tools are enough; Xcode is not required. Client generation, the omp extension, and host-file tests need Bun 1.4.3 or later. The Python SDK's tests need Python 3.11 or later.
swift build # debug build
scripts/bundle.sh release # assemble .build/easl.app (ad-hoc signed)
swift run CanvasCoreTests # test suite (an executable target; see Package.swift)
bun scripts/gen-clients.ts # regenerate the Python/TS clients from schema/easl-api.json
scripts/dev.sh runs an isolated development instance. See docs/testing.md.
docs
- docs/guide.md: every feature, from mentions to the agent API.
- docs/install.md: language-server lookup and the full uninstall.
- docs/design.md: the design record: principles, architecture and decisions.
- docs/contracts.md: the API, tile and scene contracts.
- docs/testing.md: behavior tests and a development instance.
- docs/releasing.md: signing, notarizing and publishing a release.
- skills/easl/SKILL.md: how agents work on the board.
support
Bugs and questions go in GitHub issues. To contribute, build and run the tests above and open a pull request. Report vulnerabilities privately, as SECURITY.md describes.
license
MIT. See LICENSE. easl builds on Ghostty, tree-sitter, swift-markdown and zmx; THIRD_PARTY_NOTICES.md lists every third-party component and its license, including GNU libintl's LGPL 2.1 terms.