a 10x pm for everyone.
always in the background.
it watches every GitHub and Slack thread and finds who owes a reply. you get a draft for their dm, and nothing sends unless you send it.
three commands
set three secrets, point both webhooks at the Worker, then deploy. that's the install.
- one org-wide GitHub App, so every repo's threads show up.
- one Slack app, every channel it's invited to.
one primitive per concern
every concern maps to a Cloudflare primitive. no servers, no queue to host, no database to run.
one interface, any platform
github and slack are just adapters behind one interface. implement it and the whole engine runs on a new platform — the llm provider is an adapter too.
interface Platform {
id: PlatformId;
listThreads(query): Promise<Array<Thread>>;
getThread(nativeId): Promise<Thread>;
getTimeline(nativeId): Promise<Array<TimelineEvent>>;
discoverLinks(thread): Promise<Array<Link>>;
postMessage(target, body): Promise<{ id: string }>;
editMessage(messageId, body): Promise<void>;
react(messageId, emoji): Promise<void>;
notifyPerson(identity, body): Promise<void>;
}five stages, queues between them
a thread moves through one stage at a time. one Durable Object per thread serializes the work, so two events can't make two nudges. the engine never names GitHub or Slack. both are adapters.
a webhook or sweep lands. the adapter turns it into a thread, then upserts links and participants.
detectors read the timeline and decide what's owed. no model runs here. signals fire or clear.
it rewrites the thread's notes comment. it re-posts only when the content hash changed.
open signals become nudges. apply prefs, pick the channel by priority, dedupe, back off.
what wasn't worth a dm rolls up. one digest per person, one cluster-notes summary per org.
it edits its own things only. its notes, its dms. anything on your turf is a draft you approve with one reaction.
one nudge per person, thread, and signal. a second one buys nothing, so it drops to a digest. mute and snooze always win.
plain logic decides what's owed. the model does two things: judge if a reply answered, and word the nudge.
every capability ships turned off. you turn each one on when you trust it, one at a time.
seven things it watches
each one is plain logic over the timeline. every threshold is config. the quiet window counts business days. when a thread closes, its signals clear.
signals are data. add a detector. a contract test feeds it a timeline fixture and checks the right signal comes out.