Inspiration

Digital accessibility is a fundamental human right, but in fast-paced corporate communication, it is often treated as an afterthought. While Slack provides a native setting to remind or force users to add alt-text to their image uploads, it suffers from a massive compliance gap: it cannot evaluate the quality of the text.

Users frequently bypass the platform's warning by typing lazy placeholders like "a graph", "image", or "test". While this technically fulfills the platform's requirement, it fails the core mission of inclusion, leaving blind and low-vision colleagues who rely on screen readers completely in the dark. I am inspired to build Alt-Text Assistant to bridge this exact platform gap.

What it does

Alt-Text Assistant is an agent that audits image uploads inside Slack against an organization's specific accessibility policies.

  • Proactive Monitoring: When a user drops an image into a public channel without high-quality alt-text, the agent instantly analyzes it. Instead of a generic warning, it sends a helpful nudge containing a fully drafted, context-rich alternative text description that the user can copy-paste to edit their post.
  • Interactive Workspace Drafting: Users can direct message (DM) the assistant. This allows teams to safely draft and optimize complex image descriptions in a private sandbox before sharing them publicly.

How I built it

The project is built on Node.js using the Slack Bolt for JavaScript framework. The core architecture relies entirely on the latest generation of Slack capabilities and advanced AI reasoning:

  • Slack AI Capabilities & Real-Time Search (RTS) API: When an image is uploaded in DM, the agent dynamically triggers the RTS API to query the workspace for pinned company accessibility documents (such as policies pinned in an #accessibility-standards channel).
  • Vision LLM Processing: The live policy snippet and the raw image payload are securely fed into OpenAI's GPT-4o Vision engine. The model evaluates whether the existing text is compliant, and if not, generates a highly precise description according to the guidelines.
  • Stateless Resiliency: By fetching rules via the RTS API on demand, the agent remains completely stateless. Workspace admins can change the pinned policy document, and the bot instantly obeys the new rules on the very next upload—requiring no external database.

Challenges I ran into

  • Slack API Ephemeral Limitations: I discovered that Slack's chat.postEphemeral API behaves unpredictably and often fails silently when attempting to send ephemeral messages inside existing threaded conversations. To guarantee delivery and ensure a smooth user experience, I engineered a bifurcated routing system: the agent sends private ephemeral nudges for top-level channel messages, but seamlessly pivots to standard, anchored public replies when operating inside a thread.
  • Complex State Handling in Vision Prompts: Evaluating image metadata using an LLM required highly precise decision logic. I had to engineer a strict set of prompt constraints to ensure the Vision model could reliably handle three distinct scenarios: when alt-text was entirely empty, when it was present but inaccurate or lazy (e.g., "test" or "image"), and when it was already highly accurate. Balancing this logic so the model wouldn't hallucinate or unnecessarily rewrite perfectly good text took extensive iteration.
  • Designing a Proactive Onboarding Flow: I wanted the bot to actively educate users without being spammy. Designing this required hooking into Slack's app_home_opened event and dynamically evaluating the user's direct message history. I implemented logic that checks if it is the user's first time interacting with the agent; if their message history is empty, it triggers a comprehensive, one-time welcome guide explaining our accessibility standards and how to use the private DM sandbox.

Accomplishments that we're proud of

  • A Legitimate Product Fix: I didn't just build a fun bot; we successfully identified and fixed an active enterprise gap in Slack's native compliance infrastructure.
  • Zero-Clutter UX: The agent works beautifully through inline context nudges and assistant panes, keeping main channels completely clear of bot noise.
  • Enterprise-Ready Statelessness: I built a highly dynamic compliance tool without needing to manage, host, or pay for a dedicated database, relying purely on Slack's native context layers.

What we learned

I learned a massive amount about working with Slack's modern Agentic framework and the realities of designing for accessibility. We discovered that building great software for assistive technologies requires shifting from a "checkbox mindset" to evaluating semantic quality. I also gained deep experience in prompt structuring for LLMs to guarantee outputs suitable for production code.

What's next for Alt-Text Assistant

  • Dashboard: Giving workspace admins a weekly analytics view of channel accessibility scores and compliance rates.
  • Multi-Language Support: Auto-detecting the primary language of a channel to draft alternative text localized to global teams.
  • Deep Native Integration: If Slack releases an API that lets agents to modify the alt-text for an image then our agent will use it to automatically write the approved alt-text into the image object programmatically, removing the copy-paste step entirely.

Built With

Share this project:

Updates

posted an update —

Quick update: Bug fix for Slack mobile for one click copying

While testing the agent on slack mobile app, I noticed a bug when trying to copy the generated alt-text using Slack's native "Copy text" menu. It kept grabbing the wrong fallback strings instead of the actual description.

I just deployed a fix to the live app. The agent now wraps the suggested alt-text in a Markdown code block. This lets users to copy the exact alt text on mobile too.

(Note for the judges: Because I squashed this bug after submitting, the live app will look slightly different and function much better than the UI shown in the original demo video.)

Log in or sign up for Devpost to join the conversation.

Submission history