JAWS Scripts For Slack
Doug Lee
Last Revised March, 2020

This document describes the scripts for Slack and provides tips for using this application with JAWS. The scripts will load and run when focus is in either the web portal for Slack or the Windows 10 Desktop Slack application. The Desktop application is recommended for the additional keyboard shortcuts and is the best tested with these scripts as of this writing.

This document can be opened from within the application via a double press of JAWSKey+F1 (or Insert+F1) when the scripts are running.

For advice on how to use Slack with a screen reader, see the Slack-hosted article "Use a screen reader with Slack's desktop app." For an alternative, gentle introduction to using Slack with a screen reader, see J.J. Meddaugh's August, 2019 AccessWorld article, "An Introduction to Slack, A Popular Chat App for Teams and Workplaces."

Development of these scripts was funded in part by this author's employer, Level Access, for which this author is most grateful.

Table of Contents

System Requirements For JAWS Users

In addition to any system requirements for the application, the following apply for JAWS users:

Script Installation Instructions

To install these scripts on a new system:

  1. Load JAWS if this has not already been done. This will require administrative privileges on the computer.
  2. Run JAWS as the user for whom the scripts are to be installed. This and the following steps must be performed for each user of the computer who will be using JAWS with these scripts.
  3. Download and run, or run directly, the installer for these scripts; and follow the on-screen directions. Be sure to install the scripts in the currently running JAWS version if a JAWS version list is presented.
  4. To verify successful installation, type Insert+q from within the application. Part of the JAWS spoken response should be a revision number. If you do not hear a revision number, the scripts are not correctly loaded. In some cases, restarting JAWS may fix this issue.

Key Sequences

These scripts may incorporate commands that consist of sequences of keystrokes, all beginning with a common prefix, or "command key." This approach allows many script commands without conflicting with application keystrokes. By default, the command key is the left bracket ([) key; see below for how to change it if necessary. This document may refer to this key as [ or Command; so, for example, [ Tab and Command Tab both refer to typing the prefix key, then separately the Tab key. Some sequences may consist of more than two keys, or "levels"; for example, [ d r would refer to typing [, then d, then finally r.

In addition to the commands documented elsewhere, the following commands are also available, at any level, for exploring what script commands are available for this application:

If you need to change the command key, type the current command key followed by either JAWSKey+c or Insert+c. An edit box will appear into which you may type your desired command key. The current key will initially appear in the box. Then Type or spell out your desired command key and press Enter to apply the change. If the keystroke requires modifiers like Shift or Ctrl, spell those out; do not simply type, for example, A when you mean shift+a. Example keystrokes exactly as they should be typed:

Warning: If you accidentally set the command key to something you cannot type, you will currently need to edit it in these scripts' .jcf file in the JAWS user directory under the MKCSOptions section.

Script Commands and Features

These scripts provide the following commands beyond those provided by the application itself:

These scripts also provide the following features:

Tips, Tricks, and Tactics

This section presents some tricks for using Slack efficiently, according to this script author's experience.

Finding Keyboard Shortcuts

Use the Ctrl+/ Slack command to move to a list of keyboard shortcuts. Up and Down arrows can then move through available shortcuts.


Settings can be reached quickly in Slack by typing Ctrl+,. Settings consist of panels that are activated by buttons, such as "Notifications." Once you press a button to activate a panel, Tab through the other buttons to reach the panel.

Handling Calls

The pick-button command sequence, [ b, is especially helpful for finding call control buttons such as Accept and Leave Call quickly. When many buttons appear in the list, type the first letter or few letters of the desired name in order to find it more immediately.

In an active call, use the Slack native commands m and v to toggle the microphone or video (camera) on and off. If JAWS does not announce the new state, use the SayWindowTitle command, JAWSKey+t, to determine what is on and what is off.

The Message Reading System

A Slack text message can include several types of information: content, reactions, reply count, list of reply authors, attachments, flags such as Edited or Pinned, etc. The message reading system described in this section can simplify accessing specific parts of a message. This is accomplished in two ways:

Message Reading Format Customization

The key sequence [ f will cycle between available message formats. The default format is "Default custom," which rearranges information in messages in a way pleasing at least to this script author. The "Native" option reverts message reading to the native format presented by Slack itself.

The "Default custom" message format presents message information in the following order:

Note that any change to the message reading format via [ f will remain in effect until changed again, even if JAWS is restarted.

Reading Specific Parts of a Message On Demand

Sequences consisting of [ followed by a digit between 1 and 7 will read specific portions of the current message:

Unrecognized Message Formats

From time to time, a message may appear that the scripts are unable to recognize for format alterations, separation into parts, etc. This can occur because

Messages with an unrecognized format are always presented as if the "Native" message reading format is in effect; that is, without alteration from what Slack natively presents. Command sequences for reading portions of a message may produce error messages instead of information when applied to a Slack message with an unrecognized format.

Staying Up To Date With Unread Messages and Activities

This author uses several means to keep up to date with new messages and activities across many channels and threaded conversations. Each method has pros and cons. A combination of methods will most likely be beneficial in a large or very busy Slack workspace.

By Notifications

Slack can send notifications for nothing, just mentions and direct messages, or all messages. In practice, this author finds that "all messages" might mean "most messages," though that may somehow be pilot error. Slack can also separate how to handle notifications for different devices, though this is not default behavior. Finally, Slack can include message text in notifications or, for increased privacy (and less verbosity), just notify of new messages without displaying their content. See the Settings > Notifications page for the available options.

By the "All Unreads" Pseudo-Channel

Note that the following feature must be enabled before it becomes operational. It is not enabled by default. Enable it by checking "Show All Unreads" in Preferences > Sidebar.

Typing Ctrl+Shift+a in Slack will display and update a "channel" containing all unread message threads, sorted by channel. Press Tab once after typing this native Slack command to focus the list of threads, then go up with the Up arrow as necessary to be sure to start at the top of the list. On encountering a thread with replies, use the Right arrow to move into the replies so that Up and Down arrows will move among its replies instead of among threads. The Left arrow will return to the thread list.

If new messages arrive while you are navigating the "All Unreads" list, they will be represented by buttons like "1 new message"; the new messages will not actually join the list unless you press the button. This is probably to prevent loss of messages while reading. Typing Ctrl+Shift+a a second time will also add such messages to the list without removing any messages that are not marked as read.

On finishing the reading of all messages from a particular chat or channel in the All Unreads list, press Esc to mark them all as read. Messages from other channels and chats that appear in the list will not be marked.

Typing Shift+Esc marks all messages shown in the All Unreads list as read at once. This commonly causes the announcement of a "You're all caught up" message, the wording of which may change, sometimes through amusing alternatives.

While the pseudo-channel is called "All Unreads," this author finds that it really means "All Unread Threads." Some replies to threads you've already seen may not be included. This gives rise to the next suggestion.

By the "Threads" Pseudo-Channel

Typing Ctrl+Shift+t will display a list of threads sorted by date, newest first. As with the "All Unreads" option, be sure after typing this command to Tab to and go up to the top of the list as necessary.

This view displays threads across channels, sorted by time of last post. Within each thread, all messages are shown unless there are many messages, in which case the original thread-starter messages and the new replies are shown along with an expandable indication of how many more replies are available between the two. The Down arrow is a sufficient means of reading new messages in this view. Using the Down arrow will cause focus to pass through these elements, in this useful though unusual order:

By Channel Directly

Slack includes an Alt+Shift+Down command to move to the next channel containing unread messages. This command places focus in the channel's new-message box, from which (with default settings) the Up arrow will move to the last thread in the channel. Exploration of recent additions then just consists of using the four arrows to explore threads and their replies normally for a channel.

Note that typing Alt+Shift+Down while in a channel's message entry box will change to the next channel with unread messages (if there is one) but may say nothing. This is because focus is not moved out of the edit box; the box is simply repurposed to apply to the new channel. To avoid this issue, be sure to have focus on a message in the current channel before typing the Alt+Shift+Down command. When there are no more channels with unread messages, the command will still move focus to the input box but will not leave the current channel.

By Activity

The Ctrl+Shift+m command brings up a list of activities, sorted by date, newest first. "Activities" here are those relevant to you, the logged-in Slack user, rather than all activities across all channels. The activities included are

This view is the only one this author has found that presents reactions as entries in a list of events. The Activities view is a good final check to make sure you did not miss anything directly applying to you in Slack.

Known Issues

The following issues are known and may be encountered during use of the application with these JAWS scripts. These issues may be fixed in a future update to the scripts or to the application itself.

The JAWS touch cursor sometimes provides more information than the PC cursor, especially in Settings pages where it can find hints for fields, group headings, etc.

From time to time, an entry in a list, such as a message history or a sidebar channel list, will lose its ability to accept focus. The symptoms are silence on arrowing across the item and JAWS' saying that the next or previous item remains in focus even though this is not entirely accurate. This would need to be fixed in Slack itself. Last tested in Slack 4.4.0, March 20, 2020.

Braille support is not well tested and is likely incomplete.

Revision History

This is the revision history of these scripts, most recent revision first:

Revision 59, released April 21, 2020, tested against application version 4.4.2

Revision 54, released April 14, 2020, tested against application version 4.4.0

Revision 54, released April 14, 2020, tested against application version 4.4.0

Revision 50, released March 29, 2020, tested against application version 4.4.0

Revision 48, released March 26, 2020, tested against application version 4.4.0

Revision 40, released March 21, 2020, tested against application version 4.4.0

Revision 32, released March 20, 2020, tested against application version 4.3.2

Revision 27, released March 18, 2020, tested against application version 4.3.2