Keeda
The studio's project manager, living in Discord.
Watches the studio's Discord for promises, action items, questions and blockers, logs each one, and chases whoever owns it with escalating reminders until it's resolved — plus a daily recap with a promise board. The thing that stops 'I'll do it tomorrow' from vanishing.
It's Discord-native, not a Kanban tool. The 'board' is a promise summary posted back in-channel and a local database of open items — there's no external project-management app behind it. What makes it an agent is the tracking and the escalating nudges, not a pretty board.
// architecture
One always-on Node.js process runs a shared discord.js client with two project-manager agents. The Tracker sees every message, asks Claude Haiku whether it's a question, request, task or blocker, and if so writes it to a local SQLite store. A cron job re-checks open items every couple of hours and escalates the nudge — gentle, then firm, then critical — pinging the owner in-channel and by DM until a ✅ reaction or a reply closes it. Separately, the Recap agent paginates the day's channel history and has Claude Sonnet write a structured end-of-day recap with a promise board of who owes what.
// how it works
- 1
See everything
A shared discord.js client with Guilds / Messages / Reactions intents watches every message across the studio's channels.
- 2
Spot the commitment
The Tracker runs each message through Claude Haiku to classify it as a question, request, task or blocker — and to ignore the banter around it.
- 3
Log it
Actionable items get a row in a local SQLite store (tracked_messages) with an owner and a status.
- 4
Escalate until done
A cron job re-checks open items every couple of hours and steps the reminder up — gentle → firm → critical — pinging the owner in-channel and via DM. A ✅ / 👀 reaction or a reply (classified by Claude) flips the status.
- 5
Daily recap
At 6pm a second agent paginates the day's history and has Claude Sonnet write a structured recap with a promise board — who committed to what — posted back in the channel.
// tool calls
messageCreate listenersees every message and feeds the TrackerdetectActionable()Claude Haiku classifies a message as question / request / task / blocker → JSONstore.track / setStatusSQLite CRUD on tracked_messages + reminders_sent (better-sqlite3)checkPendingReminders() (node-cron)re-checks open items and escalates gentle → firm → criticalmessageReactionAdd (✅ / 👀)closes or acknowledges a tracked itemmessages.create (Claude Sonnet)writes the daily recap + promise board from paginated history
// reminder
// stack
// infrastructure
- ▸Runtime: one always-on Node process
- ▸Store: local SQLite (WAL)
- ▸Schedule: node-cron (recap 6pm, reminder sweep ~2h)
- ▸Models: Claude Sonnet (recap) + Haiku (classify)
- ▸Delivery: in-channel pings + DMs
// why it exists
In a studio where the 'team' is spread across Discord threads, commitments evaporate. This one remembers them and won't stop nudging — the least glamorous, most useful agent I run.