Repository navigation
Redesign the Ember reader for compact feeds, focused discussions, and adaptive navigation - #2
Merged
Merged
Conversation
…overed stories by rank
…licate transport errors
…reconnect and offline reload
# Conflicts: # Ember/reader_view.rs
…subscriptions The FerroUI submodule moves to the latest main, with the workspace blocks written by sync-workspace.py and the lock file to match. The launcher and the font collection key take url::Url now. Subscriptions return a guard that unsubscribes when dropped; the menu, theme and timer handlers that live as long as their source are detached, as on main.
The FerroUI submodule moves to main 0c0ea2a72: control themes as static tables (#607), type checks by identity (#616), and the Java layer of the Android backend building on the newer JDK of ubuntu-latest (#621), which the Android package job of this pull request failed on. The workspace blocks come from sync-workspace.py.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On-demand CJK text in the browser
The Wasm reader uses the existing Inter face until shaping needs a missing Han, kana or Hangul glyph. It then fetches one hash-pinned 16,437,364-byte Noto Sans CJK SC Regular face from the site's own origin. The offline worker excludes this optional payload from installation. A verified copy is reusable offline. On first use and reconnect, the reader reshapes existing labels and text editors while keeping the caret and selection.
The browser suite exercises Latin-only startup, a failed font request, recovery on the online event, actual shaped glyph IDs and offline reload. It now runs in one CI job against the site artifact produced by the build. Multilingual discussion and editor · Browser packaging and font provenance
Feed, search and history recovery
Feed recovery at 390 × 844 · Correcting a profile lookup
Final validation passed at
1d2fa76e. All 18 packaged scenarios passed on hosted Chrome and on a separate local Chromium release run. Linux recorded 138 Rust tests, 14 additional parser-only tests and 27 JavaScript tests. Three additional local font tests used the pinned face and exercised loading, shaping and reconnect. Android, iOS simulator and WebAssembly packaging passed. The Wasm module is 38,129,430 bytes. The 16,437,364-byte CJK face is optional and excluded from the startup shell.CI with packaged Chromium interactions
Reader interaction refinements
All 14 packaged Chromium interaction scenarios passed on this exact head, including navigation across three layouts, profile retry after partial failure, clipboard text, reply folding, bookmark undo, Settings Back and offline reload. The 390 × 844 and 1280 × 800 interaction captures were visually reviewed. CI passed 83 reader, 30 core, 20 renderer, 14 parser-only and 18 JavaScript tests, and packaged Android, iOS simulator and WebAssembly successfully. Reader interaction guide · Packaged desktop screenshot · CI for these changes
Performance
The feed shares immutable story payloads and updates only the row ranges that changed. Discussion Find reuses up to 4 MiB of normalized reply text, and its virtual rows reference the original bodies. SQLite and IndexedDB now batch cache operations. The reader writes a compact state snapshot and still accepts existing backups.
Timings use the packaged Chromium releases at
ec9eb5eand76362e6for the UI, and isolated native and browser repository fixtures for storage. On the phone permalink, unrelated HN requests fell from 31 to zero. The Wasm request started at 133 ms instead of 338 ms. In a second comparison with three fresh profile pairs, cold title readiness was 4.95 s versus 4.92 s. Medians for seven worker-controlled reloads per profile changed by −20, −6 and +12 ms across the pairs. Startup work decreased, but the full launch-time gains varied with host load. The first uncached discussion Find took 168 ms in one run. The local Find fixture contained 800 stories and 400 HTML comments. The final frame reported all 16 matches without an API call, and each of five paired runs reached it sooner on the candidate. The measured module grew by 25,234 bytes. The final module is 38,089,633 bytes, an increase of 25,339 bytes (0.067%) over baseline. Discussion-scroll results overlapped on repeat runs. The frame data uses SwiftShader on Linux. All 12 interaction scenarios passed on the final packaged browser build. A shell-only upgrade activated and reloaded offline with its 38 MB module unavailable from the server.The final three-line reader change keeps keyboard refresh scoped to a single visible discussion. The native key-event regression covers phone and split view. In the final phone-sized release, pressing R with focus in the reader fetched only the visible discussion. Back then fetched the front page exactly once. Linux, desktop, Android, iOS simulator and WebAssembly CI passed. The test jobs recorded 126 Rust, 14 parser-only and 18 JavaScript tests. Performance methodology and reproduction commands · Final CI
Reader workflow updates
Verified. All 118 Rust tests, 13 parser-only checks, 15 JavaScript tests and 12 release Chromium scenarios passed. The release cases exercised page-two feed restoration, shortcut targeting while a different discussion is visible, nested reply navigation, preference draft discard, canceled downloads, phone rotation and cold offline reload. Android, iOS simulator, Linux desktop and WebAssembly builds passed at
ec9eb5e. The final extracted site was byte-identical to the release used for the twelve Chromium scenarios. Implementation CI · Final PR checksReply navigation · Offline download progress · Preference drafts
Reader experience
Reading position and navigation
Phone screenshot · Desktop screenshot
Previous verification
CI passed at
2a168d6.Earlier verification
Earlier PR checks and platform artifacts passed at
c081576.comment,story_8863to Algolia and opened matching comment9707in the release reader. It used the host’s trusted HTTPS client for the public API transport.Preview
Compact feed · Swipe feedback · Code tools · Discussion search · Offline storage · Full gallery