Skip to content

← All documentation

Post-install setup · Y2Reborn

Reborn Product UI v4 — one strict system

Documentation published by SchulzCode/Y2Reborn.

Instructions published by the project, shown here word for word.

Reborn Product UI v4 — one strict system

Plan and design contract, 2026-10-16. **Phases 0–3 released in Y2Linux 1.0 Beta 7 (baseline-61), refined through Beta 7.6 (baseline-67, sections at the end); phase 4 (device qualification) open.** Successor to Product UI v3; applies to Reborn's own look. Skins keep drawing their own layouts (see Skins).

Why

Owner, after Beta 6.3: since playlists, search and radio were added "the UI looks kind of full"; the default look is liked but "still a little rough"; it should be "tailored to actual users, not a developer", "consistent everywhere and follow a strict design choice"; removing things users would not need is welcome.

Review basis: a device capture of Beta 6.3 (Settings; matches the host render) and all 92 interactive states of reborn-preview (boot and shutdown frames excluded). The roughness is mostly inconsistency: the same idea is drawn three or four ways depending on when its screen was written.

Findings (Beta 6.3)

  1. Focus and colour. Library lists focus with a cover-tinted, outlined row

    (components::accent_row); Settings with neutral glass (glass_row) and a fixed blue for checks, sliders and progress; action sheets with a white filled row and dark text; Folders with glass inside a content list. Toggles are iOS green. The playing song in Songs is accent text in the same colour as the focus, so "playing" and "selected" look alike. The accent changes with every cover, so the same list is orange, teal or blue from one song to the next.

  2. Four button styles: accent pill (Artist Play All), glass pills (Album and

    Playlist Play/Shuffle), outlined pill (empty library Scan for Music), white and dark pills (dialogs, Station Info).

  3. Permanent hint lines: keyboard ("Buttons move · Select types · Hold Select:

    done · Hold Back: cancel", although Cancel and Join/Create/Search are keys), Bluetooth ("Select to connect · Hold to forget"), Up Next ("Hold Select to remove"), Radio Favorites ("Hold Select on a station to add it"), playlist move ("turn the wheel, Select to drop"), theme picker ("Add skins by copying…").

  4. Information users do not need: "NOW PLAYING" over Now Playing; the gapless

    icon (on by default, so always shown); radio MP3 · 128 KBPS and country-code tags; "ON AIR", "LIVE" and "ON AIR" for one fact; Popular rank badges plus "Top 2" plus codec/bitrate in one subtitle; Home counts; Wi-Fi "Good signal" beside the bars; Bluetooth codec in the device list; "by Reborn" on every theme; free space in Folders; "Songs in Library" and "From a Computer: Ready" in Storage.

  5. Layout rules differ: Settings groups rows in cards, but the Bluetooth and

    Wi-Fi device lists sit loose under a carded switch; Radio and Playlists use coloured icon tiles with outlined focus, the library round art with filled focus; empty and info states are drawn four ways (Wi-Fi off centred with icon, firmware left-aligned text, Playlists one plain line, scanning a ring); Display → Album View has no chevron beside rows that have one; spelling mixes "Normalise" and "Favorites".

  6. Home has ten items (Now Playing, Artists, Albums, Genres, Songs, Folders,

    Playlists, Search, Radio, Settings) with counts and fills the screen.

Also: preview fixtures 70-search-keyboard, 70b, 70c are titled "New Playlist" (fixture labelling, not product); fix before the before/after comparison.

Owner decisions (2026-10-16)

QuestionDecision
Cover colourNow Playing only: its background glow and the Home cover card. Everything else uses one fixed accent.
HomeMusic submenu + pinning: Now Playing, Music, Playlists, Radio, Search, Settings; Music holds Artists, Albums, Songs, Genres, Folders; a Home Menu setting pins any of them back.
Quality on Now PlayingOne quiet tag: "Lossless · 96 kHz" for files; radio shows no codec or bitrate (Station Info keeps them).
Hint linesRemoved; holding Select opens a menu that names the actions (Forget, Remove, Add to Favorites).

Rules (the contract)

One component per idea; screen code must not draw its own variant.

IdeaRule
AccentOne fixed accent (theme::color::ACCENT, today's blue) for every control and state. The cover colour is used only by Now Playing's backdrop and the Home cover card. A skin's fixed accent still overrides.
FocusNeutral glass row, bright text, same radius and inset everywhere: lists, settings, sheets, radio, playlists, search. Never colour alone.
StateAccent marks state only: playing item, check, switch on, progress, the Home marker. Focus and state never share a treatment.
SwitchesAccent when on (no separate green).
ButtonsOne shape. Glass when idle, white fill with dark text when focused. At most one primary per screen; destructive actions only in dialogs.
Live radioOne red LIVE pill. No "ON AIR".
Empty, info and error statesOne component: centred icon, title, one sentence, optional button. Firmware messages use it with numbered steps (keeping system.img; the owner must copy that file).
ListsContent (artists, albums, songs, stations, playlists, results) is flat and full width. Settings-type lists, including Bluetooth and Wi-Fi devices, are grouped cards. A chevron only on rows that open a page; a row that changes a value in place shows the value and no chevron.
HintsNo permanent hint lines. Hold-Select actions are listed in the item's menu. The keyboard's Cancel and Done keys are the only instructions it needs.
RowsTitle plus at most one secondary line of facts a listener uses (artist, album count, country · genre). No codec, bitrate, rank, free space or internal state in lists.
WordsAmerican English, Title Case for titles and labels, sentence case for secondary lines.
Menus (8.36)Menus hold actions on the item; preferences live in Customize. Every song and collection menu lists its shared actions in one order: Play, Shuffle · Play Next, Add to Queue · what this place changes (Move, Remove from …) · Add to Favorites, Add to Playlist… · Go to Album, Go to Artist · Select Songs…. A row that would not change anything is left out. No new row without removing one (test every_menu_lists_its_shared_actions_in_one_order).
Scrolling (8.37)Headers stay; only lists scroll. The focus moves through the rows in view; the list moves one row when the focus reaches an edge, with the list glide. Album, playlist and audiobook headers, Display's brightness card and the search field stay put while the list under them scrolls (components::header_list_*, views_search::search_first, Ui::group_window).
ValuesA row's value uses the room its label leaves and ends in "…" (sheets, and skins' right-aligned {detail} up to the end of {label}).

Screen changes

Unchanged: the Home typography and layout, Cover Flow, the Now Playing composition, the status bar, dialogs' structure, the boot and shutdown sequences, the service and diagnostics pages (hidden; developer-facing by design).

Skins

Skins draw layouts by name. The Music submenu needs a layout name (music), and the Home Menu setting changes Home's item list, which skins read through the engine. Both go into tools/assets/build_skins.py finishing steps (never hand-edited skin.json; Classic's hand-written json gets the layout by hand). Every shipped skin must load without warnings and render the new screens.

Phases

  1. Spec and audit (this document). Milestone-boundary audit row in Y2Linux

    docs/planning/roadmap-gap-audit.md. Fix the preview fixture titles; keep a "before" preview set.

  2. Components and tokens (theme.rs, components.rs): fixed accent outside

    Now Playing, one focus row, one button, LIVE pill, empty-state component, accent switches; then remove every screen-local variant. Most of the "rough" feeling goes here.

  3. Home and Music: submenu, Home Menu setting with persistence and reset,

    navigation and back stack, skins' music layout.

  4. Content trims per Screen changes, hold menus that replace hints.
  5. Qualification: host previews before/after for Reborn's look and every skin;

    tests and strict Clippy; device walk-through with screen capture while the owner presses the buttons (input cannot be injected over SSH).

Each phase is reviewable and releasable on its own.

Phase 1 as implemented (2026-10-16)

Left for later phases as planned: hint lines, ranks, codec/bitrate, signal words, theme previews, spelling (3).

Phase 2 as implemented (2026-10-16)

Phase 3 as implemented (2026-10-16)

Beta 7.5 refinements (owner request, 2026-10-16)

Beta 7.6 update screens (owner: "low fps", 2026-10-16)

Not verified

Everything here is released (Beta 7 to 7.6) and checked on the host (previews, tests). On the device only the motion frame rate is measured (Beta 7.3: 62 fps median). Hold-menu discoverability without hints, the fixed accent, the Beta 7.5 status bar and the Beta 7.6 update screens on the panel need the device walk-through in phase 4.

Customize and Wrap Around (Beta 8.18)

Settings gains a ninth place, Customize (how Reborn behaves; Display keeps how the screen looks): Wrap Around, Home Menu and Album View, the last two moved from Display. The Settings root shrinks its rows (44 px down to 34 px for nine) so every place stays in view.

Wrap Around (Settings::wrap_around, reborn_core::WrapAround) continues a list at the other end: past the last row to the first, before the first to the last. One press on the row steps Off → Menus → Everywhere. Menus (the default) covers Home, Music, Settings and its pages, and the hold and context menus; Everywhere adds the long lists (Ui::is_long_list: the library catalogs, Queue, Playlists, a playlist, Stations, Time Zone). All of it lives in Ui::move_focus, the one place every list moves.

Previews: 20b-settings-last, 51c-customize, 51d-customize-everywhere. On the player, the feel of the 350 ms rest and of the default still need checking.

When Screen Off and headphone controls (Beta 8.18)

Customize also holds When Screen Off (Settings::screen_off_buttons, reborn_core::ScreenOffButtons), Y2Player's "Wheel When Screen Off" redone in the one place that owns screen-off policy, reborn_platform::input::ActionRouter:

ChoiceWheelCentrePrevious/Next (held: seek)Play/Pause
Locked––––
Buttons (default; Reborn's behaviour before)––yesyes
Wheel + Buttonsvolume, one step a detentplay/pauseyesyes

Back never acts in the dark. A button that rests is swallowed from press to release, even when the screen wakes in between. Power, the volume keys and headphone controls work in every choice: AVRCP commands (AirPods: press play/pause, double next, triple previous) arrive through BlueZ and reborn_platform::avrcp, never through the router, and Action::PlayPause/NextTrack/PreviousTrack are handled before the UI's screen-off gate. Holding the AirPods stem switches noise control inside the AirPods; the player is not involved.

A paused player with Bluetooth headphones connected stays awake for HEADSET_PAUSE_AWAKE_SECS (15 minutes) before automatic sleep, so the headphones can continue playback; asleep, the radio is off and nothing hears them. The 15 minutes count from the pause itself (paused_at) and end with the pause: a hold kept across a resume was already over at the next pause, and the player slept 60 s after it with the headphones connected (Y2Linux #90, F68; platform::headset_hold_since). The paused sink is still released after three minutes (HOLD_LIMIT); playing again then reopens it.

Search page (Beta 8.32, owner request 2026-10-24)

Owner: the search "looks good but navigation wise it's a little tricky and also has some visual glitches". Findings before the change: two result views that disagreed (three rows above the keys without audiobooks and capped at 60; a second full page with an "Edit Search" row), results reached only by Up through the top key row (landing on the third row, and the same press wrapping to Done when nothing was found), the wheel dead while typing, Back from an opened result landing on a page never seen, one mixed list without headings, audiobooks matched inside words; the focused live row covered the scroll rail, the count crowded long text out of the field, round artist covers showed grey square corners while the focus glided.

Queue and Up Next (Beta 8.33, owner request 2026-10-24)

Assessment before the change: every queue edit while playing reloaded the song (load() restarted the decoder from the last reported position, ≈0.3 s of audio dropped) only so the gapless pre-open learned the new next song; Add to Queue appended after up to 5 000 songs of All Songs; Next on the last song with Repeat All and Previous on the first song stopped playback; Shuffle changed only what started later; two Play Next ran backwards; Up Next opened on played songs (Y2Linux #60); moving was one menu trip per place (Y2Reborn #32); no multi-select (#26); queue actions missing on albums/artists/genres/folders/search (#31); the session saved ≈820 bytes per queued song on every song change.

One menu order, Customize choices (Beta 8.36, owner request 2026-10-25)

The owner asked that new features not bloat menus and that the UI work the same way everywhere, with labels that mean what they say. Rules added to Rules: menus hold actions, Customize holds preferences, one order for shared actions, no growth without removing a row.

Previews 51c-customize, 09b-album-from-genre, 17e–17h, b2-audiobooks (Cover Flow). Haptics (#28): Customize > Haptics Off (default) / Light / Strong (Settings::haptics, reborn_core::Haptics). reborn_platform::haptics::Motor plays one 60 ms rumble on the kernel's regulator-haptic input (PMIC VIBR) for each button press on a lit screen, as the stock firmware's key press (framework config_virtualKeyVibePattern); wheel steps do not tick (30 ms per-step ticks felt buzzy on the owner's player). Light is 2.0 V, Strong the stock 2.8 V.

Internal speaker (#28 speaker): Settings > Sound > Output > Speaker (on by default, as stock's "Speaker"). The Headphone Jack output plays on the speaker while the kernel reads the jack empty (reborn_platform::jack, "Y2Audio Headphone" SW events; unknown counts as headphones). The output's name then reads "Speaker". The DAC's speaker route plays one channel, so the gain stage mixes (L+R)/2 (VolumeRamp::mono); the sink switches the card's Speaker pin with Master −3 dB (stock's top speaker step). Headphones in while the speaker plays: the kernel turns the speaker off at once and playback reopens on the headphones; headphones out while they play: pause, as stock. Not yet heard on a player.

Sleep timer lengths (Beta 8.37, Y2Reborn #29)

Now Playing's Sleep Timer row opens a picker instead of stepping on each press: Off, End of Song (End of Chapter in a book), 5, 10, 15, 20, 30, 45 min, 1 h, 1 h 15, 1 h 30, 2 h, 2 h 30, 3 h (SLEEP_MINUTES). It opens on the timer set (else 30 min), marks it ("23 min left"), stops at its ends; Select starts it, Back leaves it as it was. Now Playing keeps "Sleeps in 23 min" opposite the output and now redraws it as the minutes change, also while paused. Skins get {sleep} and "if": "sleep"; every shipped skin shows "Headphone Jack · Sleeps in 23 min" on its output line (build_skins.py add_sleep), and the moon icon. No menu row added. Previews 14c-now-playing-sleep, 14d-sleep-timer-picker.

Search: one level at a time, short sections, playlists (Beta 8.37, Y2Reborn #44)

Previews 71f-search-see-all, 71g-search-songs-alone, 71h-search-playlist.

One way of scrolling (Beta 8.37, owner request)

The playlist page lost its focus below the screen (its header stayed until the sixth song while showing three); the owner then asked for one way of scrolling everywhere and, after trying a header that scrolled away with its list, chose: headers stay, only the list scrolls. Album, playlist and audiobook pages keep their header and scroll the songs or chapters under it (three rows and the next one's top; the list is drawn first, the header over it, so a row gliding up passes under it). Display keeps the brightness card over its rows; the search keeps its field over the results (a section alone has none). Settings pages keep their rows until the focus reaches an edge (Ui::group_window, their own memory: the rows that fit under a page's text differ) and glide. Up Next and the long lists were already so. The artist page keeps its sideways row of albums. Tests a_page_header_stays_and_its_list_scrolls_one_row_at_a_time, a_playlist_page_keeps_the_focused_song_on_screen, settings_pages_keep_their_rows_until_the_focus_reaches_an_edge.

The live wave (Beta 8.38, owner request)

The progress wave on Now Playing (and now Home's card) is drawn as one ribbon: points every 2 px with averaged normals, a 2.6-px core and a 1-px edge on each side fading to transparent through the quad's corner colours — edge anti-aliasing without MSAA, and no beading because the pieces share their joints. It moves with the music (Levels: bass, mids, highs, 0..1): height 0.35 + 0.85 × loudness (typical music as tall as before, loud up to about a third more), bass swells it, highs ripple it; without levels (nothing measured) it waves as before. Not a spectrum visualizer (the owner: "not yet"). Previews 14e-now-playing-loud, 14f-now-playing-quiet.

Folders, Shuffle Albums, playlist Sort (Beta 8.39, user report)

A folder-first listener with 120 000 songs and loose tags. Folders shows a folder as a file manager does: its folders, then its songs, both by name (case and accents folded, numbers as numbers), songs by file name without the extension, the line under it the artist; folder rows say how many songs they hold. A song plays its folder's songs in that order; Play on a folder plays its folders first, then its songs, all the way down. Storages are titled SD Card and Internal Storage. Shuffle steps Off → Songs → Albums (Now Playing's menu, Settings → Playback): Albums plays whole albums in random order, each in disc/track/file order (an album = its folder, CD/Disc folders folded, and its album tag); Shuffle Albums is also in the menus of folders, artists, genres, playlists and an artist's Play, not an album's. Sort in a playlist's menus (and on holding its Play or Shuffle) steps Playlist Order → Album → Artist → Title → File Name, the menu staying open; the page shows and plays in that order, the file is unchanged, Move only in Playlist Order. Previews 13-folder, 13b-folder-songs. Tests a_folder_lists_its_folders_then_its_songs_by_file_name, playing_a_folder_follows_folders_order_and_offers_shuffle_albums, shuffle_steps_through_off_songs_and_albums, a_playlist_sorts_its_page_and_plays_in_that_order.

One album once, Album Order, letter scrolling (Beta 8.43, Y2Reborn #45 #46 #56 #30)

Published by the SchulzCode/Y2Reborn project [1] [3]