Projects in descending order of how much I'd stand behind them. Click any card for the full write-up. ← Back to highlights
Electron · WebGL2 · Optics
A commercial desktop optics product I designed and built. Because it is a live product, the technical internals are kept private — I'm happy to walk through the work directly.
Commercial product — internals kept private.
Chrome Extension · Gaze Tracking · Machine Learning
TL;DR is a Chrome extension that tracks your gaze through the webcam to work out how you are reading, then steps in only when it helps. A decision-tree classifier reads nine statistical features of eye movement every 2.5 seconds — fixation duration and stability, regression rate, saccade length, gaze drift, re-read count and more — and labels your state as focused, skimming, confused, zoning out, or overloaded; confusion triggers an explanation, overload triggers a simplification. Gaze runs through WebGazer.js in the page context with a smoothing and noise-filtering pipeline (EMA, velocity-spike rejection, DBSCAN) before classification, and the classifier is compiled to plain JavaScript that runs in under a millisecond with no ML library. A thin Node/Express proxy keeps the Groq API key off the client, and only paragraph text — never video — ever leaves the browser. Consumer webcams cap accuracy at paragraph level (~75–82% in the real world), a tradeoff the project is explicit about.
Python · CLI · Local Voice AI
Chuchote turns a local Ollama model into a hands-free voice assistant with a fully on-device pipeline: openWakeWord listens for the wake phrase, Silero VAD detects end-of-turn, faster-whisper transcribes, Ollama reasons, and Piper speaks the answer back — synthesis starts streaming as soon as the first sentence is ready. Nothing leaves the machine. Each exchange is written to SQLite and recent turns are fed back into context, so it stays coherent across turns and restarts. It handles ~99 languages, offers three barge-in strategies (wake / VAD / off), supports custom-trained wake words, and ships a chuchote doctor command that checks Ollama connectivity, model availability and audio hardware. Configuration is layered TOML (defaults < file < CLI flags). Packaged to PyPI with CI/CD.
pip install chuchotePython · CLI · DevOps Tooling
Ansible's --check --diff dumps an unstructured wall of output and, worse, tasks it cannot simulate (shell, command, raw) are skipped identically to conditional skips — so teams misread “no diff” as “no change.” Playcheck fixes both. Rather than scraping Ansible's ambiguous text, it ships a small JSONL stdout-callback plugin and runs the playbook with ANSIBLE_STDOUT_CALLBACK=playcheck_jsonl, receiving structured events per task, so classification never depends on brittle message strings. It renders per-host summaries (“web-01: 4 changes · 2 not previewable”), clean colored diffs, and explicitly flags anything it cannot positively attribute to a when: condition (over-flagging is deliberate). A GitHub Action posts the preview as a PR comment that updates in place, with CI-friendly exit codes. Test fixtures replay against fresh captures from ansible-core 2.15–2.21 rather than hand-written mocks. On PyPI.
pip install playcheckAppSec · Hardware Attestation · Go
Assay makes the case for replacing kernel-mode (ring-0) anti-cheat on macOS with hardware-backed client attestation. Instead of loading a driver to inspect memory for tampering, it uses Apple's Secure Enclave and App Attest (DCAppAttestService) to cryptographically prove that a specific, unmodified binary is running in a sealed process on genuine Apple hardware — a stronger integrity claim than a kernel driver squinting at memory, and with no ring-0 code on the user's machine. The design covers enrollment that binds keys to hardware, posture reporting (SIP status, debugger presence, code-signature validity), continuous challenge-response re-attestation, and a tiered access policy rather than a binary allow/deny. Current scope is the server-side verifier in Go; the Swift client SDK is deferred pending Apple Silicon hardware and a Developer Program membership. It is framed honestly as an integration project with a thesis — a demonstration of trust-boundary reasoning, not a research contribution.
Firebase · Geolocation · Vanilla JS
GeoAttend lets a lecturer open an attendance session with a set radius (10–1000 m) and duration; students are marked present when their GPS falls inside the geofence — verified with the Haversine formula — or by scanning a generated QR code when location is not reliable. It is built on Firebase (Auth + Firestore) with a vanilla-JavaScript front end and no framework. Attendance lists update live through Firestore listeners; composite document IDs (sessionId_studentId) prevent double marking; and a three-tier fallback (auto-switching non-Safari iOS to QR, then manual session-ID entry) handles browser quirks. Firestore security rules scope access so students can only write their own record and lecturers only their own sessions. Student coordinates are checked but never stored — only the lecturer's location, once per session.