Skip to content
Sunstone Apps
← Back to blog
UX and product

Running a heuristic UX critique on my own app — and actually fixing what it found

I had a published Sudoku game on Google Play and no UX designer. So I ran Nielsen's ten heuristics against my own app. It scored 25 out of 40 — decent, but three heuristics were clearly weak. After a focused round of fixes, it scored 28. Here is the full process: what the evaluation found, what I fixed, what I rejected, and what the score change actually means.

Published: 9 min read

Why bother with a formal UX review on a shipped app

Daily Sudoku was live on Google Play. Players were downloading it. Nothing was obviously broken. But “nothing is broken” is a low bar — it means the app works, not that the experience is good.

I had been adding features for weeks: themes, daily challenges, achievements, a credit economy, sound design. Each feature passed its own tests. What I had not done was step back and evaluate the whole experience as a player would see it.

A heuristic evaluation forces that shift. You score the interface against a fixed set of principles — Nielsen’s ten usability heuristics — instead of asking “does it feel okay?” The score is rough, but it produces a ranked list of concrete problems. That list is worth more than any amount of staring at your own screens.

The evaluation framework

I used Nielsen’s ten heuristics, each scored 0 to 4, for a total ceiling of 40. The scoring is deliberately harsh: a 3 means “works well with minor issues,” and a 4 means “genuinely excellent — hard to improve.” Most real interfaces land between 20 and 32.

On top of the heuristic scores, I ran three supplementary checks:

  • AI slop test. Would someone look at this and immediately say “AI made that”? This catches gradient text, glassmorphism, identical card grids, and other saturated patterns.
  • Persona red flags. I picked three user archetypes (distracted mobile user, impatient power user, confused first-timer) plus one project-specific persona (daily habit player) and walked through the app as each.
  • Cognitive load checklist. Single focus per screen, chunking, visual hierarchy, progressive disclosure.

The first critique: 25/40

The scores told a clear story. Seven heuristics sat at 3 (decent but not great). Three sat at 2 or below — and those were the ones worth fixing first.

Error Prevention scored 2. The Hint button spent credits (a real-money IAP resource) with a single tap, with no visual distinction from free actions like Undo. The Erase button did nothing when tapped on an empty cell — no feedback, no explanation. The difficulty drawer showed five options with no description, no estimated difficulty, no guidance for beginners.

Error Recovery scored 2. Wrong cell placements showed a red flash but no explanation. Economy-related error toasts disappeared quickly with no path forward. The disabled Hint button gave no indication of why it was disabled.

Help and Documentation scored 1. A “How to Play” modal on the home screen explained the three Sudoku rules (row, column, box) but said nothing about the five game controls, the credit system, notes versus auto-notes, or what happens when you run out of mistakes. The first-run tutorial covered cell selection, number entry, and feedback — but not the controls the player would use thirty seconds later.

Prioritizing: what to fix first

Not every finding deserves immediate action. I sorted them into priority tiers:

P1 (fix now): Timer showing absurd values at extreme durations. No feedback on disabled controls. No explanation of controls anywhere accessible.

P2 (fix soon): Muted text failing WCAG AA contrast. Difficulty drawer with no descriptions. Ambiguous stat labels in Profile.

P3 (fix eventually): Web page title showing generic screen name. NumberPad accessibility labels hardcoded in English. Favorites screen showing plain “Loading…” text.

One finding I explicitly rejected: adding a confirmation dialog before spending credits. The critique flagged it as a trust issue, but the product reality is that friction on credit spending reduces consumption, which reduces repurchase. The existing single-tap behavior is the correct product decision. Not every UX recommendation serves the business.

The fixes, concretely

Disabled control feedback

The biggest UX win per line of code. I added an onPressDisabled callback pattern to the game controls bar. When a button is disabled but the player taps it, instead of silence, a toast appears explaining why:

  • Hint disabled: “Select an empty cell first” or “No credits or ads available”
  • Erase disabled: “Select a cell first,” “This number is part of the puzzle,” or “This cell is already empty”
  • Undo disabled: “Nothing to undo”

Each message is localized in all ten supported languages. The toast itself got an upgrade: fade-in with slide-up, a countdown bar showing time remaining, and a fade-out exit. Previously it was a static block that appeared and disappeared abruptly.

Contrast and legibility

The mutedForeground token in light mode measured 3.9:1 against the surfaceStrong background — below WCAG AA’s 4.5:1 requirement. I darkened it from rgb(120 113 108) to rgb(98 91 86), hitting 5.4:1. The dark mode equivalent went from rgb(168 162 154) to rgb(181 175 167) for 4.7:1. Both pass AA.

The number pad’s remaining-digit counter was 10px at 35% opacity — borderline invisible. Bumped to 12px at 50% opacity.

Help expansion

The “How to Play” modal gained a Controls section: six items (Undo, Erase, Notes, Auto Notes, Hint, Credits) each with an icon and a one-line explanation. The first-run tutorial’s last step now includes a subtle line: “You can review this anytime in How to Play” — connecting the player to the reference without adding a fourth tutorial step.

Difficulty drawer clarity

Each difficulty level now shows a description line: “40 clues · Relaxed” through “24 clues · Intense.” New players (no best stars in any difficulty) see a “Recommended” badge on Novice with a sparkles icon.

Naming cleanup

“Current daily sequence” and “Daily challenge sequence” in Profile became “Play streak” and “Daily challenge streak.” The old names were too similar and neither communicated what they tracked.

Small fixes

Timer formatting supports hours (1:05:32 instead of 65:32). Web page title shows “Daily Sudoku” instead of the screen name. NumberPad accessibility labels use i18n keys. Favorites loading state uses skeleton cards instead of plain text.

The second critique: 28/40

Three heuristics improved:

  • Error Prevention: 2 → 3. Disabled control toasts now explain the problem before the player makes an error.
  • Error Recovery: 2 → 3. Toasts suggest the correct action. The tutorial review hint prevents “I missed my chance to learn.”
  • Help and Documentation: 1 → 2. Controls section in How to Play closes the main gap. Still not contextual in-game, which caps it at 2.

The other seven stayed at 3. Each had fixes that were real but didn’t resolve all issues within that heuristic.

What I learned about the process

Score the whole thing first, then fix. I was tempted to start fixing during the evaluation. Resist that. The score gives you a map; fixing mid-evaluation means you are navigating without finishing the map.

Kill findings that conflict with product goals. The credit confirmation dialog was a textbook UX recommendation that would have hurt revenue. Heuristics are a lens, not a mandate.

Localization multiplies scope. Every new i18n key means ten locale files updated. I underestimated this cost and should have batched the keys better.

The hardest score to move is Help. Going from 1 to 2 required expanding a modal and adding cross-references. Going from 2 to 3 would require contextual, in-game help — a fundamentally different architecture. Each point costs more than the last.

Re-critique honestly. It is tempting to inflate scores to show progress. A 3→3 where the fix was real but the heuristic had other issues is honest. A fake 3→4 poisons the whole exercise.

What is left

The critique identified remaining issues at P2 and P3: help is still not contextual during gameplay, the Profile screen shows too many data points without progressive disclosure, web keyboard shortcuts are missing for modals, and the favorites skeleton has no shimmer animation. Each is a real improvement that did not make this round’s cut.

The score went from 25 to 28 in one focused session. The next jump — 28 to 32 — will require deeper structural work: in-game contextual help, Profile information architecture, and keyboard accessibility. Each of those is a feature, not a fix.

If you ship an app and wonder whether the UX is “good enough,” try the ten heuristics. You will find problems you walked past every day. Whether you fix them before your players notice is up to you.

Try Daily Sudoku on Google Play