Keepword Project Story
Inspiration
Work often breaks down in the space between “we agreed on this in the chat” and “someone actually follows through.” A teammate says, “I’ll send the proposal tomorrow,” the conversation keeps moving, and the promise disappears into the scroll. We built Keepword to give teams a lightweight memory for those moments without asking them to abandon the chat where work already happens.
What it does
Keepword is a Telegram-first AI assistant for team commitments. It watches only new messages in connected group chats, identifies high-confidence promises and assignments, and asks the author or a chat administrator to confirm them. Once confirmed, Keepword keeps the commitment tied to its source message, sends the assignee a private reminder before the deadline, and provides private digests and task views. It never creates a task silently and never exposes a person’s overdue work in the group.
How we built it
We built Keepword with TypeScript, Fastify, Telegram Bot API via Grammy, PostgreSQL through Drizzle ORM, and an LLM extraction flow through OpenRouter. The bot applies a lightweight pre-filter before sending relevant messages to the model, then asks the model for a typed commitment candidate instead of free-form text.
The backend has separate modules for Telegram updates, commitment extraction, confirmation, reminders, digests, onboarding, and privacy operations. A background worker runs reminder and digest jobs every minute. We also built a static Next.js landing page that is served from the same public service as the webhook, so the project URL opens the product site while Telegram endpoints remain available.
Challenges we ran into
The hardest challenge was not extracting a possible task; it was deciding when the bot should stay quiet. A chat assistant that reacts to every message becomes noise, so Keepword only intervenes for high-confidence, actionable commitments and requires confirmation before saving anything.
Time and privacy were equally important. Natural-language deadlines need to be resolved in the group’s timezone, while reminders must arrive privately and only after a user has started a direct chat with the bot. We also had to make reminders idempotent, so worker retries cannot send duplicates, and make every callback server-authorized to protect group boundaries.
Accomplishments that we're proud of
- Keepword turns chat promises into confirmed commitments without becoming another full task manager.
- Every commitment preserves its source chat and message, so a task remains explainable.
- Private onboarding, reminders, overdue alerts, and digests respect Telegram’s communication model and team privacy.
- Chat administrators can configure mode, language, timezone, and digest time per group.
- The product supports English, Russian, and Spanish while preserving commitment titles in their original language.
- The system includes tested flows for confirmation, editing, duplicate prevention, private rescheduling, authorization, data deletion, and idempotent delivery.
What we learned
We learned that trust is a product feature, not a final polish step. Good extraction is useful, but teams only keep using an assistant when it is transparent about what it saw, cautious about what it claims, and respectful about where it speaks.
We also learned that timezones and language preferences are not small settings in a messaging product. They affect whether a reminder feels helpful or wrong. Building reliable background jobs required us to treat exact deadlines, delivery state, retries, and user consent as first-class parts of the product.
What's next for Keepword
Next, we want to validate Keepword with real teams and calibrate the assistant from confirmation, edit, and rejection signals without lowering its safety bar. We plan to improve the private commitment experience, make language behavior consistent across group and personal flows, refine reminder timing, and deepen the team’s reliability insights while preserving strict workspace and chat isolation.
Longer term, Keepword can grow into a durable memory for team agreements: not by replacing the tools teams already use, but by making sure the promises made in conversation do not get lost.
Built With
- api
- docker
- drizzle
- fastify
- grammy
- next.js
- node.js
- openrouter
- orm
- postgresql
- railway
- telegram
- typescript
Log in or sign up for Devpost to join the conversation.