Projects

Selected work

A few things I've built. What they do and how they work.

sift

  • Rust
  • Search
  • AI Memory
  • Local-first

Persistent memory for AI agents. Semantic search over local embeddings, written in Rust.

sift indexes 30+ file formats (code, PDFs, Office docs, email, audio) into a single Rust binary. Hybrid retrieval fuses BM25 keyword scoring (FTS5) and vector similarity using reciprocal rank fusion, so exact matches and semantic neighbors surface together.

On top of that sits Cortex, an automated memory layer for AI agents. A hot path captures tool-call episodes from Claude Code hooks in under 100ms with zero LLM cost. A cold path runs a five-phase consolidation pipeline in the background, using local embeddings only, turning raw episodes into a knowledge graph of entities, observations, and relations the agent can recall across sessions.

Simple Autodiff Library

  • Python
  • ML

A minimal reverse-mode automatic differentiation library, built from scratch.

Each scalar operation records its inputs and a local gradient function as the forward pass runs, building a dynamic computation graph. Calling backward walks the graph in topological order and propagates gradients via the chain rule.

Written for clarity over speed. Small enough to read end-to-end, but enough to train a multi-layer perceptron on toy data.

Personal Sous-Chef

  • TypeScript
  • LLM

An LLM cooking assistant that plans meals around whatever is already in the fridge.

You list what you have on hand and any constraints, like time, dietary needs, or what you're in the mood for. The agent proposes a dish, scales quantities to your servings, and walks you through the cook step by step, answering substitution questions as they come up.

Built to replace the loop of skimming recipe blogs when the answer is just "use what's there."

SF Parking Tracker

  • Maps
  • Civic Data
  • Web

Real-time map of San Francisco street-cleaning windows so you don't get ticketed.

Pulls SFMTA's street-cleaning schedule and renders it on an interactive map. Blocks fade from green to red as their next sweep approaches, so a glance tells you whether you need to move the car tonight or you have a few days.

Started after one too many $80 tickets.