← agent army
DISCORD

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.

// what this actually is

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.

Discord messageTracker → Claude Haiku (classify)SQLite tracked_messagescron escalation (gentle→firm→critical)ping + DM owner✅ closes it

// how it works

  1. 1

    See everything

    A shared discord.js client with Guilds / Messages / Reactions intents watches every message across the studio's channels.

  2. 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. 3

    Log it

    Actionable items get a row in a local SQLite store (tracked_messages) with an owner and a status.

  4. 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. 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 Tracker
  • detectActionable()Claude Haiku classifies a message as question / request / task / blocker → JSON
  • store.track / setStatusSQLite CRUD on tracked_messages + reminders_sent (better-sqlite3)
  • checkPendingReminders() (node-cron)re-checks open items and escalates gentle → firm → critical
  • messageReactionAdd (✅ / 👀)closes or acknowledges a tracked item
  • messages.create (Claude Sonnet)writes the daily recap + promise board from paginated history

// reminder

Keeda:👋 still open from Tuesday:
'I'll send the store screenshots tonight' — 2 days, no update
(reply 'done' or react ✅ to close it out)

// stack

Node.js (ESM)discord.js v14Claude (Sonnet + Haiku)better-sqlite3node-cron

// 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.

← back to all agents// part of the agent army