Developer blog
A Real-Browser UX Audit of movahedi.ca: 11 Findings, Two Deploys
A systematic audit of movahedi.ca in a desktop browser surfaced 11 UX issues: an English-only nav on French pages, a missing language toggle, and an internal marker leaking into a published dataset, plus eight minors. How each was fixed and what the evidence actually supported.
On this page
Key takeaways
- A real-browser audit of movahedi.ca found 11 issues: 3 major, 8 minor, desktop viewport. The tooling could not test mobile; we disclose that rather than paper over it.
- French guide pages rendered an English-only header nav. The layout now auto-localizes on /fr/ routes.
- French pages had no language toggle. Now a persistent header pill plus a mobile drawer entry, following Canada.ca’s wayfinding conventions.
- An internal “(unverified)” marker had leaked into the 87-company subprocessor dataset. The row was checked against the source and cleaned.
- All fixes shipped in two deploys, verified live on desktop.
The one that stung
The published subprocessor dataset covers 87 companies. One row carried an “(unverified)” marker that was never meant to leave the workspace. Readers cannot tell whether such a flag means the data is wrong, the source is weak, or someone forgot to finish.
We checked the row against the source before touching it: Pure Storage, rebranded to Everpure in February 2026 (ticker P). The fact was fine; the marker was stale process residue. The durable fix would be a build step that strips internal annotations from published data, the way builds strip debug flags. That step does not exist yet.
That was one of eleven.
Why audit at all
Big shipping weeks are when small breakage accumulates: every change is reviewed for what it adds, nobody reviews the site as a whole. We ran a systematic pass through the live pages in a real browser, desktop viewport, looking for anything broken, inconsistent, embarrassing. Eleven things qualified.
The audit tooling could not drive a mobile viewport. The gap was closed separately with a 390px localhost audit: no horizontal scrolling, no undersized tap targets. An audit that hides blind spots is marketing, not engineering.
Major 1: French pages, English nav
The data-mapping guide ships in both languages, but its French pages rendered the header navigation in English. For a bilingual Canadian privacy consultant, that is not cosmetic. It tells a Quebec visitor the French version is an afterthought.
The fix was structural: the base layout detects /fr/ routes and applies French chrome by default (explicit props still win where set). Future French pages get the right nav without anyone remembering to set it.
Major 2: no way back to English
A visitor who landed on the French guide from search had no visible path to the English version. The fix: a persistent pill in the header’s top-right showing the target language, plus a mobile drawer entry, following Canada.ca’s wayfinding conventions.
One scope note: the mobile drawer entry shipped with this fix, but the follow-up mobile audit covered scrolling and tap targets, not a dedicated pass over the drawer. Desktop verification was thorough; the drawer on a real phone is less verified, and we say so.
The minors
Eight minors. Six came out of the audit; two surfaced during verification and shipped in the second deploy.
| Issue | Fix | Surfaced |
|---|---|---|
| Subprocessor names duplicated inside table cells | Split-then-unique on the display values | Audit |
| Akamai showed “None found” in one view and “Partial (4)” in another | Reconciled to “Partial” in every view | Audit |
| The word “processor” was auto-linkified mid-sentence | Added to the glossary stop-list | Audit |
| The guide’s confirm button was clickable before the run finished | Explicit generating state; confirm gated on run completion | Audit |
Nested <main> landmarks across 48 pages | Flattened to one landmark per page, site-wide | Audit |
| ”1.38M” in one place, “1.4M” in another | Standardized on 1,382,017 model parameters | Audit |
| ”No map yet” workspace copy confused first-time users | Clarified to mention the confirm step, in EN and FR | Verification |
| Table A showed “None found” for login-walled sources | Now reads “Login-walled” where the data supports it | Verification |
Guided mode had a state hole: the button stayed enabled while generation was still running, so a fast user could confirm an incomplete map. The fix gates the button on run completion with an explicit generating state.
What the research actually said
Per standing practice, design decisions were checked against Reddit’s design communities first. Honestly: targeted searches of r/web_design, r/UI_Design, and r/Frontend surfaced no directly relevant threads through the text backend. The decisions were instead grounded in the closest genuine sources actually read: Canada.ca’s “Wayfinding” study, the GNWT multilingualism standard, a GitHub Community discussion on gating actions until generation completes, Checkly’s auto-waiting docs, and a dev.to piece on deduping display values. A thin evidence base, stated plainly, beats a fabricated one.
What shipped
Two deploys. The first (e8a6ffff) carried the audit fixes. Verification surfaced three follow-ups: the “No map yet” copy in English, the same copy in French, and the “Login-walled” label. Those shipped in the second deploy (be97cef2). Both verified live on desktop; changed URLs were submitted to IndexNow.
The takeaway
Two things are still open. The drawer on a real phone has not had its dedicated verification pass. The build step that strips internal annotations from published data does not exist yet. Both are on the list for the next audit, which is the point: the report should end with the work that remains, not a moral about the work that is done.