DEV Community

yousu.be
yousu.be Subscriber

Posted on

Sarah... Always Forget What She Said Before, So I build "PromiseKeeper" for Her

This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend

What I Built

I built PromiseKeeper for that friend who always says “Sure, I’ll do it” and then forgets about it.
The idea is pretty simple: instead of manually creating a task, you just write what happened in a conversation.

For example:

“Sarah asked me to review her portfolio this weekend. I told her I’d do it by Sunday.”

PromiseKeeper picks out the important parts and saves them. Later, you can ask:

“What did I promise Sarah?”

And it reminds you.


Demo

https://promisekeeper-q0l3.onrender.com/

Code

https://github.com/splmdny/PromiseKeeper


How I Built It

The app is built with Next.js, MongoDB Atlas, Gemma 4 31B IT, DigitalOcean Serverless Inference, and Render.

This was actually my first time using both Gemma and DigitalOcean Serverless Inference, so I wanted to keep the implementation straightforward and focus on getting a working product rather than over-engineering it.

The interesting part is how the pieces work together:

  • Gemma 4 31B IT understands natural-language conversations and extracts promises into structured data.
  • MongoDB Atlas acts as the app's long-term memory for storing promises and their context.
  • DigitalOcean Serverless Inference provides access to Gemma without needing to manage my own GPU infrastructure.
  • Next.js API routes keep the AI and database operations on the server, so API keys aren't exposed to the browser.
  • Render handles the deployment, and getting the full-stack app online was surprisingly quick.

I intentionally kept the architecture simple so the AI is solving the actual problem instead of adding unnecessary complexity.


How It Works

Homepage

The user flow is intentionally simple:

  • Tell PromiseKeeper what happened

The user writes something naturally, for example:

“Andi asked me to help choose his new laptop this weekend.”

  • Gemma extracts the promise

Gemma turns the message into structured information:

Person: Andi
Promise: Help choose a new laptop
Deadline: This weekend
Status: Open

  • Confirm and save

The user reviews the result and confirms it. The promise is then stored in MongoDB Atlas.

  • Ask your memory later

promise-retrieval

The user can come back and ask:

“What did I promise Andi?”

PromiseKeeper searches the user's saved promises and uses Gemma to generate an answer based on those memories.

  • Mark it complete

Once the promise is fulfilled, the user can mark it as completed.

So the whole loop is basically:

Write what happened → AI understands it → Save the promise → Ask about it later → Keep your promises


Why Does Open Innovation Matter?

For me, Gemma isn't just a chatbot added to the project. It's the part that makes PromiseKeeper useful.

Using an open-weight model gives me more flexibility in how and where the AI runs. I can use serverless inference today, but the application isn't fundamentally tied to one closed AI provider.

That makes it easier to experiment, self-host, or change the inference setup as the project grows.


My Agent Session

Building PromiseKeeper: an AI memory for commitments
You

Build a polished PromiseKeeper MVP: an AI memory for promises, using Next.js, MongoDB Atlas, and Gemma through DigitalOcean.

Agent

Implemented a complete PromiseKeeper MVP with a responsive dashboard, anonymous browser-scoped user IDs, editable promise extraction, MongoDB persistence, grounded memory questions, status updates, validation, rate limiting, health checks, and server-only environment variables.

You

Gemma returned HTTP 402 and asking memory failed.

Agent

Diagnosed HTTP 402 as DigitalOcean Serverless Inference billing or balance suspension. Added safe local fallbacks for extraction and grounded memory answers so the app remains usable while Gemma is unavailable.

You

Render could not save promises.

Agent

Improved MongoDB connection handling for Render with runtime environment lookup, bounded connection timeouts, retryable connection state, safe server logs, health diagnostics, and deployment documentation covering Render variables and MongoDB Atlas network access.

You

Update the UI: remove demo controls, restore placeholder-only Person and Deadline fields, and replace the header logo with the supplied pinky-promise hands image.

Agent

Removed demo controls, restored blank controlled inputs with muted placeholders, added the supplied local promise-hands.png asset, and updated the PromiseKeeper header logo. Lint, typecheck, and production build passed.


Prize Categories

  • Best Use of Gemma
  • Best Use of MongoDB Atlas
  • Best Use of DigitalOcean
  • Best Use of Render

Top comments (0)