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
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
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
Prize Categories
- Best Use of Gemma
- Best Use of MongoDB Atlas
- Best Use of DigitalOcean
- Best Use of Render


Top comments (0)