Experience & Research
Research Assistant — Beat Lab (Computational Neuroscience Lab)
Researched EEG motor-imagery decoding by comparing rCSP, cCSP, and TIMBRE. cCSP consistently outperformed rCSP across the three analyzed subjects and tested component counts; TIMBRE and optimization outcomes varied by subject and configuration.
Research Assistant — Sheung Lab (Experimental Biophysics Lab)
Day-to-day lab operations alongside data collection and analysis, balancing experimental work with the logistics that keep a lab running.
AI Consultant – Airis Garden Practicum — Airis Garden
Applied AI tools to a marketing problem while managing stakeholder-facing deliverables, translating technical options into decisions a non-technical team could act on.
Web Developer (Portal & Forms) — Pitzer College
Built and maintained internal tooling and forms, working directly with the people who used them to figure out what the tool actually needed to do.
Computer Science & Machine Learning Tutor — Pitzer College
Taught programming and ML concepts one-on-one, adapting explanations of the same idea to students with very different backgrounds.
Projects
/projects/eeg-complex-valued-models/
Complex-Valued Models for EEG Motor Imagery
Can complex-valued representations reveal structure in EEG that standard real-valued models miss?
I built a fold-safe pipeline comparing real-valued CSP, complex-valued CSP, and TIMBRE on motor-imagery EEG. cCSP consistently outperformed rCSP across the three analyzed subjects and tested component counts; TIMBRE and optimization outcomes depended on the subject and configuration.
- Python
- TensorFlow / Keras
- scikit-learn
- SciPy
- MNE
- Optuna
- signal processing
- cross-validation
/projects/job-application-tracker/
Privacy-Conscious Job Application Tracker
Application updates arrive in inconsistent emails, but giving an LLM direct control of a tracker creates a new class of mistakes.
I built a scheduled Cloud Run job that reads Gmail with read-only OAuth and uses Gemini to extract typed application events. Deterministic Python then matches applications, routes ambiguous cases to a Firestore review queue, and applies only validated changes to Google Sheets.
- Python 3.13
- Gemini / Vertex AI
- Gmail API
- Google Sheets API
- Firestore
- Cloud Run Jobs
- Pydantic
- RapidFuzz
- Docker
- pytest
/projects/twitter-coronavirus-mapreduce/
Coronavirus Twitter Analysis
How do hashtags spread across languages and countries during a pandemic?
I processed about 1.1 billion geotagged tweets from 2020 with a custom MapReduce pipeline, streaming compressed daily archives in parallel across POSIX background processes instead of decompressing them to disk.
- Python
- shell scripting
- MapReduce
- POSIX
- large-scale data processing
- visualization
/projects/grounded-ai-resume-builder/
Grounded AI Resume Builder
LLMs make things up, which is a problem when the thing is your resume.
I built a Gradio app that extracts job requirements, retrieves evidence from your resume and GitHub history, and checks its own output for unsupported claims before it reaches you.
- Python
- LLMs (Gemini)
- retrieval
- grounded generation
- evaluation
- Gradio
- pytest
- GitHub Actions
/projects/postgres-query-optimization/
PostgreSQL Query Optimization
A benchmark query set that took 39 minutes unindexed isn't usable.
I redesigned the schema (normalized vs. denormalized) and built targeted B-tree and GIN indexes to bring a 5-query benchmark on ~31M tweets down to under 2 seconds.
- PostgreSQL
- SQL
- database indexing
- schema design
- query optimization
/projects/conditional-wavenet-audio/
Conditional WaveNet Audio Generation
How can raw audio be modeled one sample at a time while still controlling the instrument family and pitch it generates?
I built PyTorch experiments for WaveNet-style autoregressive audio generation, including unconditional and NSynth-conditioned models. The pipeline trims 16 kHz audio into one-second chunks, encodes waveforms as 8-bit μ-law tokens, and generates new samples conditioned on instrument and pitch embeddings.
- Python
- PyTorch
- librosa
- NumPy
- NSynth
- μ-law companding
- autoregressive modeling
- signal processing
/projects/goodreads-ai-review-summaries/
Goodreads AI Review Summaries
How do you retrieve a useful cross-section of opinion from millions of reviews without loading multi-gigabyte datasets into an application?
I built a shell pipeline that streams compressed Goodreads data, resolves every edition matching a title prefix, retrieves their reviews, and sends a bounded sample to an LLM for a short synthesis. Temporary intermediates are isolated per run and removed automatically.
- shell scripting
- POSIX utilities
- jq
- grep
- gzip
- JSONL
- LLM CLI
- retrieval-augmented generation
About Me
I got into computational work through neuroscience. Trying to make sense of noisy EEG recordings led me to statistics and signal processing, and from there to machine learning. I've kept working in those areas since, in lab research and on projects of my own.
I'm always interested in difficult problems and teams where I can learn quickly and own meaningful work.