Chapter 4

Design analysis

Production UX on nokioapp.com, not Figma. Scores are for the job a visitor can finish on that screen — not visual polish alone. Phone layouts are cramped but mostly intentional. The broken range is tablet. Signing in unlocks profile chrome and a write-review composer; it does not deliver the social home the FAQ describes.

Playwright Chromium · https://nokioapp.com · 4 September 2026 · signed-out 24 routes × 2 viewports · signed-in 22 routes × 2 viewports · 175 loads across 5 widths · 7 device-agent profiles · 203 device shots, 0 load errors. Credentials are not stored in this report.

2.5 / 5Signed-out mean (24 pages)
2.6 / 5Signed-in mean (22 pages)
480–919Broken tablet band (px)
16pxNav / Sign In hit height
Two products in one FAQ Copy describes a private social graph (“home shows what your friends watched”). Screens show a public streaming guide. Persistent store FAB covers posters, FAQ, and legal text on almost every phone screen. Bookmark is offered on every thumb; signed-out watchlist is a blank pattern.

Screenshot galleries

Every capture from the production audit is linked here. This page keeps the scores, breakpoint analysis, and a session preview. Zip the report folder so the shots/ directory travels with the HTML.

Every page — phone and desktop Signed-in and signed-out captures at 390×844 and 1440×900, with what each shot shows and prioritized fixes. Same-route signed-out comparisons on discovery and account pages. Device-wise report (7 agents) 203 screenshots · iPhone 14, Pixel 7, iPad Pro 11, Galaxy Tab S9, landscape, Desktop Chrome. Sticky Phone / Tablet / Desktop switcher and per-page gaps. Seven aspect ratios 203 screenshots · 360, 390, phone landscape, tablet 3:4 / 4:3, 1440 16:9, 1920 FHD. CSS-width evidence for the tablet band. Member session — 33 frames Desktop 1440×900 while using the product: trailers, watchlist 0→1, follow 1→4, review submit failed.

Used as a member — session filmstrip

Desktop 1440×900 while actually using the product: trailers, watchlist, search, follow, review composer, profile. Watchlist went 0 → 1. Following went 1 → 4. Review submit stayed disabled.

Home signed in
01 Home signed in
Trailer playing
03 Trailer playing
New releases after save
05 After watchlist save
Trailers grid
06 Trailers grid
After trailer thumb
07 Thumb applied a filter
Search The Gentlemen
08 Search with query
Review draft
10 Review draft
After follow
14 After Follow
My watchlist
18 My watchlist (1)
My reviews empty
19 My reviews still 0
My followings
20 Following 4
Edit platforms
22 Edit platforms

All 33 frames, with the action log, are on Member session.

Cross-cutting UX findings

Signed-out page scores

Scale: 1 = broken promise, 5 = job done without friction. Discovery and movie pages are usable catalogs. Social and account pages break the product story.

PageGroupScorePrimary job
HomeDiscovery2.5Decide what to watch tonight from trailers, new titles, and social proof
New releasesDiscovery3.0Browse titles that just landed, by platform and language
Trailers (Recent / Release)Discovery3.5Skim latest trailers and pick one to play
Movies searchDiscovery1.5Find a specific title
About usMarketing1.0Understand what Nokio is and how to start
FAQMarketing2.5Resolve confusion about Circles, privacy, and how the product works
Terms / PrivacyLegal3.0Read the agreement / data use
Public profilesSocial3.0Find critics to follow
Festival / awardsFestivals3.5Browse an awards slate
Festival panelFestivals2.0Watch or read a festival panel
Movie — reviewsMovie3.0Decide if this title is worth watching
Movie — trailersMovie3.5Play a trailer for this title
Public profileSocial3.5Evaluate a critic and follow them
Followers / FollowingSocial1.0See who follows this person / who they follow
Watchlist / Edit profileAccount1.0See saved titles / change account — empty chrome, no prompt

What signing in actually changes

PageSigned-in scoreNote
Home2.5Same public catalog; rail can paint empty grey cards before session
Trailers3.5Strongest discovery surface
Movies search1.5Still no field on the page
Circles friends / following / followers2.5Featured public profiles, not the user’s graph
My watchlist / reviews / recs / friends2.0Honest empty copy exists; profile chrome collides on phone
Edit platforms / languages3.0The onboarding job, done as settings
Movie — reviews4.0Best signed-in page — read and write a review
Public profile (in)1.5Regression vs signed-out critic page in the captured session

Responsive: JS and CSS disagree on every breakpoint

Header, search, and several page layouts branch in useBreakpoints (pixel comparisons, no media query). CSS uses @custom-media in globals.css. Until useEffect runs, width defaults to DEFAULT_WIDTH = 1600, so the first paint on a phone is the desktop header.

TokenCSSJS (useBreakpoints)Gap
Mobilemax-width 480width < 480Aligned. Desktop nav hides only here.
Mobile largemax-width 640480–919 (extraSmall)Home columns stack at 640 CSS; JS tablet is 920.
Tabletmax-width 960isUptoTablet: width < 92040px hole. Search icon vs full bar disagree.
Small / laptopmax-width 1280isSmall: 480–1279JS treats 500px as “small desktop”.
SSR defaultactual viewport1600px until hydrateLayout flash: desktop chrome on mobile first paint.
Header is fighting its own CSS Header wrapper is width 100rem (1600px) and padding 0 4rem until 480px. Flex shrink saves it from page scroll — used width shrinks, intended layout does not. Search Input.white is min-width 400px. At 768: logo, New / Trailers / Circles / Awards, a pill search whose placeholder clips to “Search for”, country flag, Sign In, and hamburger — all on one 64px-tall bar. Nav links measure 16px tall. WCAG 2.5.8 needs 24px on the short side.

Tap targets below 24px

ControlSize
Hamburger / MenuPopup18 × 16
Nav links @76816px tall
Sign In @76844 × 16
Carousel arrows13 × 50
Drawer close18 × 18
See More (xs button)57 × 22
Pagination dots8 × 8

Where overflow lives

Document scrollWidth never exceeded the viewport — pages set overflow hidden (home uses 100vw). Content is clipped instead of causing a page scroll.

SurfaceViewportClippedCause
Public / Profiles grid375 / 43096pxrepeat(2, minmax(160px, 0.2fr))
Movie recommend textarea375–10241129pxOff-canvas ContactList (positioned, not page scroll)
Public profile favorites76829pxFavoriteMovies width 390px + ProfileInfo min-width 290px
Home New Releases dots37532pxDotIndicators row wider than section header
Movies search list375 / 43013pxVirtualized MovieList content-row 155–170px min

Page-by-page layout

Discovery

Home CSS stacks the 2/3 + 1/3 columns only under 640px. At 768 and 1024 the trailer carousel is undersized next to a full-height recommendations column. Platform and language chips clip with no fade. New releases at 375 uses a 3-column poster grid — stamps, unreadable titles, bookmark icons on tiny art, filter FAB plus store FAB on the right edge. Movies search at 375 showed sort pills over an empty patterned body.

Movie

At 375 the hero truncates title, year/language, and genres. JustWatch “POWERED BY” is 0.52rem (8.3px). CreateReview YouTube field is min-width 25rem (400px) inside the mobile breakpoint. Recommend ContactList stays mounted off-canvas with min-width 350px. Best page in the product once signed in (score 4.0) — the composer works if the star rating registers.

Social

Public profile grid overflows 375 by 96px and gets clipped. Names ellipsize. Store FAB covers the bottom-right avatar. At 768 the public-profile header never stacks (690px min-width only yields at 480). Circles featured names truncate. Followers/following routes for a public profile were empty shells.

Marketing and legal

About us: full-viewport black, one sentence, 0 anchors, failing contrast. FAQ questions are the right ones; copy does not match signed-out (or signed-in) home; store FAB overlaps body; no accordion. Privacy effective date 23 Dec 2020 looks stale. Reset password close X is a sub-24px target; a mobile keyboard will cover the vertically centered submit.

Device agents — not resized desktop

Every route loaded with a real device descriptor: iPhone 14 Safari, Pixel 7 Chrome, iPad Pro 11 Safari, Galaxy Tab S9 Chrome, those devices in landscape, Desktop Chrome as control. That sets user agent, touch, DPR, and CSS viewport together.

Layout still sniffs width; install CTA sniffs UA Header Nav, search field vs icon, and Sign In use window.innerWidth (480 / 920). The “Open App” bar uses navigator.userAgent after 5s (iPhone, iPad, Android). iPad Safari is a tablet that still gets desktop Nav, plus a mobile install prompt. Resizing a desktop window never showed that prompt. 160 of 203 loads showed Open App; 0 of the Desktop Chrome loads did.
AgentCSS viewportHeaderSearchOpen App
iPhone 14 Safari390×664 · DPR 3Hamburger only (correct)IconYes
Pixel 7 Chrome412×839 · DPR 2.625Hamburger onlyIconYes — in the fold
iPhone 14 landscape750×340Desktop Nav + hamburgerIconYes — covers the trailer
Galaxy Tab S9640×1024Desktop Nav (16px) + hamburgerIconYes
iPad Pro 11 Safari834×1194Desktop Nav + hamburgerIcon (834 < 920)Yes
iPad Pro 11 landscape1194×834Desktop Nav + hamburgerField (1194 ≥ 920)Yes
Desktop Chrome1280×720Desktop Nav + hamburgerFieldNo — store FAB only

Phone landscape (844×390) is a different product: width 844 hits tablet CSS (≤960) with a 390px-tall viewport. Header + chips eat the trailer.

Interaction bugs found while using the product

ResultActionDetail
okWatchlist addClicked three bookmark controls; My Watchlist went 0 → 1. Hit targets are tiny; most clicks did not persist.
okSearch with query/movies?q=The+Gentlemen returns results. Empty /movies does not.
okFollowFollowing 1 → 4
failReview submitSubmit disabled — stars ignore a click that has no prior pointermove
failTrailer thumbApplied a platform filter instead of playing

Responsive fix order

PriorityChangeUnlocks
1One breakpoint map: CSS custom-media = JS useBreakpoints. Drop DEFAULT_WIDTH 1600 for layout.Stops desktop-nav-on-tablet and hydrate flash
2Header: hide Nav below 960; 44px min hit area; search min-width 0 / width 100%.Every page
3Stack home columns at tablet (960), not only 640. Replace 100vw with 100%.Home / trailers / new releases
4Profile grid: minmax(0, 1fr) two-col; stack profile header under 960.Profiles + public profile
5Movie hero wrap; drop CreateReview 25rem min-width; enlarge JustWatch type.Movie reviews / trailers
Previous User journeys Next Page screenshots