Launcher redesign: who's playing, a home for each kind of player, and a splash for RecompLauncher and the Deck #68
Labels
No labels
area/build
area/install
area/saves
area/ui
area/updates
ci: approved
good first issue
gpu/amd
gpu/intel
gpu/nvidia
help wanted
kind
bug
kind
chore
kind
docs
kind
feature
kind
performance
kind
question
platform/linux
platform/steam-deck
platform/windows
priority
critical
priority
high
priority
low
status
blocked
status
confirmed
status
duplicate
status
invalid
status
needs-info
status
wontfix
ci: approved
No milestone
No project
No assignees
6 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/LongshotLauncher#68
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The launcher is built for the people who build it: channels, versions side by side and pull request builds are all on one screen, and a player who just wants to play sees all of it. This proposes starting with who is playing: each player has a name, an avatar and a kind (Kid, Normal, Advanced), the kind decides how much of the launcher they see, and each player's saves and settings live in their own folder, outside the game.
Every picture below is a mock (HTML, 960 × 600 like the launcher's window), not a build. The game's art (the save pictures) is replaced by grey boxes; in the launcher it would come from the player's own build, as LL#55's save pictures do. The avatars are the team's beans, shown as they are.
Contents: For players · Three looks · For maintainers · Linked issues and pull requests
For players
The whole flow
Every screen and what leads where. Start on the left: The first start, Every start after, RecompLauncher or a Steam shortcut and The older launcher was here.
0. The first start: your game, once
You point the launcher at your game files once. It shows where each thing will go before anything is written: the game files, the build, the versions, and your saves and settings. If the folder is on an SD card, it says so and offers internal storage. Portable keeps everything in one folder (for example on the SD card) instead of the standard places.
<choice>-<player>)~/Games/Longshot%USERPROFILE%\Games\Longshot~/.local/share/longshot%APPDATA%\Longshot<folder>/builds,<folder>/userIf the game files are already unpacked and correct, row 0 is skipped entirely.
1–3. Who's playing?
One tile per player. The first time you pick, the launcher asks whether to go straight to that player from then on. A new player gives a name, picks an avatar, then a kind. Create goes straight to their home; Reuse a save… lets them start from a copy of someone else's save instead of from nothing.
Avatars come from icon packs, and the picker shows five at a time. For now there is one small pack, so there is no pack selector. The mocks show it with a bean pack: five of the team's beans (the grappling-hook bean, the fairy bean, the teary elf bean, a red and a green bean), as suggested here. They are the team's own art, so they can ship with the launcher and are there from the first start. More packs can be added later, the game's icons among them (the hookshot, the bow, the ocarina, a Goron, Keaton's mask), cut on the player's PC like the save pictures. Once there is more than one pack, the picker gets a pack row and ◀ ▶ to page through five at a time.
4. A kid's home
One big Play button and their save. Grown-ups hold Edit for two seconds to change the kid's version or defaults.
5. A normal player's home
The last save you played, Play, and three choices titled with the real channel names, with plain words under each: Stable (I want a stable experience), Release candidate (I want new features), Nightly (I want the bleeding edge). Telemetry · this PC holds one choice for the whole PC: Always send crash reports and Send performance statistics, both off by default. With crash reports off, every crash shows its window with the log and nothing is sent unless you press Send.
One build per choice, shared. Every player who picks a choice plays the same build (
~/Games/Longshot/rc), each with their own saves and settings, so a second player on Release candidate builds nothing and waits for nothing. The box says who else plays it (shared with Flyingbean). Only a Kid's updates are automatic (before Play); a Normal player picks when to press Update, an Advanced player has Check for updates, and the splash never forces one. Updating a shared build updates it for everyone on it, a kid's automatic update included.Own copy for Soupbean is a switch in the same box, off by default. On (5e), that player gets a build of their own (
~/Games/Longshot/rc-soupbean, about 1 GB more when hard-linked), and only they update it. Off again, the copy is deleted and they are back on the shared build. Their saves don't move either way.With no network, everything that needs none still works (Play, saves, players), and what doesn't (updates, building another choice) says why.
6–7. An advanced player's home
LL#59's home, per player: every version, pull request builds, the build settings. Where things go shows, for one build, its folder and its saves, with the full paths: a pull request build keeps saves of its own, seeded from yours and never written back.
15. Without the launcher's home: RecompLauncher and the Steam Deck
Started from RecompLauncher or a Steam shortcut, the launcher shows a splash that counts down and starts the game, with Options a button away: saves, game settings, and where things go. It is built for a controller.
The button hints follow the last thing you touched: a controller's letters (or a PlayStation pad's shapes), the keyboard's keys, or nothing with the mouse.
The microSD hint shows only when the game's folder is detected on an SD card: internal storage plays faster (L#386).
Upgrading from the older launcher
If the game files are already there and correct, the first start is skipped: the launcher asks only who you are, then makes you an Advanced player with everything kept (your versions, your saves, your settings). It also looks for the older launcher's shortcuts (desktop and menu,
.desktopfiles and.lnks) and moves the ones that start an older launcher, a missing build or a build's game straight to the trash, so only one up-to-date shortcut remains. Show lists what was moved.Bonus: I want to help
For Normal players who want to test pull requests without being developers: saves of its own for each build, How did it go?, and Delete once it's merged. It waits for the gate below (For maintainers).
Three looks, side by side
The same screens in three themes: Launcher (today's look), Menu (the in-game menu's look, so the launcher and the game feel like one thing) and Blossom (white and pink, there to show that a theme is only a file of colours). Only colours, fonts and a few edges change: every screen keeps its layout, words and buttons.
#14161A#16110B, a soft radial light#FFF8FB, pink and peach glows#1C1F24, rounded 8–14 px#241C13, a bronze edge, square (2 px)#F3CDDB, rounded#B08A58#DE9828, a glow#E0679A, Play#D9508C, a soft shadow#B0396EResourceDictionary, after the colour-key refactorResourceDictionaryof the same keysThe menu theme's colours are the menu's own, from Longshot's
gpu/vk/vk_ui.h. Its font is Libertinus, the font the menu falls back to, never the game's own menu font: that one comes from the player's game files, and the launcher ships none of them.For maintainers
Checked against the launcher as it is (
mainat01f2797, and LL#59's branch): Avalonia 12.1.6 with the Fluent theme, .NET 10, one fixed 960 × 600 window with its own title bar, about 50 brushes inApp/App.axaml, its own icon set (c:Icon), 12 language catalogs. Most of the redesign is panels shown or hidden by the player's kind; the new code is mostly inCore/.How each piece would be built
--user <folder>, passed byMakeGameCommand.StartInfo(..., user, own: true)on every platformSaveEnvironment.PullRequestUser; LL#55's player foldersBorderwith aLinearGradientBrushand the item picture (the initial when missing), five at a time; the ring is an outerBorder. Pictures from icon packs: a folderavatars/<pack>/with a manifest (name, pictures in order, cut from the game or shipped); a player storespack/picture. One pack for now, so no selector; the mocks show the bean pack (assets/branding's beans)BoxShadowsFilesStepView/GameFileswith the places inLauncherSettings(Portable,GameFolder,BuildFolder,VersionsFolder,SavesFolder), each row's drive fromDisk.IsSdCard; game files hard-linked from one unpack (FileLinks); LL#55'sextract_save_icons.pywritesgame/pictures/GameFiles,FilesStepView,FileLinksButtonwith aFlyoutTitleBargridButtonwhosePointerPressedstarts a 2 s timerPointerReleasedcancels; held Enter or A with a controllerMotion.cs, the focus ring.longshot-savezip of a slot's files and a small manifestCore/Saves.cscopying and backupsCheckBoxes, one choice for this PC, written to every game folderlongshot_crash.ini(LL#46),send=1inlongshot_perf.ini(L#206)BuildRegistry.FolderOf/LauncherSettings.FolderForUpdatePolicy, LL#57BuildRegistryrecords which players use a build;FolderFor(channel)is shared,FolderFor(channel, player)the own copy, built from the same release and hard-linked (FileLinks); the kid's automatic update and Update act on the folder that player plays; switching off deletes the copy once no player uses itBuildRegistry,FolderFor,FileLinks(LL#58)FolderForandPullRequestUser(n)shown with full paths; Copy a save in…, Fresh copy of mine throughSaves.SeedPullRequestNetworkstate inMainViewModel, set byFetcher/CdnFetchererrors, re-checked every 60 s; each network-only action'sIsEnabledbound to it, with the reason--splash,--options <folder>)--crash <folder>is; one player, This PC; controller focus everywhere--crash(Core/CommandLine.cs),CheckReleasesAsync, the focus ringInputMode(Pad, PlayStation, Keyboard, Mouse) set by tunnellingKeyDown/PointerMoved/PointerPressedand the polled gamepad; aHintKeycontrol picks the glyph from one tableDisk.IsSdCard(folder): the mount in/proc/self/mountinfo,/sys/class/block/<dev>/device/type=SD(Linux, SteamOS);IOCTL_STORAGE_QUERY_PROPERTYbus type SD (Windows); no hint when unsure.MoveBuild(from, to)copies, checks, updatesBuildRegistry, then deletes, rolling back on failureDisk.DriveName,BuildRegistry--player <name>and a shortcut per playerProgram; a shortcut that opens that player's splash, using the path packages give (LL#54)Shortcuts.cs,WindowsShortcuts.cs--useris today'sLongshotUser, so nothing movesGameFiles,SaveEnvironment.LongshotUserShortcuts.FindOld(launcherPath, registry): the.desktopfiles and.lnks in the known places, read (Exec;IShellLinkon Windows), kept when they start this launcher, sent to the trash when they start an older one, a missing build or a build's game;WriteLinux/WindowsShortcutswrite the one keptShortcuts.LinuxPaths,LauncherMenuPaths,WindowsShortcuts.DesktopLink/StartLink,Installer.InstallPlaces.StartMenuLink,LauncherService.LauncherPathResourceDictionarywith the same keys, merged inAppbefore the window opens; the next start only (live switching would turn 289StaticResources intoDynamicResources){c:T '...'}in the 12 catalogsCore/Lang/*.jsonWhat the mocks show that the launcher hasn't got
--slot <n>) that puts the cursor on that slot, or loads it (L#229 asks for it). Until then the launcher shows the chosen slot and the game still asks.c:Iconkinds.What has to come first
Each step stands alone and can be reviewed alone:
--user, today's saves become the first player's (copied and backed up first).--splash,--options <folder>), then RecompLauncher starting it (arecomplauncher.jsonchange, L#354's file).Decisions needed
%APPDATA%\Longshot(today's),Documents\LongshotorSaved Games\Longshot? Documents is where people look, and where OneDrive syncs.Where the mocks are
The HTML mocks (clickable with
?proto, themes with?theme=menu|blossom, input with?input=pad|ps|kb|mouse), the flow boards (an HTML board with zoom, full screen and a step-by-step gallery) and a FigCraft file with the clickable prototype are in alauncher-redesignfolder, with a README going screen by screen andrelated-work.md, the list the last section is drawn from. They can go up as a branch if that helps review. The pictures here are placeholder renders: no game art, no game files.Linked issues and pull requests
As of 2026-11-14 08:05 UTC, from every issue and pull request of both repositories. L is MagicBeanDev/Longshot, LL is MagicBeanDev/LongshotLauncher.
Fixed or answered by this
--profileis--player, with a shortcut per playerBuilt on
stable,rc,nightlyfolders--crash <folder>is the model for--splash{c:T}Considered, and what to watch
bin\longshot.exe)Hello, i just want to add a request, it would be good if it is possible to disable auto updates, sometimes i want to stick with a build until i wanna update to a new one i choose. I would really apreciate it if auto updates are disabled
idea: making the circle icon in the profile pic a little bean? similar to our discord emojis
I converted this to a little demo web ui from the zip sent on the discord earlier today. https://7db.pw/launcher-preview/
Good work! I think it's clean and simple enough for the normal end user and the advanced mode looks good too!
We've adapted #55's player/save work toward this design and tested it together with the current #57 and #59. The current-player header opens Who's playing?, Home keeps a compact save preview beside the version controls, and the complete earned inventory and transfer tools live on Saves. The existing profile catalog and
--userrouting remain underneath.The compact card now includes Skulltulas opposite rupees and the three stones inside the six medallions, following the game's arrangement. Profiles offer the five upstream bean pictures proposed here, copied unchanged with their provenance, plus an optional personal square image or initial. A custom image is copied with its player so its original file can be moved; cancellation and failed edits preserve the current profile.
4f07866: focused player/save contribution, screenshots and its own checks; maintainer edits remain enabled.3c76361: #55 plus Victor's #57 at926a070and gab9281's #59 atf5a070e, on accepted main3eeaf02. The profile UI, compact rewards and avatar work are separate commits for review or reuse.Final combined checks: 1,220 Windows / 1,247 Linux core, 494 / 493 rendered UI, clean locked Release builds and 28 Linux release tests. The earlier measured integration updated an isolated nightly 148 to 153 in place, preserving protected profiles/saves/settings, then loaded Early -> Upgraded -> Early correctly. The final standalone contribution also loaded the upgraded profile and accepted movement. Current source contracts pass against game main
6c9edff; native runs used nightly 153. Detailed measurements and limits are on #55.This is a working starting point for the team to continue shaping. Kid/Normal/Advanced policies, per-player settings, avatar packs, direct slot launch and PR-build save isolation remain future design work. It does not implement the whole mockup or ask for #59's unfinished dependencies to merge; no PR build was installed and its trust gates are unchanged.
The layouts and framework are available for the team to adapt as the design develops. Game files, saves and extracted assets have stayed local.
Just a suggestion, some link back to our websites / about page with similar information found on https://longshot.magicbean.dev/about/
From philia on Discord:
Discord clarification: the request is for users to add their own text and images; no bundled assets or presets are wanted. The target UI/location and intended use of the custom text/images still need clarification.