Version 2.2 — forms and apps that run anywhere

Notes that can compute.

EEditor is a Markdown editor with a Lisp interpreter, an SQLite database and a Lotus Agenda-style organizer built in. Your notes stay plain files in a folder you choose. Nothing is uploaded, and there is no account to make.

Free and open source (MIT) · macOS, Windows and Linux · an iPhone and iPad build is in testing.

Try it now — nothing to install

These are apps built in EEditor and exported as a single HTML file each: the forms, their code, and the EELisp engine itself, compiled to WebAssembly. They run here, in your browser, and keep what you type in it — nothing is sent anywhere. Every one you build can be shared the same way.

Play

A form can have a screen: a picture the program draws, frame after frame, with the keys held and sound. These three are games and machines written in EELisp — and the last is a whole MSX computer.

How they're made: one file that runs anywhere · download their source and open it in EEditor.

A rewrite, not a re-skin

EEditor started as a Mac-only app in Swift. Version 2 is a ground-up rebuild: the language and database core moved into EELisp, a standalone Rust engine, and the app around it is TypeScript on CodeMirror 6 in a Tauri shell. One engine, one editor, five platforms — and the parts you can script are now the same everywhere.

What's inside

✎

A real editor

CodeMirror 6 with Markdown highlighting, live preview, light and dark themes, multiple tabs and autosave. Export any note to PDF.

⌘

Find anything

Fuzzy quick-open on ⌘P — and every action by name on ⌘⇧P, each with its key — full-text search across the workspace on ⌘⇧F, and a #hashtag index: nested tags, each tag's notes, and a block of links to them in any note.

↔

Linked notes

[[Wiki links]] with autocomplete as you type, click-through in preview or ⌘-click in the editor, and a backlinks bar showing what points here.

◷

An organizer, not a to-do list

Items with dates, priorities and notes; hierarchical categories, counted in the sidebar; recurrence; a calendar you can drag things around in; a kanban board of your categories; and rules that file new items for you. Tasks typed in a note are agenda items, and any list can live in a note, kept fresh with a key. How the agenda works →

λ

A language in the box

The EELisp REPL sits under the editor. Query the database, script your notes, or run a selection or a ```eelisp block straight from a document with ⌘⇧↵.

▦

Sheets whose formulas are a language

A spreadsheet in a tab, each sheet a file. The formulas you know are there — =(countif E:E "Work"), sumif, vlookup, median — and so is the whole of EELisp, plus any function you write yourself. How sheets work →

▤

Forms you draw, tables you keep

A form designer in the Visual Basic tradition: drop buttons, boxes and grids on a canvas, attach EELisp to their events, run it over your tables — in a tab, in a window beside your notes, or in the sidebar. Grids, tabs, a kanban board, a live sheet — even a two-panel file manager, keys and all. And browse still renders a real table.

Export one as a single HTML file that runs in any browser, offline — try the Office app right now, or download the examples →

The part nobody else has

Your keybindings are a program

There is no shortcuts preference pane. There is a file — .eeditor/keybindings.eelisp in your workspace — and that file is the shortcut table. Open it with ⌘⇧K, save it with ⌘S, and it reloads immediately. Delete it and the defaults come back.

A binding's body is EELisp, evaluated when the key fires. It hands back editor commands as data, so a shortcut can compute what it inserts:

;; ⌘I — the date and time, right where the caret is
(bind "Mod-i" (ed-insert (str *date* " " *time*)))

;; ⌘⇧I — a new note stamped with the minute, and a heading to match
(bind "Mod-Shift-i"
  (ed-new (str *date* " " (str-replace *time* ":" "") ".md")
          (str "# " *date* " " *time* "\n\n")))

;; ⌘⇧T — a task line at the caret
(bind "Mod-Shift-t" (ed-insert "- [ ] "))

;; What opens when EEditor launches — a note, today's note, or nothing at all
(on-start (ed-cmd "daily-note"))

The caret, the selection, the whole buffer, the date and the time are all bound as variables before your code runs. Anything the standard library defines is callable too. The same file lays out the buttons above the editor, and puts forms of your own in the sidebar — (panel "agenda" "my-agenda.eeform"). The full binding reference is in the manual.

Files you can still read in ten years

A workspace is a folder. Notes are Markdown files in it. Move them, back them up with git, open them in any other editor — EEditor holds no lock on your work and keeps no proprietary index you'd lose.

Files from outside the workspace open too: drag one onto the window, or use Open With from your file manager. EEditor asks once whether to copy it in or edit it where it lies, and in-place notes save straight back to the original.

On iPhone and iPad, the workspace is exposed in the Files app under On My iPhone → EEditor, so the same notes sync however you already sync files.

Get EEditor

Free, no account, nothing to sign up for.

Download