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
- 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.
- After the event — turns messy phone notes into structured commitments (person, company, promise, due date) and stores them in a Cognee knowledge graph.
- 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_followupuntil I approve). - Cognee as long-term memory, plugged into Strands'
MemoryManagerfollowing the organizers' reference repo; the graph is rendered tobrain.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=anthropicfails because the Anthropic adapter callsinstructor.patch()withoutprovider=Provider.ANTHROPIC. Worked around it with the LiteLLM custom provider. - Strands MemoryStore now requires an
extractionfield 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.shso 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
Log in or sign up for Devpost to join the conversation.