Inspiration
Most AI companions forget you the moment a session ends. For someone living with memory loss, that's not a small thing. It's isolating. A companion that actually holds onto who you are, and brings that back naturally instead of starting cold every time, is doing something genuinely different from a chatbot.
I also made a deliberate choice early on about what this isn't. An earlier version of the idea included medication tracking and automatic distress detection, things like flagging a missed dose or inferring confusion from repeated questions and alerting family automatically. I cut all of it. This is a solo build on a hackathon timeline, and a feature that implies medical or safety monitoring carries real consequences if it fails silently. The honest version of this product is a companion that supports connection, not a device that claims to keep someone safe when it hasn't been built or tested to that standard.
What it does
KindredMemory is a companion for people living with memory loss. It remembers who someone is, who their family is, and what's already been said, so conversations don't have to start from zero every time.
The core idea driving the design is that the person living with memory loss isn't actually the primary user of the software. Their family is. The elder just talks. No app to learn, no login, nothing to remember about how to use it. Family manages the relationship: adding memories, seeing how they're used, staying gently aware of what's happening without reading over anyone's shoulder.
For the elder, it's a simple chat interface, standing in for what would eventually be WhatsApp. They talk, the companion recalls relevant memories through semantic search, and replies naturally, weaving remembered details into conversation instead of reciting them like a database lookup. If something's already been covered and comes up again, the companion never corrects or points out the repetition. It gently re orients instead.
For family, there's a dashboard to add memories in plain language, something like "Ellen's bringing the boys on Saturday," see what's on file, and a light, honest activity feed, "a short conversation this morning," that shows engagement without exposing every word. Transcripts are one click away if you want to read them, but the default view stays light on purpose. It's about visibility, not surveillance.
How we built it
CockroachDB is the persistent memory layer, and it's doing genuine work in two ways. The Managed MCP Server was used throughout development to explore the schema and diagnose issues directly from Claude Code. Distributed Vector Indexing is a real CREATE VECTOR INDEX with cosine distance, powering semantic recall over stored memories. One interesting thing that came up along the way: CockroachDB's own documentation and engineering blog gave conflicting signals about whether cosine distance was actually supported yet in the index. The docs listed the syntax, but an older blog post said it was still "on the roadmap." I resolved it empirically by creating a real test index against the live cluster and confirming cosine distance genuinely works.
Gemini powers two things. gemini embedding 2, at 768 dimensions, generates the embeddings behind semantic recall, and gemini 3.6 flash generates the companion's actual conversational replies. The system prompt encodes the project's core design principles directly: never correct, never claim to be a real person, weave memories in naturally, and admit uncertainty plainly rather than guessing.
AWS Lambda runs seven serverless functions behind an API Gateway HTTP API: adding memories, semantic recall, the conversational chat endpoint, listing memories, listing conversation sessions, fetching transcripts, and listing family members. There's also a scheduled EventBridge ping that keeps the chat function warm, built specifically to short circuit before touching Gemini or the database, and verified against an adversarial test case to confirm it can't accidentally trigger real API calls.
The frontend is a Vite, React, and TypeScript app, deployed on Vercel, wired to all seven live endpoints across a landing page, the chat interface, and the family dashboard.
Challenges we ran into
Being honest about the real ones, because they're part of what got built.
Prisma 7 shipped breaking changes mid project. Config moved out of schema.prisma and driver adapters became mandatory. I worked through it by reading the actual CLI error output rather than guessing at fixes.
CockroachDB auto creates a crdb_internal_region enum that trips Prisma's migration drift detection. The fix was using db push instead of migrate dev, a CockroachDB specific gotcha worth knowing.
A Lambda deployment failure traced back to a pasted connection string that included its own surrounding quote characters. The error message, "can't reach database server at base," was strange enough that it took real debugging discipline to trace it back to something that simple.
A missing transitive dependency, @prisma/client runtime utils, broke the deployed Lambda in production despite a clean local build. The fix was replacing a hand picked dependency list with npm's real dependency resolver, and building a stricter verification habit afterward. A successful sam build doesn't actually prove a bundle runs. Only requiring the real built output does.
There was also a real production timeout on the chat endpoint under cold start conditions. I fixed it with a longer timeout, a scheduled warm up ping engineered to never touch paid APIs, and a frontend loading indicator so a slow reply reads as "still working" instead of "broken."
Accomplishments that we're proud of
Getting semantic memory to genuinely work end to end. Not a mocked demo, but a real pipeline where a memory added in plain language by a family member gets embedded, stored, and correctly recalled by the companion in natural conversation, matched by meaning rather than keyword.
I'm equally proud of the decisions I didn't build around. Cutting the medication and distress alert features, keeping the activity feed light by default instead of a full surveillance log, and writing a system prompt that treats "never correct, never claim to be a real person" as a hard design constraint rather than a nice to have.
What we learned
That "agentic memory" gets a lot more interesting when the constraints are taken seriously instead of treated as an afterthought. The most important design decisions in this project weren't technical. They were about what not to build, and being honest in the product itself about what it is and isn't.
What's next for kindred-memory
Voice support through a West African language text to speech provider, since major cloud voice APIs don't currently support Yoruba or Nigerian Pidgin. WhatsApp integration as the real elder facing channel. And photo attachments on memories, since a photo is a real anchor for recall that text alone can't provide.
Built With
- api-gateway
- aws-lambda
- cockroachdb
- gemini
- prisma
- react
- typescript
- vercel
- vite
Log in or sign up for Devpost to join the conversation.