ShiftScheduler/docs/superpowers/plans/2026-04-14-configurable-icons.md
Claudio Schaad 7935dd8e15
feat: configurable icons from Docker share (#61)
* docs: add design spec for configurable icons from Docker share

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: add implementation plan for configurable icons from Docker share

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Remove icons

* feat: serve icons from config/icons/ Docker share via static file middleware

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* update readme

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 17:03:27 +02:00

5 KiB
Raw Permalink Blame History

Configurable Icons from Docker Share Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Serve shift icons from config/icons/ on the Docker share instead of bundling them in the repository.

Architecture: Add a second UseStaticFiles middleware in Server/Program.cs with a PhysicalFileProvider pointing to config/icons/, served at the /icons URL path. Remove all PNG icon files and their .csproj entries from the repo. No frontend changes needed — <img src="icons/filename.png"> continues to work unchanged.

Tech Stack: ASP.NET Core static files middleware, Microsoft.Extensions.FileProviders.PhysicalFileProvider (already in the ASP.NET Core SDK, no new package required)


Files Changed

Action File What changes
Modify Server/Program.cs Add second UseStaticFiles for config/icons/
Modify Client/ShiftScheduler.Client.csproj Remove all <Content Update="wwwroot\icons\*"> and <Content Update="wwwroot\break-icon.png"> entries
Delete Client/wwwroot/icons/ Remove entire directory and all PNGs
Delete Client/wwwroot/break-icon.png (if present) Remove stray root-level copy

Task 1: Add static file middleware for config/icons/

Files:

  • Modify: Server/Program.cs:125 (after app.UseStaticFiles();)

  • Step 1: Add the icons static file middleware

In Server/Program.cs, replace:

app.UseBlazorFrameworkFiles();
app.UseStaticFiles();

with:

app.UseBlazorFrameworkFiles();
app.UseStaticFiles();

var iconsPath = Path.Combine(Directory.GetCurrentDirectory(), "config", "icons");
Directory.CreateDirectory(iconsPath);
app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new Microsoft.Extensions.FileProviders.PhysicalFileProvider(iconsPath),
    RequestPath = "/icons"
});
  • Step 2: Verify the app builds
dotnet build

Expected: Build succeeded with 0 errors (pre-existing warnings about QuestPDF and null reference are OK).

  • Step 3: Commit
git checkout -b feature/configurable-icons
git add Server/Program.cs
git commit -m "feat: serve icons from config/icons/ Docker share via static file middleware"

Task 2: Remove icon files and clean up the .csproj

Files:

  • Modify: Client/ShiftScheduler.Client.csproj — remove <ItemGroup> with icon <Content> entries

  • Delete: Client/wwwroot/icons/ directory

  • Delete: Client/wwwroot/break-icon.png (stray root-level copy listed in .csproj)

  • Step 1: Remove the entire icons ItemGroup from the .csproj

In Client/ShiftScheduler.Client.csproj, remove the entire <ItemGroup> block that contains the icon entries (lines 14–48 in the current file), so the file becomes:

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.8" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="9.0.8" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.8" PrivateAssets="all" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\Shared\ShiftScheduler.Shared.csproj" />
    <ProjectReference Include="..\Services\ShiftScheduler.Services.csproj" />
  </ItemGroup>

</Project>
  • Step 2: Delete the icon files from the repo
rm -rf Client/wwwroot/icons
rm -f Client/wwwroot/break-icon.png
  • Step 3: Verify the app still builds
dotnet build

Expected: Build succeeded with 0 errors.

  • Step 4: Commit
git add Client/ShiftScheduler.Client.csproj
git add -u Client/wwwroot/
git commit -m "chore: remove bundled icon files from repo — icons now served from Docker share"

Task 3: Smoke test the icons endpoint

This task verifies the middleware works end-to-end before the branch is merged.

  • Step 1: Copy a test icon to the config/icons directory
mkdir -p config/icons
# Copy any PNG you have on hand, e.g. the app favicon
cp Client/wwwroot/favicon.png config/icons/test.png
  • Step 2: Start the server
cd Server && dotnet run

Expected: App starts at http://localhost:5000.

  • Step 3: Verify the icon is served
curl -o /dev/null -w "%{http_code}" http://localhost:5000/icons/test.png

Expected output: 200

  • Step 4: Verify a missing icon returns 404
curl -o /dev/null -w "%{http_code}" http://localhost:5000/icons/nonexistent.png

Expected output: 404

  • Step 5: Stop the server and clean up the test file
rm config/icons/test.png
  • Step 6: Merge to main
cd ..
git checkout main
git merge --squash feature/configurable-icons
git commit -m "feat: serve icons from config/icons/ Docker share"
git branch -d feature/configurable-icons