Skip to content

Phases 1-7: GUI polish, icons, tray, backups, installer, CI#1

Merged
recklessop merged 4 commits into
mainfrom
claude/pensive-easley-4abcbe
May 8, 2026
Merged

Phases 1-7: GUI polish, icons, tray, backups, installer, CI#1
recklessop merged 4 commits into
mainfrom
claude/pensive-easley-4abcbe

Conversation

@recklessop
Copy link
Copy Markdown
Owner

Brings main up to date with the current development branch.

Phase summary

  • Phase 1: Directory.Build.props (version 0.1.0), menu bar (File / Server / Help), About dialog, right-click context menu on the endpoint grid
  • Phase 3: programmatically generated multi-resolution .ico (scripts/generate-icons.ps1) wired into the GUI executable + windows
  • Phase 5: system tray icon (NotifyIcon) with Open / Restart / Exit menu and minimize-to-tray
  • Phase 6: Inno Setup installer (installer/webhook-server.iss) + local build helper (scripts/build-installer.ps1)
  • Phase 7: GitHub Actions workflows — ci.yml on every push/PR; release.yml on v* tags builds installer and creates a release
  • Phase 4: auto-backup of config on every save (last 30 retained), File menu hooks Import config / Export config / Backups submenu
  • Plus: per-endpoint RunAs (Service / InteractiveUser / SpecificUser via LogonUser+CreateProcessAsUser), configurable bind addresses + display host, log execution outcomes

Test plan

  • dotnet test — 25 / 25 pass
  • dotnet build -c Release — clean
  • Smoke test the GUI after redeploy: icon shows in title bar + tray + About; right-click row works; File → Backups lists; File → Export writes JSON; tag v0.1.0 triggers release workflow

🤖 Generated with Claude Code

recklessop and others added 4 commits May 8, 2026 09:48
scripts/generate-icons.ps1 renders the icon programmatically with
System.Drawing - rounded teal square (#0E7C66) with a stylized white
hook glyph - at 16/24/32/48/64/128/256 px and assembles a proper
multi-resolution Microsoft ICO. The PNG and ICO outputs land in
resources/. The script is the source of truth; re-run after editing
the design.

GUI csproj uses ApplicationIcon for the EXE icon and embeds the .ico
+ .png as Resources so MainWindow and AboutDialog can use them via
WPF's resource URI scheme.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
GUI csproj enables UseWindowsForms (NotifyIcon lives in WinForms even
in .NET 8). New Services/TrayIcon.cs wraps NotifyIcon with a context
menu (Open / Restart service / Exit) and the embedded webhook-server
icon. MainWindow creates the TrayIcon, hides itself on minimize and
restores on tray double-click.

Adds GlobalUsings.cs to alias the WPF defaults for types that exist
in both WPF and WinForms (Application, MessageBox, TextBox, Binding,
etc.) so existing code keeps compiling without per-file changes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
installer/webhook-server.iss is an Inno Setup 6 script that:
- Installs to %ProgramFiles%\WebhookServer
- Creates Start Menu folder + GUI shortcut (and optional desktop icon)
- Runs install-service.ps1 post-install to register the Windows Service
- Runs uninstall-service.ps1 pre-uninstall to remove it
- Bundles the webhook-server icon for the installer / uninstaller

scripts/build-installer.ps1 is the local build helper: publishes both
projects, finds ISCC.exe (PATH or standard install path), compiles the
installer with the version pulled from Directory.Build.props, drops the
output in dist/.

.github/workflows/ci.yml runs build + test on every push/PR to main.
.github/workflows/release.yml triggers on v* tags (or manual dispatch),
runs tests, installs Inno Setup via choco, builds the installer, and
attaches the .exe to a GitHub Release. Pre-1.0 versions are flagged
prerelease automatically.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ConfigStore.SaveAsync now snapshots the previous config to
%ProgramData%\WebhookServer\backups\config-<timestamp>.json before
overwriting, retaining the last 30. Failures are silent so a
backup-write hiccup never blocks an actual save.

Three new admin pipe ops:
- list-backups: returns newest 50 entries with timestamps and sizes
- restore-backup: takes a fileName, refuses path-traversal chars,
  loads the named backup over the live config (which itself triggers
  a fresh backup of the current state via the SaveAsync hook)
- import-config: replaces the current config with a GUI-supplied
  ServerConfig, merging encrypted secrets where the GUI didn't supply
  new plaintext

GUI File menu items are wired:
- Import config: file picker -> ImportConfigAsync
- Export config: SaveFileDialog writes the current config as JSON
- Backups: dynamic submenu auto-refreshed when opened, listing
  backups with timestamp + size; click to confirm-and-restore

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@recklessop recklessop merged commit a808964 into main May 8, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant