- Default hosting mode is now Localtunnel — public *.loca.lt URL, no account, auto-fetched on first run. Replaces the prototyped Tailscale mode. - Tailscale code purged from launcher + CLI; docs swapped to Localtunnel throughout (easy-setup, joining-a-server, server-cli, troubleshooting, faq, READMEs). - Launcher sidebar gains an Open admin panel button — opens https://admin.<apex> in the browser once the server is live. - SQLite db moves to %APPDATA%\DorkNet\dorknet.db (server reads Database__SqlitePath env var, launcher passes it). Existing dbs under <serverDir>\data\ are migrated on first run. - CLI Program.cs: --mode default flips from tailscale to localtunnel; csproj links in LocaltunnelTunnel + LocaltunnelInstaller. - New Backend files: LauncherNameServer, LocaltunnelInstaller, LocaltunnelTunnel, SingleOriginServiceMap. - .gitignore: exclude installer/out/.
DorkNet Launcher
Single-download desktop launcher for self-hosting / joining DorkNet servers. Native WPF — no embedded browser, no WebView2 dependency. .NET 9 single-file self-contained build.
This README is for developers of the launcher. End-users see
the main README and download a prebuilt .exe from
Releases.
What it does
- Host mode: fetches the matching server binary from GitHub Releases for the user's picked Rec Room version, runs it as a subprocess and exposes it through a Localtunnel HTTPS URL (or binds on the LAN if the user picked that mode), patches the user's Rec Room install, hands the user a shareable join code.
- Join mode: parses the join code, fetches the matching client patcher from GitHub Releases, patches the user's Rec Room install to point at the host.
Layout
launcher/
├── DorkNet.Launcher.csproj .NET 9 WPF, single-file self-contained
├── App.xaml + App.xaml.cs WPF Application bootstrap, dark-theme palette
├── MainWindow.xaml All views (first-run / host / join / settings)
├── MainWindow.xaml.cs Code-behind: event handlers → Backend/* calls
├── app.manifest Windows DPI-awareness manifest
└── Backend/ Orchestration — UI-framework-agnostic
├── AppPaths.cs %APPDATA%\DorkNet layout
├── AppState.cs Persisted user choices (mode, paths, Photon AppId)
├── VersionsManifest.cs Fetches versions.json from main
├── ReleaseDownloader.cs GitHub Releases API + artifact unpack
├── ServerProcess.cs Spawns the downloaded server binary
├── ClientPatcher.cs Invokes install-plugin.ps1 from the unpacked patcher
├── LocaltunnelInstaller.cs Downloads the Localtunnel .NET client
├── LocaltunnelTunnel.cs Spawns the tunnel + parses the *.loca.lt URL
├── RecRoomPicker.cs Microsoft.Win32.OpenFolderDialog
└── JoinCode.cs base64url-encoded {host, version, photonAppId, …}
MainWindow.xaml holds all four views (first-run wizard, host, join,
settings) as sibling panels; code-behind toggles Visibility to
switch between them. No MVVM framework — direct event handlers in
the code-behind read/write Backend/* services.
Build + run
cd launcher
dotnet run
Window opens immediately on the first-run wizard.
Publish a self-contained .exe
dotnet publish -c Release
# Output: bin\Release\net9.0-windows\win-x64\publish\dorknet.exe (~70 MB)
The published exe is what ships in GitHub Releases on main (use the
launcher release workflow once it exists).
Dependencies on per-version branches
The launcher fetches release artifacts from GitHub Releases tagged on the per-version branches. See RELEASES.md for the exact naming convention each branch must follow.
Adding a new feature
- New backend logic → add to (or create) a
Backend/*.csclass. - New UI controls → add XAML in
MainWindow.xaml. - New event handlers → method in
MainWindow.xaml.cscalling the backend service.
Keep code-behind handlers small: they marshal between WPF dispatcher
thread + the backend services. Long work goes in Backend/*.