Dwemer-Dynamics/DwemerDistro-Launcher

Launcher for the DwemerDistro

C#

0

276 commits

updated Oct 2, 2026

See the code

README

DwemerDistro Launcher WPF

This workspace is the C# WPF launcher rewrite for DwemerDistro.

It keeps WSL distro management in the launcher, but separates launcher binary updates from WSL distro updates. The launcher updates itself from GitHub Releases using a helper updater executable.

  • https://github.com/Dwemer-Dynamics/DwemerDistro-Launcher

Scope

  • Native Windows launcher built with WPF on .NET 8
  • install, repair, update, uninstall, and reinstall CHIM, Stobe, and Dialectic independently
  • Quickstart mod selection for fresh server-free distro installs
  • launcher-only self-update via DwemerDistroUpdater.exe
  • Launcher binary updates trigger a one-time DwemerDistro/shared-system sync on the next launch

Optional Game Servers

Fresh DwemerDistro packages contain no game servers. The Quickstart Choose Your Mods step installs any selected products from their Main branch; selecting none is valid. The Mods page then shows each server as Not installed, Installed, or Needs repair and exposes only the actions valid for that state.

Uninstall is destructive. It requires the product-specific PURGE-* confirmation and removes that server's files and PostgreSQL database. It does not remove shared voice/components or another game server.

Each mod's own Update button updates DwemerDistro and shared components first, then that mod on its selected branch. It is available whenever that mod is installed and no conflicting operation is running. It never installs a missing mod and never touches another mod. If the system update fails, no mod update runs.

Each installed mod also exposes a Webpage button for its local server UI and a Nexus Page button below it. The Nexus button opens the mod's public page in your browser immediately: it does not start or contact the local server.

Update Distro in the top bar is the only top-level update action, and it is also the recovery action - it stays available whether the system reports itself as current, out of date, or not at all. It updates only DwemerDistro and shared services; installed mods are never changed. The Components page carries a compact system status line (checking, up to date, update available, unknown, updating, failed) rather than a second copy of the button. The top button raises a badge and reads Distro Update Available only when a check has confirmed one; every other state keeps the plain Update Distro label. The Quickstart Update Distro step runs the same system-only update. The launcher executable is downloaded and applied separately; the next launch automatically synchronizes DwemerDistro and shared services once for that launcher version without changing installed mods.

Workspace

  • src/DwemerDistro.Launcher.Wpf - WPF application
  • docs/MIGRATION_PLAN.md - phased rewrite plan
  • docs/PYTHON_FUNCTIONALITY_MAP.md - feature inventory from the Python launcher
  • docs/PORTING_CHECKLIST.md - current parity tracking
  • docs/UPDATES.md - launcher release/update flow

Default Port Map

These are the current DwemerDistro defaults. Most users do not need to open or configure these ports manually. A port only listens when its component is installed and running, and WSL may make the same service available through Windows localhost.

Local Voice and AI Services

PortServicePurpose
8020XTTSDefault local XTTS API. This is also the compatibility port for older Chatterbox or Python PocketTTS installations.
8021OmniVoiceOptional local OmniVoice TTS API.
8022ParakeetLocal speech-to-text API.
8023ChatterboxDedicated port used by current Chatterbox installations.
8024PocketTTS (Python)Dedicated CPU/AMD PocketTTS API used by current installations.
8082Minime/TXT2VECLocal text embedding and vector service.
8084MeloTTSOptional local MeloTTS API.
8086PocketTTS (audio.cpp)NVIDIA/CUDA PocketTTS API used by the recommended GPU quick setup.

Cartesia and Inworld are cloud TTS providers, so they do not reserve a local DwemerDistro port.

Fresh installs give each local TTS service its own port. Existing Chatterbox or Python PocketTTS installations can continue using legacy port 8020; the launcher checks the provider identity instead of assuming that every service on 8020 is XTTS. Reinstall that TTS component and re-apply its connector in TTS Studio only if you want to move it to its dedicated port.

Game Servers and Launcher Routing

PortServicePurpose
7135Launcher discoveryTells supported game clients which WSL server address and port to use.
7513Skyrim TCP proxyWindows loopback proxy to the CHIM server on port 8081.
8081CHIM / SkyrimCanonical CHIM web and API server.
8083Stobe / KenshiCanonical Stobe web and API server.
8085Legacy/development Apache listenerKept by some existing distro images for compatibility; the launcher does not use it as Dialectic's canonical URL.
8087StarfieldReserved for the Starfield server.
8088Dialectic / Fallout New VegasCanonical Dialectic web and API server.
8089ReignReserved for the Reign server.

Internal Runtime Services

PortServicePurpose
5432PostgreSQLShared local database used by the server applications.
12345CHIM background listenerInternal CHIM background-service communication and heartbeat.
12346Stobe background listenerInternal Stobe background-service communication and heartbeat.
12347Dialectic background listenerInternal Dialectic background-service communication and heartbeat.

The older NetPortRedirection.ps1 helper only lists a subset of ports and is not the authoritative map for current launcher installs.

Build

dotnet build .\DwemerDistroLauncherWpf.sln

Publish EXE

dotnet publish .\src\DwemerDistro.Launcher.Wpf\DwemerDistro.Launcher.Wpf.csproj `
  -c Release `
  -r win-x64 `
  --self-contained true `
  /p:PublishSingleFile=true `
  /p:IncludeNativeLibrariesForSelfExtract=true `
  -o .\dist\win-x64

Published output:

  • dist\win-x64\DwemerDistro.exe
  • dist\win-x64\DwemerDistroUpdater.exe once the updater project is copied beside it for packaging

Release Updates

Push a git tag like v2.5.3.

The GitHub Actions workflow in .github/workflows/release.yml will:

  1. publish the launcher
  2. publish the updater helper
  3. zip both executables into DwemerDistro-win-x64.zip
  4. upload that zip to GitHub Releases

Installed launchers then detect updates from that repo in the bottom Launcher section of the app.

chim
dwemerdistro
launcher
skyrim

Dwemer-Dynamics/DwemerDistro-Launcher

Launcher for the DwemerDistro

C#

0

276 commits

updated Oct 2, 2026

See the code

README

DwemerDistro Launcher WPF

This workspace is the C# WPF launcher rewrite for DwemerDistro.

It keeps WSL distro management in the launcher, but separates launcher binary updates from WSL distro updates. The launcher updates itself from GitHub Releases using a helper updater executable.

  • https://github.com/Dwemer-Dynamics/DwemerDistro-Launcher

Scope

  • Native Windows launcher built with WPF on .NET 8
  • install, repair, update, uninstall, and reinstall CHIM, Stobe, and Dialectic independently
  • Quickstart mod selection for fresh server-free distro installs
  • launcher-only self-update via DwemerDistroUpdater.exe
  • Launcher binary updates trigger a one-time DwemerDistro/shared-system sync on the next launch

Optional Game Servers

Fresh DwemerDistro packages contain no game servers. The Quickstart Choose Your Mods step installs any selected products from their Main branch; selecting none is valid. The Mods page then shows each server as Not installed, Installed, or Needs repair and exposes only the actions valid for that state.

Uninstall is destructive. It requires the product-specific PURGE-* confirmation and removes that server's files and PostgreSQL database. It does not remove shared voice/components or another game server.

Each mod's own Update button updates DwemerDistro and shared components first, then that mod on its selected branch. It is available whenever that mod is installed and no conflicting operation is running. It never installs a missing mod and never touches another mod. If the system update fails, no mod update runs.

Each installed mod also exposes a Webpage button for its local server UI and a Nexus Page button below it. The Nexus button opens the mod's public page in your browser immediately: it does not start or contact the local server.

Update Distro in the top bar is the only top-level update action, and it is also the recovery action - it stays available whether the system reports itself as current, out of date, or not at all. It updates only DwemerDistro and shared services; installed mods are never changed. The Components page carries a compact system status line (checking, up to date, update available, unknown, updating, failed) rather than a second copy of the button. The top button raises a badge and reads Distro Update Available only when a check has confirmed one; every other state keeps the plain Update Distro label. The Quickstart Update Distro step runs the same system-only update. The launcher executable is downloaded and applied separately; the next launch automatically synchronizes DwemerDistro and shared services once for that launcher version without changing installed mods.

Workspace

  • src/DwemerDistro.Launcher.Wpf - WPF application
  • docs/MIGRATION_PLAN.md - phased rewrite plan
  • docs/PYTHON_FUNCTIONALITY_MAP.md - feature inventory from the Python launcher
  • docs/PORTING_CHECKLIST.md - current parity tracking
  • docs/UPDATES.md - launcher release/update flow

Default Port Map

These are the current DwemerDistro defaults. Most users do not need to open or configure these ports manually. A port only listens when its component is installed and running, and WSL may make the same service available through Windows localhost.

Local Voice and AI Services

PortServicePurpose
8020XTTSDefault local XTTS API. This is also the compatibility port for older Chatterbox or Python PocketTTS installations.
8021OmniVoiceOptional local OmniVoice TTS API.
8022ParakeetLocal speech-to-text API.
8023ChatterboxDedicated port used by current Chatterbox installations.
8024PocketTTS (Python)Dedicated CPU/AMD PocketTTS API used by current installations.
8082Minime/TXT2VECLocal text embedding and vector service.
8084MeloTTSOptional local MeloTTS API.
8086PocketTTS (audio.cpp)NVIDIA/CUDA PocketTTS API used by the recommended GPU quick setup.

Cartesia and Inworld are cloud TTS providers, so they do not reserve a local DwemerDistro port.

Fresh installs give each local TTS service its own port. Existing Chatterbox or Python PocketTTS installations can continue using legacy port 8020; the launcher checks the provider identity instead of assuming that every service on 8020 is XTTS. Reinstall that TTS component and re-apply its connector in TTS Studio only if you want to move it to its dedicated port.

Game Servers and Launcher Routing

PortServicePurpose
7135Launcher discoveryTells supported game clients which WSL server address and port to use.
7513Skyrim TCP proxyWindows loopback proxy to the CHIM server on port 8081.
8081CHIM / SkyrimCanonical CHIM web and API server.
8083Stobe / KenshiCanonical Stobe web and API server.
8085Legacy/development Apache listenerKept by some existing distro images for compatibility; the launcher does not use it as Dialectic's canonical URL.
8087StarfieldReserved for the Starfield server.
8088Dialectic / Fallout New VegasCanonical Dialectic web and API server.
8089ReignReserved for the Reign server.

Internal Runtime Services

PortServicePurpose
5432PostgreSQLShared local database used by the server applications.
12345CHIM background listenerInternal CHIM background-service communication and heartbeat.
12346Stobe background listenerInternal Stobe background-service communication and heartbeat.
12347Dialectic background listenerInternal Dialectic background-service communication and heartbeat.

The older NetPortRedirection.ps1 helper only lists a subset of ports and is not the authoritative map for current launcher installs.

Build

dotnet build .\DwemerDistroLauncherWpf.sln

Publish EXE

dotnet publish .\src\DwemerDistro.Launcher.Wpf\DwemerDistro.Launcher.Wpf.csproj `
  -c Release `
  -r win-x64 `
  --self-contained true `
  /p:PublishSingleFile=true `
  /p:IncludeNativeLibrariesForSelfExtract=true `
  -o .\dist\win-x64

Published output:

  • dist\win-x64\DwemerDistro.exe
  • dist\win-x64\DwemerDistroUpdater.exe once the updater project is copied beside it for packaging

Release Updates

Push a git tag like v2.5.3.

The GitHub Actions workflow in .github/workflows/release.yml will:

  1. publish the launcher
  2. publish the updater helper
  3. zip both executables into DwemerDistro-win-x64.zip
  4. upload that zip to GitHub Releases

Installed launchers then detect updates from that repo in the bottom Launcher section of the app.

chim
dwemerdistro
launcher
skyrim

Languages

C#

100.0%