Leksah
One functional-reactive codebase that runs as a native app on macOS, Linux and Windows.
Leksah itself, compiled to JavaScript and running in your browser.
Leksah is deepest at Haskell — and its editor, terminals, git and language-server support work the same for any language.
CodeMirror 6 by default, or Monaco — the editor from VS Code — via a preference. Shared find bar, dirty-change gutter, in-editor diffs.
Deep haskell-language-server integration, and automatic use of
typescript-language-server, rust-analyzer,
gopls, pyright, clangd and
nixd when they're on your PATH: diagnostics, hover,
completion, go-to-definition, references.
Terminal panes are tmux sessions — persistent, searchable, and still running after a restart. File references in output are clickable; ⌘T opens one where you are working, ⌘D splits beside it.
A live changes pane and a history browser with side-by-side diffs for any commit.
Cabal workspaces, packages and components; incremental and background builds; errors as squiggles and a structured Errors pane; GHCi debugging; cached Nix dev-shell environments.
The active project is whichever one the pane in front of you is in —
an editor, a git log, or a terminal you just cd-ed. Wander
into a project you haven't added and it joins the workspace for as
long as you're there; pin it to keep it.
Add a server and its tmux sessions open as ordinary Leksah windows — split, drag and flip them like local ones, or nest a remote pane inside a local window. Servers can open at startup and be woken with Wake-on-LAN, and a host without tmux gets nixpkgs' tmux if it has Nix.
Open a project over SSH: editing, builds and the language server run on the remote machine while the UI stays local.
Run your AI tool in a terminal pane and send it the current selection,
a file#L10-20 reference, the current error, or a screenshot
region — straight from the menu.
Claude Code sessions get names and faces, start each other in panes beside you, and report back. The Agents pane shows what each one is doing right now — the tool it is running, what it edited, its branch and PR — the Team pane their bios, and a manager agent coordinates the rest. Suspend one and resume it later, right where it was; after a reboot, the agents it interrupted are offered back — all at once, or let the manager choose. Each agent's worktrees show under it in the workspace, as projects you can open.
Open extra OS windows onto the same session — each starts with a terminal and your panel layout — and a tab flipper switches between recent tabs across all of them.
The whole UI is a single reflex program. Each platform just gives it a different home:
Nothing to configure — unpack and run. Other platforms: macOS · Windows · Linux server (static, browser UI)
Or build it from source, with ghc, cabal and
tmux on your PATH (or inside nix develop, which
provides them):
$ git clone https://github.com/leksah/leksah.git
$ cd leksah
$ ./leksah.sh # native app (or --warp for the browser UI)
See getting started and building from source for details, front-end variants and packaging outputs.
Leksah started as a traditional IDE written in Haskell, for Haskell.
Its user interface was built with GTK — and that classic Gtk UI is
still available, as
leksah-classic.
Turning Leksah into a web app was a long-term goal. In 2019 work was still underway on a web-based user interface built with reflex when work on Leksah slowed. It has since been picked up again and carried forward with the help of AI. The result is one Haskell codebase that renders through a native WebView via jsaddle, over a websocket to your browser, or compiled to JavaScript outright — the demo above is the IDE itself, built with GHC's JS backend.
Being built alongside AI agents has shaped what Leksah does. Many of its newest features exist to make developing with AI easier: Claude Code sessions get names and faces and live in ordinary panes; they can start one another beside you and report back; the Agents pane shows what each is doing right now — its tool, its edits, its branch, PR and worktrees — and a manager agent can coordinate the rest. Agents a restart interrupted are offered back, and the selection, the current error or a screenshot region is one menu item away from the AI pane.
It is also self-hosting in the most literal sense: Leksah is developed in Leksah.