Connect your team once.
Every app after that just works.
Relay turns your Slack workspace into the identity, roles, and permission layer for every internal tool your team builds. Ship app #2 with the same effort as app #1: none.
Free while in beta · No credit card · Uninstall from Slack anytime
Requests
Signed in as Bob · Manager
Buy microphones for the podcast
by Carol
Upgrade Figma seats
by Frank
Offsite in October
by Grace
How it works
One handoff. Then every app is already onboarded.
What you get
The boring 80% of every internal tool, done once.
Roles, once
Admin, Manager, Member — defined per workspace, honored by every app automatically.
Channel-scoped apps
Install an app for one team or the whole workspace. Access is enforced server-side, not just hidden in the UI.
Build in minutes
Describe an app, choose its capabilities, pick a scope. It's live for your team before the meeting ends.
A store for internal tools
Publish to your workspace or to every Relay team. Installs go through a consent flow admins can see and approve.
Notifications where people are
relay.notify() posts straight to Slack. New app installed? Your team gets a link that opens already signed in.
Transparent capabilities
Every app declares what it reads and writes — members, tables, notifications — before anyone installs it.
For builders
An SDK that already knows who's asking.
Apps never pass a user id or workspace id. Every call is resolved server-side from the session and re-verified against membership, roles, and team scope on each request. You write the feature; Relay handles who's allowed to use it.
- currentUser(), members.list(), roles.current()
- table(name) — scoped, per-app storage with author checks
- notify() — lands in Slack, links back into the app
import { relay } from "@relay/sdk";
// Who's here? Already resolved from Slack.
const me = await relay.currentUser();
const team = await relay.members.list();
// Roles are the workspace's roles. Nothing to configure.
if ((await relay.roles.current()).includes("Manager")) {
await relay.table("requests").update(id, { status: "approved" });
await relay.notify(requester, "Your request was approved ✅");
}Your team is already in Slack. Start there.
Two minutes to connect. Your first app is installed before you finish reading this.