Oppia.org — UX Heuristic Audit Report

Advanced Agent Audit · Desktop · 4 pages captured · 83 checklist items · Accessibility profile active · HIL gates answered
Generated: 2026-05-02 · Auditor: UX Heuristic Compass + Human-in-the-Loop calibration
B- · 68.5%

⚠ Mission Amplification — Why Severity Ratings Are Higher for Oppia

Oppia's mission is to provide free, effective education to under-resourced communities worldwide. This audit applies a mission lens to every finding: issues that are 'minor' on a commercial platform can be critical barriers when the user has limited bandwidth, limited device access, limited time online, and no alternative educational resource. Severity ratings throughout this report reflect this context.

B-
68.5%
Below average
multiple issues
Plain Language Read

Oppia has strong content quality, excellent onboarding guidance, and a coherent brand — but three systemic failures undermine the learning loop for everyone: progress is lost after every session even for logged-in users, the lesson player traps users with no visible exit, and every lesson load shows a blank screen that looks broken on slow connections.

Before using this interface at scale, fix progress persistence first: lesson progress is currently lost for all users at session end regardless of login status, which breaks Oppia's core learning continuity.

🚨 Critical Finding — Immediate Fix Required

Progress lost for ALL users — including logged-in accounts

HIL auditor confirmed: progress fails to save for authenticated users, not only guests. The 0% progress ring never updates. Users who complete chapters return to find no record of their work. No warning is shown before leaving a lesson. No 'continue where you left off' path exists. For Oppia's target users with intermittent internet access, this removes the primary motivator to return and eliminates learning continuity.

Heuristic Scorecard — 11 Heuristics

C-
52.8% · avg severity 1.89
Visibility of System Status
Struggling - widespread issues
HIL: Accepted as scored. Mission context elevates this — blank screens on slow connections are a first-impression failure for target users.
A-
83.3% · avg severity 0.67
Match Between System and the Real World
Above average - minor gaps
C+
60.0% · avg severity 1.60
User Control and Freedom
Developing - significant gaps
HIL: Accepted as scored. C+ is fair — no visible exit traps young/first-time learners.
B
70.2% · avg severity 1.19
Consistency and Standards
Acceptable - some improvement needed
A-
80.0% · avg severity 0.80
Error Prevention
Above average - minor gaps
B-
68.8% · avg severity 1.25
Recognition Rather Than Recall
Below average - multiple issues
⚠ HIL ESCALATION: Also confirmed failing for authenticated users — treat as C range in prioritization.
B-
66.7% · avg severity 1.33
Flexibility and Efficiency of Use
Below average - multiple issues
⚠ HIL ESCALATION: Same root cause as H06 — progress loss affects all users. Every session starts from zero.
B+
76.6% · avg severity 0.94
Aesthetic and Minimalist Design
Good - a few notable issues
B+
75.0% · avg severity 1.00
Help Users Recognize, Diagnose, and Recover from Errors
Good - a few notable issues
B
70.0% · avg severity 1.20
Help and Documentation
Acceptable - some improvement needed
C-
50.0% · avg severity 2.00
Accessibility and Ease of Access ACCESSIBILITY
Struggling - widespread issues
HIL: Accepted as scored. Note: surface audit only — full WCAG compliance test needed.

Findings — Prioritized Fix Order

1
Critical H06 Recognition Rather Than Recall · h06_d_02

Progress lost for ALL users — including logged-in accounts

HIL auditor confirmed: progress fails to save for authenticated users, not only guests. The 0% progress ring on the topic page never updates. Users who complete chapters return to find no record of their work. No warning is shown before leaving a lesson. No 'continue where you left off' path exists.
1. Immediately audit the progress persistence pipeline for authenticated users — confirm if this is a backend bug or missing session sync. 2. Add a visible 'Sign in to save your progress' prompt for unauthenticated users at lesson start. 3. Show a progress-loss warning before navigating away from an in-progress lesson.
⚡ Mission impact: Critical for Oppia's audience: users with intermittent internet access lose all progress between sessions. For learners in low-resource environments who access the internet occasionally, this removes the primary motivator to return.
Evidence: Place Values topic page, Lesson Player
2
Major H08 Aesthetic and Minimalist Design · h08_d_12

Lesson player shows blank grey screen for 3–5 seconds with no loading feedback

Every lesson load presents a full blank grey page with only 'Loading...' text for 3–5 seconds on a fast connection. No skeleton UI, no spinner, no progress bar. Browser tab also shows 'Loading | Oppia' during this window.
Add a lesson skeleton screen matching the lesson player layout. At minimum, add a branded spinner. Fix the Angular routing config so the tab never reads 'Loading | Oppia'.
⚡ Mission impact: On low-bandwidth connections typical in Oppia's target communities, blank loading screens are indistinguishable from broken pages and cause first-impression abandonment.
Evidence: Lesson Player
3
Major H03 User Control and Freedom · h03_d_02

No visible exit from the lesson player

Inside the lesson player, there is no Exit Lesson, Back to Topic, or X button anywhere in the viewport. The only escapes are browser back or a small breadcrumb link in the stripped navigation bar. The full site navigation is hidden entirely while inside a lesson.
Add a clearly labeled 'Back to [Topic Name]' button in the lesson player header. Consider restoring at minimum a minimal nav with the parent topic link prominently visible.
⚡ Mission impact: Young learners and first-time users who arrive via a direct lesson link have no visible way to leave — a critical failure for a platform serving children in low-resource contexts.
Evidence: Lesson Player
4
Major H01 Visibility of System Status · h01_d_07

'Loading | Oppia' page title read by screen readers before content appears

The Angular SPA bootstraps with 'Loading | Oppia' as the document title for 3–5 seconds. Screen readers announce this as the page title. Browser tab shows 'Loading | Oppia'. No ARIA live region announces when lesson content finishes loading.
Set the initial Angular HTML title to something meaningful. Use an ARIA live region (role=status, aria-live=polite) to announce when lesson content has finished loading.
⚡ Mission impact: Screen reader users — often relying on assistive technology due to limited access to other educational resources — receive no status update when content loads.
Evidence: Lesson Player
5
Major H07 Flexibility and Efficiency of Use · h07_d_03

No 'continue where you left off' path for any user

Returning users (authenticated or guest) must navigate the full hierarchy (Homepage → Learn → Classroom → Topic → Chapter) to resume a lesson. No recently visited, in-progress, or bookmarked lessons surface. HIL confirmed: even logged-in users see 0% progress.
Add a 'Resume Learning' widget on the homepage for signed-in users showing their most recent in-progress lesson. For guests, use localStorage to persist the last-visited lesson URL.
⚡ Mission impact: For users with limited time online, spending session time re-navigating rather than learning is a critical friction cost.
Evidence: Homepage, Math Classroom
6
Minor H08 Aesthetic and Minimalist Design · h08_d_09

Homepage hero has two competing equal-weight CTAs

The homepage hero presents 'Explore Oppia Classrooms' and 'Access the Android app' as side-by-side buttons with near-equal visual weight. A desktop visitor who wants to start learning has no clear primary path.
Make 'Explore Oppia Classrooms' the primary CTA (filled, prominent) and demote 'Access the Android app' to a secondary link or a mobile-only conditional display.
Evidence: Homepage
7
Minor H04 Consistency and Standards · h04_d_02

Terminology hierarchy inconsistent across the site

Nav says 'Learn → Classrooms'. Classroom pages say 'Topics Covered'. Topic pages say 'Chapters'. URLs use '/explore/' while the UI says 'Lessons'. The mental model is correct but labels applied inconsistently.
Standardize on one vocabulary: Classroom → Topic → Lesson → Chapter. Apply consistently in nav labels, breadcrumbs, page headings, URLs, and CTAs.
Evidence: Math Classroom, Place Values Topic
8
Minor H04 Consistency and Standards · h04_d_12

Multiple H1 headings on classroom page break document structure

On /learn/math, 'Course Details' and 'Topics Covered' are both marked as H1 in the accessibility tree — a heading hierarchy violation.
Change 'Course Details' and 'Topics Covered' to H2 or H3. Reserve H1 for the classroom name ('Math').
⚡ Mission impact: Screen reader users relying on heading navigation cannot determine the primary topic of the page.
Evidence: Math Classroom
9
Minor H11 Accessibility · h11_d_04

SPA loading state not communicated to assistive technology

No ARIA live region is present to announce when lesson content finishes loading. The Angular SPA uses client-side routing but does not programmatically announce navigation completions to screen readers.
Add an ARIA live region that announces navigation completions. Use focus management to move focus to the main heading after navigation.
⚡ Mission impact: Screen reader users navigating between lessons hear nothing when content loads — they cannot confirm if navigation succeeded.
Evidence: Lesson Player
10
Minor H08 Aesthetic and Minimalist Design · h08_d_01

Persistent cookie banner covers lower viewport content on every page

The cookie consent banner appears on every page and covers the lower ~15% of the viewport including lesson content and topic cards. No decline option is shown — only OK.
Auto-dismiss after explicit OK click and persist that choice in localStorage. Add a 'Manage preferences' option for GDPR/CCPA compliance.
Evidence: Homepage, Lesson Player

What Is Working Well

Prioritized Fix Roadmap

SprintAction
ImmediateAudit and fix authenticated user progress persistence pipeline
ImmediateAdd 'Sign in to save progress' prompt at lesson start for guests
Sprint 1Add skeleton screen / branded spinner to lesson player loading state
Sprint 1Add visible 'Back to [Topic]' button in lesson player header
Sprint 1Fix Angular router to set meaningful initial page title
Sprint 1Add ARIA live region for SPA navigation announcements
Sprint 2Add 'Continue where you left off' widget on homepage and classrooms
Sprint 2Demote Android CTA to secondary on homepage hero
Sprint 2Standardize vocabulary across nav, headings, breadcrumbs, and URLs
Sprint 3Fix H1 heading hierarchy on all classroom pages
Sprint 3Persist cookie consent dismissal and add decline option
Sprint 3Run full axe-core accessibility scan — surface audit only covers visible issues

Evidence Limits

Scope: 4 pages audited — homepage, Math classroom, Place Values topic, lesson player. Authenticated post-completion flows, error states, and mobile views not captured.

H11 Accessibility: Surface audit only — not a full WCAG 2.1/2.2 compliance test. Actual accessibility severity may be significantly higher. A dedicated axe-core or manual screen reader audit is strongly recommended.

H09 Error Recovery: Error states were not triggered during evidence capture. Error messaging quality rated with low confidence.

Progress loss: H06/H07 scores reflect unauthenticated evidence from the audit; HIL auditor confirmed authenticated users also lose progress. Scores may understate true severity.

Recommended Next Validation Steps

  1. Run axe-core automated scan across all 4 audited pages to get a baseline WCAG report
  2. Test on a throttled 3G connection to measure actual lesson load time for target audience
  3. Verify with engineering: is authenticated progress loss a known bug or undocumented design decision?
  4. Conduct a 5-minute usability test with a first-time learner: observe them landing on the homepage and navigating to their first lesson
  5. Check lesson player on Android Chrome (Oppia's primary mobile platform) for exit affordance and loading behavior