Skip to content

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