Hello, World!

quixotic quixotic

Hello World!

I'm Oscar โ€” Principal Engineer and Founder of M31 Labs, a consultancy and engineering laboratory working at the frontier of what LLM-assisted humans can build. This is post zero. ๐Ÿ‘‹

About this blog

Part laboratory notebook, part product log, part human. All groovy. โœจ

How we got here

M31 Labs did not exist before February 19th, 2026. That evening I sketched the first parse-table loader for gotreesitter1. Six days later, on February 25th, I posted "I ported Tree-sitter to Go" to Hacker News2 โ€” because of course I did โ€” and got exactly the feedback a six-day-old project deserves: interesting, maybe, but too green, too "vibe-coded," too much surface area for one person.

They weren't wrong. Six days is six days. They also weren't the whole picture.

Why I'm writing this at all
Not to re-litigate the thread. To leave a marker. Two months on, the artifact is real, reproducible, and on a shipping cadence. The best response to "is this serious?" is receipts. ๐Ÿงพ

What I took away

Three lessons the thread clarified

  • Many folks still (in some cases, willfully) have their heads in the sand about LLM-assisted software. That's okay, and temporary.

  • Discourse about a technology and use of the technology barely overlap.

  • The goal is unchanged โ€” ship software that makes or saves money. The means changed.

The stack you're reading this on

This blog isn't hosted prose. It's the full dogfood chain, Go all the way down:

gosx3
A Go-native web platform. Components in .gsx (Go with embedded markup), server-rendered by default, interactive islands compiled to WASM bytecode. No JavaScript toolchain. m31labs.dev is a gosx app.
md++4
A single-package plain-text document system with admonitions, footnotes, math, emoji, diagrams, and a real AST. Renders the post you're reading right now.
gotreesitter1
Pure-Go tree-sitter runtime. 206 grammars. No CGo. Parses the md++ source before md++ renders it.
flowchart LR
  draft[Markdown++ source] --> mdpp[mdpp parser]
  mdpp --> gts[gotreesitter runtime]
  gts --> grammars[compiled grammar registry]
  gts --> tree[parse tree]
  tree --> ast[mdpp AST]
  ast --> html[rendered HTML cache]
  html --> gosx[gosx blog route]
  gosx --> page[server-rendered page]

Turtles, Go turtles, all the way down. ๐Ÿข

Two months of shipping, in public

ReleaseDateHighlight
v0.12.02026-03-28ABI 15 reserved-word support in grammargen; Python & C# parity
v0.13.02026-03-31SkipTreeParse hook โ€” read source without paying for an AST
v0.13.32026-04-04GLR large-file perf: 4+ min โ†’ ~420ms on a 147KB Go file
v0.13.42026-04-05Injection-parser arena leak fixed (~3 MB/parse โ†’ 0)
v0.14.02026-04-17grammargen-compiled Go blob; arena overhaul; Zig upstream migration

v0.14.0, in concrete numbers

The big one is memory. On BenchmarkSelfParseWarmReuse (gotreesitter parsing its own gnarliest root files, Docker 4G / 4 CPU):

modepre-0.14.00.14.0delta
cold (fresh Parser per iter)574 MB/op245 MB/opโˆ’57.3%
warm (one Parser reused)498 MB/op320 MB/opโˆ’35.7%
warm + GC drain522 MB/op328 MB/opโˆ’37.1%

Cold-path bytes-per-op drops by a factor of 574245โ‰ˆ2.34. Two changes drove most of it:

  1. The Go grammar ships as a grammargen-compiled blob.
    Our pure-Go LALR(1) + LR(1) state-splitting compiler produces the parse tables instead of tree-sitter's C ones. Side effectโ€ : a long-standing dead end in the C tables โ€” where } had no valid action after certain nested switch/case/if patterns โ€” no longer exists. gotreesitter parsing its own parser_reduce.go now returns HasError=false. The old blob wrapped it in ERROR.

  2. Arena sizing flipped from sourceLen ร— 4 to sourceLen / 4, and the retention ceiling is preserved across resets. The old formula over-allocated by 10โ€“16ร— on dense Go. The new one starts small and grows adaptively; warm loops stop re-reallocating the primary slab.

Plus a Zig grammar migration to the active upstream org (28% smaller blob โ€” 62,948 โ†’ 45,316 bytes) and a retry-path fix that releases losing candidate-tree arenas eagerly instead of waiting on GC finalization. Full notes: ..

โ€  The "side effect" is that the port is now, in a narrow and specific sense, more correct than the reference C implementation on one real Go file. I did not expect that to be the artifact of the week.

What it looks like to use

import (
    "github.com/odvcencio/gotreesitter"
    "github.com/odvcencio/gotreesitter/grammars"
)

src  := []byte("package main\nfunc main() {}\n")
lang := grammars.GoLanguage()
tree, _ := gotreesitter.NewParser(lang).Parse(src)

No C toolchain. Cross-compiles to wasip1, arm64, Windows โ€” anywhere Go goes. go test -race sees every line.

On AI-assisted software

The question isn't whether I used an LLM

It's whether the artifact holds up. gotreesitter has a 206-grammar parity harness against tree-sitter's C runtime, a benchmark suite with a CI gate, fuzz targets for parser/query/tagger, and seven outside contributors sending real PRs.Those are the things that keep a project honest. The provenance of the keystrokes is not.

Requests to "release the prompts" strike me as inane โ€” not because the prompts are secret, but because they're genuinely not interesting. Most read like "cmon dawggy that shouldn't go there and you know it" followed by the model agreeing ๐Ÿ˜…. The value isn't in the prompts; it's in knowing when to interrupt, re-route, and call shenanigans across many sessions for one feature, and in running the verification that tells you the output is real. If you want the recipe, read the parity harness, not the transcripts.

What's next on this blog

  • Post zero โ€” this one
  • v0.14.0 deep-dive: the grammargen-compiled Go blob, with diagrams
  • How mdpp renders this page in one pass over a gotreesitter AST
  • The gosx islands model, and why the browser is a render target not a runtime
  • Release notes, build logs, and the occasional ranty rant

Thanks for reading. Back to shipping. ๐Ÿš€

  1. gotreesitter โ€” pure-Go tree-sitter runtime, 206 grammars, v0.14.0 shipped 2026-04-17. โ†ฉ
  2. Show HN: I ported Tree-sitter to Go โ€” 2026-02-25. Go read it; the critiques were sharper than I wanted them to be at the time, and the project is better for it. โ†ฉ
  3. gosx โ€” Go-native web platform and component/runtime framework powering m31labs.dev. โ†ฉ
  4. mdpp โ€” Markdown++ parser and renderer used for this blog's authoring pipeline. โ†ฉ