Welcome and guided tour
Onboarding (ui/onboarding.py) is the
full-window welcome: an animated intro, story slides, setup pages that apply their choices live, and a guided tour of
the real interface.
When it appears#
app.py starts it when onboarding.version in the settings is lower than ONBOARDING_VERSION, JBrowser wasn't
started with URLs or --incognito, and JBROWSER_SKIP_WELCOME isn't set. Finishing or skipping stores the current
version.
ONBOARDING_VERSION is 1 in this version.
It can be replayed at any time with Replay welcome in Settings → About JBrowser, or the Replay the welcome tour command.
Raise ONBOARDING_VERSION when a release adds something the welcome introduces, and only then: every existing
user sees the whole welcome again.
One layer, one clock#
Everything is painted on one widget that covers the window (the browser UI is hidden until the tour), and a single
animation clock (now()) drives every effect. Each element computes its state from the time since its step began,
using the easing helpers at the top of the file (out_cubic, out_back, seg, lerp…). That keeps dozens of
effects in sync and makes Fluid animations off trivial: time jumps to the end.
The steps#
intro → story0 … story2 → look → search → shield → spaces → touches → ready → (tour)
| Step | Content |
|---|---|
| intro | three brand-coloured orbs swirl in on comet trails, pulse on the sound's first hit and merge into the logo; the wordmark letters hop in (timed to intro.wav: T_FORM, T_LOGO, T_WORD, T_END) |
| story0–2 | headlines (STORY) rise word by word under a shimmering brand gradient |
| look | theme and material as painted previews |
| search | the default search engine |
| shield | the protection level |
| spaces | name the starting spaces and pick their icons |
| touches | small preferences (sounds, animations, the bookmarks bar…) |
| ready | take the tour, or start browsing |
Setup pages are SetupPage widgets inside a frosted panel (paint_glass); ChoiceTile is the selectable card with
a painted preview. Every choice writes to the settings immediately, so the window behind changes as you choose.
The tour#
begin_assemble() fades the real browser in; start_tour() then moves a spotlight between parts of the interface
(TOUR), with a TourBubble explaining each one:
spaces, favourites, the address pill (Lazy Toolbar), the canvas, the card list, the Archive, the shield and the logo
(Settings).
_target_rect() finds each widget's rectangle, so the tour follows the real layout at any window size. While the
welcome runs, ctx.commands.set_shortcuts_enabled(False) keeps browser shortcuts from firing.
Sound#
Sounds (ui/sounds.py) plays intro.wav and a soft click.wav on each step forward
through QSoundEffect, with the native Windows audio backend. appearance.sounds mutes it; if Qt Multimedia or an
audio device is missing, playback silently does nothing.