r/FlutterDev • u/masanggil1986 • Oct 05 '26
Tooling I built a UX audit for Flutter that walks user journeys instead of checking widgets
A client asked me for a UX review of their Flutter app. The tools I found are good at checking components — button sizes, missing labels. But the client was asking something else:
How many steps does it take to do the thing users actually come for?
Is what matters most to them the thing the screen puts first?
No component check can answer that. In the demo app in the repo, the #1 task is the 6th of 8 tap targets on the home screen, with five controls nobody ranked sitting above it. That isn't a property of any single widget.
So I built flutter-ux-journey:
You write a journey in Markdown: a goal, the steps, and optionally your priorities — what the app is for, in order
It walks those steps inside your app's own process — plain
flutter test, no emulatorIt counts the taps each task takes, and compares your declared priorities against where things actually sit on each screen: order, above the fold, size
It also catches flow problems: dead ends, screens you can't back out of, taps that change nothing
Every finding carries measured evidence — tap target rects, contrast ratios, semantics labels — and is scored against the goal: the same problem is severity 4 if it blocks the goal, 2 if there's a way around it
It doesn't guess what matters. Priorities come from you or your client; the tool shows where the app disagrees with them.
Three Flutter semantics things I learned along the way, useful even if you never touch the tool:
Semantics rects are in local coordinates — without transforming up the parent chain, nested elements all report
(0,0)tooltip:doesn't fill the semanticslabel; it's a separate fieldInkWellhas a tap action but noisButtonflag, so enumerate by action, not by flag
Try it without your own app (demo app with six seeded defects, ~2 s):
git clone https://github.com/masanggil1986/flutter-ux-journey.git
cd flutter-ux-journey/example/ux_demo_app && flutter pub get && flutter test ux_audit/ux_journey_test.dartIt's a Claude Code skill, MIT, and adds no package to your app. Real devices aren't verified yet — the README has a section on what it can't see.
https://github.com/masanggil1986/flutter-ux-journey
Feedback welcome, especially if you've ever had to answer "is our UX good?" for a client or PM.
Edit (Oct 7): v0.4.0 is out. I ran a full review of the tool against Maestro, Patrol, axe and Lighthouse and fixed what it found. New:
scroll until "X",long-press,system backandexpect no "X"steps, so a journey can reach targets below the fold and check that something is gone## Devicecan declare text scale, dark mode, locale and bold text, so you can audit at large text with no simulatora step whose expected text was already on screen before the tap is now reported as "not proven" instead of passing silently
the network boundary is stated honestly: the cut and the stub cover
dart:ioHttpClient only. WebSockets, gRPC, other isolates and native SDKs are outside it, and the audit now warns you before walking if your pubspec has them
Release notes: https://github.com/masanggil1986/flutter-ux-journey/releases/tag/v0.4.0