A Windows desktop application for managing photo exports. Load images, assign the number of copies per photo, and export all copies in one step โ ideal for printing workflows. Built with Blazor Server hosted inside an Electron shell via ElectronNET.
- ๐ Load individual images or multi-select batches via native file dialogs
- ๐ข Set the number of copies per image using +/- controls
- โฌ ๏ธโก๏ธ Navigate forward and backward through loaded images
- ๐พ Save and load projects as JSON files for later continuation
- ๐ค Export all copies to a target folder with a live progress bar
- ๐ Localized UI (German)
The project follows an Onion Architecture (Clean Architecture) with two projects:
| Project | Layer | Responsibility |
|---|---|---|
FotoManagerLogic |
Domain / Business | Entities (Project, Image), interfaces, DTOs โ no infrastructure dependencies |
FotoManager |
Application / UI | Blazor pages, ProjectService, ElectronNET integration |
Dependencies always point inward: FotoManager โ FotoManagerLogic.
Infrastructure concerns (file I/O, Electron dialogs) are wrapped behind interfaces using the Humble Object pattern, keeping business logic fully unit-testable.
- .NET SDK (version pinned in
global.json) - Node.js / npm (required by ElectronNET CLI)
- ElectronNET CLI:
dotnet tool install ElectronNET.CLI -g
cd FotoManager
electronize startThe first start takes a while as Electron downloads its binaries. Subsequent starts are faster.
dotnet test --filter Category=Unit
dotnet test --filter Category=IntegrationFor mutation testing (requires the tool to be installed first via dotnet tool restore):
dotnet tool run dotnet-strykerThe CI pipeline builds the Windows installer automatically via GitHub Actions on every push. For a local build:
dotnet publish FotoManager\FotoManager.csproj /p:PublishProfile=win-x64The output EXE (FotoFlipper_<version>.exe) is placed under FotoManager/publish/Release/.
This project uses Versionize and Conventional Commits. A release is triggered automatically when a commit with the message chore(release): X.Y.Z is pushed to the default branch.
- ๐ Load individual images or multi-select batches via native file dialogs
- ๐ข Set the number of copies per image using +/- controls
- โฌ ๏ธโก๏ธ Navigate forward and backward through loaded images
- ๐พ Save and load projects as JSON files for later continuation
- ๐ค Export all copies to a target folder with a live progress bar
- ๐ Localized UI (German)
The project follows an Onion Architecture (Clean Architecture) with two projects:
| Project | Layer | Responsibility |
|---|---|---|
FotoManagerLogic |
Domain / Business | Entities (Project, Image), interfaces, DTOs โ no infrastructure dependencies |
FotoManager |
Application / UI | Blazor pages, ProjectService, ElectronNET integration |
Dependencies always point inward: FotoManager โ FotoManagerLogic.
Infrastructure concerns (file I/O, Electron dialogs) are wrapped behind interfaces using the Humble Object pattern, keeping business logic fully unit-testable.
- .NET 10 SDK (version pinned in
global.json) - Node.js / npm (required by ElectronNET CLI)
- ElectronNET CLI:
dotnet tool install ElectronNET.CLI -g
cd FotoManager
electronize startThe first start takes a while as Electron downloads its binaries. Subsequent starts are faster.
dotnet test --filter Category=UnitFor mutation testing (requires the tool to be installed first via dotnet tool restore):
dotnet tool run dotnet-strykerThe CI pipeline builds the Windows installer automatically via GitHub Actions on every push. For a local build:
dotnet publish FotoManager\FotoManager.csproj /p:PublishProfile=win-x64The output EXE (FotoFlipper_<version>.exe) is placed under FotoManager/publish/Release/.
This project uses Versionize and Conventional Commits. A release is triggered automatically when a commit with the message chore(release): X.Y.Z is pushed to the default branch.