Inspiration

Slack moves fast, and it quietly leaves people behind. The teammate reading in their third language. The new hire drowning in acronyms like EMEA and F25-54. The screen-reader user staring at an image-only announcement. The deaf colleague skipping every voice note. I wanted an agent whose entire job is closing those gaps, on demand when you ask, and proactively when it spots content that would exclude someone.

What it does

Bridge is an accessibility agent that lives inside Slack:

  • One-tap skills. React to any message to run a skill in-thread: globe for translation (source language identified), bulb for a plain-language rewrite, child for explain-like-I'm-five, memo for a thread summary with decisions and owners, picture frame for screen-reader alt text.
  • Living Canvas digests. /bridge digest turns a noisy channel into a shareable Canvas: TL;DR, key points, decisions, checkbox action items, open questions, and a jargon glossary in plain language. Run it again and Bridge edits the same Canvas in place. /bridge schedule hourly makes the channel document itself: the canvas carries a "last refreshed by Bridge" stamp written with zero human action.
  • Cited answers. /bridge find what did we decide about X searches the workspace and answers in plain language with sources as clickable permalinks. It never invents a citation.
  • Proactive accessibility. When a message lands in a language that differs from a teammate's saved preference, that person privately receives the translation. Every shared image is automatically described for screen readers. Voice notes are transcribed via Groq Whisper.
  • Personal profiles and measurable impact. Each person sets language (14 offered), reading level (ELI5, Standard, Pro), and verbosity in the App Home. Every assist is counted on a live impact dashboard, so inclusion becomes something a team can see: translations delivered, digests maintained, languages bridged.

How I built it

Bolt for JavaScript handles every Slack surface over Socket Mode: reactions, shortcuts, slash commands, App Home, ephemerals, and Block Kit cards. The Claude Agent SDK powers the language work, with per-user style directives injected into every prompt and two first-class custom tools: search_workspace (permalink-cited, Enterprise Grid aware) and add_emoji_reaction. The Slack MCP Server gives the conversational agent real workspace powers: search, channel reads, and canvases. The digest, catch-up, and scheduler are deterministic code pipelines (read transcript, resolve names, generate, create or edit Canvas) rather than hoping the model calls the right tool. Underneath: retries with backoff, hard timeouts on every agent flow, event dedupe with cooldowns, a boot health check for both tokens, a deleted-canvas fallback, and 59 unit tests.

Challenges I ran into

  • Enterprise Grid search silently breaks. search.messages requires the workspace team id and rejects the org id that auth.test returns. Found it live, fixed it by threading the team id through every search path.
  • Hot-reload orphans. On Windows, the dev hot-reload spawned a new app process without killing the old one. Ten instances piled up, hit Slack's Socket Mode connection limit, and would have answered every event ten times. I shipped a PID lockfile so each boot terminates its predecessor.
  • Manifest validation surprises. Slack's shortcut limit counts submitted shortcuts merged with the ones already registered, so adding a new shortcut while five existed always failed. The fix was staging the manifest update in two steps.

Accomplishments I'm proud of

Every headline flow was verified end to end in the real Slack client: the digest canvas, the in-place refresh, the cited find, the reaction skills, and the scheduler refreshing a canvas autonomously while nobody was watching. The jargon glossary regularly defines a dozen real terms per channel, which is exactly the accessibility gap I set out to close.

What I learned

Deterministic pipelines beat prompt-and-pray for anything a judge will click twice. Reliability work (dedupe, timeouts, singletons) is what makes an agent feel trustworthy. And accessibility features are best when they are measurable, not just well-intentioned.

What's next for Bridge

Reading-level-aware proactive rewrites for dense messages, per-channel language rosters so teams see which languages they bridge most, the Real-Time Search API as a second search backend, and a hosted deployment so any workspace can install Bridge in one click.

Built With

Share this project:

Updates