Programmable Text Editor
Built in Odin. Extended in Racket.
A batteries-included editor: Git, Org, file management, projects and workspaces, language support, a personal knowledge base, agents and MCP. Extend any of it in Racket.
01
Architecture
Odin owns the text and the editor's state. Racket, embedded in the same process, defines how you work with them.
- Odin
- Text, buffers, views, edit history, rendering and system resources.
- Racket
- Commands, keymaps, themes and configuration, including your own.
- Interface
- The core does not depend on the interface. Odra runs in a terminal today.
02
What's included
- Editing
- Edit UTF-8 files with the default Direct profile or the optional Modal profile. Select and transfer text, undo or redo changes, configure indentation, and recover unsaved work.
- Buffers and terminals
- Arrange files and integrated terminals in split panes. Each view keeps its own cursor and scroll position. Hide a terminal without stopping its shell.
- Search
- Search and replace with plain text or regular expressions, search across a project, and move through results or symbols.
- Files and projects
- Browse local or remote files in a tree or editable directory listing, and create, rename, move, copy, or remove them without leaving the editor.
- Version control
- Use Ksawery to inspect Git status and history, stage files or diff hunks, create commits, work with branches and conflicts, and follow repository operations. Manage repository changes
- Structured documents
- Jan is Odra's module for Org documents: outlines, tables, tasks, agendas, capture, source blocks, computation, and export. Files ending in .org or .jan use the same Org syntax. Work with Jan
- Linked knowledge
- Install the optional Roman package to connect personal notes with stable links, references, relations, daily notes, and graph inspection. Your Org documents remain the source of truth. Build a linked knowledge base
- Language support
- The basic pack supports Org documents through Jan, plus Odin, Racket, Go, Rust, TypeScript, JavaScript, HTML, and CSS. Local syntax works independently of language servers; configured servers provide completion, diagnostics, navigation, and formatting.
- Programming
- Write personal commands in Racket, discover them through M-x, bind them to keys, and reload them during a session. Compose keymaps and themes, and extend the status bar or gutter. Create personal tools
- Packages and agents
- Install packages from official or independent catalogs, choose their permissions, and enable, update, or roll them back. Run installed agents, inspect their activity, and cancel tasks from the editor. Use packages and catalogs