Files
dashcaddy/WINDOWS_APP_BUILD.md
Hermes 86e4c9fc81 wip: Windows desktop app scaffold (WinUI 3/.NET 8) + NSIS installer + docs
Owner decision pending (STATE.md DC-100 tick): adopt/ship/park.
Preserved from fragile git stash to named branch 2026-08-23.
NOTE: requires a Windows build machine (WinUI XAML compiler + MSIX do not
cross-build on Linux) — see WINDOWS_APP_BUILD.md in this tree.
Secret-scanned clean 2026-08-23 (no keys/tokens/PEM in tree).
2026-08-22 23:50:34 -07:00

8.9 KiB

DashCaddy Windows App — Build & Release Checklist

What's Complete

Desktop App (WinUI 3 / .NET 8)

File Purpose
desktop/DashCaddy.Desktop.csproj Project file with MSIX packaging
desktop/App.xaml / App.xaml.cs App entry, service initialization
desktop/MainWindow.xaml / .cs Main UI with service list, toolbar, status bar
desktop/ViewModels/MainViewModel.cs Central state, service management
desktop/ViewModels/ServiceViewModel.cs Service model with health status
desktop/ViewModels/Converters.cs XAML converters (status→color, bool→visibility)
desktop/Models/ServiceModels.cs DTOs matching your Node.js API
desktop/Services/DockerService.cs Docker.DotNet wrapper
desktop/Services/ApiClient.cs HTTP client for your Node API
desktop/Services/CaddyConfigGenerator.cs Caddyfile generation
desktop/Services/DnsClient.cs DNS API client
desktop/Services/TemplateRegistry.cs 9 built-in templates (Plex, HA, Jellyfin, etc.)
desktop/Services/ComposeParser.cs Docker Compose import
desktop/AddServiceDialog.xaml / .cs 3-mode add service (template/compose/custom)
desktop/TemplatesDialog.xaml / .cs Template browser
desktop/SettingsDialog.xaml / .cs Domain, Docker, DNS settings
desktop/Styles/Colors.xaml / Controls.xaml Fluent design styles

Installer (NSIS + PowerShell)

File Purpose
installer/windows/dashcaddy.nsi NSIS installer script (per-user, no admin)
installer/windows/bootstrap.ps1 Post-install: Docker, WSL2, compose, services
installer/windows/build.ps1 Build script: .NET publish → NSIS package

To Build the Installer

Prerequisites (on Windows build machine)

# 1. Visual Studio 2022 with "Windows App SDK" workload
# 2. .NET 8 SDK
# 3. NSIS 3.08+ (makensis.exe)
# 4. Code signing cert (optional but recommended)

One-Command Build

cd dashcaddy/installer/windows
.\build.ps1 -Version 1.15.0

Output: artifacts/DashCaddy-Setup-1.15.0.exe (~150-200 MB)


What the Installer Does (User Experience)

User double-clicks DashCaddy-Setup-1.15.0.exe
         │
         ▼
┌────────────────────────────────────────────────────────────┐
│ 1. Welcome → License → Choose Folder (%LOCALAPPDATA%)    │
│ 2. Components: App, Docker Desktop, WSL2, Auto-start     │
│ 3. Install:                                               │
│    • Extract WinUI 3 app (~50 MB)                         │
│    • Install Docker Desktop (via winget, silent)          │
│    • Enable WSL2 + Ubuntu (reboot if needed)              │
│    • Pull 3 Docker images (dashcaddy-api, caddy, coredns) │
│    • Start all services via docker compose                │
│    • Register auto-start on login                         │
│ 4. Finish → Launches DashCaddy.app                        │
└────────────────────────────────────────────────────────────┘
         │
         ▼
┌────────────────────────────────────────────────────────────┐
│ DashCaddy Window Opens:                                    │
│ • Green/Yellow/Red status badges (12/12 running)          │
│ • Service list with toggle switches                       │
│ • "+ Add Service" → Templates (Plex, HA, Jellyfin...)     │
│ • "Import Compose" → Drag .yaml file                      │
│ • "Open Dashboard" → Browser to https://status.local      │
└────────────────────────────────────────────────────────────┘

Integration with Your Existing Stack

Your Existing Component How Desktop App Uses It
dashcaddy-api (Node.js in Docker) ApiClient.cs calls /api/v1/services, /api/v1/health
platform-paths.js paths bootstrap.ps1 creates same paths on Windows (E:/dockerdata/...)
Caddy reverse proxy CaddyConfigGenerator.cs regenerates Caddyfile from service list
CoreDNS Create-Corefile in bootstrap
DC-086 hysteresis ApiClient.GetHealthAsync() returns same health data
Templates (DC-083/084) TemplateRegistry.cs has 9 templates matching your compose files

Remaining Tasks to Ship

Task Effort Notes
Build on Windows machine 30 min Run build.ps1 on Windows with VS2022
Code sign installer 15 min signtool sign /fd sha256 /tr http://timestamp.digicert.com DashCaddy-Setup-1.15.0.exe
Test on clean VM 1 hr Fresh Windows 10/11, verify Docker+WSL install flow
Host installer 15 min Upload to https://dashcaddy.net/downloads/DashCaddy-Setup-1.15.0.exe
Auto-update via MSIX 1 hr Configure AppInstallerUri in csproj, host .appinstaller file
Submit to Winget 30 min PR to microsoft/winget-pkgs with manifest
Submit to Chocolatey 30 min choco pack + push to community repo

Architecture Summary

┌─────────────────────────────────────────────────────────────────┐
│                    DashCaddy for Windows                        │
├─────────────────────────────────────────────────────────────────┤
│  📦 DashCaddy-Setup-1.15.0.exe (NSIS, ~180 MB)                 │
│     └─ Per-user install to %LOCALAPPDATA%\DashCaddy\           │
├─────────────────────────────────────────────────────────────────┤
│  🖥  DashCaddy.exe (WinUI 3, single-file, self-contained)      │
│     ├─ MainWindow: Service dashboard with health badges        │
│     ├─ Add Service: Template / Compose / Custom                │
│     ├─ Settings: Domain, DNS, Docker paths                     │
│     └─ Talks to: http://localhost:3001/api (your Node API)     │
├─────────────────────────────────────────────────────────────────┤
│  🐳 Docker Desktop (auto-installed via winget)                 │
│     ├─ dashcaddy-api:3001  ← Your existing Node.js API         │
│     ├─ caddy:80/443        ← Reverse proxy + TLS               │
│     └─ coredns:53          ← Local DNS for *.local             │
├─────────────────────────────────────────────────────────────────┤
│  📁 Data in %LOCALAPPDATA%\DashCaddy\                          │
│     ├─ data\caddy\Caddyfile     ← Auto-generated               │
│     ├─ data\coredns\Corefile    ← Local DNS                    │
│     ├─ config.yaml              ← User settings                │
│     └─ logs\                    ← App + bootstrap logs         │
└─────────────────────────────────────────────────────────────────┘

Key Design Decisions

Decision Rationale
Per-user install (%LOCALAPPDATA%) No UAC prompt, works on locked-down corporate machines
WinUI 3 + MSIX Native Windows 10/11 look, auto-updates, clean uninstall
Docker Desktop via winget Standard Windows way, handles WSL2, auto-updates
bootstrap.ps1 does heavy lifting Keeps NSIS simple, PowerShell has better Docker/WSL APIs
Talks to your existing Node API Zero backend changes — reuses all your DC-085/086 work
9 built-in templates Covers 80% of self-hosting use cases out of the box
Import Docker Compose Power users can bring any stack

Next Step

Run the build on a Windows machine:

git clone https://git.dashcaddy.net/sami7777/dashcaddy.git
cd dashcaddy/installer/windows
.\build.ps1 -Version 1.15.0

Then test the installer on a clean Windows VM. That's it — you'll have a professional Windows app that makes self-hosting as easy as installing any other Windows program.