Self-hosted Slack operations bot
Client asks. Engineering moves.
Relay turns client messages into owned engineering work, keeps both threads in sync, and records the useful history without making anyone become a project manager.
- Slack Socket Mode
- SQLite ledger
- CLI + agent skill
A client message becomes a focused triage card.
The actual workflow
Two threads. One piece of work.
The client never leaves their conversation. The team gets a clean task thread with ownership, context, and commands.
A request arrives
Relay watches a paired client channel and creates a triage card in the right engineering channel.
Someone owns it
A raised-hand reaction claims the request. !start, !ask, and !block keep the state honest.
Both sides stay current
Intentional updates return to the original client thread. The task card and ledger update at the same time.
Built around real handoffs
Less status theatre. More useful signal.
Triage by reaction
Claim real work with a raised hand. Dismiss harmless chatter with a cross. Relay keeps the channel readable.
Commands that mean what they say
Start, pause, ask, reply, assign, block, and finish from the task thread—or use the same operations from the CLI.
The boundary is deliberate.
Ordinary team discussion stays internal. Only explicit !ask and !reply messages cross back to the client.
- Thread-scoped work history
- Exact team effort, rounded client time
- Append-only event log in SQLite
- Optional Google Sheets mirror
Designed for trust
Quiet automation, visible accountability.
Relay automates the repetitive part without pretending context is automatic. People still decide what crosses the client boundary and when work is actually done.
- 01One clock per engineerStarting another task pauses the current one, so time cannot quietly double-count.
- 02Retries do not duplicate workSlack redelivery is safe because each client message maps to one task.
- 03The ledger survives the interfaceTask state, sessions, and events live in a persistent SQLite database.
# install and configure npm install cp .env.example .env # start Relay locally npm run dev # verify the live Slack config npm run doctor
Self-hosted and inspectable
Run it where your client context belongs.
Use Socket Mode locally or deploy the bot as a single Coolify service with a persistent /data volume. The public website remains just static files.
Source available · ready to self-host
Keep the work moving without losing the human thread.
Read the code, test it in a throwaway workspace, and shape Relay around how your team already works.