AI Solutions Engineer, Toronto. MCP servers, agents, retrieval systems.
Before this I directed music videos for a decade, 101 of them. One of them, Casper TNG's "Dope Boy", was certified Gold in 2022. The first thing I built here was an MCP server for Final Cut Pro.
Grouped tools over FCPXML, so Claude can read a real timeline, health-check it, and write back non-destructive edits. On PyPI since 2026-07-25. defusedxml throughout, sandboxed writes, adversarial input tests, a private disclosure channel.
Two developers outside the project sent fixes and I merged them:
- @mikegrant25 · #6:
apply_templatecould write outside its sandbox - @jardelapp · #7: audio duration was stamped from the timeline span instead of probed
- @jardelapp · #8: silence detection decoded the whole video stream, timing out on a 2.5GB camera file
coldopen · six artists, six live domains
Five hand-built. The sixth was generated by the engine the other five produced. Each build starts by naming the world it lives in: K Money's is The Vault, so his catalogue hangs on the wall like work in one.
| Site | The world | The artist |
|---|---|---|
| officialkmoney.com | The Vault | K Money · Instagram · YouTube · Spotify |
| 100bandplan.com | Mission File | 100Bandplan · Instagram · YouTube · Spotify |
| savv4x.com | Problem Child | SAVV4X · Instagram · YouTube · Spotify |
| syreneffect.com | SyrenEffect TV | Syren Effect · Instagram · YouTube · TikTok |
| officialstreetbud.com | The Streetlight | Street Bud · Instagram · YouTube · Spotify |
| shortiieraw.com (generated) | Carry-On | Shortiie Raw · Instagram · YouTube · Spotify |
Type, colour, motion and section names all derive from that one decision, and the build is refused if it drifts. Every renderable value is a Fact that will not construct without a sourceUrl and a verifiedAt, so an unsourced claim renders as a redaction bar instead of a number.
Blind A/B, 2026-08-21: a fresh judge shown five screenshots picked savv4x.com, which is hand-built, at 70% confidence, and ranked the generated site first of the five for looking hand-made. One judge, one round, one viewport. docs/GAUNTLET.md lists what that does not cover.
Public: the engine, its guards, its tests, and a _template. Client site code is not in the repo.
A desktop OS that boots in a browser tab. Draggable windows, a Cmd+K palette, a magnifying dock, deep-linkable routes, a Three.js cyberspace view. No React, Vue or Svelte anywhere in the tree: the DOM is built by hand, and Three.js and DOMPurify come in as pinned CDN modules. One Vite config builds three surfaces from it, at /, /os and /coldopen.
| Latest release | Latest commit | fcp-mcp-server CI |
|---|---|---|
fcp-mcp-server v0.22.12026-09-03 |
portfolio-os 7e43e1d chore(fandom-flow): daily regenerate (2026-09-04 13:00 UTC)2026-09-04 |
Tests: passing 2026-09-04 |
Generated 2026-09-04 from the GitHub API by build_readme.py.
| Project | Built | |
|---|---|---|
| chain-recall · an AI memory layer for luxury hotel chains. They already pay for Oracle OPERA, so the pitch is to open the guest history they own at the moment that converts: arrival at the desk. Voice front end. | Rosewood Hospitality 2030, Rosewood Sand Hill · 8 hours · May 2026 · with Joshua Dare · Next.js, Claude, ElevenLabs | |
| second-opinion · an evidence-grounded appointment brief for adenomyosis patients, who get a short specialist window and lose most of it to recap. Every claim carries its citation. | Anthropic Opus 4.7 Hackathon · repo private, demo open | Live → |
AI Solutions Engineer · Developer Relations · Solutions Architect · Founding Engineer · Toronto or remote
TypeScript · Python · Node · React · Next.js · MCP · SQLite · Playwright
Six AI literacy games, one engine
They ship from one shared Next.js engine: XP and leveling, FSRS-4.5 spaced repetition, Kumon-style mastery gates, adaptive difficulty, and a Web Audio sound engine with no audio files.
Engine and every game spec are public in passion-learning-suite (template · specs).
| Game | Concept | |
|---|---|---|
| Red Team Arena | Ethical prompt injection and jailbreaks, then defending against them | Play → |
| Hallucination Hunter | Spot factual errors in model output and verify the claim | Play → |
| Token Prophet | Next-token prediction, probability, context windows | Play → |
| Bias Buster | Detect and measure bias across demographics | Play → |
| Prompt Craft | Structure, constraints, iterative refinement | Play → |
| Tool Match | Match an intent to the right model or tool | Play → |
Other projects
| Project | What it is | |
|---|---|---|
| Ultimate Image & Video Prompt Generator | A prompt workbench for nine generation engines, stills and motion. Nine incompatible parameter grammars normalized into one wizard. Every suggestion is credited to the creator it came from. | Live → |
| pulsemap | Global disease surveillance dashboard on WHO data. Mapbox GL, Supabase, Next.js. | Live → |
| rag-system-with-citations | RAG pipeline that returns the chunk behind every answer, so retrieval can be checked. | |
| llm-evaluation-harness | Regression testing for LLM systems: rule-based, semantic, and LLM-as-judge scoring, wired for CI. | |
| clickfix-defense-kit | macOS anti-infostealer toolkit, written after a real ClickFix attack came at me. Blocks curl | sh paste attacks and audits what already ran. |
|
| music-time-machine | One song tracked across Spotify, YouTube, Billboard, and Genius. | |
| toronto-parking-viz | 3D timelapse of Toronto parking tickets. deck.gl and Mapbox. | Live → |
| hand-playground | Seven exercises in spatial gesture UI. MediaPipe, React, Canvas 2D. | |
| vector-vs-keyword-search | Semantic vector search against BM25, side by side, on the same corpus. | |
| jackpoint | One command installs every AI coding CLI on a Mac, plus an optional offline model. | |
| lockedin | One-tap connection card that routes straight to an action: Follow All, vCard, DM, Book, Pay. | Live → |
| whats-poppin | Match-3 bubble game: swap adjacent bubbles, pop three or more, chain the cascades. Match 4 clears a line, match 5 drops a bomb, an L or T shape fires a colour nuke. | Play → |
| tdotssolutionsz-portfolio | Index of the music videos I directed. | Live → |
| syreneffect-site (private) | Next.js site for a Twitch streamer: stream embed, gallery, media kit, analytics admin. | Live → |
| buildright | Duolingo-style mobile learning for home building. React Native and Expo. | |
| ThrowingTracker | Fork of Waleee7/ThrowingTracker. Training log for throwing athletes, built by Waleee7. |
Seven bugs, with receipts
Every broadcast frame rate was arithmetic on the wrong timebase. TimeValue built its denominators with int(fps). int(23.976) is 23, so 3604 seconds was stored as 86410/23s and read back as 3756.957s, a 152 second error on a number that is exact on the page. It hit 23.976, 29.97 and 59.94. Rates are exact rationals and are carried as such end to end now, through a new rational.py. fcp-mcp-server #17
A tool moved nothing and reported success. snap_to_beats built its work list from spine children only. A music video hangs every visual off an audio bed as a connected clip, so on the video I was cutting the spine held one <gap>: 0 of 129 clips considered, and the tool reported success. It walks connected clips lane by lane now and names every cut in its report as considered, moved, already on a beat, out of reach, or skipped for a collision. fcp-mcp-server #16
A 200 came from the wrong file. A page hung on its boot screen in production. Its script tag used a relative ./app.js. At a path with no trailing slash that resolves to /app.js, hits the SPA rewrite, and returns index.html with a 200. It passed local testing because the local URL carried the trailing slash the deployed link does not. The tag is absolute now. portfolio-os CHANGELOG 4.14.1
A banned-colour list is defeated by nudging one channel. coldopen refuses to ship a cream ground. The first version was a hex denylist, which #F7F1E7 fails and #F9F3E9 passes, and those are the same colour. Replaced with a test on hue, saturation, and lightness, which catches the neighbourhood around a sample, plus a brandExemption a caller has to justify in the call. The same audit fails a build whose lexicon contains a generic label like "Contact". coldopen/docs/DECISIONS.md
Duplicate clip names silently lost their markers. Markers were placed through a name-indexed clip dictionary, so duplicate names were last-one-wins, and interval markers landing on an earlier clip were swallowed by an except ValueError: pass. The fix removed the index from that path entirely, so the writer walks spine elements directly. The regression test runs against the four same-named Interview_A clips in the sample timeline. fcpxml/writer.py
The zero guard was the bug. TimeValue.to_seconds() carried if denominator == 0: return 0.0. A malformed 0/0 frame duration became a plausible zero and travelled through every downstream comparison as data. The fix deleted the fallback and rejected the value at construction, so corruption raises at the point it enters the model. fcpxml/models.py
A counter froze on a wrong number and stayed there. requestAnimationFrame is suspended in a background tab, so a page opened with "open link in new tab" stalled a count-up partway and left the intermediate value on screen permanently. Observed live: a streak counter read 1 while its own data-count said 2. Counters now snap to the true value on a timer, with or without the animation. portfolio-os CHANGELOG 4.14.2
What I would build differently
I unit-tested a parser and shipped integration bugs. fcp-mcp-server has a deep unit suite. Issues #16 and #17 both walked past all of it, because a synthetic timeline cannot show you that a real music video puts every visual on a connected clip. One was caught by an end-to-end stdio smoke test, the other by dogfooding the server on one of my own music video projects. Real files in examples/ should have been the first test target.
Numbers typed into a page drift. Two plates on the portfolio-os homepage carried hardcoded wiki edit and screenshot counts, correct the day they were written and wrong by the end of that week. They are regenerated from source now.
"No dependencies" was a claim the manifest did not make. portfolio-os ships no frontend framework and Vite is its only build step, which is the interesting part. package.json still lists two runtime dependencies: @vercel/analytics in the browser bundle and @anthropic-ai/sdk in the two serverless routes under api/.
passion-learning-suite's README enumerates every test group in the suite inside a single 581-word bullet.
Toronto · jamesdare.com · this profile's source



