AI Solutions Engineer · Toronto
Directed 350+ music videos and earned a gold record. Now I build AI systems — MCP servers, autonomous agents, RAG pipelines. Shipped, not slides.
The first MCP server for Final Cut Pro. Natural-language timeline editing — analysis, health checks, non-destructive edits, beat detection. Python · MCP SDK · FCPXML
Structured prompt workbench for nine image/video engines — Nano Banana Pro, GPT-Image-2, Seedance, Veo, Kling, plus the open-source spectrum. TypeScript
| Project | Built | |
|---|---|---|
| chain-recall — AI memory layer for luxury hotels. The chain already pays for Oracle OPERA; this unlocks that data at the moment of arrival. | Anthropic Hackathon, SF · 8 hours · May 2026 | |
| second-opinion — evidence-grounded appointment brief generator for adenomyosis patients. Citation-tracked, built for someone who needed it. | Anthropic Opus 4.7 Hackathon | Live → |
| Project | What It Is | |
|---|---|---|
| pulsemap | Disease surveillance dashboard — weather radar for outbreaks. Real-time WHO data, animated spread arcs. | Live → |
| music-time-machine | Music intelligence dashboard across Spotify, YouTube, Billboard. The bridge between the video years and the AI work. | |
| rag-system-with-citations | RAG pipeline with source attribution — retrieval you can actually verify. | |
| clickfix-defense-kit | macOS anti-infostealer toolkit, born from a real ClickFix attack on my own machine. |
Passion OS (private) — my personal AI operating system. Agent + dashboard + memory MCP, running 24/7 on a Mac Mini, managing repos while I sleep.
AI Solutions Engineer · Developer Relations · Solutions Architect · Founding Engineer
AI literacy games — 6 built, all playable
Each one teaches a concept by making you do it, not read about it.
| Game | Concept | |
|---|---|---|
| red-team-arena | Break the model, then learn to defend it | Play → |
| hallucination-hunter | Spot AI hallucinations | Play → |
| token-prophet | Predict the next token | Play → |
| bias-buster | Detect bias in LLM output | Play → |
| prompt-craft | Prompt engineering challenges | Play → |
| tool-match | Match intents to the right tool | Play → |
Everything else
| Project | What It Is | |
|---|---|---|
| toronto-parking-viz | 3D timelapse of Toronto parking tickets — deck.gl + Mapbox | Live → |
| tdotssolutionsz-portfolio | Music video portfolio | Live → |
| vibe-coder | Survivors-style idle game powered by real coding XP | Play → |
| whats-poppin | Bubble pop game with cultural sauce | Play → |
| lockedin | One-tap connection card — an action protocol, not a Linktree clone | Live → |
| jackpoint | One command sets up every AI coding CLI on your Mac | |
| llm-evaluation-harness | Rule-based + semantic + LLM-as-judge scoring | |
| vector-vs-keyword-search | Semantic vs BM25, side by side | |
| hand-playground | Hand-tracking interaction lab — MediaPipe spatial UI | |
| syreneffect-site | Creator + Twitch streamer site | |
| buildright | Duolingo-style mobile learning | |
| tapin-native | Expo iOS deep-link feasibility spike |
Hard problems I've actually solved
Real bugs from real repos, not tutorial exercises.
Zero-denominator crashes in FCPXML time parsing — Final Cut uses rational time notation (1001/30000s). Malformed files sent 0/0 framedurations and crashed the parser. Traced every division, added guards at the parsing boundary. 5 fixes, 7 new tests.
Silent marker loss from duplicate clip names — markers were placed by clip name, but editors reuse names. Later markers silently overwrote earlier ones — data loss, no error. Fixed by keying on (clip_name, clip_index) tuples so every placement is positionally unambiguous.
Context window management for autonomous agents — tool outputs consumed 83% of context. Added observation masking (compress to structured summaries), sub-agent isolation (scoped context per task), and a 70% utilization compression trigger. Eliminated mid-task truncation.
SSE invalidation starvation under rapid agent cycles — a plain trailing debounce reset on every event. During bursts the timer restarted endlessly and the UI never refreshed, showing stale data for minutes. Replaced with a hybrid throttle-debounce: 300ms trailing edge for coalescing plus a 1.5s max-wait ceiling guaranteeing freshness.
Per-frame memory allocation in an animation loop — Function.prototype.bind() inside requestAnimationFrame allocated ~60 objects/second. Cached the reference, moved timing to CSS custom properties. Cut ~3,600 allocations per minute.
Enum aliasing flake — MarkerType.INCOMPLETE and MarkerType.TODO shared an underlying value. Python aliases duplicate enum values to the first-defined member, so MarkerType(1) always returned TODO. The test asserted by name, got identity. Fixed by asserting on .value.
What I'd build differently
Monolithic agent config — a single config.json at 92 modules is a merge-conflict magnet. Should have split to per-module config around module 20. Config decisions compound faster than code decisions.
SQLite access patterns — right database, wrong abstraction. Raw SQL in 30+ modules instead of a thin repository layer. The storage choice was correct; the access pattern was the mistake.
Test strategy — hundreds of unit tests in fcpxml-mcp-server, but the bugs that shipped were integration-level: malformed XML that parsed fine alone and broke combined. Should have started with 10 integration tests against real FCPXML files.
Component explosion — 121 components, not enough composition. A <DataCard> with render props beats three single-use wrappers sharing 80% of their markup. Component count should fall as a codebase matures.
Learning Suite shared shell — 6 games with near-identical shells, each built independently. A shared <GameShell> would have cut 40% of the markup. Noticed at game 4 and kept shipping — speed over architecture was right for the first few, doubling down past that wasn't.
Toronto · jamesdare.com



