skip to content

work

projects

  • an ai assistant that lives in imessage. text it an assignment, it schedules the reminder and follows up.

    dates. june 2026 to present

    hard part. serverless functions die after each request, so a delayed reminder can't just sleep. a next.js route handles the webhook, a separate always-on worker consumes a redis/bullmq queue and fires reminders on time, with recovery on boot so nothing is lost if the worker restarts.

    also. claude agent with a tool-use loop (7 tools), webhook dedup on message guid, e.164 phone normalization, 20-message rolling history, and reminders that would land overnight pushed to 9am in the user's own timezone with a guard so the shift can never push past the due date. follow-ups escalate over five rungs, each checking whether you already replied.

    numbers. 35 users

    typescript · next.js · node · postgres (prisma) · redis · bullmq · anthropic api · docker

  • watches a full class at gsu and texts you the second a seat opens.

    dates. july 2026 to present

    hard part. gsu's banner registration api has no public docs and returns empty results with a 200 status if you call it out of order. captured the real request chain from browser dev tools, then rebuilt the session-cookie handshake in code.

    also. tiered polling with a redis surge flag, idempotent alerts so nobody gets texted twice for the same opening, and per-watch rate guards.

    numbers. 152 students

    typescript · node · redis · bullmq · postgres

  • upload your degreeworks pdf and it tells you what classes you're actually eligible for, then builds a schedule.

    dates. january 2026 to present

    hard part. prerequisites are free text like "(csc 2720 or dsci 2720) and either math 3020 or math 3030 with a c or higher". wrote a resolver that turns that into and/or groups against a 13-level minimum-grade ladder, then walks the chain to work out what you're actually eligible for. claude writes the schedule, but the engine pre-filters the catalog down to courses you're cleared to take first, so it can only pick from a legal set.

    also. live section data from the banner self-service json api behind a session and term handshake, professor ratings from the ratemyprofessors graphql api, two school-specific adapters feeding one shared normalization layer, disk-backed cache.

    numbers. 40 students

    python · fastapi · react · anthropic api · graphql · pdf parsing

  • pulls internship postings straight from companies' ats boards and classifies them with claude.

    dates. june 2026 to present

    hard part. linkedin lags job boards by a vendor-documented 6 to 48 hours, so the pipeline goes to the source: 50 companies' own ats boards every 3 minutes, deduped by normalized fingerprint, each posting run through a claude classifier against a rubric. cut about an hour of daily manual filtering to a 30-second glance.

    also. four ats integrations, three currently exercised. two schedulers run at once, modal crons and github actions, kept from stepping on each other by a run lock in postgres.

    numbers. 50 ats boards · every 3 min

    python · modal · github actions · supabase (postgres) · next.js · anthropic api

    githubin daily use
  • iphone app that scans a room with lidar and measures it, built in a day and a half.

    dates. july 2026

    hard part. measures by fitting planes (ransac + pca) to thousands of mesh points and reports every number with an honest confidence interval. the geometry math lives in a pure swift core under 14 unit tests, which caught an eigen-solver bug that was silently corrupting results.

    numbers. 14 unit tests

    swift · arkit · lidar / roomplan · simd · xctest

    githubprototype
  • mirrors your iphone screen to a tesla's in-car browser. rebuilt it solo on webrtc over a self-hosted livekit sfu, replacing the rtmp prototype my co-developer wrote before he left, so it runs off the car's own connection instead of needing both devices on the same wifi.

    dates. december 2025 to june 2026

    hard part. inverted the usual replaykit split. the broadcast extension is 15 lines and only forwards frames over an app group socket. the host app owns the webrtc session, which means the app has to keep running in the background, so it declares background audio mode to survive app switches.

    also. pinned h.264 because tesla's chromium has a hardware decoder for it on both mcu2 (intel) and mcu3 (ryzen). 1440p at 30fps, 14 mbps, simulcast and adaptive stream off since there is exactly one full-screen viewer. turned off echo cancellation, auto gain control, noise suppression and voice processing, which are voice-call dsp and degrade a media stream.

    swift · swiftui · replaykit · webrtc (livekit) · node

experience

  • software engineer intern · dec 2024 to jul 2025

    • sole engineer. took a local tire shop from no app to a published ios app.
    • swiftui app with in-app tire ordering and roadside assistance scheduling.
    • cloudflare workers backend so stripe secret keys stayed server side, never in the client. firebase auth and firestore for accounts.
  • computer solutions intern · summers 2021 and 2022, springfield, va

    • resolved client it and help desk requests through a ticketing system.

skills

languages
python · typescript · javascript · swift · sql · java · c · c++
frontend
react · next.js · tailwind · swiftui
backend
node · express · flask · rest apis · postgres (prisma) · redis · bullmq · background workers · serverless · webhooks · stripe
ai
anthropic claude api · openai api · agentic tool-use loops · structured json output · validation and guardrails
tools
git · github actions · docker · supabase · firebase · modal · vercel