Equal access to the workplace conversation is not a premium feature. It is a right.
Slack Agent Builder Challenge · Track: Agent for Good
One billion people worldwide have a hearing impairment. Fifteen percent of the global workforce has a recognized disability. And yet Slack — the platform where remote work actually happens — has no native accessibility layer.
- Deaf/HoH employees miss Huddle decisions because there are no summaries
- ADHD employees are overwhelmed by 200+ unread messages every morning
- Non-native speakers can't decode idioms like "let's not boil the ocean"
- Autistic employees can't parse ambiguous requests like "take a look at some point"
EchoAccess closes all four gaps.
| Feature | Trigger | What Happens |
|---|---|---|
| 🎙️ Huddle Summary | Huddle ends (Slack AI transcript) | Structured Canvas summary + private DM to Deaf/HoH users |
| ☀️ Smart Morning Digest | Daily cron at user's time | Priority-ranked 🔴🟡🟢 digest via RTS API |
| ♿ Thread Simplifier | React ♿ on any message | Plain-English summary → private DM |
| 🌍 Idiom Translator | React 🌍 on any message | Idioms decoded in your language → private DM |
| 🔍 Ambiguity Resolver | @EchoAccess mention | Urgency + intent + tone analysis → private DM |
| 🔔 Mention Alert | Every 15 min (cron) | Proactive DM when Deaf/HoH users are @mentioned |
| ⚙️ App Home Settings | Open App Home tab | Full configuration UI for all preferences |
Privacy rule: All individual outputs are private DMs. EchoAccess never posts publicly on behalf of a user.
| Layer | Technology |
|---|---|
| Agent Framework | @slack/bolt v4 (Socket Mode) |
| Language | TypeScript 5.x |
| Runtime | Node.js 20 LTS |
| LLM (Quality) | Claude Sonnet — Huddle summaries, morning digest |
| LLM (Speed) | Claude Haiku — reactions (<10s), ambiguity resolver |
| Search | Slack Real-Time Search API (assistant.search.context) with conversations.history fallback |
| AI Dependency | Slack AI Huddle transcription (Business+ plan) |
| User Storage | Vercel KV (Redis) |
| Scheduling | node-cron |
┌─────────────────────────────────────────────────────────┐
│ SLACK WORKSPACE │
│ Events: reaction_added · app_mention · message │
│ APIs: assistant.search.context (RTS) · canvases.create │
└───────────────┬─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ EchoAccess (Bolt v4 · Socket Mode) │
│ │
│ Handlers: │
│ ├── huddleEnded.ts → Path A: Transcript → Canvas │
│ ├── huddleStartAlert.ts→ Path A': Alert Deaf/HoH │
│ ├── reactionAdded.ts → Path B: ♿ Simplify │
│ │ → Path C: 🌍 Translate │
│ ├── appMention.ts → Path D: @EchoAccess Ambiguity │
│ ├── morningDigestCron → Path E: Cron → RTS → Digest │
│ ├── mentionAlert.ts → Path F: Mention Alert Cron │
│ ├── appHome.ts → Settings UI │
│ └── slashCommand.ts → /echo commands │
│ │
│ Services: │
│ ├── claude.ts → Sonnet (quality) + Haiku (speed)│
│ ├── rtsSearch.ts → Real-Time Search API │
│ ├── mcpCanvas.ts → Canvas creation │
│ ├── sendDM.ts → Privacy-first DM utility │
│ └── userPrefs.ts → Vercel KV preferences │
└───────────────┬─────────────────────────────────────────┘
│
▼
🔒 ALL OUTPUTS → PRIVATE DMs (never channel posts)
- Node.js 20+
- A Slack workspace (Business+ for Huddle transcription)
- AI provider key (Gemini default, plus optional OpenAI, Anthropic, or OpenRouter BYOK)
- Slack user token for full RTS-powered digests
- Vercel KV or Redis instance
# 1. Clone and install
cd echoaccess
npm install
# 2. Configure environment
cp .env.example .env
# Edit .env with your tokens
# 3. Create Slack app
# Use slack.json as your app manifest in api.slack.com
# 4. Run in development
npm run dev
# 5. Build for production
npm run build
npm startSLACK_SIGNING_SECRET=... # Slack app signing secret
SLACK_CLIENT_ID=... # OAuth client ID
SLACK_CLIENT_SECRET=... # OAuth client secret
STATE_SECRET=... # OAuth state secret
SLACK_BOT_TOKEN=replace_with_slack_bot_token
SLACK_APP_TOKEN=replace_with_slack_app_level_token
SLACK_USER_TOKEN=replace_with_slack_user_token
GEMINI_API_KEY=
REDIS_URL=redis://... # Redis connection string
ENCRYPTION_KEY=... # 32-byte key material for BYOK encryptionRequired OAuth Scopes:
reactions:read— detect ♿ and 🌍 reactionschannels:history,groups:history— read messages and threadschat:write— send DMsim:write,im:history— DM conversationschannels:read,groups:read— channel metadatausers:read— user infocanvases:write— create Huddle summary Canvasessearch:read.public,search:read.users— Real-Time Search API for public results and user discovery- User scopes:
search:read.public,search:read.private— user-consented RTS access for richer digests app_mentions:read— @EchoAccess mentions
Event Subscriptions:
reaction_added— ♿ and 🌍 reactionsapp_mention— @EchoAccess for ambiguity resolvermessage.channels,message.groups— Huddle transcriptsapp_home_opened— App Home settings tab
EchoAccess directly addresses workplace communication exclusion for four distinct groups — Deaf/Hard-of-Hearing workers, ADHD employees, non-native speakers, and those who process social ambiguity differently — representing approximately 15% of the global workforce, or roughly 500 million people in employment.
| Tier | Price | Includes |
|---|---|---|
| Individual Free | $0/forever | All features, 1 user, unlimited |
| Team | $6/user/month | + Manager analytics, custom digest times |
| Enterprise | $12/user/month | + SSO, WCAG compliance, SLA |
| Nonprofit | 80% discount | Verified 501(c)(3) organizations |
MIT
EchoAccess supports Vercel Hobby with authenticated external schedules for digests and mention alerts. See docs/VERCEL_FREE_DEPLOYMENT.md.
Built for the Slack Agent Builder Challenge · Agent for Good Track