<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tooling on Theta Nil's Blog</title><link>https://wickedgrog.com/tags/tooling/</link><description>Recent content in Tooling on Theta Nil's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Tue, 04 Aug 2026 19:48:12 +0000</lastBuildDate><atom:link href="https://wickedgrog.com/tags/tooling/index.xml" rel="self" type="application/rss+xml"/><item><title>Thirteen Submodules</title><link>https://wickedgrog.com/p/thirteen-submodules/</link><pubDate>Tue, 04 Aug 2026 19:48:12 +0000</pubDate><guid>https://wickedgrog.com/p/thirteen-submodules/</guid><description>&lt;img src="https://wickedgrog.com/p/thirteen-submodules/cover.svg" alt="Featured image of post Thirteen Submodules" /&gt;&lt;p&gt;I track thirteen active projects as git submodules in a single workspace. Here&amp;rsquo;s where each one stands and what it does.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Project&lt;/th&gt;
					&lt;th&gt;Last Update&lt;/th&gt;
					&lt;th&gt;Language&lt;/th&gt;
					&lt;th&gt;What it is&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/cf" target="_blank" rel="noopener"
 &gt;cf&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;now&lt;/td&gt;
					&lt;td&gt;Hugo/Py&lt;/td&gt;
					&lt;td&gt;This site; Hugo + Cloudflare Worker across 33 domains&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/acts" target="_blank" rel="noopener"
 &gt;acts&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;now&lt;/td&gt;
					&lt;td&gt;Shell&lt;/td&gt;
					&lt;td&gt;Local action workflows&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/rex" target="_blank" rel="noopener"
 &gt;rex&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;now&lt;/td&gt;
					&lt;td&gt;Go&lt;/td&gt;
					&lt;td&gt;Desktop file manager; Go + Wails, per-kind intelligence&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/simulator" target="_blank" rel="noopener"
 &gt;simulator&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;10d&lt;/td&gt;
					&lt;td&gt;Go&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;simstudio&lt;/code&gt;: reactive simulation + SDF sprites&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/narrated" target="_blank" rel="noopener"
 &gt;narrated&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;16d&lt;/td&gt;
					&lt;td&gt;Python&lt;/td&gt;
					&lt;td&gt;Multi-agent narrative generation; LLMs + vLLM + Chroma&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/pad-a1" target="_blank" rel="noopener"
 &gt;pad-a1&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;17d&lt;/td&gt;
					&lt;td&gt;Python&lt;/td&gt;
					&lt;td&gt;Code idiom mining; tree-sitter corpus + Stitch learning&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/qbacktest" target="_blank" rel="noopener"
 &gt;qbacktest&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;21d&lt;/td&gt;
					&lt;td&gt;QB64/C&lt;/td&gt;
					&lt;td&gt;Options backtester; QB64-PE ↔ DuckDB bridge&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/cloops" target="_blank" rel="noopener"
 &gt;cloops&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;21d&lt;/td&gt;
					&lt;td&gt;Csound&lt;/td&gt;
					&lt;td&gt;Drum loops for Elektron Octatrack; sample-accurate, click-free&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/chatapp" target="_blank" rel="noopener"
 &gt;chatapp&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;23d&lt;/td&gt;
					&lt;td&gt;Erlang&lt;/td&gt;
					&lt;td&gt;XMPP playground&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/cv" target="_blank" rel="noopener"
 &gt;cv&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;24d&lt;/td&gt;
					&lt;td&gt;Python&lt;/td&gt;
					&lt;td&gt;Computer vision experiments&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/decentweb" target="_blank" rel="noopener"
 &gt;decentweb&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;24d&lt;/td&gt;
					&lt;td&gt;TypeScript&lt;/td&gt;
					&lt;td&gt;Decentralized web node; DHT-based content, zero-JS reader&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/seqcast" target="_blank" rel="noopener"
 &gt;seqcast&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;25d&lt;/td&gt;
					&lt;td&gt;C/jsonnet&lt;/td&gt;
					&lt;td&gt;MIDI sequencer for Elektron hardware via ALSA&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;a class="link" href="https://github.com/thetanil/theta-seq" target="_blank" rel="noopener"
 &gt;theta-seq&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;35d&lt;/td&gt;
					&lt;td&gt;Zig&lt;/td&gt;
					&lt;td&gt;GPU synthesizer; SID chip emulation on multipass textures&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="the-hardware-row"&gt;The Hardware Row
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;seqcast&lt;/strong&gt; and &lt;strong&gt;cloops&lt;/strong&gt; live together under gear: seqcast streams MIDI into an Elektron rig (OT/A4/DT) and cloops fills the sample library. Both are production-quality, neither is a sketch.&lt;/p&gt;
&lt;h2 id="the-narrative"&gt;The Narrative
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;narrated&lt;/strong&gt; is a storytelling engine: a narrator LLM sets per-character goals each round, character agents respond in voice, and the narrator weaves responses into prose. Every story is plain markdown with YAML frontmatter — no database, everything diffs cleanly. Uses local vLLM inference and Chroma for style corpus retrieval.&lt;/p&gt;
&lt;h2 id="the-sim-stack"&gt;The Sim Stack
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;simulator&lt;/strong&gt; (&lt;code&gt;simstudio&lt;/code&gt;) is a reactive scientific simulation platform. The core insight is a narrow waist: only the &lt;code&gt;store&lt;/code&gt; package (bbolt KV + in-memory fields) touches both the sim tick loop and the renderer, so they never import each other. M0–M3 (store, Conway kernel, X11/EGL windowing, hand-rolled IMGUI) are live-verified. M4 (Simulation Objects in Starlark) is built and runnable. M5 (SDF sprite rendering) is compiled and type-checked; the GL pass was live-tested once on the user&amp;rsquo;s desktop and found three real bugs, now fixed — but nothing has re-confirmed a live run in this sandbox since.&lt;/p&gt;
&lt;h2 id="the-code-mining"&gt;The Code Mining
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;pad-a1&lt;/strong&gt; mines Python and C corpora for the idiom vocabulary programmers actually use, by compression. Stages 1–2 (acquire, parse) have run at full scale: ~400k files, a 26GB blob store, 14GB of tree-sitter AST tables with Merkle hashes. US-0–US-3 are done (paper reproduction, function-unit extraction, canonicalization, tier-1 mining with a browsable web UI). US-4 (Stitch abstraction learning) harness is built and verified; the full multi-hour run hasn&amp;rsquo;t been launched yet.&lt;/p&gt;
&lt;h2 id="the-synthesizers"&gt;The Synthesizers
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;theta-seq&lt;/strong&gt; models synthesizer circuits on the GPU with multipass textures. It&amp;rsquo;s written in Zig — no Python, no other tooling. Currently explores SID chip emulation with complex FM routing between voices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;decentweb&lt;/strong&gt; is a BitTorrent-like node for long-form static content. Everything is content-addressed and fetched over HTTP from mirrors that can never alter a byte (signatures verify on arrival). The reader UI is zero-JavaScript, zero outbound requests, and runs in a browser or on a phone with no app install.&lt;/p&gt;
&lt;h2 id="the-backtester"&gt;The Backtester
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;qbacktest&lt;/strong&gt; bridges QB64-PE BASIC to DuckDB via a C wrapper (&lt;code&gt;libduckdb_wrapper.so&lt;/code&gt;). The strategy: query gigabytes of Parquet tick data directly from QB64 without CSV round-trips. Includes a full bull-call-spread backtest in native BASIC and a migration pipeline for Algoseek&amp;rsquo;s 508 GB options dataset.&lt;/p&gt;
&lt;h2 id="the-utilities"&gt;The Utilities
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;rex&lt;/strong&gt; is a single-user desktop file manager, Go + Wails. Files are the source of truth; the database is a rebuildable SQLite index. It knows about many file kinds (images, video, audio, documents, code) and can extract metadata, generate thumbnails, and preview in-app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cf&lt;/strong&gt; is this site: Hugo, Cloudflare Workers, Terraform. It auto-deploys on save and handles forms via GitHub dispatch events. Hosts both long-form posts and short notes, plus standalone games (shader-based, two-canvas architecture with PixiJS UI over WebGL).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;acts&lt;/strong&gt; is a collection of local action workflows — quick shell utilities.&lt;/p&gt;
&lt;h2 id="the-playground"&gt;The Playground
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;chatapp&lt;/strong&gt; and &lt;strong&gt;cv&lt;/strong&gt; are exploration spaces. The former is an XMPP client in Erlang; the latter is computer vision sketches in Python.&lt;/p&gt;</description></item></channel></rss>