I build retrieval systems that turn unstructured data into something production can depend on. Currently AI Engineer at XNode AI, working on an enterprise information catalog that unifies metadata across PostgreSQL and five other sources: 100K+ data assets, lineage-tracked, behind CI/CD.
- Building: entity and relationship extraction into Neo4j and Graphiti, running alongside the vector layer instead of replacing it. Vector search finds what a document says; a graph keeps how things relate.
- Learning: where the graph-ingestion token cost actually pays for itself. You pay once at ingestion instead of at every query, and that only earns out if enough queries are relational.
- Open to: conversations about RAG that has to survive contact with real data.
LangGraph Agentic Platform is a multi-agent system for supply chain resilience: real-time news analytics, geospatial risk scoring, automated alerting. I designed the orchestration layer, covering state management, tool routing, memory, and the LLM decision loops.
Registry Points is a lookup over the World Swing Dance Council's competitor registry. Type-ahead search and record lookup, points totalled by division, eligibility resolved. (code)
Portfolio is my own work modelled as the kind of knowledge graph I build for a living. Next.js, TypeScript, a hand-rolled force layout. (live)
CHIP-8 is an emulator for the 1970s virtual machine. Six of its instructions have two accepted readings, and 86 of the 103 programs in the community archive were quietly running the wrong one until it started reading what each program actually asks for. (code)
Nibble is a small language that compiles to CHIP-8 machine code. Write a program, press compile, and play it; the bytes shown under the screen are the real output and run on any interpreter. (code)
Checking the emulator against Timendus' CHIP-8 test suite meant asking whether the suite could actually fail, so I broke instructions on purpose and watched which tests stayed quiet. Three bugs got through it. All three are now patches there, each one holding the screen pixel for pixel identical on a correct interpreter: #35, #36, #37.