-
-
A live sweep: the agent plans queries, searches a month of history with the Real-Time Search API, and cites every matched thread.
-
Verify before nudge: it re-read the thread, saw the question was already answered, and closed the loop itself. No ping was sent.
-
The Home dashboard: what you owe, what you're owed, and workspace impact.
-
Loops aren't trapped in Slack: Claude Desktop asks the MCP server what I'm waiting on and gets live answers with links to each thread.
-
Track any message as a loop with one shortcut. Note the footer: source message content is never stored, only pointers and paraphrases.
Inspiration
Every team I've worked on has the same failure mode. Someone asks a question and nobody answers. Someone says "I'll send it by Friday" and Friday quietly passes. Nothing is broken enough to escalate, so nothing gets fixed. Slack's 2026 Workforce Index has a stat that stuck with me: 40% of desk workers have used an AI chatbot, but only 23% have ever had one actually complete work for them. Most Slack AI tools summarize, search, and draft. I wanted to build one that finishes something.
What it does
Loop Closer hunts for open loops in your workspace: unanswered questions, unkept commitments, requests waiting on someone, and action items nobody owns.
You DM it "sweep #channel last month" and it searches live with Slack's Real-Time Search API, streams its plan as it works (you watch it search and classify, with source links), and turns what it finds into tracked, typed loops with owners and due dates.
Before it ever nudges a human, it re-reads the thread. If the question already got answered, it closes the loop instead of pinging anyone, and increments a "nudges avoided" counter. I think that metric is the most honest thing in the app. An agent that interrupts people is easy; an agent that knows when not to is the point.
When a nudge is genuinely needed, you approve every word. Drafts are AI-improved but editable, delivery is rate-capped per person, and nothing goes out during the owner's quiet hours in their own timezone. A Home dashboard shows what you owe, what you're owed, and the metrics. A checkmark reaction can close a loop. Snoozed loops wake themselves up through a daily digest.
And because your commitments shouldn't be trapped in one app, Loop Closer is also an MCP server. From Claude Desktop I can ask "what am I waiting on from my team?" and get the live ledger with permalinks back into Slack.
How we built it
TypeScript, Bolt with Socket Mode, Postgres with Prisma, and claude-sonnet-5 with structured outputs for classification and resolution verdicts. Deployed as an always-on worker on Railway. 345 automated tests.
Challenges we ran into
I discovered that freshly posted messages take a long time to become visible to RTS retrieval even though Slack's own search bar finds them instantly. My demo data was invisible to my own product. Diagnosing that (it's the semantic index lagging the lexical one) and re-planning the demo around older, already-indexed conversations was the most stressful debugging of the project.
Accomplishments that we're proud of
The verify-before-nudge moment works reliably, live, every time: click Nudge, watch it discover the answer already exists, watch it close the loop instead. Building a full loop lifecycle (detect, verify, nudge, escalate, close, wake), with the privacy story intact end to end. And the moment Claude Desktop first answered "what am I waiting on?" from the same ledger Slack writes to.
What we learned
Platform constraints aren't footnotes, they're the architecture. Nearly every interesting design decision in Loop Closer exists because a measured fact contradicted my assumption. I also learned that for agents that act on people (not just data), the guardrails are the product: the confidence bar for auto-close, the caps, the quiet hours. Those took as long as the pipeline and were worth it.
What's next for Loop Closer
Multi-workspace OAuth and a Slack Marketplace listing (the internal-app architecture was scoped for this from day one), richer escalation paths, and team-level analytics on where loops die. The goal stays the same: fewer pings, more closed loops.
Built With
- anthropic
- bolt
- claude
- mcp
- node.js
- postgresql
- prisma
- railway
- real-time-search-api
- slack
- socket-mode
- typescript
- vitest
- zod

Log in or sign up for Devpost to join the conversation.