Leksah

An IDE written in Haskell

One functional-reactive codebase that runs as a native app on macOS, Linux and Windows.

DEMO The real IDE compiled to JavaScript — a canned sample, not a full IDE in your browser
This is a canned demo: Leksah itself, built with GHC's JavaScript backend, pre-loaded with a small game project, recorded terminal sessions and precomputed tooltips — nothing compiles or runs natively in this page. Prefer a full window? Open it full-page ↗

Batteries included

Leksah is deepest at Haskell — and its editor, terminals, git and language-server support work the same for any language.

Your choice of editor

CodeMirror 6 by default, or Monaco — the editor from VS Code — via a preference. Shared find bar, dirty-change gutter, in-editor diffs.

Language servers, zero config

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.

Real terminals

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.

Git built in

A live changes pane and a history browser with side-by-side diffs for any commit.

Haskell projects, understood

Cabal workspaces, packages and components; incremental and background builds; errors as squiggles and a structured Errors pane; GHCi debugging; cached Nix dev-shell environments.

Follows your focus

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.

Terminals on other machines experimental

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.

Remote projects experimental

Open a project over SSH: editing, builds and the language server run on the remote machine while the UI stays local.

AI assistant experimental

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.

A team of agents experimental

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.

Multiple windows

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.

One codebase, every platform

The whole UI is a single reflex program. Each platform just gives it a different home:

macOS — native WKWebView app Linux — GTK4 + WebKitGTK app Windows — Edge WebView2 app Any browser — served over HTTP No install at all — compiled to JavaScript (the demo)

Get it

⬇  Download for Linux (x86_64)

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.

Written in Haskell, since 2007

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.