{"id":51156897,"url":"https://github.com/ooyeku/stem","last_synced_at":"2026-06-26T11:01:08.117Z","repository":{"id":360086537,"uuid":"1248561826","full_name":"ooyeku/stem","owner":"ooyeku","description":"A modal text editor for the terminal. Built in Zig, with tree-sitter syntax highlighting and built-in LSP integration for 20+ languages.","archived":false,"fork":false,"pushed_at":"2026-05-25T00:27:41.000Z","size":4550,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-25T00:29:13.349Z","etag":null,"topics":["lsp","text-editor","vim","zig"],"latest_commit_sha":null,"homepage":"","language":"Zig","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ooyeku.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-24T20:00:58.000Z","updated_at":"2026-05-25T00:27:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ooyeku/stem","commit_stats":null,"previous_names":["ooyeku/stem"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ooyeku/stem","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ooyeku%2Fstem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ooyeku%2Fstem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ooyeku%2Fstem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ooyeku%2Fstem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ooyeku","download_url":"https://codeload.github.com/ooyeku/stem/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ooyeku%2Fstem/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34813782,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["lsp","text-editor","vim","zig"],"created_at":"2026-06-26T11:01:07.603Z","updated_at":"2026-06-26T11:01:08.110Z","avatar_url":"https://github.com/ooyeku.png","language":"Zig","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Stem\n \nA modal text editor for the terminal. Built in Zig, with tree-sitter\nsyntax highlighting and built-in LSP integration for 20+ languages.\n\nStem aims to keep modal editing approachable: Vim-style modes, a Space\nleader, and a discoverable command palette. ZLS is embedded so Zig\nworks with no setup; other language servers install on request via\n`stem lsp install`.\n\n![Zig](https://img.shields.io/badge/zig-0.16%2B-orange)\n![Platforms](https://img.shields.io/badge/platforms-macOS%20%7C%20Linux-green)\n![License](https://img.shields.io/badge/license-MIT-brightgreen)\n\n## Install\n\n\u003e Prebuilt binaries and one-line install scripts will land with the\n\u003e first tagged release. For now, build from source — `zig build` does\n\u003e everything end-to-end.\n\n### From source\n\nRequires **Zig 0.16+** and a C compiler. All other dependencies\n(tree-sitter, language grammars, ZLS) are fetched by `zig build`.\n\n```bash\ngit clone https://github.com/ooyeku/stem.git\ncd stem\nzig build run\n```\n\nTo build and install:\n\n**macOS / Linux** (bash, zsh, sh):\n\n```bash\n./install.sh                  # build ReleaseFast, install, refresh plugins\n./install.sh --prefix ~/.local\n```\n\n**Windows** (PowerShell 5.1+, no admin needed):\n\n```powershell\n.\\install.ps1                          # install into %LOCALAPPDATA%\\Programs\\stem\n.\\install.ps1 -Prefix C:\\tools\\stem    # custom prefix\n.\\install.ps1 -NoPath                  # skip the user-PATH update\n```\n\nIf PowerShell blocks the script with an execution-policy error,\nlaunch it as `powershell -ExecutionPolicy Bypass -File .\\install.ps1`.\n\nBoth installers compile from source (`zig build -Doptimize=ReleaseFast`),\ncopy the binary, install bundled wasm plugins to the system prefix and\nrefresh the per-user plugin dir at `~/.stem/plugins/`\n(`%USERPROFILE%\\.stem\\plugins\\` on Windows), and add the bin dir to PATH\nwhen it isn't already there.\n\n### Uninstall\n\n```bash\n./uninstall.sh             # remove the binary and bundled plugins\n./uninstall.sh --purge     # also remove ~/.stem (config, logs, LSP cache)\n```\n\n```powershell\n.\\uninstall.ps1            # remove binary, plugins, and PATH entry\n.\\uninstall.ps1 -Purge     # also remove %APPDATA%\\stem + %LOCALAPPDATA%\\stem\n```\n\n## Features\n\n- Modal editing — Select, Insert, Visual, View, and Terminal modes\n- Multi-buffer workflow with a tab bar\n- Horizontal and vertical split panes\n- Transactional undo/redo with cursor restoration\n- Multi-cursor editing (Sublime-style `Ctrl+D` add-next-occurrence)\n- Vim-style text objects (`w` `W` `p` `\"` `(` `[` `{` …) for select inside / around\n- Surround commands: wrap selection, change or delete a pair\n- Named bookmarks (`m\u003ca-z\u003e` set, `'\u003ca-z\u003e` jump) persisted per project\n- Incremental in-buffer search with `/` and `?`, smart-case, live match count\n- Project-wide search (`Space /`) with per-match replace confirmation\n- Fuzzy file picker, buffer picker, and command palette\n- Tree-sitter syntax highlighting for 29 languages\n- LSP integration for 23 external language servers plus embedded ZLS\n  for Zig (with optional format-on-save)\n- LSP code actions (`Space C`), range format (`Space F`), signature\n  help (auto-popup in Insert mode), and inlay hints (opt-in)\n- Inline diagnostics (\"error lens\") rendered at end-of-line\n- Word-under-cursor highlight after a short idle\n- Integrated terminal mode\n- Manifest-driven plugin system with wasm/exec runtimes, a Zig SDK,\n  bundled examples, and a plugin-manager dashboard\n- Auto-completion, hover docs, go-to-definition, references,\n  diagnostics, and document symbols (via LSP)\n- Jump to next/previous diagnostic (`]d`/`[d`), git hunk (`]g`/`[g`),\n  AST sibling (`]s`/`[s`), function (`]m`/`[m`)\n- Session restore with crash-recovery snapshots\n- Periodic auto-save backups of dirty buffers in `~/.stem/recover/`,\n  surfaced at startup if any survived a crash\n- Stem Control Center (`stem.control_center`) for runtime, Vigil,\n  project-index, LSP, job, plugin, and message-bus health in one view\n- Project Brain (`project.brain`) for workspace index state, open\n  languages, diagnostics pressure, and LSP coverage\n- Project Tasks (`task.list`) detects common build/test/run commands\n  from Zig, Rust, Go, Python, npm, and Make projects; `task.run_build`\n  and `task.run_test` execute the preferred detected tasks as retained\n  background jobs, with `task.run`, `task.run_dev`, `task.run_lint`,\n  and `task.run_format` for matching project scripts\n- **Large-file mode**: files past 5 MB / 50k lines auto-degrade —\n  tree-sitter, brackets, LSP, and auto-pair disabled so a multi-MB\n  log stays responsive. `[LARGE]` badge in the status bar\n- Background workspace file index for instant `Find` queries\n- CLI search tools (`stem --find`, `--vfind`, `--scope`)\n\n### Language coverage\n\nSyntax highlighting works for:\nZig, Python, JavaScript, TypeScript, TSX, JSON, Bash, Go, HTML, CSS,\nRust, C, C++, Java, Ruby, C#, PHP, Swift, Kotlin, Lua, Dart, Elixir,\nHaskell, OCaml, Scala, R, Perl, Erlang, Markdown.\n\nLanguage servers installable via `stem lsp install \u003cname\u003e`:\n\n| Language | Server | External requirement |\n|---|---|---|\n| Zig | ZLS (embedded) | — |\n| Python | Pyright | Node |\n| JavaScript / TypeScript | typescript-language-server | Node |\n| Go | gopls | Go |\n| Rust | rust-analyzer | — |\n| C / C++ | clangd | LLVM / Xcode CLT |\n| Ruby | ruby-lsp | Ruby + gem |\n| C# | OmniSharp | — |\n| Java | jdtls | Java runtime |\n| Bash | bash-language-server | Node |\n| Lua | lua-language-server | — |\n| Swift | sourcekit-lsp | Swift toolchain |\n| R | languageserver | R |\n| CSS / HTML / JSON | vscode-langservers-extracted | Node |\n| PHP | intelephense | Node |\n| Perl | perlnavigator | Node |\n| Dart | dart language-server | Dart SDK |\n| Elixir | elixir-ls | install via brew or releases |\n| Erlang | erlang_ls | rebar3 |\n| Haskell | haskell-language-server | ghcup |\n| Kotlin | kotlin-language-server | brew or releases |\n| OCaml | ocaml-lsp-server | opam |\n| Scala | metals | coursier |\n\n`stem lsp install all` walks the list and installs every server whose\nprerequisites are available.\n\n## Usage\n\n```bash\nstem                       # empty buffer\nstem myfile.zig            # open a file\nstem file1.zig file2.zig   # open multiple files\nstem ./src                 # open a directory\n\n# CLI search tools\nstem --find \"pattern\"      # grep-like text search\nstem --vfind \"pattern\"     # interactive visual search\nstem --scope file.zig fn   # search within a specific file\n\n# Project/operator tools\nstem task list             # detected build/test/run/dev/lint/format tasks\nstem task run test         # run the preferred detected test task\nstem project inspect       # root, tasks, and cache location\nstem project warm          # pre-build the persistent search index\nstem logs tail             # latest log tail\nstem logs bundle           # write a local debug bundle\nstem lsp doctor python     # explain one language server's install state\nstem recover list          # session and dirty-buffer recovery artefacts\nstem cache status          # cache/plugin/LSP storage sizes\n\nstem --help                # all options\nstem --version             # version info\n```\n\n## Key bindings\n\nStem leans on a Space leader and a discoverable command palette\n(`Space f`) for most actions. The bindings below cover everyday\nediting; everything else is reachable through the palette.\n\nPress `Space ;` (or `Space ?`) at any time to pop up the which-key\nreference — it shows every available follow-up key. While in a\nchord like `Space l` the popup shows that chord's sub-bindings.\n\n### Modes\n\n| Key | Action |\n|-----|--------|\n| `i` | Enter Insert mode |\n| `v` | Enter Visual mode (selection from cursor) |\n| `V` | Visual-select the syntax node under the cursor |\n| `t` | Enter Terminal mode |\n| `Esc` | Return to Select mode |\n\n### Navigation (Select / Visual)\n\n| Key | Action |\n|-----|--------|\n| `h` `j` `k` `l` | Move left/down/up/right |\n| Arrow keys | Move left/down/up/right |\n| `w` `b` `e` | Next / previous / end of word |\n| `W` `B` | Next / previous WORD (whitespace-separated) |\n| `{` `}` | Previous / next paragraph |\n| `Home` / `End` | Start / end of line |\n| `PageUp` / `PageDown` | Scroll one page |\n| `%` | Jump to matching bracket |\n| `[N] motion` | Repeat motion N times (`5j`, `3w`) |\n| `[` / `]` | Previous / next buffer (Cmd+Shift on macOS) |\n| `]d` / `[d` | Next / previous diagnostic |\n| `]g` / `[g` | Next / previous git hunk |\n| `]s` / `[s` | Next / previous AST sibling |\n| `]m` / `[m` | Next / previous function-like node |\n\n### Search (Select / Visual)\n\n| Key | Action |\n|-----|--------|\n| `/` | Incremental forward search with live preview + `[i/N]` count |\n| `?` | Incremental backward search |\n| `n` / `N` | Next / previous match after closing the prompt |\n| `Esc` | Cancel search; cursor returns to its starting position |\n\nSearch uses smart case: any uppercase character in the query makes\nthe search case-sensitive; otherwise it's case-insensitive.\n\n### Bookmarks\n\n| Key | Action |\n|-----|--------|\n| `m\u003ca-z\u003e` | Set bookmark `\u003cx\u003e` at the cursor |\n| `'\u003ca-z\u003e` | Jump to bookmark `\u003cx\u003e` (works across files) |\n\nBookmarks persist per project under `~/.stem/cache/bookmarks/`.\nThe `bookmark.list` command opens a `[Bookmarks]` overview;\n`bookmark.clear_all` removes them.\n\n### Text objects (Select / Visual)\n\nIn **select mode**:\n- `s i \u003cc\u003e` — select INSIDE `\u003cc\u003e`\n- `s a \u003cc\u003e` — select AROUND `\u003cc\u003e`\n\nIn **visual mode**, drop the `s` prefix: `i \u003cc\u003e` / `a \u003cc\u003e`.\n\n`\u003cc\u003e` is one of: `w` word, `W` WORD, `p` paragraph, `\"` `'` `` ` ``\nstring literals, `(` `[` `{` `\u003c` matching pairs (use either bracket).\n\n### Surround\n\n| Chord | Action |\n|-------|--------|\n| `S \u003cc\u003e` (visual) | Wrap the active selection with `\u003cc\u003e` |\n| `s d \u003cc\u003e` (select) | Delete the surround pair `\u003cc\u003e` enclosing the cursor |\n| `s r \u003cold\u003e \u003cnew\u003e` (select) | Replace surround `\u003cold\u003e` with `\u003cnew\u003e` |\n\n### Multi-cursor\n\n| Key | Action |\n|-----|--------|\n| `Ctrl+D` | Add the next occurrence of the word / selection as a secondary cursor |\n| `Esc` (select mode) | Clear all secondary cursors |\n\nTyping and backspace replicate at every cursor. Newlines and\nline-altering operations collapse back to the primary cursor.\n\n### Save / open / quit\n\nOn macOS use `Cmd`, on Linux/Windows use `Ctrl`:\n\n| Key | Action |\n|-----|--------|\n| `Cmd/Ctrl+S` | Save current buffer |\n| `Cmd/Ctrl+O` | Open file picker |\n| `Cmd/Ctrl+W` | Close active buffer |\n| `Cmd/Ctrl+Q` | Quit |\n\n### Space leader — top level\n\nThe highest-frequency actions live as a single key after Space.\n\n| Key | Action |\n|-----|--------|\n| `Space e` | Open file (tree-shaped explorer — also `Cmd/Ctrl+O`) |\n| `Space b` | Buffer picker |\n| `Space s` | Save |\n| `Space q` | Quit |\n| `Space k` | Close current pane / buffer |\n| `Space n` / `Space p` | Next / previous buffer |\n| `Space [1-9]` | Quick switch to buffer N |\n| `Space f` | Command palette (find any command) — `Space :` alias works on terminals that handle Shift+; cleanly |\n| `Space /` | Project-wide search \u0026 replace |\n| `Space ,` / `Space .` | Jump back / forward |\n| `Space z` | Center cursor in viewport |\n| `Space u` / `Space r` | Undo / redo |\n| `Space c` / `Space x` / `Space v` | Copy / cut / paste |\n| `Space a` | Code actions (LSP) |\n| `Space -` / `Space \\|` | Horizontal / vertical split |\n| `Space ←/→/↑/↓` | Focus split pane in that direction |\n| `Space h` | Help view |\n| `Space j` | Background jobs list |\n| `Space ;` / `Space ?` | Toggle which-key popup |\n| `Space Esc` | Cancel the leader |\n\n### Space leader — chord groups\n\nRelated families live under a chord prefix. Tap `Space ;` inside\nany chord to see the contents on screen.\n\n#### `Space l` — LSP\n\n| Key | Action |\n|-----|--------|\n| `Space l d` | Go to definition |\n| `Space l r` | Find references |\n| `Space l h` | Hover (docs) |\n| `Space l a` | Code actions (alias for `Space a`) |\n| `Space l f` | Format buffer |\n| `Space l F` | Format selection |\n| `Space l D` | Diagnostics list |\n| `Space l s` | Document symbols |\n| `Space l S` | Workspace symbols |\n| `Space l t` | Toggle inline diagnostics |\n| `Space l i` | Toggle inlay hints |\n| `Space l =` | Toggle format-on-save |\n\nSignature help auto-pops above the cursor in Insert mode when you\ntype `(` or `,`. Dismissed by `)`, Esc, or mode change.\n\n#### `Space g` — Git\n\n| Key | Action |\n|-----|--------|\n| `Space g d` | Git diff (via bundled git plugin) |\n\n#### `Space w` — Window / splits\n\n| Key | Action |\n|-----|--------|\n| `Space w -` | Horizontal split |\n| `Space w \\|` | Vertical split |\n| `Space w h/j/k/l` | Focus pane left / down / up / right |\n| `Space w q` | Close pane |\n\n#### `Space t` — Toggle\n\n| Key | Action |\n|-----|--------|\n| `Space t d` | Toggle inline diagnostics |\n| `Space t i` | Toggle inlay hints |\n| `Space t =` | Toggle format-on-save |\n\n### File explorer (`Space e` — also `Cmd/Ctrl+O`)\n\nThe single entry point for opening files. Modal, tree-shaped\noverlay rooted at the project root.\n\n| Key | Action |\n|-----|--------|\n| `↑/↓` or `j/k` | Move selection |\n| `→` / `l` | Expand directory |\n| `←` / `h` | Collapse directory (or jump to parent) |\n| `g` / `G` | Top / bottom of list |\n| `Enter` / `Space` | Open file (or toggle directory) |\n| `H` | Toggle hidden files |\n| `Ctrl+r` | Rebuild tree |\n| `Esc` | Close explorer |\n\n### Project-wide search \u0026 replace\n\n`Space /` opens the global search panel. Type into the query field;\nresults populate live across the workspace.\n\n| Key | Action |\n|-----|--------|\n| `Tab` | Toggle focus between query and replace fields |\n| `Enter` | Open the highlighted match |\n| `↑` / `↓` | Walk through matches |\n| `Ctrl+R` | Start replace-with-confirmation walk |\n\nInside the replace walk:\n\n| Key | Action |\n|-----|--------|\n| `y` | Apply replacement at this match, advance |\n| `n` | Skip this match, advance |\n| `A` | Apply this match and every remaining match silently |\n| `q` / `Esc` | Cancel; summary shown in the status bar |\n\nReplacements happen in open buffers (not directly on disk), so you can\nundo per-file with `Space u` and only commit by saving.\n\n### Split navigation\n\n| Key | Action |\n|-----|--------|\n| `Ctrl+h` / `Ctrl+l` | Focus split left / right |\n| `Ctrl+j` / `Ctrl+k` | Focus split down / up |\n\n## Configuration\n\nConfiguration lives in `~/.stem/`:\n\n```\n~/.stem/\n├── config.json     # User settings\n├── plugins/        # Installed plugins (seeded from bundled on first run)\n├── lsp/            # Language servers installed via `stem lsp install`\n├── cache/          # Background workspace index, etc.\n└── logs/           # Debug logs (stem-*.log)\n```\n\nManage settings from the CLI:\n\n```bash\nstem config list\nstem config get editor.tab_size\nstem config set editor.tab_size 2\nstem config reset editor.tab_size\nstem config reset --all\n```\n\nOr edit `~/.stem/config.json` directly:\n\n```json\n{\n  \"editor\": {\n    \"tab_size\": 4,\n    \"insert_spaces\": true,\n    \"line_numbers\": \"relative\",\n    \"wrap\": false,\n    \"cursor_line\": true,\n    \"auto_pairs\": true,\n    \"format_on_save\": false,\n    \"inline_diagnostics\": true,\n    \"inlay_hints\": false,\n    \"auto_save_backup\": true,\n    \"auto_save_interval_seconds\": 30,\n    \"large_file_threshold_bytes\": 5242880,\n    \"large_file_threshold_lines\": 50000,\n    \"large_file_hard_limit_bytes\": 104857600\n  },\n  \"ui\": {\n    \"show_status_bar\": true\n  },\n  \"logging\": {\n    \"level\": \"info\"\n  }\n}\n```\n\nRuntime toggles (via the command palette `Space a`, or `stem config set ...`):\n\n| Setting | Command palette | Effect |\n|---------|-----------------|--------|\n| `editor.format_on_save` | `lsp.toggle_format_on_save` | Run LSP formatter before each save |\n| `editor.inline_diagnostics` | `editor.toggle_inline_diagnostics` | \"Error lens\" — diagnostic message after every affected line, not just the cursor's |\n| `editor.inlay_hints` | `editor.toggle_inlay_hints` | LSP type / param-name hints rendered as dim virtual text |\n\n### Runtime cockpit\n\nThe command palette includes `stem.control_center`, a single live\ncockpit for Stem's runtime health: Vigil-backed services, message-bus\npressure, open buffers, project index freshness, LSP state, diagnostics,\nbackground jobs, plugins, terminal status, and recommended next actions.\n\nUse `project.brain` when you want a tighter project view: workspace\nroot, index state, open languages, diagnostics pressure, and per-LSP\ncoverage. Use `task.list` to see detected project commands from\n`build.zig`, `Cargo.toml`, `go.mod`, Python project markers,\n`package.json` scripts, and common Make targets. Use `task.run_build`\nor `task.run_test` to execute the preferred detected task under Stem's\nbackground job manager; `task.run`, `task.run_dev`, `task.run_lint`,\nand `task.run_format` cover run/start, dev, lint, and format tasks. Use\n`task.output` to reopen the latest retained stdout/stderr report.\nThe same detector is available from the shell with `stem task list`,\n`stem task run \u003cid|kind\u003e`, and `stem task doctor`.\n\n### Large-file mode\n\nWhen a buffer exceeds `large_file_threshold_bytes` (default 5 MB)\nor `large_file_threshold_lines` (default 50 000), Stem opens it in\n**large-file mode**: tree-sitter syntax highlighting, bracket\nrainbow, LSP requests, and bracket auto-pair are disabled for\nthat buffer. The status bar shows a yellow `[LARGE]` badge so the\nquiet behaviour isn't mysterious. Files past\n`large_file_hard_limit_bytes` (default 100 MB) are rejected at\nopen time. All three thresholds are per-buffer at open and sticky\nfor the buffer's life — re-open after `stem config set ...` to\nre-classify.\n\n### Auto-save backups\n\nWhile stem is running, every `auto_save_interval_seconds` (default\n30 s) it writes a snapshot of every dirty buffer to\n`~/.stem/recover/\u003chash\u003e.bak` with a `.path` sidecar recording the\noriginal filename. On the next startup, if any backups survived,\nthe status bar prompts you to run `buffer.restore_backups` to\nview them. From a shell, `stem recover list` shows the same artefacts\nand `stem recover restore \u003cid\u003e` copies a snapshot back to its recorded\npath. Disable with `stem config set editor.auto_save_backup false`.\n\n## Platform support\n\n| Platform | Status | Notes |\n|----------|--------|-------|\n| macOS (ARM64) | Supported | Primary development target |\n| macOS (x86_64) | Supported | |\n| Linux (x86_64) | Supported | |\n| Linux (ARM64) | Supported | |\n| Windows | Experimental | No integrated terminal |\n\n## Building from source\n\n```bash\nzig build                                  # Debug\nzig build run                              # Debug + run\nzig build -Doptimize=ReleaseFast           # Release\nzig build test                             # Tests\nzig build -Dtarget=x86_64-linux-gnu -Doptimize=ReleaseFast\nzig build -Dtarget=x86_64-windows -Doptimize=ReleaseFast    # experimental\n```\n\n| Option | Description |\n|--------|-------------|\n| `-Doptimize=ReleaseFast` | Optimised build |\n| `-Doptimize=ReleaseSafe` | Optimised with safety checks |\n| `-Doptimize=ReleaseSmall` | Optimised for size |\n\n## Architecture\n\n```\nsrc/\n├── main.zig           # Entry point and CLI handling\n├── cli.zig            # Subcommand dispatch (config, logs, lsp, plugin)\n├── kernel/            # Event loop, buffer manager, sessions, commands\n├── core/              # Piece-table buffer, editor state, file I/O\n├── ui/                # Terminal rendering (vaxis), pickers, themes\n├── syntax/            # Tree-sitter integration and language queries\n├── services/          # LSP, logging, terminal, global search\n├── lsp/               # LSP protocol client and transport\n├── plugins/           # Manifest, wasm interpreter, exec runtime\n├── config/            # Config schema, keys, persistent storage\n├── tools/             # CLI tools (find, vfind, scope, plugin, operator commands)\n└── fuzz/              # Fuzz targets (piece table, state, URIs)\n```\n\n### Dependencies\n\nAll Zig dependencies are pinned in [build.zig.zon](build.zig.zon):\n\n- [libvaxis](https://github.com/rockorager/libvaxis) — terminal UI\n- [vigil](https://github.com/ooyeku/vigil) — actor-style message passing\n- [zls](https://github.com/zigtools/zls) — embedded Zig LSP\n- [lsp-kit](https://github.com/zigtools/lsp-kit) — LSP protocol types\n- [uucode](https://github.com/jacobsandlund/uucode) — Unicode tables\n- [tree-sitter](https://github.com/tree-sitter/tree-sitter) plus\n  per-language grammars\n\n## Plugins\n\nBundled plugins are installed into `~/.stem/plugins/\u003cname\u003e/` with a\n`plugin.json` manifest. Both wasm modules and child-process exec\nplugins are supported.\n\n| Plugin | Runtime | Description |\n|--------|---------|-------------|\n| `echo` | wasm | Reference plugin: a single command that pops a notification |\n| `git` | wasm | Status / diff / staged-diff plus a live branch indicator |\n| `plugin_manager` | wasm | SDK-backed dashboard, raw JSON, permissions, storage health, and reload commands |\n| `sdk_demo` | wasm | SDK example covering commands, events, status items, panels, active-buffer reads, dashboard data, and plugin storage |\n\nSee [docs/plugins.md](docs/plugins.md) for the full author guide\nand host internals, including the SDK at\n[bundled/plugins/sdk/stem.zig](bundled/plugins/sdk/stem.zig).\n\n## Troubleshooting\n\n**An LSP isn't working for a language.** Run\n`stem lsp install \u003clanguage\u003e` and check `stem logs`. Bump verbosity\nwith `stem config set logging.level debug`.\n\n**Colours look wrong.** Make sure your terminal advertises 24-bit\ncolour: `export COLORTERM=truecolor`.\n\n**`./install.sh` says \"no write access to /usr/local\".** Either\nre-run with `--prefix $HOME/.local` (no sudo needed), or grant sudo\naccess.\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make sure `zig build` and `zig build test` pass\n4. Cross-check at least one other target:\n   `zig build -Dtarget=x86_64-linux-gnu`\n5. Open a pull request\n\n## Documentation\n\n- [Plugins](docs/plugins.md) — author guide + host internals\n- [stem.md](docs/stem.md) — long-form reference\n\n## License\n\n[MIT License](LICENSE)\n\n## Acknowledgments\n\n- Modal-editing ideas from [Vim](https://www.vim.org/),\n  [Kakoune](https://kakoune.org/), and [Helix](https://helix-editor.com/)\n- Built with [Zig](https://ziglang.org/)\n- Syntax highlighting powered by\n  [tree-sitter](https://tree-sitter.github.io/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fooyeku%2Fstem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fooyeku%2Fstem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fooyeku%2Fstem/lists"}