Work

Context

Surge XT has hundreds of parameters across oscillators, filters, FX, and modulation—impossible to keep in working memory during a session.

Tension

Asking an AI for help with sound design means the model is guessing from training data, not reading the actual parameter documentation.

Decision

Built an MCP server that ingests and chunks the official Surge XT docs, exposing search, section fetch, and parameter lookup as tools AI models can call directly.

Outcome

AI assistants can now look up exact knob behaviour and guide patch recreation with authoritative documentation.

Context

Adding semantic search to a small project means standing up Pinecone, Weaviate, or a Postgres extension—infra for something that should be trivial.

Tension

Hosted vector databases are overkill for local tools; rolling your own HNSW index is a week of work that has nothing to do with the actual project.

Decision

Built an embedded Rust vector store with a single-file persistence model—same mental model as SQLite, but for approximate nearest-neighbour search.

Outcome

Drop-in semantic search with no server, no daemon, no connection pool.

Context

Running multi-agent AI systems is chaotic without clear orchestration and shared state.

Tension

Agents need task scheduling, shared memory, and a single control plane—otherwise you're gluing scripts and hoping they don't collide.

Decision

Built a distributed AI worker runtime with an orchestrator, shared memory, and DAG-based scheduling so multi-agent runs stay predictable at scale.

Outcome

Autonomous workflows: research summaries, parallel analysis, and agent collaboration across engineering, finance, and legal operations.

Context

Note-taking tools optimise for writing, not retrieval. Months later, the note you need is buried and keyword search returns 40 results.

Tension

Semantic search requires a vector store and embedding pipeline; RAG synthesis requires an LLM—both are heavy to wire up just for personal notes.

Decision

Built a Rust CLI and TUI that embeds notes locally, retrieves by meaning, and synthesises answers from your own knowledge base—nothing leaves your machine.

Outcome

Ask questions in plain English. Get answers drawn from your own notes.

Context

LLM pipelines stitch together inference servers, vector stores, and orchestration layers across multiple process boundaries.

Tension

The model is fast; the glue is slow. Every HTTP hop and subprocess call adds latency the user feels but the benchmark doesn't capture.

Decision

Built a C++ execution runtime that compiles LLM and ML pipelines into static graphs—embed, retrieve, and generate as typed first-class operations with no interpreter overhead.

Outcome

Single binary, no orchestration daemons. Pipelines run as compiled programs.

Context

Working on a proprietary photonics platform that bridges simulation and design workflows.

Tension

Most photonics tools are either opaque GUIs or low-level solvers that are hard to integrate into modern research and product stacks.

Decision

Designing Eigenwave as a focused, proprietary environment that pairs high-fidelity simulation with opinionated, ergonomic workflows.

Outcome

In active development—aimed at making advanced photonics exploration feel closer to modern software engineering.

Context

Document extraction is often brittle, lossy with images, or prohibitively expensive at scale.

Tension

Generic OCR ignores structure; most "AI study tools" quietly fail on diagrams, equations, and screenshot-heavy slides.

Decision

Built an opinionated document intelligence CLI that uses vision LLMs and config-driven RAG to turn arbitrary slides, papers, and textbooks into clean, full-context markdown.

Outcome

Static PDFs become queryable, refinable knowledge—ready for RAG, notes, flashcards, and assessment pipelines.

Context

Writing Rust extensions for Python means maintaining a C FFI layer, a Python wrapper, and keeping both in sync with the Rust API.

Tension

Every type change requires updates in three places. The binding layer is always a commit behind the implementation.

Decision

Built a compiler that reads Rust source, reflects the public type surface, and emits the FFI layer, native extension, and .pyi stubs automatically.

Outcome

Bindings become a compiler output. Change the Rust signature, run ferryx, done.