ScormStack: A Clean Scan vs. a Screen Reader
ScormStack points to a spotless automated report as evidence that its courses are accessible. I tested the same course with NVDA to see what a screen reader user actually experiences.
Tested June 2026, with two findings added in a November 2026 recheck. Updated November 6, 2026, after ScormStack responded and shipped fixes.
Update, November 6, 2026: ScormStack Responded
In short: I emailed these findings to ScormStack on November 5. They replied within a day, shipped fixes for most of them, and added an accessibility statement and a Contact page. Several fixes hold up with NVDA. A few issues remain, and one, the page language, has changed rather than gone away. This is what a responsive vendor looks like.
Their response
ScormStack thanked me for the report and listed the fixes they'd made. They wrote that their automated and keyboard checks pass, but that they aren't treating the report as resolved on the strength of those checks alone, and that "a clean FastPass result is not proof of accessibility." They gave permission to include their response here.
Read ScormStack's full response
Hi Jacob,
Your report is a real gold mine; thank you!
We have made many enhancements/fixes since the April 26 Blog post, and we added even more today based on your report.
Corrections cover:
- Keyboard completion of matching activities, with clear instructions and plain-text announcements.
- Quiz radio-group behavior, feedback and results announcements, and focus after retrying or editing a response.
- Image enlargement dialogs, flashcard pagination and single-choice ratings.
- Internal block names and IDs being announced, inconsistent control languages, heading structure and progress indicators.
Use the same course link (you might want to hard refresh to clear your browser cache) […]
Our automated regression and browser keyboard checks pass. We’re not considering the report fully resolved on the strength of those checks alone. Meaningful image descriptions remain a content responsibility.
You’re right that a clean FastPass result is not proof of accessibility.
We’ve also added a public accessibility reporting page on our website so people have a clearer route to report barriers and request help.
Thank you so much for contacting us about this. […]
You’re welcome to include this response alongside your findings.
What I rechecked
I retested the main issues with NVDA and Edge on November 6 and checked the rest in the course's code. "Code" means I confirmed the change in the markup but haven't tested it with NVDA yet.
| Original finding | Status | Checked with | Notes |
|---|---|---|---|
| Assessment answers behave as a radio group | Fixed in the main quiz | NVDA | Arrow keys now move between answers. In the code, each question's answers are a labeled radio group with one Tab stop. |
| Answers in the "Success Meter" assessment | Still an issue | NVDA and code | A second quiz type, a multi-step scenario with a "Success Meter", wasn't fixed. Its answers are still custom radio buttons with no group around them. Every answer is its own Tab stop, and the arrow keys do nothing. |
| Assessment feedback is silent in Focus Mode | Fixed | NVDA | Feedback now takes focus after Submit, so it's read right away. |
| Drag-and-drop can't be completed with a keyboard | Improved, still an issue | NVDA | In the "Sort into Categories" activity, items can now be picked up, moved and dropped by keyboard, and they have plain-text names. But announcements still use internal IDs ("item-4 was dropped over droppable area cat-3") instead of "Recursion" and "Advanced", and most arrow presses announce nothing. See the video below. |
| Matching activity | Fixed | NVDA | "Match Related Items" now works with a keyboard. NVDA tells you to select an item, then select its match in the next column, which is clearer for keyboard users than "draw lines". The raw HTML and the untranslated keyboard hint are gone. It's still slow, because you Tab through the whole left column to reach the right one, but it works. |
| Language of the page | Still an issue, changed | NVDA and code | The page is now marked French (lang="fr"), but the course content is English. NVDA announces "French (not supported)" before English headings. Because the page says it's French, Microsoft Edge also translated it automatically, so I heard a mix of French, machine-translated English and placeholder text. A learner can't easily tell what's original and what's translated. |
| Untranslated text keys | Mostly fixed | Code | matching.keyboard_hint is gone, but a visible button still reads assessment.next. |
| Internal block names announced as regions | Fixed | Code | Down to 8 regions with meaningful names, such as "Video Player" and "Audio player: Audio Track". |
| Heading structure | Fixed | Code | One H1. The "1 / 1" question heading now has the label "Question 1 sur 1" (in French). |
| Image alt text | Partly fixed | Code | The scormstack_blue.png alt text is fixed. Four images still use file names (step1_opt.png to step4_opt.png). ScormStack notes that meaningful descriptions are the author's responsibility, which is fair, though this is its own demo course. |
| A way to report problems | Improved | NVDA | See the new way to report a problem. |
| Focus after Try Again and Edit Response, results announcements, enlarge dialog, flashcard pagination, rating questions, busy indicator | Reported fixed, not yet retested | Not yet | In the code, the rating questions are now radio groups. |
Drag-and-drop after the fixes
Transcript: what NVDA says in the drag-and-drop retest video
The activity shows four items (Variables, Design Patterns, Loops, Recursion) above three categories (Beginner, Intermediate, Advanced). NVDA says:
- "Heading level 3, French (not supported), Sort into Categories."
- "Drag each item into the appropriate category."
- "Item: Loops, draggable. To pick up a draggable item, press the space bar…"
- [Space] "Picked up draggable item item-3. Draggable item item-3 was moved over droppable area unsorted."
- [Right, Right, Right, Left, Up and Down arrows] (silence)
- [Shift+Tab to Recursion, then Space] "Picked up draggable item item-4. Draggable item item-4 was moved over droppable area unsorted."
- [Right arrow, twice] "Draggable item item-4 was moved over droppable area cat-3."
- [Right, Right and Down arrows] (silence)
- [Space] "Draggable item item-4 was dropped over droppable area cat-3. Incorrect. 2 trial(s). Try again."
That's real progress: the item can be moved and dropped, and the result is announced. But a learner still hears "item-4" and "cat-3" rather than "Recursion" and "Advanced", so they can't tell what they're moving or where it landed without looking.
The new way to report a problem
ScormStack added an accessibility statement and a Contact page. Both point to a support chat. I tested it with NVDA:
- The chat takes focus when it opens, landing on the message box, and its buttons are labeled.
- A "Quick Actions" menu works with Tab and Browse Mode, but not with arrow keys.
- Writing in the evening, French time, I got a message that the team was offline and would email me. But the chat never asked for my email address, and I wasn't signed in.
- On the Contact page, NVDA started reading an "offline" alert, but the chat's autofocus cut it off, and I couldn't find the message anywhere on screen.
The chat is mostly accessible, and having a reporting route at all is a real improvement. But a learner who hits a barrier outside office hours still needs a way to be heard. An email address or a form alongside the chat would close that gap.
The rest of this page is the original teardown, kept as a record of what I found before ScormStack's fixes.
Summary
A colleague evaluating e-learning authoring tools asked me whether ScormStack lives up to its accessibility claims. In "ScormStack's WCAG Accessibility Support Was Built In From Day One" (opens in a new tab), ScormStack presents a FastPass accessibility report (opens in a new tab) as evidence of its platform foundation: 0 failures, 0 incomplete checks, 45 passed checks.
So I tested the exact course that report was run against, using NVDA, the way a learner who relies on a screen reader would. Plain content reads well. But every interactive block I tried had at least one screen reader problem. The matching activity can't be completed with a keyboard at all. The assessment block, which matters most for compliance training, isn't much better: feedback is silent in NVDA's Focus Mode, the answer options don't respond to arrow keys, and focus repeatedly lands somewhere other than where the learner needs to go next.
Bottom line: A clean automated scan is not proof of accessibility. ScormStack's own course, the one behind its published report, has problems a screen reader user runs into within minutes. Teams choosing a tool on the strength of a scan result should test it with assistive technology before they commit.
Why a Clean FastPass Isn't Enough
FastPass is a quick check in Microsoft's Accessibility Insights for Web. It runs automated axe-core rules, plus a short guided check of Tab stops. It's a good first step, and ScormStack's blog does acknowledge that it isn't a full WCAG audit. But automated rules can only test a portion of WCAG. They can confirm that an image has alt text, but not that the alt text is meaningful. They can confirm that an element has a role, but not that it behaves the way that role promises. They can't hear what a screen reader announces.
The blog goes on to say that accessibility "includes automated validation, manual keyboard testing, assistive technology testing", but the scan is the only evidence the post offers. Several of ScormStack's specific claims, on the blog and on its WCAG support page, don't hold up when tested with a screen reader.
What They Claim vs. What I Found
Claims are quoted from the blog post and from ScormStack's WCAG support feature page (opens in a new tab), which the site's menu labels "WCAG compliance".
| ScormStack's claim | Source | What I found |
|---|---|---|
| "Navigation, buttons, and interactive elements are structured to work well with screen readers and keyboard navigation" | WCAG support page | The matching activity can't be completed with a keyboard. Arrow keys move nothing, and NVDA never says where an item is. See the matching activity finding and video. |
| "Navigation and controls are designed for keyboard use" | Blog post | The same matching activity. Every drop ends with no match made. See the matching activity finding and video. |
| "Assessments, resources, and media players are designed to be usable via keyboard controls" | WCAG support page | The quiz answers are custom elements that ignore arrow keys, and quiz feedback is silent in Focus Mode. See the radio group finding. |
| "Interactive elements can be reached using Tab and arrow keys" | Blog post | The assessment's answer options ignore arrow keys. Each one is a separate Tab stop. See the radio group finding. |
| "Learners can tab through buttons, links, inputs, and quiz controls in a predictable order" | WCAG support page | After Try Again, View Results and Edit Response, focus lands somewhere other than where the learner needs to go next. See the focus finding. |
| "Focus does not move unexpectedly without learner action" and "focus follows the logical visual order" | Blog post | The same focus problems. See the focus finding. |
| "Headings carry structure, not just visual style" | Blog post | The course has more than one H1, and the question heading reads only "1/1". See the heading finding. |
| "ScormStack makes it easy to add meaningful alternate text" | WCAG support page | Images in ScormStack's own demo course, the one its report scanned, use file names such as "scormstack_blue.png" as alt text. See the alt text finding. |
| Controls behave predictably, so "assessment actions … are easier to understand" | Blog post | Assessment feedback and results are silent in Focus Mode, and the score isn't labeled. See the feedback finding. |
| "Exported courses preserve semantic HTML where it matters" | Blog post | Every content block is announced as a region named with its internal block type and ID. See the region names finding and video. |
| "Keep listening when customers or learners find real-world friction" | Blog post | There's no accessibility contact and no general contact page. See how to report an issue. |
No Clear Way to Report a Problem
Before publishing, I looked for a way to send these findings to ScormStack. There's no Contact page, and the WCAG support page has no accessibility contact or feedback link. The only contact form on the site is for enterprise sales.
The one general address I found, hello@scormstack.io, is listed in the privacy policy. That isn't where a learner who gets stuck in a course would think to look. A screen reader user who can't complete an activity has no obvious way to tell anyone.
An accessibility statement with a named contact and a feedback route is standard practice, and it's what makes a promise to "keep listening" real.
How I Tested
- Setup: NVDA (current release as of June 2026) with Microsoft Edge on Windows 11.
- Content: ScormStack's own preview course, the one named as the target page in its FastPass report. It includes text and images, flashcards, an open response question, a rating question, and a scored assessment.
- Approach: Navigated in both Browse Mode and Focus Mode, by arrow keys, Tab, and single-key navigation (headings, landmarks, form fields). Recorded what NVDA announced at each step.
- Scope: This is a teardown, not a full WCAG audit. It covers screen reader and keyboard behavior. It doesn't cover color contrast, reflow, or other visual criteria, and apart from the radio button markup, I didn't inspect the source code, so other causes I suggest are informed guesses.
Findings at a Glance
High means a screen reader user is likely to get stuck or misled during a core task. Medium means the task is possible but takes significant extra effort. Low means friction or noise. Items marked best practice aren't strict WCAG failures but still affect the experience.
The Matching Activity
Matching activity can't be completed with a keyboard
WCAG: 2.1.1 Keyboard (A); 4.1.2 Name, Role, Value (A) · Severity: High · Found: November 2026 recheck
The "Match Related Items" block asks learners to "draw lines to match the related items between the two columns." With a keyboard, I could pick an item up and put it down, but nothing in between worked. Arrow keys produced no announcement and no visible movement, and every drop ended with no match made. In over a minute of trying, I couldn't complete a single match.
Transcript: what NVDA says in the matching activity video
The matching block shows three terms on the left and three definitions on the right. Throughout, nothing on screen moves except the page scrolling. NVDA says:
- "Out of region, out of region, matching block, ID: b41, region, clickable, heading level 3, Match Related Items."
- "Draw lines to match the related items between the two columns."
- "matching dot keyboard line hint"
- "1 sur 3 réponses"
- "Match these items."
- "Draggable, Match item: less p greater Respiration less slash p greater. Use Tab to navigate, Space or Enter to select."
- [Tab, then Space] "Picked up draggable item left-2."
- [Up, Right, Down, Right, Left and Up arrows] (silence)
- [Space] "Draggable item left-2 was dropped."
- [Shift+Tab, then Space] "Picked up draggable item left-2."
- [Right, Right, Left, Down and Up arrows] (silence)
- [Space] "Draggable item left-2 was dropped."
Almost every announcement in that clip has a problem of its own:
- Raw HTML in the names. Each item's
aria-labelincludes its markup, for example"Match item: <p>Respiration</p>", so NVDA reads out "less p greater" around every term. - An untranslated placeholder. Where the keyboard instructions should be, NVDA reads the internal text key
matching.keyboard_hint. - Internal IDs instead of names. Pick-up and drop announcements name the item "left-2" rather than "Transpiration", and never say where the item is or which definition it's over.
- Contradictory instructions. The label says "Space or Enter to select and match". A hidden description says to pick up with Space, move with the arrow keys, and drop with Space. Neither approach makes a match.
- French in an English course. The progress counter reads "1 sur 3 réponses" with English pronunciation (see the language finding).
The instructions ("To pick up a draggable item, press the space bar…") and the "Picked up draggable item" / "was dropped" announcements match the defaults of dnd-kit, a popular drag-and-drop library. dnd-kit expects developers to replace those defaults with announcements that name the item and its drop target. Here they've been left as they are, on an activity that matches items by drawing lines, not by moving them.
Fix: Give the matching activity a non-drag alternative that works by keyboard and screen reader. For example, select a term, then select its definition, with each step announced: "Respiration selected. Now choose its match." Then "Respiration matched with Process of converting glucose to energy." Use plain-text names, finish the translations, and test the result with NVDA and JAWS.
The Assessment Block
Assessment feedback is silent in Focus Mode
WCAG: 4.1.3 Status Messages (AA) · Severity: High
After choosing an answer and pressing Submit in Focus Mode, NVDA says nothing. The feedback is on the page, but the only way to find it is to switch to Browse Mode and arrow around. In Browse Mode the feedback is read right away, which suggests it isn't exposed as a status message and only gets read because Browse Mode follows the page change. The feedback also appears beside the selected answer, above the Submit button, so reaching it means moving backward and then past the now-unavailable answer options again.
Answer options don't behave as a radio group
WCAG: 1.3.1 Info and Relationships (A) · Severity: Medium
Standard radio buttons are one Tab stop: you Tab into the set and use the arrow keys to choose. Here each option is its own Tab stop and has to be selected with Space. A keyboard user gets a different, slower pattern than every other form they use.
The code explains why. Each answer is a div given role="radio", and each one is its own Tab stop. Trimmed to the parts that matter:
<div data-slot="assessment-choices">
<div role="radio" aria-checked="false" tabindex="0"
aria-labelledby="…choice-1-1-label">…</div>
<div role="radio" aria-checked="false" tabindex="0"
aria-labelledby="…choice-1-2-label">…</div>
…
</div>
Three things are missing. The wrapper has no role="radiogroup", so assistive technology isn't told the four answers belong together. Nothing connects the group to the question it answers. And every option has tabindex="0", when the radio pattern calls for only the selected (or first) option to be in the Tab order, with arrow keys moving between options. Native <input type="radio"> elements sharing a name and wrapped in a <fieldset> with a <legend> would provide all of this for free.
Focus lands in the wrong place after key actions
WCAG: 2.4.3 Focus Order (A) · Severity: Medium
- Try Again: focus stays on the attempts-remaining message. The learner has to move backward to find the answer options.
- View Results: focus jumps to the "Review Questions" button, past the results themselves.
- Edit Response (open response question): focus goes to the Submit button instead of the text box the learner wants to edit.
Results aren't announced, and the score isn't labeled
WCAG: 4.1.3 Status Messages (AA); 1.3.1 Info and Relationships (A) · Severity: Medium
After View Results, nothing is announced. Navigating back to the results, NVDA reads:
"Assessment passedRequired: 60%" / "100%" / "1/1 Correct"
"Assessment passed" and "Required" run together as one line, and "100%" has no label, so a learner has to guess that it's their score. Clearer: "Assessment passed. Required: 60%. Your score: 100%. You got 1 of 1 correct."
Question heading reads only "1/1"
WCAG: 2.4.6 Headings and Labels (AA) · Severity: Low
The word "Question" is plain text, and the heading is just "1/1". Someone jumping by heading lands on "heading level 2, 1/1" with no idea what it is. "Question 1 of 1" as the heading fixes it.
What the Assessment Should Do
Rather than leave the vendor with a list of problems, here is the flow a screen reader user would expect from a quiz block:
- The answer options are one radio group. Tab moves into the group; arrow keys choose an answer.
- Tab moves from the group to Submit.
- On Submit, the result ("Correct" or "Incorrect", plus any feedback) is announced automatically, in both Browse and Focus Mode. The feedback sits after the Submit button in reading order, or in a dialog that manages focus properly.
- On Try Again, a status message announces the attempts left (for example, "Attempt 2 of 3") and focus returns to the answer group.
- On View Results, the results are announced, with every number labeled.
Content Blocks
Internal block names and IDs are announced as regions
WCAG: Best practice · Severity: Medium
Every block in the course is a named region, and the name is ScormStack's internal block type and ID. Even a purely decorative separator gets announced, and every block is also reported as "clickable". The main landmark is announced as "Slide Intro Block" instead of just "main". Because the ID comes in the same breath as the role and state, the announcement is long and the useful part is easy to miss. It's noise a learner hears on every block, on every page.
Transcript: what NVDA says in the region names video
On screen, NVDA's focus highlight moves from the separator below the header, to the image, to the paragraph beside it. NVDA says:
- "Out of list, out of region, separator block, ID: B1, region, clickable, space."
- "Out of region, image block, ID: B2, region, clickable, button, no indent, Click to enlarge: Learning illustration."
- "Images make your content more engaging and help learners remember key concepts. You can add images alongside text, adjust their position, and customize the layout to match your teaching style."
Fix: Don't name blocks as regions. Keep landmarks for real page structure, mark decorative separators as decorative, and leave block IDs out of anything assistive technology reads.
Image alt text is a file path
WCAG: 1.1.1 Non-text Content (A) · Severity: Medium
A "happy customers" image was announced as "Click to enlarge: media/happy_customers_u1l44wk.png". A file name tells the learner nothing. The tool should prompt authors for alt text, let them mark images as decorative, and never fall back to the file path.
"Click to enlarge" gives no feedback
WCAG: 4.1.2 Name, Role, Value (A) · Severity: Medium
Pressing an image's "Click to enlarge" button produced no announcement, no dialog, and no change in focus. Whatever it does visually, a screen reader user can't tell it did anything. That matters for low-vision NVDA users who would actually use a zoom feature, a group that will grow as NVDA adds built-in magnification.
Flashcard pagination doesn't say which card is current
WCAG: 4.1.2 Name, Role, Value (A) · Severity: Low
The Previous and Next buttons are done well: they're correctly announced as unavailable at either end. But the numbered buttons all read "Go to card 1", "Go to card 2" and so on, with no indication of which one is current. All three cards can also be read just by arrowing down, so it's unclear what the pagination is for. If the flashcards are meant to work like a carousel, the cards not on display should be hidden from screen readers too.
Single-choice rating uses toggle buttons
WCAG: Best practice · Severity: Low
The "How do you feel about this content?" question uses toggle buttons, and pressing one turns the others off. That is radio button behavior. Toggle buttons tell a screen reader user each option is an independent on/off switch, so they can't predict what pressing one will do. A radio group communicates "pick one" and supports arrow keys.
Course Shell
French player controls are read with an English voice
WCAG: 3.1.2 Language of Parts (AA) · Severity: Medium · Found: November 2026 recheck
The course is marked as English (<html lang="en">), but parts of the player are in French: the Submit button reads "Envoyer", navigation reads "Suivant" and "Précédent", the attempts counter reads "3 essai(s)", and the objectives heading reads "Objectifs d'apprentissage". None of it is marked as French, so NVDA reads it with English pronunciation and the words come out garbled. A learner who doesn't read French also can't tell what the Submit button does.
This is a Level AA failure on the same page the FastPass report shows with 0 failures. Automated rules can check that a page declares a language, but not whether the text matches it.
Fix: Translate the player's interface into the course's language. If mixed languages are intended, mark each French phrase with lang="fr".
Leftover busy indicator and two H1s
WCAG: Best practice · Severity: Low
- Right after the course title, NVDA announces "Course Progress Busy Indicator". The loading spinner seems to stay in the accessibility tree after loading finishes.
- The progress text reads as one run-on string: "0% COMPLETEDSCORE: 100%".
- The course title ("Test") and the lesson title ("Welcome to Test!") are both H1s. A single H1 makes the page outline clearer.
What Works
- Plain text content reads cleanly.
- Flashcard Previous and Next buttons correctly report when they're unavailable.
- Flipping a flashcard updates its instructions to say which side is showing.
- The open response question does announce "Response saved" after Submit, as a polite status message.
- In Browse Mode, assessment feedback is read immediately after Submit.
Related Work
Like my ClickUp review, this is one of a series of teardowns comparing vendors' accessibility claims with what users actually experience.
Next Step
Choosing an authoring tool or platform and want to know whether its accessibility claims hold up? I can test it the way your learners will use it.