- User-facing product name is Dev Grid.
- Code-level identifiers still use
TopToolbar(TopToolbar.exe, namespaces, solution/project names). Do not rename these unless the task explicitly asks for it.
- Primary log root:
%LOCALAPPDATA%\TopToolbar-Standalone\Logs(AppPaths.Logs). - Optional app-data root override:
TOPTOOLBAR_APPDATA_ROOT. - Logs are written into versioned subfolders under the root (see
Logging/AppLogger.cs). - After finishing coding tasks, clear the log folder contents so the next test run starts clean.
- During migration/debugging, also clear
%LOCALAPPDATA%\TopToolbar\Logsif it exists.
- Toolbar config (groups/buttons):
%LOCALAPPDATA%\TopToolbar-Standalone\toolbar.config.json(AppPaths.ConfigFile). - Workspace definitions:
%LOCALAPPDATA%\TopToolbar-Standalone\config\workspaces.json(WorkspaceStoragePaths.GetWorkspaceDefinitionsPath). - Templates directory (one JSON file per template):
%LOCALAPPDATA%\TopToolbar-Standalone\config\templates\(WorkspaceStoragePaths.GetTemplatesDirectoryPath). - Workspace provider config/buttons:
%LOCALAPPDATA%\TopToolbar-Standalone\Providers\WorkspaceProvider.json(WorkspaceStoragePaths.GetProviderConfigPath). - Legacy migration source (PowerToys):
%LOCALAPPDATA%\Microsoft\PowerToys\Workspaces\workspaces.json(WorkspaceStoragePaths.GetLegacyPowerToysPath).
- Toolbar is workspace-centric: runtime workspace buttons are first-class and support right-click removal.
- Quick snapshot is a camera action and prompts for a name (default name uses current timestamp).
- New workspace creation is template-driven. If no templates exist,
New workspacestays disabled and indicates templates must be configured first. - Template management lives in Settings under the Templates section (left nav), with list-first flow (create/configure/delete on one page).
- Toast notifications and input prompts render in a separate top-most
ToastWindow, not inside the toolbar window; current placement is bottom-right of the active display area.
- Physical template files are editable JSON (
<template-id>.json) in the templates directory above. TemplateDefinitioncontains:- metadata:
schemaVersion,name,displayName,description,requiresRepo,defaultRepoRoot - launch ordering:
focusPriority[] - layout:
layout.strategy,layout.monitorPolicy,layout.slots[] - app definitions:
windows[]withrole,exe,cwd,args,init,monitor,matchHints
- metadata:
- Token expansion supported in launch fields:
{repo},{instanceName},{workspaceTitle}. - Settings UI currently exposes monitor policy values
primary,any,currentas a dropdown. Runtime also acceptsexplicit:<monitor-id>in JSON.
- Snapshot flow:
- UI calls
WorkspaceProvider.SnapshotAsync->WorkspacesRuntimeService->WorkspaceSnapshotter. - Captures current window/monitor state, filters excluded windows, resolves
ApplicationFrameHostpaths, then writesworkspaces.json. - Binds current window handles to app IDs in
ManagedWindowRegistryfor reuse on launch.
- UI calls
- Launch flow:
WorkspaceProviderinvokesWorkspacesRuntimeService.LaunchWorkspaceAsync->WorkspaceLauncher.- Phase 1: reuse existing windows, then launch missing apps.
- Phase 2: resize/arrange windows.
- Phase 3: minimize extraneous windows.
- Matching uses AUMID/package/PWA/process/title; excludes windows on other virtual desktops during launch assignment.
- Build using arm64. Prefer:
dotnet build .\TopToolbar.slnx -c Debug -p:Platform=arm64dotnet build .\TopToolbar.slnx -c Release -p:Platform=arm64- For explicit RID build (project-only):
dotnet build .\TopToolbar.csproj -c Debug -r win-arm64 -p:Platform=arm64 - For explicit RID Release (project-only):
dotnet build .\TopToolbar.csproj -c Release -r win-arm64 -p:Platform=arm64 - Note:
.slnx+-ris blocked by .NET SDK (NETSDK1134), so use.csprojwhen passing-r.
- Before building, kill
TopToolbar.exeif it is running. - After a successful build, start
TopToolbar.exeautomatically for user testing (arm64 output, e.g.bin\arm64\Debug\net9.0-windows10.0.19041.0\win-arm64\TopToolbar.exe).
- Always consider virtual desktops and multi-monitor behavior when making changes.