Brodie Lee

Use Claude Smarter

Brodie Lee builds agentic systems.

Better tools for Claude. Projects to prove it.

Reach me at .

Scroll
001/Agentic engineering

The Workshop

Before the demo floor, the workshop. Four terminal agents run in parallel on my machine (Claude Code, Codex, Pi, OpenCode), all standardized on the same five core skills from one canonical hub, symlinked into every harness. Write a skill once and all four agents know it. claude-mem gives them memory that survives the session, and task-observer logs friction during real work, then folds the lessons back into the skills on a weekly review. The setup improves itself while I use it.

Living in raw terminal harnesses left me with a stance: a CLI plus a skill beats an MCP server on token cost and reliability, and anything touching your communications should be read-only by default. The agent drafts; a human sends. I shipped that stance as two open-source Claude Code plugins.

imessage-reader, extracted from a larger personal-AI system, is read-only iMessage triage: it ranks the texts you haven't answered, drafts copy-paste replies, and pulls plans out of long threads. It is structurally incapable of sending; no send path exists in the code. comms-triage goes wider, composing Google's gws CLI (Gmail and Calendar) with the iMessage reader into one ranked digest under a shared taxonomy (URGENT / ACTION / FYI / NOISE), with cross-channel contact matching ("she emailed and texted") and graceful degradation when a channel is down. A bundled gws-setup skill smooths the Google Workspace CLI's minimal-scope OAuth. Single-channel plumbing exists everywhere; unified read-only triage for a raw harness didn't. Now it does.

Claude CodePluginsTypeScript + BunOpen Source
comms-triage — gmail · calendar · imessage · representative digest
[triage] scanning 3 channels — gws mail · gws calendar · imessage-reader
[triage] 52 unread across channels → 4 surfaced
URGENT · Sarah · imessage + gmail · same person, matched
asked about tonight twice, second time by email. still unanswered
↳ reply drafted, ready to paste. nothing sends without you
ACTION · Prof. Aldrich · gmail
thesis feedback wants a reply before Friday's meeting
↳ cross-checked: calendar shows Friday 2:00 PM confirmed
FYI · 3 events tomorrow  ·  NOISE · 46 promos sunk to the bottom
[triage] read-only by design — no send path exists
002/About

What I'm up to

I build agentic systems: a four-harness Claude rig that remembers, improves itself, and ships. The rig is detailed in the Workshop above and open-sourced where it's useful. The five products below are all live. This page is the working record; it's what I hand out instead of a LinkedIn.

003/Multi-agent AI research system

ATLAS

I love Together's Mixture-of-Agents paper and its findings on MoA performance made me wonder if quantitative finance could be a good testbed for multi-agent research, so I built ATLAS, a multi-agent research system for stock trading.

Stock trading has a clear scoreboard of the valuation of your portfolio. So I built a research collective to settle it for myself and learn a little bit about multi-agent orchestration along the way. I set up eight named agents with research roles and a nine-phase deliberation with evidence-first rules where every claim has to cite a source.

The accountability ledger is really the backbone of the system: being wrong costs the agent, so voting power gets reweighted by track record, and roles are up for election. A quant that keeps missing gets outvoted, then unseated. Biggest obstacle was the first real run dying with a 429: the morning data brief came out to 32K tokens against a 30K limit, so my agents' reading list was literally too long for them to read. A summarizer now compresses the raw dumps into tight digests all eight agents can afford to read.

PythonClaude APIMulti-agentAlpaca
atlas — deliberation · paper account · representative transcript
[atlas] convening deliberation — 7 specialists · topic: semiconductor momentum
MERLIN · market analyst · weight 0.19
SMH up 3.2% this week on above-average volume; breadth is narrow
↳ cite: alpaca:bars/SMH/1D 2025-10-21..10-27
IRIS · news analyst · weight 0.14
Two fab-capacity headlines contradict the momentum read
↳ cite: newsapi:reuters 2025-10-27T14:02Z
GAUSS · quant researcher · weight 0.17
10-day realized vol 31.4 vs implied 27.9 — vol is underpriced
↳ cite: fred:VIXCLS 2025-10-27
AEGIS · risk · weight 0.16
Position would breach the 12% sector cap after Friday's drift
↳ cite: ledger:positions 2025-10-28T09:30Z
[atlas] challenge phase — IRIS contests MERLIN's breadth claim
[atlas] vote (outcome-weighted) — TRIM to sector cap · 5–2
[atlas] orders → alpaca:paper · ledger updated · outcomes pending
004/Defense-tech news intelligence

Field Brief

I wanted to learn more about the defense-tech industry, so I made Field Brief, which provides a continuous briefing of the latest news and contract awards.

Learned a lot about big data wrangling with DoD contract awards, SAM.gov opportunities, prime-contractor market data. I also wanted to learn how to render seriously data-dense pages in React, and how to run Sanity as a real editorial surface with review queues and a curation workflow which this project has in spades.

On a technical level, one cron runs the whole cycle, from feed pull to entity extraction to clustering to publish. Basically it's a newspaper with zero staff. The big fight was story clustering: pure embedding similarity kept fusing unrelated coverage into one mega-story while splitting a single contract award into five. A hybrid score, word overlap plus embeddings, finally snapped stories into shape.

Next.jsSupabaseLLM pipelineEmbeddingsUSAspending / SAM.gov
005/Social nightlife discovery

Rounds

Which bar wins?
Tap to vote and watch the ranking re-fit.
  1. 1The HawthorneCocktail Bar · Kenmore1520
  2. 2BackbarCocktail Bar · Somerville1505
  3. 3Yvonne'sCocktail Bar · Downtown1495
  4. 4DrinkCocktail Bar · Fort Point1490
  5. 5State ParkDive Bar · Kendall1480

A toy of the real thing: this demo runs the plain Elo the beta shipped on.

My friends and I could never decide where to go out in Boston. Everyone had opinions about every bar, and the apps that rank places only cared about restaurants. So I built the thing we actually needed: rate the bars you visit, compare them head-to-head, and let an algorithm work out what you like and where the group should go tonight. I wanted to learn React Native, and I wanted to learn how to code algorithmic suggestions for real: the kind that hold up when the data is a dozen bar visits, sparse and noisy.

I shipped the beta on a simple Elo engine because it was tested and safe, then built a Monte Carlo simulation to check it. The simulation showed Elo was mostly noise at our data sizes, so I swapped in a per-user Bayesian ranking model, with a written decision log to show the reasoning. Biggest obstacle was mobile itself: my first React Native app, and the Expo ecosystem fought me the whole way. Firebase's trust model was the boss fight. Client-side security rules couldn't safely handle group membership, so that logic moved into trusted Cloud Functions, with every rule under an emulator test suite.

React Native / ExpoFirebaseBayesian rankingPostHog
006/Campus nutrition tracking

HealthyHoyas

Made this because I was trying to hit my macros while eating every meal at a Georgetown dining hall, and MyFitnessPal had no idea what Leo's was serving. Logging a dining-hall meal meant guessing at food that wasn't in anyone's database, so my friend Alex and I started building the tracker we actually needed. This was my first real project, the one where I learned full-stack development: Next.js and Supabase up front, Python scraping in the back, and how to move data through a real pipeline.

That first project grew into a three-repo production system: a scraper that reads every Georgetown dining menu daily, an API that serves it, and the app on top. It's now earning an iOS port, which I'm actively building. The hard part was the scraping. The menus weren't sitting in clean HTML; the data was buried in JavaScript payloads, scattered across hundreds of per-item fetches, and the site failed at random. A 700+ item nutrition cache, cleaning passes, and retry logic tamed it, and it's been quietly shipping menus every morning since.

Next.jsSupabasePython scraper3-repo pipeline
Today's lunch
Nothing logged yet
Calories0 / 800
Protein0 / 45g
Carbs0 / 90g

Sample items from a scraped HoyaEats menu; the real app serves every dining hall, every day.

007/In-browser photo editor

Photon

Georgetown rugby team celebrating with a trophy — original photo
EDITED ORIGINAL

Drag the handle: the edit is a live filter chain running in your browser, the same idea Photon runs on canvas.

I kept needing two dumb-simple things, background removal and image-to-SVG, and every site that does them wants an account, an upload, or a subscription. So Photon is the editor that just opens: crop, filters, drawing, one-click background removal, everything running in your browser and nothing uploaded anywhere. Full honesty: it took one prompt to GPT-5, which came back with a single HTML file. 2,266 lines, zero dependencies, works offline, magic-wand flood fill included.

Vanilla JSCanvasSingle HTML file
008/Contact

That's the whole demo floor.

Five products, every one shipped and running. If you made it this far, say hi. I read every email.

I also take on Claude-automation work for small businesses. If something tedious eats your week, email me and we'll spend twenty minutes on it.