iMessage memory agent
ECHO
A second brain that lives in iMessage — turning conversations into commitments, deadlines and decisions, and watching threads on your behalf.
Hackathon prototype. Runs on a seeded demo history; needs a Photon Spectrum project and an LLM key to run live.
- Period
- Sep 2026
- Status
- Prototype
- Role
- Agent design, Backend
- Context
- Built for the Photon iMessage Agent Challenge.
The problem
Why this needed to exist
Commitments, deadlines and decisions get made in chat and then disappear into scrollback. Remembering them is left to the person least able to: the busy one.
Who it’s for
- People who run their lives and work through messaging
The solution
How it works
One database, one extraction pipeline, many surfaces. Every inbound message runs through tool-use extraction into commitments, events, decisions, open questions and opportunities — each with an explainable urgency or confidence score. Briefs, a timeline, a knowledge graph and a weekly review are all queries over the same rows.
Implemented
What’s actually built
"Catch me up"
An animated orb appears instantly, then morphs in place into a live brief card using Spectrum’s edit() on an already-sent card.
Cross-thread watches
"When James replies, summarise his answer and tell me what to do" registers a watch on a group thread; his reply triggers a proactive DM to you elsewhere.
Screenshot to event
Send a screenshot of a flyer; ECHO reads it with a vision model and confirms through a real iMessage poll before adding the event.
Three autonomy levels that change behaviour
Suggest only, ask before acting, or act automatically — the screenshot and cleanup flows branch on each.
Explainable scoring
The extraction schema requires a reason alongside every urgency, importance and confidence score, and every surface shows them together.
Privacy centre
Pause, forget a conversation, export, or delete everything — and an activity log tags every autonomous action with the agent that took it.
My role
What I did
Design and implementation of the agent pipeline, data model, commands, dashboard and the orb interaction.
Responsibilities
- Agent design
- Backend
- Dashboard
- Interaction design (the ECHO orb)
Stack (verified from source)
- Bun
- Hono
- SQLite (bun:sqlite)
- Claude / Gemini (provider-neutral)
- Photon Spectrum
- TypeScript
Decisions
Technical and design choices
- 01
SQLite over hosted Postgres
Zero external services means nothing can be down on demo day; the dashboard reuses the same process and database.
- 02
Search without embeddings
A multi-turn tool-use retrieval loop over keyword searches. At this data scale, vectors would be ceremony — and it is called keyword search, not "semantic".
Trade-offs
Challenges along the way
- 01
Its own number, by design
ECHO only sees threads it is actually in. That is the privacy model, and it is what makes "when James replies" real rather than surveillance.
- 02
Provider differences
Gemini’s function schema rejects JSON Schema unions and numeric bounds, so tool schemas are converted properly rather than cast and hoped.
Lessons
What I took away
- A deliberate 900ms pause before the brief is a presentation choice — and it should be documented as one, not passed off as latency.
What’s next
Planned — not built
Planned work
- Semantic search
- Time-based follow-ups
- Auth on the dashboard
- Writing events to a real calendar
Current limits, stated plainly
- The dashboard has no auth and should not be exposed publicly.
- Demo history is seeded directly into the database.