Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
72c363e
Cherry-pick Launcher from xplat-editor branch
Kryptos-FR Jan 7, 2026
2c247ce
Update packages
Kryptos-FR Dec 30, 2025
9631523
Cherry-pick minimum changes to presentation libraries
Kryptos-FR Dec 30, 2025
4950387
Upgrade to Avalonia 12
Kryptos-FR Apr 21, 2026
726e083
ci: fix potential parallel build issue for the launcher job
Kryptos-FR Apr 21, 2026
3ebbe54
docs: add contributor documentation for the Stride Launcher
Kryptos-FR Apr 21, 2026
477ae6e
docs: add launcher port-status document with gap analysis and roadmap
Kryptos-FR Apr 21, 2026
a9b7c5b
docs: add Phase 5 (test infrastructure with Avalonia headless) to lau…
Kryptos-FR Apr 21, 2026
1f29517
feat(launcher): add close-confirmation localized strings
Kryptos-FR Apr 21, 2026
3a51352
feat(launcher): persist tab selection immediately on change
Kryptos-FR Apr 21, 2026
dd54dc9
feat(launcher): add MainViewModel.TryCloseAsync for close-confirmatio…
Kryptos-FR Apr 21, 2026
cc902fa
feat(launcher): restore close-confirmation prompt on main window
Kryptos-FR Apr 21, 2026
0a959a6
feat(launcher): capture Win32 HWND on main window for /LauncherWindow…
Kryptos-FR Apr 21, 2026
6595f65
docs(launcher): reflect restored window-lifecycle parity
Kryptos-FR Apr 21, 2026
b2ea7d7
fix(launcher): bind Escape key to 'Keep launcher open' in close-confi…
Kryptos-FR Apr 23, 2026
c737d51
docs(launcher): add 'beyond parity' section with alternate-version pe…
Kryptos-FR Apr 23, 2026
677f0a2
feat(launcher): add file-backed CompletedTasks storage API
Kryptos-FR Apr 23, 2026
8b8a8f0
refactor(launcher): route HasDoneTask/SaveTaskAsDone through Launcher…
Kryptos-FR Apr 23, 2026
c2555d0
feat(launcher): cross-platform 'Show in Explorer' for recent projects
Kryptos-FR Apr 23, 2026
eb4c2b6
docs(launcher): reflect cross-platform services parity
Kryptos-FR Apr 23, 2026
73d9945
docs(launcher): log Linux right-click hit-test offset on recent-proje…
Kryptos-FR Apr 23, 2026
c076b34
fix: Avalonia.Controls.DataGrid doesn't necessarily follow Avalonia's…
Kryptos-FR Apr 27, 2026
60d5ad2
refactor(xunit-runner): replace CommunityToolkit.Mvvm with Stride's o…
Kryptos-FR Apr 27, 2026
8d8000a
fix: missing package reference
Kryptos-FR Apr 27, 2026
8b95b69
feat(launcher): Phase 3 — slide animations for release-notes and anno…
Kryptos-FR Apr 27, 2026
f2a9fcb
fix(launcher): restore .md → .html URL rewriting in OnLinkClicked
Kryptos-FR Apr 27, 2026
d04bcb0
feat(launcher): add ILauncherSettingsService interface and LauncherSe…
Kryptos-FR Apr 27, 2026
24e9015
refactor(launcher): inject ILauncherSettingsService into MainViewModel
Kryptos-FR Apr 27, 2026
6b457a9
refactor(launcher): migrate AnnouncementViewModel to ILauncherSetting…
Kryptos-FR Apr 27, 2026
3f8bea5
refactor(launcher): migrate StrideVersionViewModel and MainView code-…
Kryptos-FR Apr 27, 2026
b5fd82b
test(launcher): bootstrap Stride.Launcher.Tests project with helpers
Kryptos-FR Apr 27, 2026
bdfda02
test(launcher): add MainViewModel unit tests (HasDoneTask, CurrentTab…
Kryptos-FR Apr 27, 2026
d48fe70
docs(launcher): reflect Phase 5 viewmodel tests and ILauncherSettings…
Kryptos-FR Apr 27, 2026
9f482bb
ci(launcher): restore parallel build
Kryptos-FR Apr 27, 2026
e7d7d9c
fix(launcher): three high-priority bug fixes
Kryptos-FR May 2, 2026
656f934
chore(launcher): remove legacy PrivacyPolicyHelper placeholder
Kryptos-FR May 2, 2026
f1752aa
docs(launcher): clarify MinimalApp empty OnFrameworkInitializationCom…
Kryptos-FR May 2, 2026
eb2568d
fix(launcher): move recent-project ContextMenu to Button to fix Linux…
Kryptos-FR Apr 27, 2026
7be44f2
docs(launcher): update port-status.md corrections
Kryptos-FR May 2, 2026
1a7538f
Merge branch 'master' into feature/launcher-avalonia-cherrypick
Kryptos-FR May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build-launcher.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ jobs:
- name: Build
run: |
dotnet build build\Stride.Launcher.sln `
-nr:false `
-v:m -p:WarningLevel=0 `
-p:Configuration=${{ github.event.inputs.build-type || inputs.build-type || 'Debug' }} `
-p:StridePlatforms=Windows `
Expand Down
82 changes: 47 additions & 35 deletions build/Stride.Launcher.sln
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28803.352
# Visual Studio Version 18
VisualStudioVersion = 18.1.11312.151
MinimumVisualStudioVersion = 16.0
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Launcher", "..\sources\launcher\Stride.Launcher\Stride.Launcher.csproj", "{0F8BE30E-C41F-4747-B52B-D2D4E13EC6A2}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Launcher", "..\sources\launcher\Stride.Launcher\Stride.Launcher.csproj", "{78695DE1-E621-45DF-975D-CFD407081E23}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Launcher.Tests", "..\sources\launcher\Stride.Launcher.Tests\Stride.Launcher.Tests.csproj", "{835D46B3-1E85-4D28-9F25-A1BD7A2C30F7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core", "..\sources\core\Stride.Core\Stride.Core.csproj", "{BAC8FB10-95ED-4FBB-9925-F6F0E15BD936}"
EndProject
Expand All @@ -21,35 +23,32 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.IO", "..\source
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.MicroThreading", "..\sources\core\Stride.Core.MicroThreading\Stride.Core.MicroThreading.csproj", "{076940AD-70F3-47A8-827C-8E722714F937}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Presentation.Wpf", "..\sources\presentation\Stride.Core.Presentation.Wpf\Stride.Core.Presentation.Wpf.csproj", "{61E90191-22FF-4ADC-AFD0-FAB662589AB4}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Translation", "..\sources\core\Stride.Core.Translation\Stride.Core.Translation.csproj", "{8A23DF78-B3D6-41BD-BA50-19D0FBE4AB69}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Packages", "..\sources\assets\Stride.Core.Packages\Stride.Core.Packages.csproj", "{1F5FBA04-C334-41C2-895A-ACC4B786F99E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Presentation.Dialogs", "..\sources\presentation\Stride.Core.Presentation.Dialogs\Stride.Core.Presentation.Dialogs.csproj", "{5EB0493A-076D-4488-AF08-D812FB3FDF7C}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Presentation", "..\sources\presentation\Stride.Core.Presentation\Stride.Core.Presentation.csproj", "{0C63EF8B-26F9-4511-9FC5-7431DE9657D6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Translation", "..\sources\core\Stride.Core.Translation\Stride.Core.Translation.csproj", "{8A23DF78-B3D6-41BD-BA50-19D0FBE4AB69}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.CompilerServices", "..\sources\core\Stride.Core.CompilerServices\Stride.Core.CompilerServices.csproj", "{ADE0E241-CBDD-48C3-8F50-98FFE76C03C8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Translation.Presentation", "..\sources\presentation\Stride.Core.Translation.Presentation\Stride.Core.Translation.Presentation.csproj", "{7B286D71-5143-4A08-B9DE-113B310A3F0C}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "10-CoreRuntime", "10-CoreRuntime", "{706260A8-86D4-432D-9FE0-F312863288F5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Packages", "..\sources\assets\Stride.Core.Packages\Stride.Core.Packages.csproj", "{1F5FBA04-C334-41C2-895A-ACC4B786F99E}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "30-CoreDesign", "30-CoreDesign", "{FE721A31-DF09-4E33-B791-BEC6C9E1C6F1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stride.Core.Presentation", "..\sources\presentation\Stride.Core.Presentation\Stride.Core.Presentation.csproj", "{0C63EF8B-26F9-4511-9FC5-7431DE9657D6}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "50-Presentation", "50-Presentation", "{3BC606D7-27B3-41FA-8FB3-9D56AC8B4DD7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stride.Editor.CrashReport", "..\sources\editor\Stride.Editor.CrashReport\Stride.Editor.CrashReport.csproj", "{2880C313-2483-416D-A902-DC2259EDFF64}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stride.Core.Presentation.Avalonia", "..\sources\presentation\Stride.Core.Presentation.Avalonia\Stride.Core.Presentation.Avalonia.csproj", "{3B613E66-671E-4049-8EF5-43CDAA549210}"
EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
..\sources\assets\Stride.Core.Assets.Yaml\Stride.Core.Assets.Yaml.projitems*{0f8be30e-c41f-4747-b52b-d2d4e13ec6a2}*SharedItemsImports = 5
..\sources\editor\Stride.Core.MostRecentlyUsedFiles\Stride.Core.MostRecentlyUsedFiles.projitems*{0f8be30e-c41f-4747-b52b-d2d4e13ec6a2}*SharedItemsImports = 5
..\sources\editor\Stride.PrivacyPolicy\Stride.PrivacyPolicy.projitems*{0f8be30e-c41f-4747-b52b-d2d4e13ec6a2}*SharedItemsImports = 5
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0F8BE30E-C41F-4747-B52B-D2D4E13EC6A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0F8BE30E-C41F-4747-B52B-D2D4E13EC6A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0F8BE30E-C41F-4747-B52B-D2D4E13EC6A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0F8BE30E-C41F-4747-B52B-D2D4E13EC6A2}.Release|Any CPU.Build.0 = Release|Any CPU
{78695DE1-E621-45DF-975D-CFD407081E23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{78695DE1-E621-45DF-975D-CFD407081E23}.Debug|Any CPU.Build.0 = Debug|Any CPU
{78695DE1-E621-45DF-975D-CFD407081E23}.Release|Any CPU.ActiveCfg = Release|Any CPU
{78695DE1-E621-45DF-975D-CFD407081E23}.Release|Any CPU.Build.0 = Release|Any CPU
{BAC8FB10-95ED-4FBB-9925-F6F0E15BD936}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BAC8FB10-95ED-4FBB-9925-F6F0E15BD936}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BAC8FB10-95ED-4FBB-9925-F6F0E15BD936}.Release|Any CPU.ActiveCfg = Release|Any CPU
Expand Down Expand Up @@ -82,22 +81,10 @@ Global
{076940AD-70F3-47A8-827C-8E722714F937}.Debug|Any CPU.Build.0 = Debug|Any CPU
{076940AD-70F3-47A8-827C-8E722714F937}.Release|Any CPU.ActiveCfg = Release|Any CPU
{076940AD-70F3-47A8-827C-8E722714F937}.Release|Any CPU.Build.0 = Release|Any CPU
{61E90191-22FF-4ADC-AFD0-FAB662589AB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{61E90191-22FF-4ADC-AFD0-FAB662589AB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61E90191-22FF-4ADC-AFD0-FAB662589AB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61E90191-22FF-4ADC-AFD0-FAB662589AB4}.Release|Any CPU.Build.0 = Release|Any CPU
{5EB0493A-076D-4488-AF08-D812FB3FDF7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5EB0493A-076D-4488-AF08-D812FB3FDF7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5EB0493A-076D-4488-AF08-D812FB3FDF7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5EB0493A-076D-4488-AF08-D812FB3FDF7C}.Release|Any CPU.Build.0 = Release|Any CPU
{8A23DF78-B3D6-41BD-BA50-19D0FBE4AB69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A23DF78-B3D6-41BD-BA50-19D0FBE4AB69}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A23DF78-B3D6-41BD-BA50-19D0FBE4AB69}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A23DF78-B3D6-41BD-BA50-19D0FBE4AB69}.Release|Any CPU.Build.0 = Release|Any CPU
{7B286D71-5143-4A08-B9DE-113B310A3F0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B286D71-5143-4A08-B9DE-113B310A3F0C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B286D71-5143-4A08-B9DE-113B310A3F0C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B286D71-5143-4A08-B9DE-113B310A3F0C}.Release|Any CPU.Build.0 = Release|Any CPU
{1F5FBA04-C334-41C2-895A-ACC4B786F99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F5FBA04-C334-41C2-895A-ACC4B786F99E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F5FBA04-C334-41C2-895A-ACC4B786F99E}.Release|Any CPU.ActiveCfg = Release|Any CPU
Expand All @@ -106,15 +93,40 @@ Global
{0C63EF8B-26F9-4511-9FC5-7431DE9657D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C63EF8B-26F9-4511-9FC5-7431DE9657D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C63EF8B-26F9-4511-9FC5-7431DE9657D6}.Release|Any CPU.Build.0 = Release|Any CPU
{2880C313-2483-416D-A902-DC2259EDFF64}.Debug|Any CPU.ActiveCfg = Debug|iPhone
{2880C313-2483-416D-A902-DC2259EDFF64}.Debug|Any CPU.Build.0 = Debug|iPhone
{2880C313-2483-416D-A902-DC2259EDFF64}.Release|Any CPU.ActiveCfg = Release|iPhone
{2880C313-2483-416D-A902-DC2259EDFF64}.Release|Any CPU.Build.0 = Release|iPhone
{ADE0E241-CBDD-48C3-8F50-98FFE76C03C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ADE0E241-CBDD-48C3-8F50-98FFE76C03C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ADE0E241-CBDD-48C3-8F50-98FFE76C03C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ADE0E241-CBDD-48C3-8F50-98FFE76C03C8}.Release|Any CPU.Build.0 = Release|Any CPU
{3B613E66-671E-4049-8EF5-43CDAA549210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3B613E66-671E-4049-8EF5-43CDAA549210}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3B613E66-671E-4049-8EF5-43CDAA549210}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3B613E66-671E-4049-8EF5-43CDAA549210}.Release|Any CPU.Build.0 = Release|Any CPU
{835D46B3-1E85-4D28-9F25-A1BD7A2C30F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{835D46B3-1E85-4D28-9F25-A1BD7A2C30F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{835D46B3-1E85-4D28-9F25-A1BD7A2C30F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{835D46B3-1E85-4D28-9F25-A1BD7A2C30F7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{BAC8FB10-95ED-4FBB-9925-F6F0E15BD936} = {706260A8-86D4-432D-9FE0-F312863288F5}
{1F01E12A-50B7-4092-B30A-DEE9638FB753} = {706260A8-86D4-432D-9FE0-F312863288F5}
{53CDAFA0-30DF-404C-AAF0-652CA4047605} = {FE721A31-DF09-4E33-B791-BEC6C9E1C6F1}
{A7AE1C3F-CDC6-42DC-B4C1-5F7150661984} = {FE721A31-DF09-4E33-B791-BEC6C9E1C6F1}
{CA70C887-2A83-45DF-82EB-2DFFA8841B7B} = {706260A8-86D4-432D-9FE0-F312863288F5}
{CEF8B221-56E0-4777-88C1-9E3F9F3D1D3D} = {FE721A31-DF09-4E33-B791-BEC6C9E1C6F1}
{B6687100-3D8C-428C-8288-84607D9D5EDF} = {706260A8-86D4-432D-9FE0-F312863288F5}
{076940AD-70F3-47A8-827C-8E722714F937} = {706260A8-86D4-432D-9FE0-F312863288F5}
{8A23DF78-B3D6-41BD-BA50-19D0FBE4AB69} = {FE721A31-DF09-4E33-B791-BEC6C9E1C6F1}
{0C63EF8B-26F9-4511-9FC5-7431DE9657D6} = {3BC606D7-27B3-41FA-8FB3-9D56AC8B4DD7}
{ADE0E241-CBDD-48C3-8F50-98FFE76C03C8} = {706260A8-86D4-432D-9FE0-F312863288F5}
{3B613E66-671E-4049-8EF5-43CDAA549210} = {3BC606D7-27B3-41FA-8FB3-9D56AC8B4DD7}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {04241BED-1662-4690-BA56-15C99A840CFE}
EndGlobalSection
GlobalSection(SharedMSBuildProjectFiles) = preSolution
..\sources\editor\Stride.Core.MostRecentlyUsedFiles\Stride.Core.MostRecentlyUsedFiles.projitems*{78695de1-e621-45df-975d-cfd407081e23}*SharedItemsImports = 5
EndGlobalSection
EndGlobal
99 changes: 99 additions & 0 deletions docs/launcher/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# Stride Launcher — Overview

The Stride Launcher is the entry point end users run after installing Stride. It is an Avalonia MVVM application that manages the locally installed Stride/Xenko versions (download, update, uninstall), exposes recent projects and VSIX extensions for Visual Studio, surfaces release notes, news and documentation, and finally starts the selected version of Game Studio.

The launcher's sources live in [sources/launcher/](../../sources/launcher/). The application itself is [Stride.Launcher](../../sources/launcher/Stride.Launcher/), built against `net10.0` with RIDs `linux-x64` and `win-x64`. It is distributed as a NuGet package (`Stride.Launcher`) and wrapped by an Advanced Installer setup on Windows.

## Big picture

```mermaid
flowchart TD
User["User"]
Setup["StrideSetup.exe<br/>Advanced Installer bundle<br/>sources/launcher/Setup/"]
Prereq["launcher-prerequisites.exe<br/>sources/launcher/Prerequisites/"]
Exe["Stride.Launcher.exe<br/>Avalonia MVVM app<br/>sources/launcher/Stride.Launcher/"]
NuGet["NuGet feed<br/>(packages.stride3d.net, nuget.org)"]
Store["NugetStore<br/>sources/assets/Stride.Core.Packages/"]
GS["Stride.GameStudio<br/>(selected version)"]

User -- "runs" --> Setup
Setup -- "installs" --> Exe
Setup -- "installs" --> Prereq
Exe -- "uses" --> Store
Store -- "fetches packages" --> NuGet
Exe -- "starts" --> GS
GS -. "optional: /LauncherWindowHandle" .-> Exe
```

The launcher has three responsibilities:

1. **Self-update.** On start, check NuGet for a newer `Stride.Launcher` package and optionally replace the current executable before the UI is shown. See [self-update.md](self-update.md).
2. **Version management.** List available Stride versions, download/install/uninstall them through `NugetStore`, and track a single "active" version. See [versions.md](versions.md).
3. **Launch Game Studio.** Locate the main executable of the active version, start it with the right arguments, and optionally auto-close when Game Studio signals back via `/LauncherWindowHandle`. See [lifecycle.md](lifecycle.md).

## Projects

The launcher codebase is small and self-contained under [sources/launcher/](../../sources/launcher/):

| Directory | Role |
|---|---|
| [Stride.Launcher/](../../sources/launcher/Stride.Launcher/) | Avalonia MVVM application (`Stride.Launcher.exe`) |
| [Prerequisites/](../../sources/launcher/Prerequisites/) | Advanced Installer project producing `launcher-prerequisites.exe` (Windows only) |
| [Setup/](../../sources/launcher/Setup/) | Advanced Installer project producing the user-facing `StrideSetup.exe` bundle (Windows only) |

The launcher depends on two Stride libraries:

- [Stride.Core.Packages](../../sources/assets/Stride.Core.Packages/) — the `NugetStore` abstraction used to talk to NuGet feeds.
- [Stride.Core.Presentation.Avalonia](../../sources/presentation/Stride.Core.Presentation.Avalonia/) — the shared Avalonia MVVM framework (dispatcher, dialogs, markdown viewer integration, etc.). The WPF equivalent in the editor is `Stride.Core.Presentation.Wpf`.

A handful of files from the editor are linked in directly (not as project references) to keep the launcher dependency graph minimal:

- `EditorPath.cs` — resolves user data paths (`LauncherSettings.conf`, `launcher.lock`, MRU, etc.).
- `PackageSessionHelper.Solution.cs` — parses `.sln` files to discover the Stride version used by a recent project.
- The `Stride.Core.MostRecentlyUsedFiles` shared project — shared MRU list infrastructure.

See [projects.md](projects.md) for the full layout and each file's role.

## When you need these systems

> **Decision tree:**
>
> - Adding a new UI page/tab or a new version-list entry kind?
> → **A new ViewModel + View under Stride.Launcher.** See [viewmodels.md](viewmodels.md) and [views.md](views.md).
>
> - Changing how a Stride version is downloaded, updated, or uninstalled?
> → **`StrideVersionViewModel` and `PackageVersionViewModel`** — they drive `NugetStore`. See [versions.md](versions.md).
>
> - Changing how the launcher updates itself?
> → **`SelfUpdater`** and the self-update window. See [self-update.md](self-update.md).
>
> - Adding a new command-line argument or action?
> → **`LauncherArguments` + `Launcher.ProcessArguments`.** See [lifecycle.md](lifecycle.md#command-line-arguments).
>
> - Persisting a new user preference?
> → **`LauncherSettings`** (launcher-owned) or **`GameStudioSettings`** (shared with Game Studio). See [settings.md](settings.md).
>
> - Adding a new localized string or URL?
> → **`Assets/Localization/Strings.resx` / `Urls.resx`** (+ `.ja-JP` variants). See [localization.md](localization.md).
>
> - Working on the Windows installer or prerequisites bundle?
> → **Advanced Installer projects under `Prerequisites/` and `Setup/`.** See [packaging.md](packaging.md).
>
> - Running/debugging on Linux and something behaves differently?
> → **Platform-specific code paths.** See [cross-platform.md](cross-platform.md).

## Spoke files

| File | Covers |
|---|---|
| [projects.md](projects.md) | Directory and file layout, external dependencies, linked files |
| [lifecycle.md](lifecycle.md) | Entry point, single-instance mutex, command-line arguments, error codes, crash reporting |
| [viewmodels.md](viewmodels.md) | `MainViewModel`, version view models, recent projects, news/docs/announcement view models |
| [views.md](views.md) | XAML views, windows, converters, markdown viewer integration |
| [versions.md](versions.md) | Version discovery, install/uninstall flow through `NugetStore`, framework selection, beta filter, dev redirects |
| [self-update.md](self-update.md) | Launcher self-update: NuGet update probe, force-reinstall, file swap, restart |
| [settings.md](settings.md) | `LauncherSettings`, `GameStudioSettings`, config file locations |
| [localization.md](localization.md) | `Strings.resx` / `Urls.resx`, designer classes, adding a new language |
| [packaging.md](packaging.md) | `Stride.Launcher.nuspec`, Advanced Installer projects, `StrideSetup.exe`, versioning |
| [cross-platform.md](cross-platform.md) | Windows-only code paths, Registry usage, Linux/macOS porting status (xplat-launcher) |
| [port-status.md](port-status.md) | Full delta vs the WPF launcher on `master` — including silent regressions — and a phased roadmap to close the gap |
Loading
Loading