Home / Projects

Things I've built

Projects

A selection of things I've built, newest first.

Tripwire

2026 Live on PyPI

Prompt-injection evaluation harness

Python, GitHub Actions CI, LangGraph/CrewAI adapters

Measures whether a tool-using AI agent can be hijacked by prompt injection before it ships. Drops the agent into realistic tasks, runs 13 attacks (including adaptive ones that refine their injection based on the agent's responses), and answers one question with pure Python, no LLM judge: did the agent leak a planted secret? Reports attack-success rates with confidence intervals and plain-English hardening advice. Published as tripwire-eval with a 351-test suite and a CI release gate on attack success rate.

Terminal output of a tripwire run: an attack-success-rate table for three attacks, followed by security feedback explaining which attacks leaked and how to harden the agent

RACE Attention Kernel

2026 In progress

GPU systems work, CDIS & OpenAI Summer AI Lab

CUDA, PyTorch, bf16

Fusing the causal forward pass of RACE Attention (ICLR 2026) into a single CUDA kernel. Traced the reference implementation and found its shipped CUDA kernels never run; the real bottleneck is a PyTorch prefix-sum path that materializes a five-dimensional tensor growing about 128 KB per token, which runs a 40 GB A100 out of memory at 131K tokens. The tensor is written once and read once, so the fused kernel removes it entirely, targeting 2M-token forwards on a single H100.

Log-log chart of peak GPU memory versus context length: the reference cumsum path at 284 KB per token hits out-of-memory at 131K tokens on a 40 GB A100, while the fused kernel at 4 KB per token reaches 2M tokens using 8.4 GB

jobcrawl

2026 Running 24/7

Autonomous job-search pipeline

Python, SQLite, Claude API, systemd

Polls about 540 company career boards at the ATS source every 10 minutes, scores new postings against my profile with Claude, and publishes email digests plus an auto-generated tracker. The interesting parts are infrastructure: conditional fetches with ETags, per-host throttling, content-hash dedupe with repost detection, absence-based closure detection, and a feedback loop that turns my applied/skipped decisions into calibration examples for the scorer. Runs unattended on an EC2 instance under a systemd timer. Source is private.

Monday

2026 Research prototype

Assistive hardware + AI, built at StarkHacks 2026

Python, Arduino, Claude vision, EMS

Vision-guided assistive grasping for people with upper motor neuron injury, who can reach for objects but cannot complete the hand closure. Combines a voice trigger, a camera feed, a Claude-based grip planner, and electrical muscle stimulation of three fingers, with a physical kill switch inline with the EMS lead. Research use only, not a medical device.

The Monday prototype worn on a forearm: EMS electrodes taped to the hand, relay board and Arduino on the wrist, in front of a piano

CortexOS

2026 Live

Observability for AI agent memory

Python, FastAPI, Postgres, Next.js, TypeScript

Sits between a memory system and the LLM that reads from it. For each retrieval it records which memories were returned, scores how much each one influenced the response, tracks token cost, and keeps a provenance graph so a stored memory can be traced back to the interaction that created it. Ships as an SDK that wraps any Mem0-compatible client, plus an operator dashboard.

Cortexa monitor tracing a support-bot hallucination: the agent quoted an outdated shipping policy, the attribution trace pins it on a stale memory with 0.86 attribution while the current policy memory ranked 4th, and the fix invalidates the stale memory and promotes the current one

cshell

2025 Done

POSIX shell

C11, no dependencies beyond libc

A POSIX shell in about 1,800 lines of C11: quoting and variable expansion, pipelines of any length, redirection, background jobs, and enough terminal job control that Ctrl-C kills the running command instead of the shell. Started from the shell project in UW-Madison's CS537 and grew well beyond the spec.

A real cshell session showing pipelines, stdout and stderr redirection, a background job with jobs output, and history

WattBot

2025 Kaggle competition

Hybrid RAG question answering

Python, BM25, BGE embeddings, HNSW

Answers quantitative questions about the environmental cost of AI for the UW-Madison Environmental AI Kaggle competition, where an answer only counts if the value, unit, and source document all match exactly. Hybrid retrieval fuses BM25 and dense embeddings with reciprocal rank fusion; 87% accuracy on 282 held-out test questions with only 40 labelled examples, spent as few-shot exemplars selected by question type.

WattBot results card: 87 percent accuracy on 282 held-out test questions, 40 labeled examples, 32 source PDFs, hybrid BM25 plus BGE retrieval with reciprocal rank fusion

InterviewIQ

2025 3rd at MadData 2025

AI mock interviewer

Gemini, computer vision, speech

Runs a live practice interview in the browser: generates questions with Gemini, reads the webcam feed frame by frame to track body language, and returns written feedback on both the answers and the delivery. Placed 3rd at MadData, UW-Madison's annual data science hackathon.