🎯 Vision
Add a web-based UI plugin using Blazor Server to make Revela accessible to photographers who prefer graphical interfaces over CLI. The UI will run locally (CLI hosts web server), open browser automatically, and provide real-time progress updates during image processing.
Target Users: Photographers with low-to-medium technical skills who want visual feedback and easier configuration.
🏗️ Technology Decision
Chosen: Blazor Server (.NET 10)
Why not alternatives?
- ❌ Blazor WASM: 3-4 MB download, still needs API for file access, slower
- ❌ WPF/MAUI: Windows-only (WPF) or complex (MAUI), larger binaries
- ❌ React/Vue SPA: Requires separate API layer, less code sharing
- ✅ Blazor Server: ~50 KB load, direct DI access to services, SignalR built-in, cross-platform
Key .NET 10 Features:
- Circuit State Persistence (
[PersistentState]) for long-running operations
- WebSocket compression (automatic)
- Improved form validation (source-generated)
- Hot Reload for faster development
- JIT/stack allocation improvements (10-50% faster)
📋 Implementation Plan
Phase 1: Minimal MVP ✅ Must-Have
Goal: CLI launches browser with basic working UI
Deliverable: revela web opens browser, shows scan progress, displays results
Phase 2: Core Features 🎯 Should-Have
Goal: Full generation workflow with real-time feedback
Deliverable: Complete read-only UI for generating sites and browsing results
Phase 3: Advanced Features 💡 Nice-to-Have
Goal: Configuration editing and live preview
Deliverable: Full-featured UI with editing capabilities
Phase 4: Polish & Extensions (Future) 🚀 Could-Have
📁 Project Structure
src/Plugins/Plugin.UI.Web/
├── Plugin.UI.Web.csproj
├── UIWebPlugin.cs # IPlugin implementation
├── Commands/
│ └── WebCommand.cs # 'revela web' command
├── Pages/
│ ├── _Host.cshtml # Entry point
│ ├── Index.razor # Home page
│ ├── Generate.razor # Generation workflow
│ ├── Config.razor # Configuration viewer/editor
│ └── Galleries.razor # Gallery browser
├── Shared/
│ ├── MainLayout.razor # Layout with navigation
│ └── NavMenu.razor # Navigation menu
├── Components/ # Reusable components
│ ├── ProgressDisplay.razor
│ └── GalleryCard.razor
└── wwwroot/
├── css/
│ ├── app.css # Main styles
│ ├── layout.css # Grid/flex layouts
│ ├── components.css # Component-specific styles
│ └── variables.css # CSS custom properties
├── js/
│ └── interop.js # Optional JS interop
└── favicon.ico
🎨 UI/UX Considerations
Design Principles:
- Simple & Clean: Photographers aren't developers
- Visual Feedback: Show progress, not just text
- Fast: Leverage .NET 10 performance improvements
- Responsive: Works on desktop and tablets
- Photography-focused: Image-centric design, clean typography
Technology Stack:
- Backend: ASP.NET Core + Blazor Server
- Frontend: Razor Components (no separate SPA)
- Styling: Custom CSS (modern features)
- CSS Grid for layouts
- CSS Custom Properties for theming
- CSS Container Queries for responsive components
- CSS Cascade Layers for organization
- Real-time: SignalR (built into Blazor Server)
CSS Architecture:
/* variables.css - Design tokens */
:root {
--color-primary: #2563eb;
--color-bg: #ffffff;
--color-text: #1f2937;
--spacing-unit: 0.5rem;
--border-radius: 0.5rem;
}
/* layout.css - Grid/flex patterns */
.container { ... }
.grid { ... }
/* components.css - UI elements */
.button { ... }
.progress-bar { ... }
.card { ... }
📊 Success Metrics
🔗 Related
- Architecture:
docs/architecture.md
- Plugin Development:
docs/plugin-development.md
- Copilot Context:
.github/copilot-instructions.md
💬 Discussion
- Should we support multiple concurrent sessions (multi-user)?
- Answer: No, single-user local tool (one browser session)
- Should we add authentication?
- Answer: No, localhost only (no external access)
- Should we support mobile?
- Answer: Responsive design yes, but primary target is desktop
- Dark mode from the start?
- Answer: Phase 4 (CSS custom properties make it easy to add later)
🚀 Getting Started (for contributors)
# Create plugin project
dotnet new razorcomponents -n Plugin.UI.Web -o src/Plugins/Plugin.UI.Web
# Add project references
cd src/Plugins/Plugin.UI.Web
dotnet add reference ../../Core/Core.csproj
dotnet add reference ../../Commands/Commands.csproj
# Run in development mode
revela web --port 5000
First-time contributors: Start with Phase 1, Task 1 (create plugin structure)
Design contributors: Start with Phase 1, Task 3 (basic layout & custom CSS)
🎯 Vision
Add a web-based UI plugin using Blazor Server to make Revela accessible to photographers who prefer graphical interfaces over CLI. The UI will run locally (CLI hosts web server), open browser automatically, and provide real-time progress updates during image processing.
Target Users: Photographers with low-to-medium technical skills who want visual feedback and easier configuration.
🏗️ Technology Decision
Chosen: Blazor Server (.NET 10)
Why not alternatives?
Key .NET 10 Features:
[PersistentState]) for long-running operations📋 Implementation Plan
Phase 1: Minimal MVP ✅ Must-Have
Goal: CLI launches browser with basic working UI
src/Plugins/Plugin.UI.Web/projectUIWebPlugin : IPluginAddRazorComponents,AddInteractiveServerComponents)WebCommandwith--portand--no-browseroptionsWebApplication.CreateBuilder()with service sharingapp.MapRazorComponents<App>().AddInteractiveServerRenderMode()Process.Start()with OS detection)Pages/_Host.cshtmlentry pointShared/MainLayout.razorwith navigationPages/Index.razorlanding pageIContentService.ScanAsync()IProgress<ContentProgress>Deliverable:
revela webopens browser, shows scan progress, displays resultsPhase 2: Core Features 🎯 Should-Have
Goal: Full generation workflow with real-time feedback
project.jsoncontentssite.jsoncontentsDeliverable: Complete read-only UI for generating sites and browsing results
Phase 3: Advanced Features 💡 Nice-to-Have
Goal: Configuration editing and live preview
output/index.htmlDeliverable: Full-featured UI with editing capabilities
Phase 4: Polish & Extensions (Future) 🚀 Could-Have
📁 Project Structure
🎨 UI/UX Considerations
Design Principles:
Technology Stack:
CSS Architecture:
📊 Success Metrics
🔗 Related
docs/architecture.mddocs/plugin-development.md.github/copilot-instructions.md💬 Discussion
🚀 Getting Started (for contributors)
First-time contributors: Start with Phase 1, Task 1 (create plugin structure)
Design contributors: Start with Phase 1, Task 3 (basic layout & custom CSS)