The accessibility-first Slack agent that helps every employee participate fully — regardless of ability.
Alt-text enforcement, streaming catch-up digests, cognitive fatigue accommodation, file summarization, and compliance tracking — all shaped by per-user vision profiles.
Built for the Slack Agent Builder Challenge — Slack Agent for Good track.
| Say this | What happens |
|---|---|
Catch me up on #general |
Streams a structured digest of recent channel activity with action items extracted |
Catch me up on #design #engineering |
Multi-channel digest in one request |
Catch me up on #social skip gifs |
Digest without GIF descriptions (reduces noise) |
I'm fried |
Activates fried mode — all output becomes ultra-short, simple language |
I'm fried, catch me up on #general |
Fried mode + digest in one command |
Back to normal |
Exits fried mode |
Scorecard for #engineering |
Shows alt-text compliance stats for the channel |
Schedule daily digest for #general at 09:00 |
Automatic daily summary DM at that time (UTC) |
Cancel digest |
Stops your scheduled digest |
Preferences |
Shows your current vision profile |
Help |
Lists all commands |
| (send an image) | Describes the image for screen readers |
| (send a PDF, CSV, or text file) | Summarizes the file content |
| (right-click any message → "Describe this image") | In-channel image description via message shortcut |
Slack is where work happens — but not equally. Employees with disabilities face daily friction that their coworkers never see:
- A blind engineer encounters an unlabeled screenshot and has to ask a colleague what it shows.
- A developer with chronic migraines opens Slack after lunch to 200 unread messages and can't process them.
- A project manager with ADHD scrolls through #general three times and still misses the action item assigned to them.
- A team lead with low vision can't read the PDF someone dropped in the channel.
Lull eliminates these barriers. It's the only Slack app that combines intelligent content summarization with accessibility-first design — adapting its output to each user's specific needs.
Every other Slack digest tool (Slack AI, Spoke.ai, Recal, Catch Up) treats accessibility as an afterthought, if they consider it at all. Accessibility-focused tools (like khiga8's bot) only do passive reminders. Lull is the only app that bridges both worlds:
- Digest tools summarize channels but don't adapt output for screen readers, don't accommodate cognitive fatigue, and don't track accessibility compliance.
- Accessibility tools remind users to add alt-text but don't generate descriptions, don't summarize content, and don't enforce compliance.
- Lull does all of it — and shapes every response to each user's vision profile, fatigue level, and assistive technology needs.
- Alt-text guardian — When someone posts an image without alt-text, Lull generates a description and nudges the poster to apply it with one click. No more blank voids for screen reader users.
- Image and screenshot descriptions — Right-click any image in any channel and choose "Describe this image" to get an instant accessible description.
- GIF context in digests — GIFs from GIPHY and Tenor are described in catch-up digests (e.g., "responded with a GIF of Homer Simpson looking surprised") so blind users don't miss the social context.
- Screen-reader mode — Outputs plain, linear text with no visual formatting tricks. Digests are also exported as
.txtfiles for easy consumption. - Emoji stripping — Removes emoji from all output so screen readers don't read out "grinning face with smiling eyes" mid-sentence.
- Fried mode — Say "I'm fried" and Lull switches to ultra-short, simple-language output: 3-5 bullet points max, one sentence each, no jargon, no section headings. Designed for days when processing dense information is physically painful.
- Catch-up digests — Instead of scrolling through hundreds of messages during a migraine, get a structured summary with action items pulled out separately. Eliminates the sustained visual attention that triggers symptoms.
- Scheduled daily digests — Automatic summaries delivered at a chosen time, so employees recovering from a migraine episode can catch up without the cognitive load of real-time monitoring.
- Skip GIFs option — Animated content can trigger migraines and seizures. Say "catch me up skip gifs" to exclude GIF descriptions entirely.
- Structured action items — Every digest automatically extracts to-dos, follow-ups, and requests assigned to specific people. No more re-reading a channel three times to find what needs your attention.
- Multi-channel digests — "Catch me up on #engineering #design #social" processes all three channels in one request, reducing context-switching.
- Verbosity profiles — Choose brief (short bullets), normal, or detailed output. Brief mode is ideal for ADHD users who need the signal without the noise.
- Proactive context awareness — When you navigate to a channel, suggested prompts update automatically so you don't have to remember Lull's commands.
- Conversational interface — Everything works through natural language in Lull's DM. No menus to navigate, no buttons to click, no settings pages to find. Say what you need and Lull does it.
- Scheduled digests — Eliminate the repetitive action of manually requesting catch-ups every morning.
The DOJ's 2024 ADA Title II rule establishes WCAG 2.1 Level AA as the mandatory technical standard for digital accessibility. While the rule currently applies to state and local governments (compliance deadlines: April 2027 for large entities, April 2028 for smaller ones), it signals a clear direction — and private-sector employers face growing pressure from ADA Title III lawsuits, Section 508 requirements, and the European Accessibility Act (June 2025).
WCAG 2.1 AA requires that non-text content have text alternatives (Success Criterion 1.1.1). Every image posted in Slack without alt-text is a potential compliance gap.
- Accessibility scorecard — Per-channel compliance tracking shows exactly how many images have alt-text, the compliance percentage, and a visual progress bar. Ask "scorecard for #channel" or Lull auto-generates one when joining a channel. This gives accessibility officers and team leads concrete, auditable data.
- Proactive alt-text enforcement — Rather than relying on opt-in reminders (Slack's current approach, off by default), Lull actively detects images without alt-text, generates AI descriptions, and nudges posters to apply them — with WCAG context explaining why it matters.
- One-click remediation — Posters can apply AI-generated alt-text with a single button click, reducing the friction that causes most people to skip it.
- Trend visibility — Track whether your team's alt-text compliance is improving over time, channel by channel.
- Channel-join audit — When Lull is invited to a channel, it immediately scans the last 100 messages and reports the current alt-text compliance rate, giving teams a baseline to improve from.
Organizations preparing for WCAG compliance in their digital workplace tools can use Lull's scorecard as both an enforcement mechanism and an audit trail.
| Feature | How it works |
|---|---|
| Alt-text guardian | Detects images without alt-text, generates descriptions via Gemini Vision, nudges with Apply/Dismiss + WCAG context |
| On-demand describe | "Describe this image" shortcut on any message, or DM an image directly |
| Streaming digests | "Catch me up on #channel" streams structured summaries word-by-word with rotating status |
| Action items | Automatically extracted from digests and rendered as a separate section |
| File summarization | DM a PDF, CSV, or text file for an accessible summary |
| Scheduled digests | "Schedule daily digest for #channel at HH:MM" for automatic daily DMs |
| Fried mode | "I'm fried" activates ultra-short, simple-language output |
| Accessibility scorecard | "Scorecard for #channel" shows alt-text compliance stats with progress bar |
| Vision profiles | Verbosity, screen-reader mode, emoji stripping, compact blocks |
| GIF/media context | GIF alt-text extracted from nested attachment blocks; optional skip |
| Multi-channel | "Catch me up on #a #b #c" processes multiple channels in one request |
| Guided onboarding | Welcome explainer, preferences form, interactive walkthrough, contextual tips |
| App Home tab | Persistent quick-start guide, profile summary, schedule status, command reference |
| MCP tools | 5 tools via Model Context Protocol for external agent integration |
No other Slack app — including Slack AI — combines channel catch-up with accessibility-first design. Existing tools fall into two non-overlapping categories: digest tools that ignore accessibility, and accessibility tools that only do passive reminders. Lull bridges this gap.
| Feature | Lull | Slack AI | Spoke.ai | Recal | Catch Up | khiga8 bot |
|---|---|---|---|---|---|---|
| Streaming channel digests | Yes | Yes | Yes | Yes | Yes | No |
| Structured action item extraction | Yes | No | No | Yes | No | No |
| Multi-channel in one request | Yes | No | No | No | No | No |
| File summarization (PDF/CSV/text) | Yes | No | No | No | Yes | No |
| Scheduled daily digests | Yes | No | No | Yes | No | No |
| Fried mode (cognitive fatigue) | Yes | No | No | No | No | No |
| Vision profiles (verbosity, screen-reader) | Yes | No | No | No | No | No |
| GIF alt-text in digests | Yes | No | No | No | No | No |
| Screen-reader .txt export | Yes | No | No | No | No | No |
| Proactive alt-text generation (AI) | Yes | No | No | No | No | No |
| One-click alt-text apply | Yes | No | No | No | No | No |
| Accessibility scorecard | Yes | No | No | No | No | No |
| Skip GIFs option | Yes | No | No | No | No | No |
| Guided onboarding + App Home tab | Yes | No | No | No | No | No |
| MCP server | Yes | Yes | No | No | No | No |
| Free / self-hosted | Yes | No (paid) | Freemium | Freemium | $15/workspace | Yes |
| Area | Slack built-in | Lull |
|---|---|---|
| Alt-text | Opt-in reminders (off by default) | Proactive AI generation + nudge + compliance tracking |
| Screen readers | Message verbosity toggles | Profile-driven output shaping + plain-text export |
| Cognitive fatigue | None | Fried mode with ultra-short, simple language |
| Digests | Thread summaries (Slack AI, paid) | Streaming channel digests with action items + scheduling |
| Files | Preview only | AI-powered PDF/CSV/text summarization |
| Compliance | None | Per-channel scorecard with trend tracking |
| GIF/media context | Not described for screen readers | GIFs detected and described in digests |
| Onboarding | Static help page | Guided walkthrough + App Home tab + contextual tips |
| Emoji-free output | Not available | All digests strip emoji for screen-reader clarity |
| Adaptation | Static settings | Per-user profiles that shape all LLM output |
- Node.js 20+
- A Slack workspace with admin access
- A Google Gemini API key (get one free)
Copy .env.example to .env and fill in:
SLACK_BOT_TOKEN=xoxb-... # Bot token
SLACK_APP_TOKEN=xapp-... # App-level token (Socket Mode)
GEMINI_API_KEY=... # Google Gemini API keyOptional:
SLACK_USER_TOKEN=xoxp-... # User token for RTS search
LLM_MODEL=gemini-3.5-flash # Model override (default: gemini-3.5-flash)npm install # Install dependencies
npm run dev # Development mode (live reload)
npm run build # Compile TypeScript
npm start # Run compiled output- Create a new Slack app from
manifest.jsonat api.slack.com/apps - Enable Socket Mode and create an app-level token with
connections:writescope - Install to your workspace and copy the bot token
- Add the bot to channels where you want alt-text monitoring (
/invite @Lull)
The push pipeline requires message.channels event subscription and bot presence in channels. The channel-join scan triggers automatically when Lull is invited to a channel.
| Technology | Usage |
|---|---|
Agent framework (agent_view) |
DM-based agent experience with app_home_opened, app_context_changed, message.im event handlers, assistant.threads.* APIs for status/title/prompts |
| Chat streaming | chat.startStream / appendStream / stopStream for real-time digest delivery |
| Native feedback buttons | context_actions block with feedback_buttons element for response quality tracking |
| Real-Time Search API | assistant.search.context with action tokens for semantic channel search (falls back to conversations.history) |
| MCP server | 5 tools via stdio transport: get_user_profile, list_profiles, describe_image, catch_up, get_scorecard |
Lull runs as a Slack Bolt app (v4.7+) in Socket Mode with the agent DM experience (agent_view). It uses Google Gemini (gemini-3.5-flash primary, gemini-3-flash-preview fallback on 503) for LLM text generation and vision-based image description, with SQLite (WAL mode) for persistence.
src/
app.ts Entry point (Socket Mode bootstrap + background jobs)
assistant.ts Agent event handlers, App Home tab, walkthrough, contextual tips
router.ts Intent classifier (catch-up, schedule, scorecard, fried, etc.)
db.ts SQLite connection + schema + migrations
types.ts Shared types, action IDs, Block Kit helpers
flows/ Business logic
catchUp.ts Streaming digest generation with action item extraction
fileSummarize.ts PDF/CSV/text file summarization via Gemini
scheduledDigest.ts Background job for automated daily digests
screenshotDecode.ts On-demand image description
onboarding.ts Welcome explainer, preference setup, profile summary UI
content/ Shared content constants
capabilities.ts Feature descriptions, key phrases, command references
guardian/ Alt-text guardian (push pipeline)
altTextGuardian.ts Image detection, description, WCAG-aware nudge flow
compliance.ts State machine (pending -> nudged -> compliant/dismissed)
scorecard/ Accessibility compliance tracking
store.ts SQLite-backed per-channel scorecard
format.ts Block Kit scorecard rendering
services/ External API integrations
llm.ts Gemini SDK (chat + streaming + vision) with 503 fallback
vision.ts Image/file download + vision description (Slack + public GIF hosts)
rts.ts Slack RTS / conversations.history fallback, nested GIF block extraction
profile/ Vision profile engine
types.ts VisionProfile + DigestSchedule interfaces
store.ts SQLite-backed profile storage (7-day TTL, schedule persistence)
format.ts System prompts (catch-up, image, file summarize) + Block Kit formatting
security/ Defense-in-depth security
constants.ts Security limits (file sizes, rate limits, host allowlists)
rateLimiter.ts Per-user sliding-window rate limiter
safeLogger.ts Token-redacting logger
inputSanitization.ts Null byte / control char stripping
outputValidation.ts LLM output token redaction + length caps
urlValidation.ts SSRF prevention (host allowlist, HTTPS-only)
util/ Utilities
sanitize.ts Alt-text output sanitizer (prompt leak + PII redaction)
slack.ts Safe property access + app_context entity resolution
feedback.ts Native feedback button generation
backgroundWorker.ts Recurring background job runner
userStage.ts In-memory walkthrough/tip tracking per user
time.ts Common time duration constants
mcp/ Model Context Protocol
server.ts MCP tools (stdio transport)
Lull exposes 5 tools via Model Context Protocol for external agent integration:
| Tool | Description |
|---|---|
get_user_profile |
Get a user's vision profile |
list_profiles |
List all stored profiles (user IDs redacted) |
describe_image |
Generate sanitized alt-text for a Slack image |
catch_up |
Generate a catch-up digest for a channel |
get_scorecard |
Get accessibility scorecard for a channel |
Run the MCP server: npm run mcp
npm run typecheck # TypeScript type checking
npm run lint # ESLint
npm run format # Prettier (write)
npm run format:check # Prettier (check only)
npm test # Run all tests (vitest)
npm run test:watch # Watch modeLull uses Google Gemini for content generation. Key practices:
- AI disclosure: Digests and alt-text descriptions are AI-generated and should be treated as suggestions, not authoritative descriptions.
- Data minimization: Only user preferences and aggregate channel statistics are stored locally. Message content is processed in real-time and discarded — never persisted.
- PII protection: Alt-text output is sanitized to strip emails, phone numbers, prompt leaks, and markdown artifacts. Logs automatically redact tokens and API keys.
- Profile TTL: User profiles auto-delete after 7 days of inactivity.
- SSRF prevention: Image downloads are restricted to HTTPS with host allowlisting (Slack CDN, Tenor, GIPHY).
- Track: Slack Agent for Good (accessibility)
- Technologies: Slack AI capabilities (agent framework, chat streaming, native feedback buttons), Real-Time Search API (
assistant.search.context), MCP server integration - Impact: Addresses accessibility gaps for the 2.2 billion people worldwide with vision impairments, plus employees with chronic migraines, ADHD, sensory processing disorders, motor disabilities, and other conditions that affect information processing in the workplace
For hackathon judges: grant sandbox access to slackhack@salesforce.com and testing@devpost.com.
Built by bloo-berries