Now in private beta with founding teams

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

userelay.dev/spaces/acme

Requests

Signed in as Bob · Manager

4 members online

Buy microphones for the podcast

by Carol

Approved

Upgrade Figma seats

by Frank

Offsite in October

by Grace

How it works

One handoff. Then every app is already onboarded.

01

Connect Slack once

Install Relay in your workspace. Members, emails, avatars, and channels are imported and kept in sync — no invites, no CSVs.

02

Teams come from channels

Pick the channels that make up a team. Membership is derived live, so when someone joins #engineering, they're on the team.

03

Ship app #1, then #2, then #10

Every app reuses the same identity, roles, and permissions. The second app needs zero new auth, onboarding, or deploy code.

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.