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
Live handoff / REL-7
Client / #acme
JD
Jane

Checkout is broken. It throws a 500 when I submit.

Seen by Relay
Team / #eng-acme
Checkout throws a 500 REL-7 · Bug · Jane in #acme Needs triage · unassigned

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.

01

A request arrives

Relay watches a paired client channel and creates a triage card in the right engineering channel.

02

Someone owns it

A raised-hand reaction claims the request. !start, !ask, and !block keep the state honest.

03

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.

  1. 01
    One clock per engineerStarting another task pauses the current one, so time cannot quietly double-count.
  2. 02
    Retries do not duplicate workSlack redelivery is safe because each client message maps to one task.
  3. 03
    The ledger survives the interfaceTask state, sessions, and events live in a persistent SQLite database.
Terminal / five minutes
# 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.