Skip to content

Repository files navigation

Lull

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.

Lull MCP Agent Architecture

Built for the Slack Agent Builder ChallengeSlack Agent for Good track.


Quick demo — try these in Lull's DM

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

Why Lull?

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.

What makes Lull different

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.

How Lull helps employees with disabilities

Blindness and low vision

  • 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 .txt files for easy consumption.
  • Emoji stripping — Removes emoji from all output so screen readers don't read out "grinning face with smiling eyes" mid-sentence.

Chronic migraines, sensory processing disorders, and fatigue conditions

  • 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.

ADHD and executive function challenges

  • 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.

Motor disabilities and repetitive strain injuries

  • 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.

Accessibility compliance and the law

The regulatory landscape is shifting

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.

How Lull helps workspaces stay compliant

  • 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.


Features at a glance

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

How Lull compares

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

How Lull complements Slack's built-in accessibility

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

Getting started

Prerequisites

  • Node.js 20+
  • A Slack workspace with admin access
  • A Google Gemini API key (get one free)

Environment variables

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 key

Optional:

SLACK_USER_TOKEN=xoxp-...       # User token for RTS search
LLM_MODEL=gemini-3.5-flash     # Model override (default: gemini-3.5-flash)

Install and run

npm install          # Install dependencies
npm run dev          # Development mode (live reload)
npm run build        # Compile TypeScript
npm start            # Run compiled output

Slack app setup

  1. Create a new Slack app from manifest.json at api.slack.com/apps
  2. Enable Socket Mode and create an app-level token with connections:write scope
  3. Install to your workspace and copy the bot token
  4. 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.


Slack AI capabilities used

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

Architecture

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)

MCP tools

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


Development

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 mode

Responsible AI

Lull 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).

Hackathon

  • 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

About

An accessibility-first Slack agent: alt-text guardian, streaming catch-up digests, and vision-aware assistive features.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages