Inspiration

I go to an event in SF almost every week. I meet people, make promises ("I'll send you that doc"), and then forget. Networking rarely fails at meeting people — it fails at follow-up. So I built a personal brain that tracks my follow-up debt and helps me pay it back.

What it does

  1. Before the event — reads the event's public Luma page via Bright Data and generates a brief: which companies to talk to tonight and what to bring up, grounded in what's already in memory.
  2. After the event — turns messy phone notes into structured commitments (person, company, promise, due date) and stores them in a Cognee knowledge graph.
  3. Take action — drafts a follow-up, pauses for human approval (reject → it rewrites), sends it, and updates memory so the commitment is marked done. Ask "what do I still owe?" and it's gone.

How we built it

  • Strands Agents for the agent loop, tools, hooks (audit log on every tool call) and steering (a Python rule that blocks send_followup until I approve).
  • Cognee as long-term memory, plugged into Strands' MemoryManager following the organizers' reference repo; the graph is rendered to brain.html.
  • Bright Data Web Unlocker for fetching public pages.
  • Anthropic Claude Sonnet as the model, with local fastembed embeddings.

Challenges we ran into

  • cognee 1.1.2 bug: LLM_PROVIDER=anthropic fails because the Anthropic adapter calls instructor.patch() without provider=Provider.ANTHROPIC. Worked around it with the LiteLLM custom provider.
  • Strands MemoryStore now requires an extraction field the reference repo doesn't set.
  • Demo state: a commitment already marked done wouldn't re-run. Instead of forcing the model, I added reset.sh so every demo starts from a clean brain — the memory behavior stays honest.

Accomplishments that we're proud of

  • A closed loop, not a chatbot: brief → commitments → draft → human approval → send → memory update, all in one command.
  • Security by design: the agent that reads the web has no write access to memory and can only fetch allow-listed domains, so a malicious page can't plant fake "facts" or exfiltrate memory through URLs.
  • All four sponsor tools in real roles: Strands (agent loop, hooks, steering), Cognee (memory graph), Bright Data (web access), plus two upstream issues found and documented along the way.

What we learned

  • Memory changes what "correct" means: the agent refusing to resend a completed follow-up is the feature, not a bug.
  • Anything an agent reads from the web is untrusted input. Separating the agent that reads from the one that writes memory matters more than any prompt.
  • Build each piece in isolation first (agent → memory → web), then wire them together — it made every failure easy to locate.

What's next for Brain Battle: Your Follow-Up Event Tracker

  • Replace sample notes with voice-memo capture right after each conversation.
  • Match Luma guest lists only against people you already know — no profiling of strangers.
  • Real sending via email / Telegram, keeping the human-approval step.

Built With

  • anthropic
  • bright-data
  • claude
  • cognee
  • fastembed
  • litellm
  • pydantic
  • python
  • strands-agents
  • uv
Share this project:

Updates

Submission history