This document covers local development, packaging, and release-related references for WindowThumbWall.
- Windows 10 or 11
- .NET 10 SDK as pinned in global.json
- Visual Studio 2022 or later for the easiest local debugging experience
- WiX Toolset v5 for MSI packaging
- WindowThumbWall.csproj: main WPF desktop application
- MainWindow.xaml.cs: main UI behavior and interaction flow
- ThumbnailSlot.cs: thumbnail slot lifecycle and rendering behavior
- ThumbHost.cs: host for DWM thumbnail content
- NativeMethods.cs: Win32 and DWM interop declarations
- AppState.cs: local state persistence
- packaging/: packaging scripts, manifests, release metadata generator, and installer assets
- docs/: policy and process documentation
- Open WindowThumbWall.sln.
- Set WindowThumbWall as the startup project.
- Press F5 to debug or Ctrl+F5 to run.
dotnet run --project WindowThumbWall.csprojIf Codex asks for a command to launch the app, use one of the following:
- Normal local run:
dotnet run --project WindowThumbWall.csproj- Installed-package run for notification listener verification:
.\packaging\build-and-run-msix.ps1 -Configuration ReleaseUse the MSIX path when you need to verify packaged app identity or OS notification listener behavior. Use dotnet run for ordinary local UI work.
If you start the unpackaged dotnet run / bin\Debug build, the Settings window now keeps Reflect OS notifications disabled and explains that notification attention requires the installed MSIX runtime.
The installed MSIX build does not use constant notification polling; it scans immediately when notification-change events arrive and keeps a 5-second follow-up reconciliation window for near-term toast updates.
Use the supported command split below when working locally.
dotnet build .\WindowThumbWall.csproj -c Release--no-build assumes the test project binaries already exist. From a clean CLI state, build the test project once before using the command below.
dotnet build .\WindowThumbWall.Tests\WindowThumbWall.Tests.csproj -c Releasedotnet test .\WindowThumbWall.Tests\WindowThumbWall.Tests.csproj -c Release --no-build.\packaging\build-msix.ps1 -Configuration Releasepackaging/WindowThumbWall.Package.wapproj is built with Visual Studio MSBuild/Desktop Bridge tooling. Plain dotnet build is not the supported packaging path in this repo/environment.
After building the MSIX locally, install the newest signed test package with:
.\packaging\install-msix.ps1If you want a single entrypoint for Codex or local repeated runs, use:
.\packaging\build-and-run-msix.ps1 -Configuration ReleaseNotes:
build-msix.ps1now creates or reuses a local self-signed test certificate under%LOCALAPPDATA%\WindowThumbWall\devcert.- If the same package version is already installed locally,
build-msix.ps1bumps only the fourth version segment for the local MSIX build, so a repeated local install becomes0.6.5.1,0.6.5.2, and so on without changing the source-controlled release version. install-msix.ps1runs in the current terminal, imports the local test certificate into the current user's trust stores, installs the newest bundle, and launches WindowThumbWall.- If the local machine does not trust the test signing certificate,
install-msix.ps1falls back to unpackaged registration only when Windows Developer Mode or sideloading policy is enabled. build-and-run-msix.ps1runsbuild-msix.ps1first and only continues toinstall-msix.ps1when the build succeeds.- A pure current-user install is not always enough for signed
.msixbundlesideloading. When Windows still rejects the bundle with0x800B0109, trust the certificate in the local machine store once or enable Developer Mode so the fallback register path can be used. - Notification listener features are expected to be tested from the installed MSIX, not from an unpackaged
dotnet run.
Use the checklist below when changing local packaging, install scripts, app identity, attention notifications, or taskbar integration.
- Run
.\packaging\build-msix.ps1 -Configuration Release. - Confirm the newest directory under
packaging\AppPackagesmatches the expected version. - If the same
X.Y.Z.0package is already installed locally, confirm the new local test output increments only the fourth segment, for example0.6.5.1. - Confirm the source manifests still remain on the checked-in release version after the build completes.
- Run
.\packaging\build-and-run-msix.ps1 -Configuration Release. - Confirm the script stays in the current terminal and does not open a separate helper shell.
- Confirm the newest package installs or, if blocked, the script prints the correct next action for certificate trust or Developer Mode.
- Confirm WindowThumbWall launches after installation and resolves the installed package identity correctly.
- Open the Settings window from the
Settingsbutton underFullscreen, then confirmReflect OS notificationsis off by default on a fresh state file. - Trigger an
HSHELL_FLASHpath and confirm the matching monitored slot flashes red. - Trigger a Windows notification that resolves to one monitored window and confirm only that slot flashes red.
- Trigger a Windows notification that leaves multiple monitored candidates and confirm those slots flash orange.
- Confirm only monitored slots participate in notification matching.
- Confirm a notification without usable source-app metadata does not render red or orange attention.
- Confirm notifications that were already present before the listener was enabled do not get replayed into the wall until they change.
- Confirm activating one of the candidate windows clears the related attention state.
- Confirm an unchanged notification that was cleared by activating its candidate window does not light up again by itself.
- Confirm an ambiguous notification does not render orange when the same source app already has any monitored window flashing red from the taskbar.
- Confirm notification text is matched against title tokens by exact token equality, not substring matching.
- Confirm
AppUserModelIdmatching uses exact equality only. - Confirm app-display or identity hints reduce candidates only through process name or executable base name, not full path fragments.
- Confirm the resolver picks the narrowest non-empty candidate set instead of the first token that matches anything.
- Confirm a notification with source-app metadata does not jump to a different app's window only because a generic title token happened to match.
- Turn
Reflect OS notificationsoff in the Settings window during runtime and confirm notification-derived red/orange borders clear immediately. - Confirm an in-place update to the same toast shortly after the notification event is still reflected during the 5-second follow-up reconciliation window.
- Open the shortcut guide and confirm the version label is shown at the lower left.
- Confirm the shortcut guide no longer shows the
Available controls in the app:/アプリで利用できる操作:helper line. - Toggle fullscreen on and off and confirm the taskbar icon stays on the intended app icon instead of falling back to the generic document icon.
- Run
dotnet build WindowThumbWall.csproj. - Run
dotnet test WindowThumbWall.Tests\WindowThumbWall.Tests.csproj.
Official distributions must continue to support ZIP, MSI, and MSIX.
.\packaging\build-all.ps1.\packaging\build-zip.ps1
.\packaging\build-msi.ps1
.\packaging\build-msix.ps1build-msix.ps1 locates Visual Studio via vswhere.exe, verifies Desktop Bridge imports are available, and fails with an actionable error instead of falling back to dotnet build.
For signing expectations, see code-signing-policy.md.
Release metadata is generated by packaging/generate-release-metadata.ps1.
Generated outputs include:
release-notes.mdfor the GitHub Release bodystore-listing-ja.mdandstore-listing-en.mdfor Microsoft Store listing textstore-whats-new-ja.mdandstore-whats-new-en.mdfor the Store "What's new" field
The script accepts a version and optional output directory.
.\packaging\generate-release-metadata.ps1 -Version v0.2.0 -OutputDir distIf you want release-specific highlights, create packaging/release-notes-<version>.md before running a tagged release.
If you want different Japanese and English release text, you can instead create:
packaging/release-notes-ja-<version>.mdpackaging/release-notes-en-<version>.md