In my free time I was building a game engine. Like every engine, it grew a surface area faster than I could document it — and I wanted documentation that actually looked modern: something that would drop cleanly into an Astro + Starlight site, with real cross-references and code navigation rather than a wall of extracted comments.
Nothing off the shelf did what I wanted, so I set out to generate it from source. That turned out to be the hard part.
The two dead-ends
My first instinct was to reach for Clang. If anything understands C++, it's the compiler front-end. But building tooling on top of a compiler is heavy: slow to set up, awkward to embed, and shaped around compilation rather than around understanding a codebase the way a human reader does.
So I swung the other way — heuristics and regular expressions. Fast to start, and just as fast to fall apart. C++ is far too context-sensitive to pattern-match your way through; every rule I added spawned three exceptions.
The answer was in the middle ground.
The middle ground
Between the compiler's weight and the regex's fragility sat tree-sitter — fast, incremental, embeddable, and forgiving of incomplete code. On its own it produces a concrete syntax tree, not the semantic picture I needed. So I forked it, updated it for the C++ I cared about, and started building my own AST and analysis layer on top of its CST.
That layer is what became the CodeXX engine. Once you own the whole path from source to a real understanding of the code, documentation stops being the goal and becomes just the first thing you can build. Code generation, memory-safety analysis, IDE intelligence — they all fall out of the same foundation.
The documentation generator that started it all still ships today. It just turned out to be the smallest piece of a much larger idea.