v0.9.12 · stable
e · The Editor

The editor for
the rest of us .

A fast, native code editor written in Rust — with first-class PHP/Laravel support, LSP, a built-in terminal and database panel, and an integrated AI agent panel running right beside your code.

Editing a Laravel Blade view in e — Flux UI components, Tailwind classes, tabs and breadcrumbs

On 0.9.9 or earlier? Upgrade, and rotate your database passwords.

Database passwords, SSH passwords and key passphrases were written in plaintext to ~/.config/e/databases.json with the process umask — 0644 in practice, readable by any account on the machine. They go to the OS credential store now, and an existing file is tightened to 0600 as soon as e reads it. Upgrading protects the file; it does not unmake a copy somebody already took. The agent sync socket was also unauthenticated, so anything on the machine could find it and run arbitrary shell — that one is fixed by upgrading alone.

0.9.10 also stops the editor aborting and losing unsaved work while you type, and stops Workspace Replace All rewriting a Laravel vendor/ with no preview and no undo. The changelog has the detail on all four.

S.01 — What it does

Fast and native,
built for the web stack.

Tree-sitter highlighting, LSP, fuzzy navigation, and framework-aware completion for PHP, Laravel, Blade, Vue, Svelte and Tailwind — wrapped in a GPU-accelerated UI that stays out of your way.

GPU-accelerated & native

Written from scratch in Rust with a reactive, GPU-accelerated UI. Responsive on big files, light on resources.

Native agent chat panel

A native chat panel (⌘L) drives Elyra headless over its structured RPC (the e-agent crate) — or run Claude Code, Codex or any CLI agent beside your code. Deep co-op: reviewable propose_edit diffs, an autonomous TDD loop (⌘⇧T), and an activity timeline (⌘⌥A).

Review what the agent changed

An agent can touch forty files in a minute, and you did not write any of them. ⌘⌥V opens the whole session changeset risk-ranked — migrations, .env, config, routes, auth and dependency manifests first; lockfiles, tests and docs last — with a sign-off counter, Ask why for a single file, and Revert for just that one. No pushing a PR to review your own machine.

It reads the diff too

e flags what agents tend to leave behind: a forgotten dd() or console.log, a hardcoded secret, interpolated raw SQL, a dropColumn in a migration, a changed .env value, a deleted authorize() call, a skipped test, rejectUnauthorized: false. Each finding has an Ask button that sends it to the agent that wrote it. The matching is call-aware, so add( is never mistaken for dd(.

A gate, then a measured pull request

A verdict bar says Ready, Notes or Needs attention — and why: files still unreviewed, tests not run, danger flags. Run tests reports 12 passed · 2 failed · 1 skipped, each failure listed by its first assertion line and clickable straight to it, because “the suite failed” and “two of ninety tests failed” are different news. Measure routes replays the routes a changeset reaches, with the change and again with your work stashed, and puts a before/after table of status, time, queries and N+1 in the PR body — cautiously: write routes are never replayed, and without Clockwork the query columns read not visible rather than zero. Then Commit & PR commits in logical groups in dependency order with Conventional Commits subjects and opens the PR through gh.

Step debugger, containers included

Breakpoints, a live call stack, variable inspection and step controls over the Debug Adapter Protocol, so one UI drives PHP via Xdebug, Node, and Rust/C/C++ via codelldb. Under Laravel Sail it did not work at all until 0.9.12: the launch config sent empty path mappings, so Xdebug's container paths matched nothing on disk and breakpoints never bound, silently. e now reads your docker-compose.yml and maps the project root's bind mount, so a stock Sail setup needs no configuration.

LSP & tree-sitter

Diagnostics, completion, hover and go-to-definition across 12+ languages, with file-type icons in the explorer. A file can be served by several language servers at once — document sync reaches all of them, completions and code actions are merged, and formatting stays with the primary — except in a PHP project that ships Pint, where Pint takes it. A Laravel project's formatting is whatever Pint says it is, and letting the language server format to its own taste only produces a diff for Pint to undo. PHPStan runs on save alongside, each finding carrying its rule identifier; when PHPStan itself fails the error is shown rather than swallowed, because a run that never looked at your code must not read as a clean one.

The official Laravel language server, too

In a Laravel project e runs laravel/lsp alongside Intelephense and merges their answers: Intelephense for general PHP, laravel/lsp for framework awareness — routes, views, translations, config, env, middleware, Inertia, Livewire, policies, container bindings and validation rules, with diagnostics and quick fixes. An unknown route or a missing view is a squiggle rather than a runtime surprise, and Blade files get a language server for the first time. Install it once with composer global require laravel/lsp; without it nothing breaks and e's own Laravel intelligence carries on.

Laravel intelligence, built in

Completion for route(), view(), config(), env(), __(), x-… Blade components and Eloquent ($model->) from your live schema — plus log tail, schema diff and a Tinker scratchpad (⌘⌥T). None of it depends on an external server being installed.

Architecture map & request-replay

An interactive route → controller → view map (⌘⌥M); replay a request against your running app and see the response, SQL and N+1 warnings.

Semantic search

Describe what you’re looking for (⌘⌥K) — ranked locally with Ollama when available, lexical fallback otherwise. Nothing leaves your machine.

Visual undo tree

A branching history (⌘⌥U) that keeps edits a linear undo would discard, with click-to-jump time travel persisted across sessions.

Fuzzy finder & palette

Jump to files (⌘P), run any action from the command palette (⌘⇧P), and search & replace across the workspace (⌘⇧F).

Integrated terminal

A PTY-backed terminal (⌘T) with ANSI colour, multiple tabs, rename and split — never leave the editor.

Database panel

Browse and query MySQL, PostgreSQL, SQLite and ClickHouse (⌘3) — connect from .env or manually, edit cells, export CSV.

Source control

Stage, commit, push/pull, switch branches, view history, stash, blame and resolve merge conflicts (⌘2).

Built-in auto-updater

Detects new GitHub releases, shows the changelog, and installs the update in place.

Agents, built in

Your coding agent,
beside your code.

Open the agent panel with ⌘L and run Elyra, Claude Code, Codex — or any CLI agent — without leaving the editor. The editor hosts; the agent reasons.

  • Any CLI agent runs in a native panel next to your files
  • Review the session changeset risk-first, and revert file by file
  • Pairs perfectly with the Elyra coding agent
  • Terminal, database and source control one keystroke away
  • Free, open source, and built in Rust
AI agents in e
The e welcome screen: file explorer with type icons and the keyboard shortcut cheat sheet
Colophon — Get the editor

Open a project,
start writing.

Download e, point it at your code, and get a native editor with an agent panel built in. Free and open source.

e · v0.9.12 Built in Norway · MMXXVI