Bud
Turns a teammate's Discord messages into reviewed pull requests.
Watches one collaborator's messages in a private Discord server, decomposes each into discrete items, and checks feasibility against the live repo before filing GitHub issues. DMs me a per-item โ / โ gate โ approve and it dispatches a GitHub Action that runs Claude Code to open the PR.
// architecture
A second, separate discord.js bot โ its own token, locked to one Discord server โ that watches a single collaborator and never replies to them. Their stream-of-consciousness messages go to Claude Sonnet, which decomposes them into discrete typed items. For each item, Bud pulls the target repo's file tree and searches/reads the relevant files through the GitHub API, then asks Claude whether it's already built, how hard it is, and where to touch โ filing a GitHub issue and DMing me a report. Nothing proceeds without my โ on that item; the approval listener is global, so it survives restarts and works on uncached DMs.
// how it works
- 1
Watch one channel
A dedicated bot (its own token, one server) watches a single collaborator's messages โ nobody else โ and never shows itself by replying.
- 2
Decompose
Claude Sonnet breaks each message into discrete typed items โ bug or feature, priority, whether it touches the DB schema โ each with the original quote attached.
- 3
Probe the codebase
For each item Bud pulls the target repo's file tree, runs a couple of code searches and reads the relevant files via the GitHub API, then asks Claude if it's already built, how hard it is, and where to touch.
- 4
File + gate
It opens a labelled GitHub issue and DMs me a report with a โ / โ per item. The approval listener is global, so it works on uncached DMs and survives a bot restart.
- 5
Dispatch the build
On โ it fires a workflow_dispatch to a GitHub Action wired to run Claude Code โ which branches off main, implements the item and opens the PR. On โ the item is dropped. Schema-touching items are flagged, not auto-migrated.
// tool calls
analyzeMessage()Claude Sonnet decomposes a message into typed items { type, title, priority, schema-change? }GET /git/trees/main?recursive=1pulls the target repo's full file tree (session-cached)GET /search/codecontent search to locate the relevant files per itemGET /contents/{path}reads candidate files (truncated) to judge feasibility with ClaudePOST /issuesfiles a labelled GitHub issue (bug / enhancement)POST /actions/workflows/โฆ/dispatchesthe โ action โ workflow_dispatch that runs Claude Code โ PR
// approval dm
// stack
// infrastructure
- โธRuntime: separate always-on Node process
- โธState: SQLite (items + analyses, status machine)
- โธAuth: GitHub PAT (repo + workflow scope)
- โธTarget: a React / Vite / Supabase repo
- โธBuild step: workflow_dispatch โ Claude Code (in the target repo)
// why it exists
A non-technical collaborator can just describe what they want in plain English, and it comes out the other end as reviewed pull requests โ no tickets, no handoffs, no 'can you rewrite that as a spec'.