Sno Station
Sno Station is your agents' workstation: open-source software that turns the AI agents you already run into one squad on your own machine. Two heads are better than one, and they get better with every
Source Insight-style code navigation for large C codebases, in VS Code. No build, no compile_commands.json.
PluginsRust · PythonGitHub @humphrey0925OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Fast, accurate C/C++ code navigation for VS Code: call graph, callers/callees through macros and function pointers, symbol search, #if-aware indexing without a build or compile_commands.json. Indexes the Linux kernel in about a minute. Also a CLI and language server.
Taken from the repository README
Loading the full README.
Read the full README ↗Language servers built on a compiler, such as clangd, need to know exactly how
every file is compiled. A great deal of real C cannot tell them: firmware built
with a proprietary toolchain, SDKs with a header per chip, vendor trees that only
build on one machine, code too large or too old to have a working compilation
database. Text indexers such as ctags and cscope work anywhere, but they find
names, not calls, and they cannot tell which #if branch is compiled.
Norn reads the sources the way a person would, and the build's own description where there is one:
compile_commands.json files and works out which #if branches are compiled.| Norn | clangd | ctags / cscope / GNU Global | |
|---|---|---|---|
| Works without a compilation database | ✅ | ⚠️ less accurate | ✅ |
Knows which #if branches the build compiles | ✅ | ✅ with a database | ❌ |
| Call graph (callers and callees) | ✅ | ✅ | ⚠️ cscope, by name |
| Calls through function pointers | ✅ | ❌ | ❌ |
| Calls generated by macros | ✅ | ✅ with a database | ❌ |
| Index updated as you save | ✅ | ✅ | ❌ re-run |
| Source Insight-style views (Relation, Context) | ✅ | ❌ | ❌ |
Measured on public projects against clang's own view of a real build of each.
Each tool's cold index of the whole project is timed, and every call it reports
is checked against the call clang compiles. clangd is measured twice: given each
build's own compilation database (clangd at its best, the reference for an index
that is told exactly how every file is compiled) and given none, as a project
without a working compile_commands.json leaves it. Norn is given nothing. ctags, cscope and GNU Global
index fastest because they record names and places, not a call graph.
| Project | Language | Files | Norn | clangd + build database | clangd | codebase-memory-mcp | cscope | GNU Global | Universal Ctags |
|---|---|---|---|---|---|---|---|---|---|
| Redis | C | 801 | 100.0%0.33 s | 100.0%2.71 s | 95.8%15 s | 97.1%15 s | 96.9%0.28 s | n/a0.20 s | n/a0.18 s |
| git | C | 919 | 99.9%0.26 s | 99.9%2.42 s | 64.2%34 s | 85.9%12 s | 87.9%0.28 s | n/a0.21 s | n/a0.17 s |
| binutils | C | 1,622 | 99.6%2.56 s | 92.7%9.65 s | 32.3%22 s | 81.0%38 s | 70.6%1.40 s | n/a0.87 s | n/a1.03 s |
| STM32F4 HAL | C | 253 | 96.5%0.67 s | 95.0%2.82 s | 0.0%1.86 s | 85.8%10 s | 75.7%0.46 s | n/a0.72 s | n/a0.63 s |
| nrfx | C | 535 | 99.4%0.58 s | 100.0%1.12 s | 14.1%1.59 s | 94.2%8.65 s | 12.0%0.31 s | n/a0.41 s | n/a0.36 s |
| curl | C | 1,067 | 89.6%0.34 s | 100.0%1.12 s |
Each cell: the share of calls found (checked against clang), and below it the time to index.
clangd on binutils, STM32F4 HAL, nrfx, curl, Mbed TLS, FreeRTOS, lwIP, U-Boot, Linux, LevelDB, Bitcoin Core, Ninja, GoogleTest, Abseil, yaml-cpp, spdlog: given no include paths and no -D, as a project without a compilation database would, most of the code that needs the build's include paths or definitions does not parse for it. With a real build's database it does far better; that is not what is measured here.
How the numbers are made, every figure for every project, and the versions of
the tools: docs/benchmarks. Every number there is
produced by bench/compare.py; none is typed in. To measure it
again from nothing, on EC2 or any Ubuntu 24.04: bench/ec2.
Norn is a complete language server: Go to Definition, Find References, Call Hierarchy, signature help, rename, folding, formatting and quick fixes too. Alongside Microsoft's C/C++ extension it becomes IntelliSense's configuration provider instead of competing with it. The full list is on the extension's page.
.vsix from the
releases. From the command
line: code --install-extension humphrey0925.norn-c.That is all. The server is included for Windows, Linux and macOS, on x64 and Arm64. The user guide covers every view and setting.
Without VS Code, the same indexer is a command of its own, norn, for the
terminal, scripts, CI, other editors (as a language server) and AI agents
such as Claude Code, Codex, OpenCode and Copilot (as an MCP server, norn mcp;
norn setup sets the agents up, Norn for AI agents says how): see
the command line.
sources ─► tree-sitter parse ─► facts per file ─► link ─► call graph (CSR) ─► language server
▲ ▲
#if worked out from the build's calls through macros and
own configuration and the sources function pointers resolved
Norn is written in Rust. Each file is parsed once with tree-sitter after its preprocessor conditions are worked out, from the build's configuration and from what the sources themselves define. The facts of each file are cached by content hash, and a folder opened inside or around one already indexed takes those facts for every file it reads the same way; linking them into a call graph takes milliseconds, so saving a file updates the index almost at once. The graph is kept in compressed sparse rows, which answer a callers query in well under a microsecond.
Requires Rust (stable) and Node.js 20.
cargo build --release
cd vscode && npm ci && npm run compile
| Path | |
|---|---|
crates/si-core | The index: parsing, preprocessor conditions, linking, the stored graph |
crates/si-cli | The norn executable: norn lsp (the language server), norn mcp (for AI agents), norn index, norn query |
vscode | The VS Code extension |
bench | Accuracy and speed measurements against clang and other indexers |
Releases are built and tested on Windows, Linux and macOS by GitHub Actions; see docs/releasing.md.
Issues and pull requests are welcome; see CONTRIBUTING.md. Contributions are accepted under the Contributor License Agreement, which the CLA check asks you to sign on your first pull request.
Copyright 2026 humphrey0925 and the Norn contributors. Licensed under the Apache License, Version 2.0.
Source Insight is a trademark of Source Dynamics, Inc. Norn is not affiliated with, or endorsed by, Source Dynamics; the name is used only to describe the style of navigation. Other names are trademarks of their owners.
| 45.4%22 s |
| 78.5%9.74 s |
| 78.7%0.20 s |
| n/a0.15 s |
| n/a0.12 s |
| SQLite | C | 360 | 93.9%0.26 s | 99.2%0.64 s | 74.5%15 s | 90.8%12 s | 83.6%0.29 s | n/a0.19 s | n/a0.19 s |
| Mbed TLS | C | 131 | 89.8%0.11 s | 99.3%0.40 s | 0.0%1.54 s | 68.1%5.43 s | 69.0%0.06 s | n/a0.05 s | n/a0.04 s |
| FreeRTOS | C | 655 | 98.6%0.34 s | 100.0%0.11 s | 9.1%5.57 s | 48.1%9.17 s | 50.6%0.21 s | n/a0.18 s | n/a0.19 s |
| lwIP | C | 480 | 80.5%0.16 s | 96.6%0.48 s | 0.8%4.44 s | 68.8%6.20 s | 75.1%0.11 s | n/a0.09 s | n/a0.07 s |
| U-Boot | C | 13,352 | 94.9%5.54 s | 96.4%4.09 s | 19.9%150 s | 65.5%65 s | 76.2%3.22 s | n/a1.98 s | n/a2.02 s |
| Linux | C | 64,574 | 91.1%64 s | 99.6%113 s | 18.8%1026 s | – | 63.9%56 s | n/a23 s | n/a26 s |
| fmt | C++ | 72 | 89.9%0.20 s | 91.6%3.88 s | 68.1%13 s | 9.2%6.24 s | 4.8%0.06 s | n/a0.04 s | n/a0.04 s |
| LevelDB | C++ | 366 | 96.1%0.27 s | 98.8%2.45 s | 6.3%17 s | 9.2%7.52 s | 4.3%0.09 s | n/a0.08 s | n/a0.07 s |
| Bitcoin Core | C++ | 1,498 | 94.0%3.62 s | 86.8%72 s | 15.2%45 s | 12.3%18 s | 25.9%0.43 s | n/a0.42 s | n/a0.27 s |
| Ninja | C++ | 258 | 99.1%0.31 s | 100.0%2.47 s | 40.7%26 s | 7.6%6.79 s | 15.1%0.08 s | n/a0.07 s | n/a0.06 s |
| GoogleTest | C++ | 155 | 85.3%0.31 s | 92.0%6.92 s | 5.3%10 s | 6.3%5.99 s | 4.1%0.07 s | n/a0.07 s | n/a0.05 s |
| Abseil | C++ | 837 | 78.8%0.28 s | 96.3%22 s | 10.8%27 s | 5.7%8.61 s | 0.8%0.18 s | n/a0.13 s | n/a0.13 s |
| yaml-cpp | C++ | 259 | 86.7%0.36 s | 99.0%2.51 s | 22.4%12 s | 9.2%6.44 s | 2.5%0.08 s | n/a0.06 s | n/a0.06 s |
| spdlog | C++ | 542 | 77.1%0.36 s | 92.3%4.14 s | 2.5%17 s | 4.3%7.30 s | 1.3%0.08 s | n/a0.08 s | n/a0.07 s |
| Cppcheck | C++ | 554 | 84.3%0.29 s | 99.7%8.33 s | 83.4%47 s | 3.3%19 s | 49.7%0.21 s | n/a0.15 s | n/a0.14 s |