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).
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
# 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)
|
||||
```powershell
|
||||
# 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
|
||||
```powershell
|
||||
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:**
|
||||
```powershell
|
||||
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.
|
||||
Reference in New Issue
Block a user