Architecture Decision Records¶
Every architecturally significant decision made on this project, in the order it was made — see ADR 0001 for why this project keeps these at all. This is the project's history, told through the reasoning behind each choice rather than a changelog of what changed.
| # | Decision |
|---|---|
| 0001 | Record architecture decisions with ADRs |
| 0002 | Core engine builds and runs headless |
| 0003 | License is deliberately undecided |
| 0004 | Core engine is plain C, not C++ |
| 0005 | Buffer engine is a piece table, not a rope |
| 0006 | Phase 2 GUI shell — deliberate v1 shortcuts |
| 0007 | Syntax highlighting via Tree-sitter, monochrome by design |
| 0008 | Config/theme format is a minimal hand-rolled key=value format, not TOML |
| 0009 | Plugin ABI + Lua host, unified under one command registry |
| 0010 | Hand-rolled JSON, not a vendored library |
| 0011 | LSP client — process isolation, sync handshake, async everything else |
| 0012 | Phase 7 polish — scope and an accessibility fix |
| 0013 | Fix caret drift — measure rendered text, don't assume a fixed pitch |
| 0014 | Viewport geometry — horizontal scroll, view-follow, line numbers |
| 0015 | Smooth motion — caret glide and smooth scroll |
| 0016 | Fix invisible caret; blink resets on activity, not on a fixed cycle |
| 0017 | Viewport review pass — four fixes from live use |
| 0018 | Undo/redo — diff-based groups on top of the buffer's own primitives |
| 0019 | Selection model — a per-cursor anchor, not a separate range type |
| 0020 | Clipboard — cut/copy/paste on top of the selection model |
| 0021 | Find & replace — a keyboard-only bar, matches as selections |
| 0022 | A unified floating-panel design system for editor chrome |
| 0023 | Editor chrome — status bar, dirty tracking, and a custom Open/Save-As panel |
| 0024 | Panel animation rework, file-browser search/highlight, scroll margin, status bar theme |
| 0025 | Command line + :compile + output panel |
| 0026 | Keybinding scheme fix, Help/About panels, find bar repositioned |
| 0027 | Logo, title-color bug, thin scrollbars, faster animation, output divider |
| 0028 | Click precision fix, deletion glide, select-all, About centering, synced input blink |
| 0029 | LSP diagnostics wiring (Phase 16) |
| 0030 | LSP completion + hover (Phase 17) |
| 0031 | Draggable panels, smooth scroll, tracking-popup glide, Tab |
| 0032 | Fix LSP URI construction for relative paths |
| 0033 | License chosen (Apache 2.0) — first alpha release |
| 0034 | Linux packaging (AppImage, Arch PKGBUILD, .deb) |
| 0035 | MkDocs documentation site |
| 0036 | Docs site branding (logo, editor colors) and a Plugins page |
| 0037 | A feedback triage log, alongside ADRs |
| 0038 | Feedback triage criteria, and a "Deferred" status |
| 0039 | Fix mouse click/hover drift on styled lines |
| 0040 | Fix italic glyphs clipped at the top |
| 0041 | Diagnostic underline redesign — thin line, dim/focus states |
| 0042 | Empty-buffer welcome overlay |
| 0043 | Faster global easing; welcome overlay two-column layout |
| 0044 | Panel isolation, full drag bar, unsaved-quit confirmation |
| 0045 | v0.2.0-alpha, and packaging finally built on pinned old bases |
| 0046 | Native Vim mode, Phase 1 |
| 0047 | A real block cursor for Vim Normal mode |
| 0048 | Syntax accent colors, caret inset, smaller default font, immediate status label |
| 0049 | A typing pop-in animation |
| 0050 | Runtime font-size zoom, and Vim mode on by default |
| 0051 | Global animation consistency, and three Vim-mode polish fixes |
| 0052 | Splitting EditorViewport across several translation units |
| 0053 | Fixing the render hot path, and one motion language |
| 0054 | Multiple buffers, and finally wiring the plugin host in |
| 0055 | The dot means unsaved, plus new-file and panel fixes |
| 0056 | Linewise Visual, tab motion, and a searchable shortcut reference |
| 0057 | An always-present tab strip, and a welcome screen worth reading |
| 0058 | The greeting belongs to the session; panel carets join the app |
| 0059 | Dirtiness derived from undo state; vim paste cursor; { } Ctrl+U Ctrl+D |
| 0060 | Linewise operations at the end of the buffer (dd on the last line) |
| 0061 | The unnamed register — dd+p works, and x stops eating your clipboard |
| 0062 | The status bar message line — the editor can finally say things |
| 0063 | Language-server state in the status bar |
| 0064 | The GUI in CI, and a test suite that actually runs in Release |
| 0065 | Quick open (Ctrl+P) — fuzzy file finding across the project |
| 0066 | Project-wide search (Ctrl+Shift+F) |
| 0067 | Go to definition (gd / F12) |
| 0068 | Freeing Ctrl+O/Ctrl+I: help to F1, About/Open to Alt |
| 0069 | Vim's f/t find-in-line, and Ctrl+J/Ctrl+K in every list |
| 0070 | The jumplist (Ctrl+O / Ctrl+I) |
| 0071 | The block cursor's knockout follows its block |
| 0072 | Incremental highlighting, and a measured hot path |
| 0073 | The command line moves to the status bar |
| 0074 | / search, and a needle that outlives its panel |
| 0075 | Repeating the last change (.) |
| 0076 | Replacing a character (r) |
| 0077 | Replace mode (R) |
| 0078 | Visual-mode r, and a selection that is off by one |
| 0079 | The visual selection includes the character under the cursor |
| 0080 | One undo step per insert session |
| 0081 | cw changes to the end of the word |
| 0082 | A bare modifier must not clear a pending count |
| 0083 | The shorthand operators (s, S, C, D, X) |
| 0084 | %, */#, and where a search lands |
| 0085 | A second grammar for C++ |
| 0086 | One language gate, and per-language config keys |
| 0087 | A project file says what files mean, never what to run |
| 0088 | Config keys document themselves |
| 0089 | :q closes a buffer, and closing stopped sleeping |
| 0090 | Scrolling runs at frame rate |
| 0091 | The animation clock follows the display |
| 0092 | A discarded server is not waited for |
| 0093 | The initialize handshake is not awaited |
| 0094 | What startup actually costs |
| 0095 | The performance baseline |
| 0096 | One server per language and project, not per buffer |
| 0097 | Marks and macros |
| 0098 | Global marks reuse the jumplist’s entry |
| 0099 | Four vim rules the editor was missing |
| 0100 | Text objects |
| 0101 | J joins lines |
| 0102 | :s, and the regex dialect it speaks |
| 0103 | The mainstream languages |
| 0104 | The vim conformance suite |
| 0105 | Named registers, and a test that was lying |
| 0106 | WORDs, case, indent and numbers |
| 0107 | The large-file wall |
| 0108 | The half-typed command |
| 0109 | Saving without losing the file |
| 0110 | Unsaved work survives a crash |
| 0111 | Session restore |
| 0112 | Git gutter marks |
| 0113 | Keybindings as data |
| 0114 | Built-in themes |
| 0115 | One path for a colour change |
| 0116 | Find references and document symbols |
| 0117 | The seam is the grip |
| 0118 | Closing and reaching the panel |
| 0119 | A command belongs to its buffer |
| 0120 | A law for the keyboard |
| 0121 | Saying where the keyboard is |
| 0122 | The cursor on the line it selected |
| 0123 | A range that ends where a line begins |
| 0124 | The debounce that never happened |
| 0125 | A keystroke should not allocate to ask a question |
| 0126 | The docs read the tables |
| 0127 | The buffer with nothing to fall back on |
| 0128 | One name, one command |
| 0129 | A release that builds itself |
| 0130 | The CI nobody was reading |
| 0131 | Replacing across files |
| 0132 | Renaming a symbol |
| 0133 | A theme you can share as a file |
| 0134 | Vim keys you can move |
| 0135 | The parse moves off the UI thread |
| 0136 | A new line starts where the last one did |
| 0137 | A count before an insert |
| 0138 | Two paper cuts |
| 0139 | The column a caret is aiming for |
| 0140 | The styles a capture can have |
| 0141 | What a plugin is handed |
| 0142 | Four things a plugin can react to |