Projects

Some of these started with a problem I wanted to solve. Others with a question I wanted to answer. A few simply because I wanted to understand how something worked.

Selected Projects

Oblique Writer

An experiment in making AI-generated writing feel less like AI-generated writing.

I originally built Oblique as an AI writing system, but eventually ran into a problem I couldn't prompt my way around: regardless of what I asked for, the output kept falling back into the same recognizable "AI voice." So I started over.

The current version uses a five-stage generation pipeline informed by research into what makes generated fiction feel synthetic. I deliberately built directly against the model API rather than using an orchestration framework, giving me visibility into every stage of generation, while SQLite telemetry makes failures and intermediate outputs inspectable. An 11-prompt evaluation harness compares the pipeline against a same-model baseline, so improvements are measured rather than judged entirely by feel.

LLM SystemsPythonEvaluationOpenRouterSQLite

GraphRAG

A local retrieval-augmented generation system built to explore whether combining semantic, lexical, and graph structure can improve multi-hop retrieval.

Instead of relying on a single retrieval method or a managed RAG service, I built a hybrid retriever over 1,059 Wikipedia pages and 10,955 chunks, combining dense vector search, BM25, Personalized PageRank, and entity resolution. The idea was simple: each retrieval signal sees information differently, so their failure modes should be complementary.

I built an evaluation framework using Recall@k and MRR@k to test that assumption, with the resulting system showing a 38% relative diversity gain on multi-hop retrieval. I also profiled the same pipeline across Apple Silicon and CUDA to understand its behavior across hardware backends.

ML SystemsRAGPyTorchFAISSMPSCUDA

Nova Bloom

A camera app exploring how computational photography can push beyond the physical limitations of a smartphone sensor.

Small sensors struggle in difficult lighting, so Nova Bloom captures multi-exposure RAW and JPEG bursts of up to 100 frames along with exposure and motion metadata for on-device processing. I designed the processing pipeline around ideas from recent computational photography research, including exposure normalization, frame alignment, motion rejection, multi-frame fusion, and RAW finishing.

The full multi-frame pipeline is implemented but currently disabled while I continue tuning its numerical behavior. Rather than ship an unreliable result, the app currently uses a simpler single-frame RAW finishing path. Building it has made me think as much about concurrency, performance, and reliability as photography itself.

iOSComputational PhotographySwiftAVFoundationCore Image

VERA

A multimodal AI assistant that fuses vision, speech, and personal knowledge retrieval into a single conversational pipeline.

VERA combines vision, speech, personal knowledge retrieval, and language-model reasoning through a Swift iOS client and an asynchronous Python backend. Rather than relying on a proprietary multimodal API, I built a modular late-fusion pipeline that processes vision, speech, and retrieval independently before assembling the context for a Llama model.

The MacBook Pro powering the client side was a CPU-bound 2018 Intel model, well short of what real-time vision, speech, and LLM inference actually need, so I split the system accordingly: perception and I/O ran at the edge, while the orchestration layer and model inference ran on Azure. I built a 50-query multimodal benchmark to evaluate the system, measuring latency, retrieval quality, and task completion, and used ablation tests to understand how much vision, speech, and retrieval each contributed to the final result.

Multimodal AIAzureSwiftFastAPIllama.cpp

More Things I've Built

Experiments, coursework, and side projects from other corners of computing I've wanted to understand.

Logic Leapers

An NLP research project exploring whether reasoning learned in one domain transfers to another. We fine-tuned Qwen2.5-7B using SFT and GRPO on mathematical reasoning, then evaluated both on natural-language first-order logic. SFT degraded cross-domain performance, while GRPO preserved and modestly improved it.

Machine LearningRLLoRAGRPO

Delphi Compiler

A compiler built to work through the machinery behind programming languages, from ANTLR-based lexing and parsing to LLVM IR generation. The project later became particularly relevant when I returned to the same material as a teaching assistant for Programming Language Principles.

CompilersANTLRLLVM

Gleam/OTP Engine

A Reddit-style backend built to explore the actor model and fault isolation through BEAM/OTP. The system uses separate supervised actors for users, communities, content, and direct-message routing, with both a REST API and a load simulator for benchmarking.

SystemsGleamBEAM/OTPActor Model

Roam.io

A team-built travel platform where I owned the Go/PostgreSQL backend and its integration with the frontend, including REST APIs, relational data models, and authentication. The system was containerized with Docker and Kubernetes and integrated with Jenkins CI/CD.

BackendGoPostgreSQLDockerKubernetes