I like building things. While some projects become public, most never leave my machine, and the only people who hear about them are my friends and family. That's what this page is; an excuse to dive deep into something and get it out into the world.
Writing about something is its own kind of project, and so is posting something publicly. It makes you commit to producing a real version of what's in your head, knowing someone might actually look at it. It forces a different kind of clarity than building alone does.
The topics jump around a lot, but if something kept me up late more than a few nights in a row, it might end up here.
01.Selected Works

Gemma 4 MoE Heretic-ARA
Out of curiosity I rented an H100 on RunPod and fine tuned Google's Gemma 4 26B MoE model using Heretic's experimental ARA branch. I couldn't decide between two of the models on the KL divergence/refusals Pareto frontier, so I benchmarked them both against the evals Google released for the original model (MMMLU, MMMU Pro, AIME 2026, GPQA Diamond, LiveCodeBench V6, τ2-bench, etc).
I'm currently working on a blog post that explains in more depth what I did, how Heretic works, and how arbitrary rank ablation improves on Heretic's original design. In the meantime, you can download and try the models yourself using the link below.

Embedded Swift Agent
Recently I decided I wanted to build a coding agent from scratch. With so many tutorials online, I decided to make it a little more challenging for myself; make the final binary as small as possible. Rather than learn Rust, I went with Embedded Swift. Without Foundation I had to create almost every dependency manually: networking with libcurl via C interop, JSON parsing by wrapping cJSON with RAII semantics, concurrency with raw pthreads and mutexes, etc. Once the initial implementation was working in standard Swift, I used the agent running inside its own binary to help port itself to Embedded Swift.
The final result is a 195 KB binary that boots in 120ms, supports streaming responses, parallel tool execution, subagents, and more. It's smaller than most JPEGs, with the same capabilities as agents more than 500x its size.

Silicon Fly
A team of more than 200 researchers from 50 labs mapped every neuron and synapse in a real fly's brain and open sourced it. Others turned half a percent of that brain into a desktop app that produces a fly that wanders across your display, sees your cursor, and runs away from it.
I wrote a Metal kernel that made running the whole brain feasible by scattering instead of gathering, cutting the per step work by 560x. I used integer arithmetic to make the kernel bit for bit verifiable against a CPU reference. The result is 139,255 neurons and 15,091,983 connections running at 13.5x realtime on an M4 Pro in 163 lines of Metal.

Helm
I often work on many projects at the same time. Sometimes I find myself with over a dozen Cursor windows open at once. At a certain point, managing them all started to feel like a job on its own. I am a huge fan of Arc Browser and wanted its elegant space and tab management inside my IDE, so I built it.
Helm is a VS Code/Cursor extension that lives in the Explorer sidebar. You can save workspaces, and organize them into “spaces” with custom names, colors, and emojis. You can swipe between spaces with the trackpad, and drag and drop to reorder. The styling uses VS Code's built-in theme variables, so it looks native regardless of which theme you're using.

Toolbelt
Fundamentally, a coding agent is just a chatbot with access to a filesystem. There's no reason that access must be restricted to a CLI agent running locally on a machine. In theory, any chatbot could become a coding agent if given the right access.
Toolbelt is an MCP server that does exactly that. It runs on your machine (or a cloud VM/dev box) and exposes a configurable set of tools (bash, read_file, write_file, glob, grep, web_search, etc) over the internet through a secure Cloudflare tunnel. Add Toolbelt to any MCP compatible chatbot (like the ChatGPT app on your iPhone or a local model in LM Studio) and it will become an agent capable of taking actions on your machine. This makes the chat interface the minor component of the agentic system; you can swap it out anytime without having to modify your tools or environment.

Amino Amigo
I like to workout, and building muscle requires lots of protein. Building muscle optimally requires timing protein intake. However, no macronutrient tracking app that I could find takes this into account. None distinguish complete from incomplete protein, or optimal protein windows. This frustrated me to the point that I created the app I wished already existed.
Amino Amigo has been downloaded in over a dozen countries. The app factors in individual metabolic limits and alerts users to when - and how much - protein to have. The app closely follows Apple's interface guidelines and design principles, and makes use of a wide variety of Swift features and frameworks.

LexChat
LexChat is a website that allows users to search and talk to the Lex Fridman podcast. I transcribed the podcast with Whisper, created the search engine using vector embeddings, and construct natural language replies based on this search using GPT-3.5. Each search result includes a timestamped link directly to the moment in the podcast episode containing the search result.
I built this back in 2022, before ChatGPT was launched and the explosion of LLMs in general. Because there was limited LLM tooling at the time, I had to build my own RAG stack from scratch, including hosting the embeddings and implementing my own search engine using approximate k-NN.

Deep RL
After graduating college, I became interested in reinforcement learning, and decided to do a self-study using "Reinforcement Learning: An Introduction" by Sutton and Barto as a guide. I read that book from cover to cover and fell in love with the ideas there. Along with OpenAI's Spinning Up, I implemented many of the algorithms I learned from scratch, including SARSA, DQN, PPO, DDPG, SAC, and a simple version of Monte Carlo Tree Search inspired by AlphaZero.