Repository navigation
Welcome App
The Welcome app is the guided first-run of the shell — a short, animated tour that gets a fresh install from "a bare desktop" to your desktop: language, keyboard layout, date and time, network, your name, a look (wallpaper + colours, or a whole preset from the store), your monitors, your bar, the shortcuts worth remembering, how Search works, and the accounts you may want to connect (Gmail, Google Calendar, Google Drive backup, TickTick). It can restore a previous settings backup before anything else, and you can reopen it at any time.
-
After installing. The installer (
ii-p3drovfx install, the samesetup-ii-p3drovfx.shCLI that updates the shell) starts the shell and opens the Welcome over IPC once the shell answers — it polls for up to 15 seconds in the background rather than holding up the summary. Every successful deployment opens it, exceptupdate. (It does not depend on whether the fork's Hyprland files were installed; those only make the compositor float the window.) -
From the upstream
./setupa first install on a TTY can't reach a running shell, so the request waits as a file,~/.local/state/quickshell/user/welcome_pending: the shell reads it at startup, waits 2.5 s for the session to draw, opens the Welcome and deletes the file. It means "setup asked for it", never "already shown" — a new install, or./setup resetfirstrunfollowed by an install, re-arms it; an update does not. -
On demand: Super + Shift + Alt + /, or
qs -c ii ipc call welcome toggle(open,close).
Every way of opening it goes through GlobalStates.openWelcome(), which first moves you to the nearest empty workspace (the guide is a window in the middle of the screen, and on a fresh install the desktop underneath is whatever terminal ran the installer) — skipped if the current workspace is already empty. The switch is asynchronous, so the window opens ~220 ms later to avoid mapping on the workspace it is leaving.
Thirteen steps with stable ids (WelcomePageRegistry); the button of each page names the next step ("Add your name"), not the action.
| # | Page | What it does |
|---|---|---|
| 1 |
Hi there (hello) |
A rotating greeting; "Let's go". At the bottom-left, Restore from a [[settings backup |
| 2 | Choose your language | Only the languages that have translations; English first. A note says missing strings are completed later by AI |
| 3 | Keyboard layout | The current XKB layout and variants from Hyprland, a list of known layouts, and manual fields behind a switch. It applies at once and writes a managed block in custom/input.lua. Skippable |
| 4 | Date and time | Formats shown as the rendered date (never as a format string), 12/24 h, week starting Monday |
| 5 |
Get connected (start) |
Wi-Fi (choose a network inline), Bluetooth, audio output, battery — online means Wi-Fi or ethernet. "Set up later" appears only when nothing is connected |
| 6 |
Add your name (profile) |
Name, photo, avatar shape and colour ([[Customization |
| 7 |
Make it yours (personalize) |
Two tabs: pick a wallpaper and colour scheme, or ready-made looks from the Preset Store — one click installs and applies a preset ([[Preset Store |
| 8 | Set up your displays | Arrange monitors by dragging; each physical screen shows a big number for ~3 s on arrival (and on demand) so you know which is which |
| 9 |
Arrange your bar (bar) |
Opens the real [[Edit Mode |
| 10 | Shortcuts to remember | Keybind cards derived from your actual Hyprland binds (never hard-coded keys); clicking a card runs that shortcut; a checklist ticks what you've tried but never blocks |
| 11 |
One box for everything (search) |
The launcher's panels and prefixes, derived from the live settings — a disabled panel vanishes and a rebound prefix shows the new symbol |
| 12 |
Connect your accounts (learn) |
Four tutorial cards, below |
| 13 |
All set! (finish) |
Done; opens Settings if you want |
Navigation: the floating buttons, Alt + ← / →, Esc (back out of a tutorial, then close). Pages slide with an interruptible transition; hovering Next or Back nudges the current page slightly in that direction (a predictive preview) without loading the destination, and an animation level of "reduced" turns the motion, blur and stagger off.
Each tutorial is a short step list with live "done" states, linking to the console you need and to the Settings page that finishes the job; they don't duplicate OAuth or sync code.
| Tutorial | Walks through |
|---|---|
| Set up Gmail | Google Cloud project → Gmail API → consent screen (scopes) → test user → Desktop OAuth client → paste the ID and secret → Connect Account → verify ([[Gmail Integration |
| Set up Google Calendar | Install khal and vdirsyncer (the right command for your distribution) → OAuth credentials → ~/.config/vdirsyncer/config (a copyable sample) → vdirsyncer discover / sync → khal configure → verify ([[Khal Integration |
| Set up Google Drive backup | Check rclone → enable the Drive API in the same project → Settings → Accounts & Backup ([[Rclone and Google Drive |
| TickTick | Developer Center app → client ID / secret → authorize ([[To-Do and Tasks |
The credentials flow is shared: all four reuse one Google Cloud project.
-
In-process.
welcome.qmlis only a compatibility wrapper for the legacy keybind;shell.qmlkeepsWelcomeWindow.qmlbehind aLoadergated byConfig.ready && GlobalStates.welcomeOpen, so the whole tree is released when the Welcome closes. It always starts athello. -
One page alive.
WelcomeFlowholds only the current page (and, mid-transition, the one leaving); no page is preloaded or remembered as visited. - Previews it opens, it closes. Sidebar/Search previews and dialogs shown by a page are cleaned up when you leave it — but only those the Welcome itself opened; something you already had open stays.
-
Deep links.
GlobalStates.openSettingsPage(pageId, subPageId)validates ids againstSettingsPageRegistry; tutorials use it to land you on the right settings page, even if Settings is already open. -
Shortcut cards resolve actions through
WelcomeKeybindRegistry, which lists candidate descriptions per action (the defaultShell: Open search onlyis commented out in the shipped binds, so Search also falls back to the Super tap) and formats modifiers from your Cheat Sheet options. -
Files:
modules/welcome/(WelcomeWindow,WelcomeFlow,WelcomePageRegistry,Welcome*Page.qml,WelcomeMotion,WelcomeRestoreDialog,WelcomePresetStorePane,tutorials/),modules/common/ShellModePolicy.qml,GlobalStates.qml.