Senior Software Engineer building sports analytics, agent infrastructure, Bayesian research tools, and personal automation.
San Diego native in Portland, OR. Personal projects here are independent of my employer.
Nights-and-weekends work, run at the same standard as anything I'd ship at a job: tests, migrations, calibration checks. Each project exists to answer a question I actually want answered, whether a league's scoring rules mispriced a player, whether a training readiness score beats a coin flip, whether a trade helped a team. A few report a null result instead of a win, because that is the honest answer and it says more about the engineering than a green checkmark would.
Sports analytics · Agentic AI systems · Bayesian modeling · Knowledge/retrieval infrastructure · Cloud FinOps
Senior Software Engineer · Nike · Portland, OR
Obsidian vault architecture for coding agents
A sanitized look at the knowledge system behind my local coding and research workflow. The real vault stays private; this repo shows the structure: routing docs, retrieval packs, review metadata, project manifests, validation checks, and redacted examples.
| Corpus behind it | 1,088 wiki pages · 587 source summaries · 312 concept cards · 117 book hubs · 18 project manifests |
| What it solves | Gets Codex, Claude Code, and ChatGPT-style agents from a vague request to the right pack, source note, or project manifest without searching the whole vault |
| Agent contract | The vault gives context; the live repo/source still wins. Agents are routed to inspect current files before changing code or making live-state claims. |
| Ingestion depth | Books and papers become hubs, extraction notes, targeted chapter notes, concept cards, and route wiring, added only where that extra grain changes the agent's behavior |
| Boundary | The showcase publishes the operating model, not the library: no raw PDFs, books, personal notes, or full third-party-derived summaries |
| Stack | Obsidian · Claude Code · Codex · Markdown · Mermaid · Python validation · GitHub Actions |
AI dynasty fantasy football GM
A full-stack AI general manager that re-computes player values under league-specific scoring, compares them to generic PPR baselines, and ranks trade targets by roster context.
| Valuation | Re-scores every player under the league's exact settings and generic PPR; ranks the mispricing created by custom passing and yardage bonuses |
| Market signals | Monte-Carlo title equity, buyer/seller contention windows, TD-regression buy-low/sell-high, owner behavioral profiling learned from the league's real trade history |
| Matchup Lab | Pre-lock win probability, stadium/weather splits, playoff strength-of-schedule, snap-share wire early-warning, handcuff/leverage map |
| AI loop | Deterministic engines build one briefing -> Claude Code reasons, self-critiques, and posts back -> UI renders. No runtime LLM key in the backend. |
| Stack | Python 3.12 · Polars · FastAPI · React 19 · TypeScript 6 · Vite 8 · Tailwind 4 · nflverse · Claude Code · 32 engines · 210 tests |
MLB front-office trade evaluation platform
Built to answer one question: Was this trade a good move for this team, in this contention window, under this front office?
| Data | 1.29M+ rows · transactions 1880-2024 · Statcast percentiles & arsenal · Spotrac $49B contracts · front-office personnel |
| War Room | Deadline command center: buyer/seller verdict, CBT headroom, roster holes, 3-year payroll projection |
| AI Brief | Structured-output GM brief: highest-leverage move today, trade packages with two-sided surplus accounting, counterparty leverage reads |
| Research | 35 rounds. Original thesis empirically rejected and reported. Four validated findings including sell-high skill and K%-trajectory signal. |
| Stack | Python 3.12 · DuckDB · PyMC (Bayesian) · FastAPI · React 19 · TypeScript 6 · Vite 8 · Tailwind 4 · model2vec RAG |
Quantitative research platform
As of the latest run, no factor clears the significance bar, so live trading is disabled.
| Factors | Momentum · Low-vol · Sharpe · Value · Quality, all point-in-time, zero lookahead |
| Alt-data | SEC EDGAR Form 4 · 13F institutional flow · Senate congressional trades · White House executive mentions |
| Rigor | Pre-registered backtest harness · Newey-West HAC t-stats · multiple-testing correction · long-short spread |
| Calibration | Brier score · per-conviction hit-rate buckets · reliability diagrams on every thesis |
| Stack | Python 3.12 · DuckDB + HNSW vector search · fastembed (local) · FastAPI · React 18 · Vite |
WHOOP + Apple Health + Hevy + DUPR fused through a single typed DailyState for readiness, training load, and workout planning.
| Signals | Drug-adjusted HRV (σ-deviation, medication-aware weights) · WHOOP-measured HRmax · Gabbett ACWR from fused strain + tonnage |
| Gate engine | 20 deterministic rules derived from physiology research reject a Claude-drafted plan outright; the model never has final say |
| Self-eval, published either way | Calibration holds (+0.03 RPE bias, 86% of prescriptions within 0.5 of target); next-day predictive validity of readiness is a null (r = -0.07, n = 54), reported rather than buried |
| Science | Banister CTL/ATL/TSB · concurrent training interference (pickleball-primary) · pre-registered N-of-1 hypothesis catalog |
| Stack | Python 3.12 · FastAPI · DuckDB · Next.js 15 · React 19 · Tailwind v4 OKLCH · Claude Opus 4.8 · 1,030 tests |
LLM regression-detection harness · MIT · Published on PyPI
uv add agent-eval-kitThree judge types · exact match · numeric tolerance · LLM-as-judge (~$0.001/case) · regression diffing across prompt versions · per-run latency + cost tracking · JUnit XML for CI · Markdown for PR comments
San Diego Padres analytics engine · Powers @xFriars on X
| Data | MLB Stats API · Statcast leaderboards · full franchise history · team and player profiles |
| Engine | Deterministic SQL detectors, interest-weight scoring, pad CLI driving the full pipeline |
| Output | Branded stat cards rendered to PNG via D3, auto-posted to X |
| Stack | Python 3.12 · DuckDB · React 19 · TypeScript · D3.js · Jinja2 |


