Projects
I write a lot of Go. My side-projects are usually libraries, dev tools, or APIs that scratch an itch or explore an idea. I try to keep them small and focused, albeit not always successfully.
Agentic orchestration platform.
An LLM orchestration system geared toward getting the most out of smaller, less-capable LLMs running on limited hardware. Supports declarative execution graphs, fault resiliancy, and job management.
Go library providing a bounded agent loop with a structured, three-status output contract.
The conversation loop ends only when the model calls one of three injected terminal tools: complete, request_context, or report_error, so output structure is enforced by tool-call validation rather than JSON-from-prose parsing.
A lightweight, generic graph execution engine in Go.
Define typed nodes and edges, compile the graph, and run it. Provides conditional branching, loops with cycle protection, and a middleware chain for retries, timeouts, and panic recovery. Opt-in checkpointing snapshots state after every node so a crashed run can resume in a different process, and nodes can pause for human-in-the-loop input via interrupts.
An event-sourcing toolkit for Go.
Model application state as a series of state-changing events. Get auditing, replay, and time travel for free. Provides composable primitives: event-sourced aggregates, snapshotting, caching, and lifecycle hooks. Storage is pluggable: choose from Postgres, SQLite, MongoDB, KurrentDB, and S3, or roll your own.
Define, generate, and run CLI tools from config — or straight from OpenAPI.
The Command Line Interface Compiler turns a simple YAML/JSON spec — or any OpenAPI 3.x document — into a command-line tool you can run on the fly or compile to a native Go binary. Includes an interactive TUI with response contract-testing and a spec-driven mock server with no server code.
A tiny CLI that runs an open-ended conversation between two LLMs.
Each participant is an OpenAI-compatible endpoint with its own model, system prompt, and temperature. History persists in SQLite, and per-session compaction and handoff keep long conversations from blowing past the context window. Socrates and Nietzsche can argue indefinitely.