PLATFORM_OVERVIEW
Luxoria Platform Architecture
Platform Overview
Luxoria is a complete, open-source photography ecosystem consisting of three integrated components:
Luxoria Desktop - Native Windows application for image management, editing, and local operations
LuxStudio Web Platform - Cloud-based web application for client collaboration, gallery sharing, and remote operations
Infrastructure & Deployment - Kubernetes-based cloud infrastructure for hosting and scaling LuxStudio
Together, these components create a unified workflow: photographers work locally with Luxoria Desktop, then seamlessly publish and collaborate with clients via LuxStudio Web Platform, all powered by transparent, open-source infrastructure.
Official Website & Downloads: luxoria.bluepelicansoft.com Documentation: docs.luxoria.bluepelicansoft.com Repository: github.com/LuxoriaSoft/Luxoria Marketplace: github.com/LuxoriaSoft/marketplace
Platform Architecture Diagram
┌─────────────────────────────────────────────────────────────────────┐
│ Luxoria Platform │
├─────────────────────┬──────────────────────────┬─────────────────────┤
│ │ │ │
│ Luxoria Desktop │ LuxStudio Web Platform │ Infrastructure │
│ (Local Windows) │ (Cloud Services) │ (Kubernetes) │
│ │ │ │
│ • Image Import │ • Gallery Publishing │ • Base Config │
│ • Organization │ • Client Collaboration │ • Pluto Overlay │
│ • Editing │ • Feedback System │ • Saturn Overlay │
│ • Modules │ • Analytics │ • Ingress/TLS │
│ • Local Export │ • Asset Management │ • Load Balancing │
│ │ │ │
│ Tech: C#, WinUI 3, │ Tech: ASP.NET, Next.js, │ Tech: Kustomize, │
│ .NET 9, Modular │ PostgreSQL, MinIO │ Kubernetes, Traefik │
│ Architecture │ │ │
└─────────────────────┴──────────────────────────┴─────────────────────┘
↓ ↓ ↓
Desktop-to-Web Web-to-Infrastructure Infrastructure
Integration API Calls, DB Access OrchestrationHow Luxoria is Split
1. Luxoria Desktop (Standalone Application)
Purpose: Local image processing and management on Windows
Technology: C# with WinUI 3 and .NET 9.0
Architecture: Modular, event-driven with plugin system
Key Features:
Image import and organization
Advanced editing tools
Module-based extensibility
Direct integration with LuxStudio for uploads
Completely functional offline
Distribution: Inno Setup installer or portable executable
No Cloud Required: Can function entirely locally
2. LuxStudio Web Platform (Cloud Services)
Purpose: Collaborative photography galleries and client management
Technology Stack:
Backend: ASP.NET Core 8.0, PostgreSQL, MinIO
Frontend: Next.js 14, React 18, TypeScript
Real-Time: SignalR for live updates
Key Features:
Publish galleries online
Client feedback and collaboration
Image analytics and engagement tracking
Secure asset storage and delivery
Multi-user administration
Deployment: Containerized microservices
Requires Cloud: Hosted environment with persistent storage
3. Infrastructure & Deployment (Kubernetes Cluster)
Purpose: Reliable, scalable hosting of LuxStudio platform
Technology: Kubernetes with Kustomize, Traefik, Let's Encrypt
Architecture: Base configuration + environment overlays
Key Features:
Production environment (Pluto)
Staging environment (Saturn)
Automatic SSL/TLS certificates
Load balancing and failover
Namespace isolation
Zero-configuration environment creation
Maintenance: Minimal operational overhead
Integration Points
Desktop → Web
Photographers upload images from Desktop directly to LuxStudio
JWT authentication for secure API access
SignalR real-time updates of gallery status
Metadata and EXIF preservation
Web → Infrastructure
LuxStudio API runs on Kubernetes
Database (PostgreSQL) persisted on cloud storage
Object storage (MinIO) for image assets
Automatic scaling based on demand
Desktop ↔ Marketplace
Built-in module discovery from GitHub releases
One-click module installation
Automatic updates from marketplace repository
Table of Contents
Part 1: Luxoria Desktop
Part 2: LuxStudio Web Platform
Part 3: Infrastructure & Deployment
Part 4: Cross-Platform Considerations
Part 1: Luxoria Desktop
Luxoria Desktop Technology Stack
Primary Language & Framework
Programming Language: C#
Framework: .NET 9.0 (net9.0-windows10.0.26100.0)
UI Framework: WinUI 3 (Windows App SDK 1.6)
Target Platform: Windows 10 version 1809 (10.0.17763.0) and later
Windows SDK: 10.0.26100.57
Supported Architectures
x86 (32-bit Intel/AMD)
x64 (64-bit Intel/AMD)
ARM64 (64-bit ARM processors)
Core Technologies
Dependency Injection: Microsoft.Extensions.DependencyInjection 9.0.0
Hosting: Microsoft.Extensions.Hosting 9.0.0
Graphics Rendering: SkiaSharp 3.116.1
UI Controls: CommunityToolkit.WinUI 8.1
Development Tools
IDEs: Visual Studio 2022 / JetBrains Rider
Version Control: Git / GitHub
CI/CD: GitHub Actions
Testing Framework: xUnit
Code Quality: SonarQube Cloud
Deployment Format: Inno Setup Wizard
Desktop Architectural Pattern
Luxoria Desktop follows a modular, event-driven architecture with clear separation of concerns. The system is built on several key architectural principles:
1. Modular Architecture
The application is designed as a plugin-based system where functionality is organized into independent, reusable modules. This approach provides:
Extensibility: New features can be added as modules without modifying core code
Maintainability: Each module has a well-defined responsibility
Scalability: Modules can be developed, tested, and deployed independently
Flexibility: Features can be enabled/disabled dynamically
2. Event-Driven Communication
Modules communicate through an event bus system (IEventBus), enabling:
Loose Coupling: Modules don't need direct references to each other
Asynchronous Operations: Non-blocking event processing
Real-time Updates: Components respond to changes across the application
Extensible Interactions: New event types can be added without breaking existing code
3. Dependency Injection
The application uses Microsoft's DI container for:
Service Lifetime Management: Singleton, Scoped, and Transient services
Testability: Easy mocking and unit testing
Configuration: Centralized service registration in
Startup.csDecoupling: Components depend on abstractions, not concrete implementations
4. Layered Architecture
The solution is organized into distinct layers, each with specific responsibilities:
Desktop Project Structure
The Luxoria Desktop solution consists of several interconnected projects:
Core Projects
Luxoria.App
Purpose: Main application entry point and presentation layer
Technology: WinUI 3 with .NET 9
Key Components:
App.xaml.cs: Application initialization and module loadingMainWindow.xaml: Primary application window with split-panel layoutViews/: Feature-specific views (ModuleManager, Marketplace, etc.)Components/: Reusable UI components (MenuBar, Panels)EventHandlers/: Event processing logicServices/: UI-specific services
Responsibilities:
Application lifecycle management
User interface rendering
Module coordination
Event routing
Luxoria.Core
Purpose: Core business logic and services
Technology: .NET 9.0
Key Components:
Services/: Business logic implementationsModels/: Domain entities and data structuresInterfaces/: Core service contracts (IMarketplaceService, etc.)Helpers/: Utility functions
Responsibilities:
Business rule enforcement
Data management
Marketplace integration
Storage operations
Luxoria.Modules
Purpose: Module system implementation
Technology: .NET 9.0
Key Components:
ModuleLoader.cs: Dynamic assembly loading and module discoveryEventBus.cs: Publish-subscribe event systemModuleContext.cs: Module execution contextServices/ModuleService.cs: Module lifecycle managementInterfaces/IModule.cs: Module contract
Responsibilities:
Loading external module assemblies
Module initialization and lifecycle
Inter-module communication via events
Module isolation and sandboxing
Luxoria.GModules
Purpose: Graphical module components
Technology: WinUI 3 with .NET 9
Key Components:
SmartButton.cs: Advanced button controlLuxMenuBarItem.cs: Menu bar itemsCustom UI controls for modules
Responsibilities:
Shared UI components across modules
Consistent visual design
Reusable interactive elements
Luxoria.SDK
Purpose: Software Development Kit for module developers
Technology: .NET 9.0
Key Components:
Interfaces/ILoggerService.cs: Logging contractInterfaces/IFileHasherService.cs: File hashing contractServices/LoggerService.cs: Logging implementationServices/FileHashService.cs: File hashing with multiple algorithmsModels/LogLevel.cs: Structured logging levels
Responsibilities:
Standardized logging across modules
File integrity verification
Common utilities for module development
Consistent API for third-party modules
Test Projects
Luxoria.Core.Tests
Unit tests for core business logic
Tests:
ModuleServiceTests.cs,VaultAndStorageTests.cs,StartupTests.cs
Luxoria.Modules.Tests
Module system and event bus tests
Tests:
ModuleLoaderTests.cs,BusTests.cs,ManifestTests.cs, etc.
Luxoria.SDK.Tests
SDK functionality tests
Tests:
LoggerServiceTests.cs
Module System Architecture
Module Interface (IModule)
IModule)All Luxoria modules must implement the IModule interface:
Module Lifecycle
Discovery:
ModuleLoaderscans designated directories for.dllassembliesLoading: Assemblies are loaded via reflection (
Assembly.LoadFrom)Instantiation: Types implementing
IModuleare instantiatedInitialization:
Initialize()is called with event bus, context, and loggerExecution:
Execute()begins module operationShutdown:
Shutdown()is called during application termination
Module Communication
Modules communicate exclusively through the IEventBus system:
This decoupled approach ensures modules remain independent and testable.
Standard Modules (LuxStd)
Luxoria includes several built-in standard modules:
LuxImport
Purpose: Asset importation and indexing
Features:
Bulk image import from cameras/storage
Automatic metadata extraction
Collection organization
Asynchronous processing with progress tracking
LuxFilter
Purpose: Advanced asset filtering and scoring
Features:
Multi-criteria filtering pipeline
Weighted scoring algorithms
Real-time filter application
Extensible filter framework
LuxEditor
Purpose: Image editing and manipulation
Features:
Non-destructive editing
Layer-based operations
AI-powered enhancements
Color correction and retouching
LuxExport
Purpose: Asset export and delivery
Features:
Multi-format export (JPEG, PNG, TIFF, PDF)
Batch processing
Quality presets
Watermarking
LuxStudio (Desktop Module)
Purpose: Web platform integration module for publishing to LuxStudio
Features:
Gallery publishing
Client collaboration
Feedback collection
Remote asset sharing
Luxoria Marketplace: Open & Transparent Module Distribution
Overview
The Luxoria Marketplace is a revolutionary, fully open-source module distribution system that enables users to discover, download, and install modules seamlessly within the Luxoria Desktop application. Unlike traditional app stores with hidden infrastructure and proprietary systems, the Luxoria Marketplace operates with complete transparency, leveraging GitHub's public infrastructure and automated CI/CD pipelines.
Marketplace Repository: github.com/LuxoriaSoft/marketplace
Architecture & Design Philosophy
Fully Open Source
The entire marketplace infrastructure is open source, meaning:
Complete Visibility: Every aspect of module distribution is public and auditable
No Hidden Systems: No proprietary databases, secret APIs, or closed-source components
Community Trust: Users can verify exactly what happens when they download a module
Educational Resource: Developers can learn from and improve the system
GitHub-Native Infrastructure
The marketplace leverages GitHub's existing infrastructure:
GitHub Releases: Modules are distributed as GitHub Release assets
Public Repository: All modules, metadata, and documentation are version-controlled
GitHub API: Module discovery uses the official GitHub REST API via Octokit
Asset Hosting: GitHub's CDN handles all downloads at no cost
CI/CD Automation
The entire process is automated through GitHub Actions:
Automated Builds: Module compilation happens in public CI workflows
Automated Testing: Quality checks run before modules are published
Automated Releases: Publishing is triggered by git tags or workflow dispatch
Transparent Pipeline: Every build step is logged and visible to the community
How It Works
From the User Perspective
Browse Modules
Open Luxoria Desktop and navigate to the Marketplace View
Browse available modules with descriptions, versions, and download counts
View module README files directly in the application
Select Architecture
Modules are built for x86, x64, and ARM64 architectures
The application automatically selects the appropriate build for your system
Multi-architecture support ensures compatibility across all Windows devices
Download & Install
Click to download a module directly from GitHub Releases
The application handles extraction and installation automatically
Modules are loaded dynamically without requiring an application restart
Automatic Updates
The marketplace checks for new module versions
Users are notified when updates are available
One-click updates keep modules current
From the Developer Perspective
Submit Module
Fork the marketplace repository
Add your module metadata and assets
Submit a pull request with your module
Automated Validation
CI pipeline validates module manifest format
Security checks ensure no malicious code
Build verification confirms cross-platform compatibility
Publication
Once approved, the module is automatically built for all architectures
GitHub Actions creates a new release with your module assets
Module appears immediately in all Luxoria Desktop installations worldwide
Version Management
Semantic versioning (SemVer) ensures predictable updates
Each version is tagged and permanently archived
Users can download previous versions if needed
Technical Implementation
MarketplaceService Architecture
The marketplace integration is implemented via IMarketplaceService:
Key Implementation Details:
Uses Octokit (official GitHub API client) for reliable GitHub integration
Asynchronous operations ensure UI responsiveness
Built-in retry logic handles network interruptions
Caches results to minimize API calls
Module Discovery Process
Fetch Releases: Query GitHub API for all releases in
LuxoriaSoft/marketplaceParse Assets: Each release contains architecture-specific module builds
README Identification: Modules with
.readme.mdassets include documentationArchitecture Matching: Filter assets by
.x86.dll,.x64.dll,.arm64.dllsuffixesMetadata Extraction: Parse
luxmod.jsonmanifest files for module information
Download & Installation Flow
Revolutionary Advantages
1. Complete Transparency
Open Build Process: Every module build is logged in public GitHub Actions runs
Source Code Visibility: Developers can inspect the entire pipeline
Audit Trail: All changes are tracked in git history with full attribution
No Black Boxes: Users know exactly where modules come from and how they're built
2. Zero Infrastructure Costs
No Databases: Module metadata lives in git, not proprietary databases
No Servers: GitHub hosts everything via its global CDN
No APIs to Maintain: The GitHub REST API is our infrastructure
Free for All: Both developers and users benefit from zero hosting costs
No Scaling Concerns: GitHub automatically handles traffic and storage
Zero Maintenance Overhead: No architecture to maintain, upgrade, or monitor
No Capacity Planning: Storage scales infinitely without intervention
No DevOps Required: No servers to patch, backup, or secure
3. Community Empowerment
Anyone Can Contribute: Fork, modify, and improve the marketplace itself
Democratized Distribution: No gatekeepers or approval committees
Feature Requests Welcome: Want a new feature? Submit a PR to the marketplace repo
Collaborative Governance: The community decides marketplace evolution
4. Decentralized & Resilient
No Single Point of Failure: GitHub's infrastructure is globally distributed
Git-Based: Even if GitHub goes down, modules can be distributed via git mirrors
Forkable: Anyone can create their own marketplace fork for specialized modules
Censorship-Resistant: No central authority can remove modules unilaterally
5. Developer-Friendly
Simple Workflow: Tag a release, and CI does the rest
Multi-Architecture by Default: Automatic builds for x86, x64, ARM64
Version Management: Git tags provide natural versioning
Documentation Included: README files travel with modules
6. Security Through Transparency
Public Scrutiny: Malicious code would be immediately visible
Reproducible Builds: Anyone can verify module integrity
Hash Verification: SHA256 hashes prevent tampering
Community Review: Pull requests are reviewed before merging
How Collaborators Can Modify the Marketplace
The marketplace's open nature allows anyone to contribute improvements:
Adding New Features
Fork
github.com/LuxoriaSoft/marketplaceClone the repository locally
Create a feature branch (e.g.,
feature/enhanced-search)Implement your improvement (e.g., better search, categories, ratings)
Test your changes with the CI pipeline
Submit a pull request with clear documentation
Collaborate with maintainers to refine and merge
Example Contributions
Enhanced Metadata: Add module categories, tags, screenshots
Rating System: Implement user reviews and ratings
Dependency Management: Automatic resolution of module dependencies
Security Scanning: Automated vulnerability checks for modules
Localization: Multi-language support for module descriptions
Analytics: Download statistics and popularity metrics
Custom Marketplace Forks
Organizations can create their own private or specialized marketplaces:
Fork the repository for your organization
Configure
MarketplaceServiceto point to your forkMaintain internal modules with the same transparent process
Merge upstream improvements as they're released
Marketplace View in Luxoria Desktop
The application includes a dedicated MarketplaceView component:
Features:
Module Catalog: Grid or list view of available modules
Search & Filter: Find modules by name, category, or version
Module Details: View README, version history, download counts
One-Click Install: Download and install with a single button
Update Notifications: Visual indicators for available updates
Installed Modules: Manage currently installed modules
Navigation: Main Menu → Modules → Marketplace
Module Manifest Format
Each module includes a luxmod.json manifest:
This metadata is parsed by the marketplace service to populate the UI.
Future Marketplace Enhancements
The open architecture enables exciting future possibilities:
Paid Modules: Integration with GitHub Sponsors or payment gateways
Module Dependencies: Automatic installation of required modules
Preview System: Try modules without full installation
Rollback Mechanism: Revert to previous module versions
Beta Channel: Opt-in to pre-release module versions
Community Ratings: User reviews and star ratings
Module Analytics: Usage statistics for developers
Automated Updates: Background module updates
Smart Recommendations: AI-powered module suggestions based on usage
Comparison to Traditional App Stores
Infrastructure
GitHub (free, public)
Proprietary servers
Source Code
Fully open
Closed source
Build Process
Public CI (GitHub Actions)
Hidden build systems
Costs
$0 for hosting
Hosting fees + revenue share
Approval Process
Community-driven
Centralized review
Modification
Anyone can fork/improve
Vendor lock-in
Transparency
Complete visibility
Black box
Censorship
Decentralized (forkable)
Single authority
Getting Started with the Marketplace
For Users:
Open Luxoria Desktop
Navigate to
Modules → MarketplaceBrowse available modules
Click "Install" on any module
Start using new features immediately
For Developers:
Read the contribution guidelines
Fork the repository
Submit your module via pull request
Watch your module become available to thousands of users
For Contributors:
Identify an improvement opportunity
Fork the marketplace repository
Implement and test your feature
Submit a PR with clear documentation
Collaborate with the community to merge
Application Flow
Startup Sequence
Application Launch (
App.xaml.cs::OnLaunched)Initialize dependency injection container
Configure services via
Startup.csDisplay splash screen with version info
Module Discovery (
LoadModulesAsync)Scan module directories
Load module assemblies
Instantiate module instances
Update splash screen with progress
Service Initialization
Resolve required services from DI container
Initialize
EventBus,LoggerService,ModuleServiceConfigure module UI service
Main Window Creation
Close splash screen
Create
MainWindowwith split-panel layoutInitialize UI components (menu bar, panels)
Activate window
Module Initialization
Call
Initialize()on each moduleProvide event bus, context, and logger
Subscribe to application events
Module Execution
Call
Execute()on each moduleModules begin processing events
Application ready for user interaction
Runtime Behavior
Event-Driven: User actions trigger events that modules respond to
Asynchronous: Long-running operations use async/await patterns
Responsive: UI remains interactive during background processing
Extensible: New modules can be added without recompilation
UI Architecture
Main Window Layout
The main window uses a split-panel layout with five primary areas:
Main Menu Bar: Context-aware actions and module controls
Left Panel: File explorer, collections, module navigation
Center Canvas: Primary workspace (image viewing, editing, etc.)
Right Panel: Properties, metadata, adjustment controls
Bottom Panel: Timeline, progress indicators, status information
Resizable & Adaptive
Panels are resizable with GridSplitter controls
Minimum/maximum width constraints prevent unusable layouts
State is preserved across sessions
Deployment & Distribution
Packaging Format
Inno Setup: Built application and associated DLLs packaged into Inno Stup using ISS wizard
Self-Contained: Includes .NET 9 runtime (no external dependencies)
Windows App SDK: Self-contained (no framework dependencies)
Installation Options
Inno Setup: Built application and associated DLLs packaged into Inno Stup using ISS wizard
Portable Version: Unpackaged executable for advanced users & option for all-in-one updater system
Update Strategy
Module Updates: Modules can be updated independently
Rollback Support: Previous versions preserved for recovery
Download Location
Primary: luxoria.bluepelicansoft.com
GitHub Releases: github.com/LuxoriaSoft/Luxoria/releases
Documentation: docs.luxoria.bluepelicansoft.com
Key Architectural Decisions
Why WinUI 3?
Modern UI: Fluent Design System with native Windows 11 styling
Performance: Hardware-accelerated rendering via DirectX
Future-Proof: Microsoft's current UI framework for Windows
Rich Controls: Comprehensive control library with accessibility support
Why Modular Architecture?
Extensibility: Third-party developers can create custom modules
Maintainability: Changes to one module don't affect others
Performance: Unused modules can be disabled to reduce memory usage
Distribution: Modules can be sold/distributed separately
Why Event Bus Pattern?
Decoupling: Modules communicate without direct dependencies
Scalability: New event types can be added without breaking changes
Testability: Events can be mocked and verified in unit tests
Flexibility: Multiple modules can respond to the same event
Why .NET 9?
Modern Features: Latest C# language features (records, pattern matching, etc.)
Performance: Significant performance improvements over previous versions
Long-Term Support: Enterprise-grade stability and security
Cross-Platform SDK: Shared codebase potential for future Linux/macOS ports
Part 2: LuxStudio Web Platform
LuxStudio Technology Stack
Code Signing
All binaries are signed with LuxoriaSoft certificate
MSIX packages are signed for Windows SmartScreen compatibility
Sandboxing
Modules run in the same process but with restricted capabilities
File system access controlled through
IModuleContext
Logging & Diagnostics
Comprehensive logging via
ILoggerServiceError telemetry (opt-in) for crash reporting
Diagnostic logs written to
%APPDATA%\Luxoria\Logs
Data Protection
User data stored in isolated application directories
Sensitive data encrypted using Windows Data Protection API (DPAPI)
Performance Considerations
Asynchronous Operations
All I/O operations use async/await
Image processing offloaded to background threads
UI remains responsive during long-running tasks
Memory Management
Lazy loading of large assets
Image thumbnails cached for quick display
Unused modules unloaded to free memory
Rendering Optimization
SkiaSharp for hardware-accelerated graphics
Virtual scrolling for large collections
Progressive image loading
Future Architecture Considerations
Potential Enhancements
Cross-Platform: .NET MAUI or Avalonia for Linux/macOS support
Cloud Integration: Direct upload to cloud storage providers
AI Services: Cloud-based AI enhancement services
Collaborative Editing: Real-time multi-user editing
WebAssembly Modules: Browser-based module execution
Scalability Plans
Database Backend: SQLite/PostgreSQL for large collections
Microservices: Split processing into separate services
Container Support: Docker deployment for server components
Security & Best Practices (Desktop)
Code Signing
All binaries are signed with LuxoriaSoft certificate
MSIX packages are signed for Windows SmartScreen compatibility
Sandboxing
Modules run in the same process but with restricted capabilities
File system access controlled through
IModuleContext
Logging & Diagnostics
Comprehensive logging via
ILoggerServiceError telemetry (opt-in) for crash reporting
Diagnostic logs written to
%APPDATA%\Luxoria\Logs
Data Protection
User data stored in isolated application directories
Sensitive data encrypted using Windows Data Protection API (DPAPI)
Performance Considerations (Desktop)
Asynchronous Operations
All I/O operations use async/await
Image processing offloaded to background threads
UI remains responsive during long-running tasks
Memory Management
Lazy loading of large assets
Image thumbnails cached for quick display
Unused modules unloaded to free memory
Rendering Optimization
SkiaSharp for hardware-accelerated graphics
Virtual scrolling for large collections
Progressive image loading
LuxStudio Technology Stack
LuxStudio is the cloud-based companion platform to Luxoria Desktop, providing photographers with a powerful web interface for client collaboration, gallery sharing, and remote asset management. Built as a modern, containerized microservices architecture, LuxStudio enables photographers to publish galleries online, collect client feedback, and manage projects from anywhere.
Live Platforms:
Pluto Environment: studio.pluto.luxoria.bluepelicansoft.com
Saturn Environment: studio.saturn.luxoria.bluepelicansoft.com
Repository: Located in LuxStudio/ directory within the main Luxoria repository
Backend (LuxAPI)
Core Technologies
Language: C#
Framework: ASP.NET Core 8.0 (net8.0)
Runtime: .NET 8.0
API Architecture: RESTful API with SignalR for real-time communication
Containerization: Docker with Linux containers
Database & Storage
Primary Database: PostgreSQL 17.2 (Alpine Linux 3.21)
Entity Framework Core 9.0.1 for ORM
Npgsql.EntityFrameworkCore.PostgreSQL 9.0.3 for PostgreSQL integration
Object Storage: MinIO (S3-compatible)
Image asset storage and delivery
Bucket-based organization
CDN-style content distribution
Key Libraries & Services
Authentication: JWT Bearer Tokens (Microsoft.AspNetCore.Authentication.JwtBearer 8.0.12)
Password Hashing: BCrypt.Net-Next 4.0.3
Real-Time Communication: SignalR (Microsoft.AspNetCore.SignalR 1.2.0)
Email Services: SendGrid 9.29.3
API Documentation: Swashbuckle (Swagger) 6.6.2
Architecture Patterns
Repository Pattern: DAL (Data Access Layer) abstractions
Service Layer: Business logic separation
Dependency Injection: Built-in ASP.NET Core DI container
Background Services: Hosted services for cleanup tasks
Frontend
Portal v1 (Legacy - Vue.js)
Framework: Vue 3.5.13 with TypeScript
Build Tool: Vite 6.2.0
Routing: Vue Router 4.5.0
Styling:
TailwindCSS 3.4.17
DaisyUI 4.12.23 (component library)
HTTP Client: Axios 1.7.9
Real-Time: SignalR Client 8.0.7
Portal v2 (Next.js - Current)
Framework: Next.js 14.2.3 (React 18)
Language: TypeScript 5
Styling:
TailwindCSS 4.1.7
Headless UI 2.2.4 (accessible components)
Heroicons 2.1.3 (icon library)
Animations: Framer Motion 11.2.6
HTTP Client: Axios 1.10.0
Real-Time: SignalR Client 8.0.7
File Processing:
JSZip 3.10.1 (bulk downloads)
FileSaver 2.0.5 (client-side downloads)
Code Quality:
ESLint with Next.js config
Prettier 3.3.2 with plugins
Infrastructure & DevOps
Containerization
Container Runtime: Docker 27.4.0+
Orchestration: Docker Compose (development) / Kubernetes (production)
Base Images:
PostgreSQL:
postgres:17.2-alpine3.21.NET API: Custom .NET 8.0 image
Frontend: Nginx-based static hosting
Kubernetes Cluster Architecture
Overview
LuxStudio uses a declarative, template-based Kubernetes architecture that leverages Kustomize for configuration management. This approach enables multiple isolated environments (Pluto and Saturn) to be deployed from a single base configuration with environment-specific overlays, eliminating duplication and ensuring consistency across all deployments.
Key Philosophy: Define once, deploy everywhere with minimal configuration drift.
The Kustomize Pattern: Base + Overlays
What is Kustomize?
Kustomize is a native Kubernetes templating system that uses a composition-based approach rather than templates. It's built into kubectl (no external dependencies needed) and allows you to:
Define a base configuration with all standard components
Create overlays that override specific values for different environments
Compose manifests declaratively without variable substitution
Why Kustomize Instead of Alternatives?
Learning Curve
Gentle (native YAML)
Steep (Go templates)
Very steep (scripting)
Native Support
Built into kubectl
External tool
Not a standard
Configuration Reuse
Strategic merge
Values files
Environment variables
Version Control
Git-friendly YAML
Complex charts
Hard to track changes
Debugging
kustomize build
helm template
Manual expansion
Dependency Management
Built-in composition
Package management
Manual dependencies
Production Ready
Yes
Yes
Not recommended
We chose Kustomize because:
No Learning Curve: Uses standard Kubernetes YAML
Native Integration: Part of kubectl, no additional tools
Git-Friendly: All configurations version-controlled, easily reviewable
Composition Over Templating: Declarative approach prevents template complexity
Simple Overlays: Easy to understand environment differences
Directory Structure
Base Configuration
What Goes in Base?
The base/ directory contains the common foundation shared across all environments:
1. Namespace (namespace.yaml)
2. Service Definitions (service.yaml)
ClusterIP service for LuxAPI (internal only)
ClusterIP service for LuxDB (internal only)
ClusterIP service for MinIO (internal only)
NodePort service for LuxStudio (exposed via ingress)
3. Deployments (4 core services)
a) LuxAPI Deployment (deployment-luxapi.yaml)
Base image:
luxoria/luxapi:latestReplicas: 1 (customized per environment)
CPU/Memory: Baseline requests/limits
Init container: Waits for PostgreSQL readiness
Liveness/Readiness probes: Health checks
Environment variables: Base values (overridden by overlays)
b) LuxStudio Frontend (deployment-luxstudio.yaml)
Base image:
luxoria/luxstudio:latestReplicas: 1 (customized per environment)
Port: 3000 (Next.js default)
No init containers: Stateless, can start immediately
c) PostgreSQL Database (deployment-luxdb.yaml)
Image:
postgres:17.2-alpine3.21Replicas: 1 (not meant for HA in base)
Storage:
emptyDirin base (replaced by PersistentVolume in overlays)Init scripts: Loaded from ConfigMap
Readiness probe:
pg_isreadycommand
d) MinIO Object Storage (deployment-minio.yaml)
Image:
quay.io/minio/minio:latestReplicas: 1 (single-node, not distributed)
Storage:
emptyDirin base (replaced by persistent storage in overlays)Console ports: 9000 (API), 9001 (Web UI)
Arguments:
server /data --console-address 0.0.0.0:9001
4. Kustomization Definition (kustomization.yaml)
Overlay Configuration
Pluto Overlay (Production)
Purpose: Production-grade deployment with security, performance, and reliability focus.
File: overlays/pluto/kustomization.yaml
Key Customizations:
Namespace Isolation:
luxstudio-plutoAll resources isolated in dedicated namespace
Prevents accidental interference with other deployments
Enables role-based access control (RBAC) per environment
Image Tags: Production-specific versions
Base uses
latest(development)Pluto overrides to stable release versions
Enables rollback to known-good versions
API Patches (
patch-deployment-luxapi.yaml)Frontend Patches (
patch-deployment-luxstudio.yaml)Production Ingress (
ingress.yaml)
Saturn Overlay (Staging)
Purpose: Testing environment that mirrors production but with lower resource requirements.
Key Differences from Pluto:
Namespace:
luxstudio-saturnReplicas: 1 (cost optimization)
Resource limits: Lower than production
ENVIRONMENT:
STAGINGDomains:
*.saturn.luxoria.bluepelicansoft.comImage tags:
devorstaging(development versions)
Technical Implementation Details
1. Strategic Merge Patches
Kustomize uses Strategic Merge Patches (SMP) to intelligently merge configurations:
Why this matters:
Changes don't overwrite base values
Additive approach prevents accidental deletions
Predictable, debuggable merging behavior
2. Image Tag Substitution
Advantages:
Single source of truth for image versions
No manual manifest editing
Easy promotion through environments
Audit trail in git history
3. Namespace Isolation
Benefits:
Resource quota per environment
Network policies per environment
RBAC policies per environment
Clean separation for cleanup/deletion
4. Secret Management
Secrets are stored outside version control (in cluster or external manager):
Building and Deploying
Building Manifests
Deploying
Monitoring Deployment
Why This Architecture?
1. Single Source of Truth
All configurations derive from the base. Changes to common features happen once, propagate everywhere.
Alternative Rejected: Separate manifests for each environment
❌ Duplication: 100+ lines duplicated per environment
❌ Maintenance nightmare: Bug fix must be applied 3 times
❌ Drift risk: Environments diverge accidentally
2. Git-Friendly
All configurations are standard YAML. Diffs show exactly what changes between environments.
Alternative Rejected: Helm charts with Go templates
❌ Templates are hard to read and debug
❌ Requires Helm tool (external dependency)
❌ Diffs show template variables, not actual values
3. Environment Parity
Pluto and Saturn run identical configurations except for:
Image tags
Resource limits
Number of replicas
Domain names
Secrets
This ensures staging is a true production replica.
Alternative Rejected: Different Kubernetes clusters for each environment
❌ Expensive (2+ clusters, 2+ control planes)
❌ Difficult to test infrastructure changes
❌ Overkill for our scale
4. Easy Onboarding
New developers see the directory structure and immediately understand:
What's common (base/)
What's different (overlays/)
How to add a new environment (copy overlay, modify names)
Alternative Rejected: Terraform + Helm + Kubectl
❌ Requires learning 3 tools
❌ State management complexity
❌ Longer deployment feedback loop
5. Namespace-per-Environment
Each environment is completely isolated:
Benefits:
Can delete entire environment:
kubectl delete namespace luxstudio-saturnNetwork policies can restrict cross-namespace traffic
RBAC can grant different permissions per namespace
Resource quotas prevent one environment starving another
6. Multi-Region Ready
To add a third environment (e.g., asia region):
Deployment Workflow
Storage & Persistence
Current Approach (Development)
Characteristics:
✅ Simple, no storage provisioning needed
✅ Good for testing and development
❌ Data lost when pod restarts
❌ Can't survive node failures
Production Improvements (Future)
Option 1: PersistentVolume Claims (Recommended)
Option 2: StatefulSet + Persistent Volumes
Option 3: Managed Database Service
AWS RDS PostgreSQL
Azure Database for PostgreSQL
Kubernetes Operator (CloudNativePG)
Resource Management
Current Setup
Requests: Kubernetes reserves this amount Limits: Pod killed if it exceeds this
Scaling Strategy
Monitoring & Observability
Health Checks
Logging
Kubernetes Ingress Configuration
Ingress Controller: Traefik
Why Traefik?
Built-in TLS termination
Automatic certificate management (Let's Encrypt)
Middleware support (rate limiting, authentication)
Simple, declarative routing
Lower memory footprint than Nginx Ingress
TLS/SSL: Let's Encrypt with cert-manager
Automatic Certificate Issuance: Certificates created automatically
Renewal: Auto-renewed 30 days before expiration
Multiple Certificates: One per domain, or wildcard
Domain Routing
Comparison: What We Chose vs. Alternatives
Templating
Native YAML + patches
Go templates
HCL templating
Learning
Minimal (YAML knowledge)
Steep (charts, values)
Medium (HCL)
Reusability
Overlays
Chart packages
Modules
Version Control
Excellent (git diffs)
Good
Good
Secrets
External or sealed-secrets
Values/Helm Secrets
tfstate files
Integration
kubectl built-in
Separate tool
Separate tool
Multi-env
Simple overlays
Helm values override
Workspaces/modules
Debugging
kustomize build
helm template
terraform plan
State Management
None (immutable)
None (stateless)
tfstate (stateful)
Current Kubernetes Setup
Cluster Configuration
Deployment Environments:
Pluto: Production environment
Fully replicated and highly available
3 API replicas, 2 frontend replicas
SSL/TLS with Let's Encrypt
Production secrets and credentials
Saturn: Staging environment
Minimal replication (1 replica each)
Development image tags
Staging secrets
Used for testing before production
Scaling:
API: 1 → 3 replicas (CPU/memory-based HPA in future)
Frontend: 1 → 2 replicas
Database: 1 replica (single point currently)
MinIO: 1 replica (single-node currently)
Next Steps for Production Readiness:
Add persistent volumes for database and object storage
Implement database replication/failover
Add horizontal pod autoscaling (HPA)
Implement pod disruption budgets (PDB)
Add network policies for pod-to-pod communication
Implement distributed tracing (Jaeger)
Add Prometheus monitoring and Grafana dashboards
Kubernetes Deployment
Portal Architecture
Next.js Frontend (v2)
Routing Structure
Server-Side Rendering (SSR): Initial page loads for SEO
Client-Side Navigation: Instant page transitions
Dynamic Routes: Gallery-specific URLs
API Routes: Next.js API endpoints for backend proxying
Key Components
Public Pages:
Gallery Viewer: Browse shared galleries without authentication
Image Lightbox: Full-screen image viewing with navigation
Client Feedback: Comment and rating system
Authenticated Pages:
Dashboard: Photographer workspace overview
Gallery Management: Create, edit, delete galleries
Upload Interface: Bulk image upload with progress
Client Management: Invite and manage client access
Analytics: View statistics and engagement metrics
State Management
React Context API for global state
Local component state for UI interactions
SignalR connection state management
Styling Architecture
TailwindCSS Utility Classes: Rapid UI development
Headless UI Components: Accessible, unstyled primitives
Framer Motion: Smooth animations and transitions
Responsive Design: Mobile-first approach
Performance Optimizations
Next.js Image Optimization: Automatic image resizing and WebP conversion
Code Splitting: Route-based lazy loading
Static Generation: Pre-render static pages at build time
Incremental Static Regeneration: Update static pages without rebuilding
Deployment Architecture
Docker Compose (Development)
Features:
Single command startup:
docker-compose upAutomatic service dependencies
Volume persistence for database data
Health checks for service readiness
Kubernetes (Production)
Base Manifests (depl/base/)
Deployment configurations for all services
Service definitions (ClusterIP, LoadBalancer)
ConfigMaps for application configuration
PersistentVolumeClaims for data storage
Environment Overlays (depl/overlays/)
Pluto: Production configuration
High availability (multiple replicas)
Resource limits (CPU/memory)
Production database credentials (secrets)
MinIO production configuration
Saturn: Staging configuration
Lower resource allocation
Test data and debugging enabled
Ingress Configuration
Features:
Automatic SSL/TLS via Let's Encrypt
Path-based routing to services
WebSocket support for SignalR
Rate limiting and DDoS protection (Traefik)
Deployment Strategy
Rolling Updates: Zero-downtime deployments
Health Checks: Kubernetes monitors service health
Auto-Scaling: Horizontal pod autoscaling based on load
Secrets Management: Kubernetes secrets for sensitive data
Key Features
For Photographers
Gallery Management
Create unlimited galleries with custom names and descriptions
Organize images into collections within galleries
Set gallery visibility (public, private, password-protected)
Bulk upload with drag-and-drop interface
Client Collaboration
Share gallery links with clients
Allow clients to favorite/flag images
Collect comments and feedback on specific images
Download selected images in bulk (ZIP)
Analytics & Insights
View gallery access statistics
Track client engagement (views, downloads, favorites)
Monitor upload progress and storage usage
For Clients
Gallery Viewing
Browse shared galleries without account creation
Full-screen lightbox image viewer
Zoom and pan for image details
Mobile-responsive interface
Feedback System
Flag favorite images for photographer
Leave comments on specific images
Rate images (if enabled)
Download approved images
Integration with Luxoria Desktop
Desktop-to-Web Workflow
Export from Desktop
Photographer selects images in Luxoria Desktop
Uses LuxStudio module to upload to web platform
Assigns images to specific gallery
Authentication
Desktop module uses JWT tokens for API authentication
Tokens stored securely in Windows Credential Manager
Upload Process
Desktop generates thumbnails locally
Uploads full-resolution images to MinIO
Registers images with LuxAPI database
Real-time progress via SignalR
Metadata Sync
EXIF data preserved during upload
Tags and collections synchronized
Editing history maintained
Module Communication
The LuxStudio Desktop Module acts as a bridge:
Consumes LuxAPI REST endpoints
Maintains SignalR connection for live updates
Handles authentication token refresh
Provides UI within Luxoria Desktop for web operations
Security Architecture
API Security
Authentication Flow
User logs in with email/password
Password verified with BCrypt
JWT token generated with user claims
Token returned to client
Client includes token in
Authorizationheader for subsequent requests
Password Security
BCrypt hashing with salt
No plain-text password storage
Configurable hash cost factor
CORS Protection
Whitelist frontend origins
Credential support for cookies/auth
Preflight request handling
Data Security
Database Security
Connection string stored in environment variables
PostgreSQL SSL connections (production)
Database user with minimal privileges
Regular automated backups
Object Storage Security
Pre-signed URLs with expiration
Bucket-level access policies
Per-object access control
Encryption at rest (MinIO)
Network Security
TLS 1.3 for all external connections
Internal services communicate over private network
Kubernetes NetworkPolicies for pod isolation
Scalability & Performance
Horizontal Scaling
API Scaling
Stateless API design enables multiple replicas
Kubernetes Horizontal Pod Autoscaler (HPA)
Load balancing across API instances
Session state stored in database (not memory)
Frontend Scaling
Static assets served via CDN (Next.js automatic optimization)
Multiple portal replicas behind load balancer
Client-side caching with service workers
Database Scaling
PostgreSQL read replicas for query load distribution
Connection pooling (Npgsql)
Query optimization and indexing
Storage Scaling
MinIO distributed mode for multi-node storage
Automatic bucket sharding
CDN integration for global content delivery
Performance Optimizations
Backend
Asynchronous I/O throughout (async/await)
Database query optimization (EF Core eager loading)
Response caching for frequently accessed data
Frontend
Image lazy loading
Virtual scrolling for large galleries
Progressive image loading (blur-up technique)
Code splitting and tree shaking
Monitoring & Observability
Application Logging
Structured logging via ASP.NET Core ILogger
Log aggregation to centralized system
Error tracking and alerting
Performance metrics collection
Health Checks
Kubernetes liveness probes
Kubernetes readiness probes
Database connectivity checks
MinIO availability monitoring
Analytics
User activity tracking (ActivityLogService)
API endpoint performance metrics
Gallery engagement statistics
Storage usage monitoring
Key Architectural Decisions
Why ASP.NET Core?
Performance: High-throughput HTTP server
Cross-Platform: Runs on Linux containers
Ecosystem: Rich library ecosystem and tooling
Integration: Seamless .NET desktop integration
Why Next.js for Frontend?
SEO: Server-side rendering for search engines
Performance: Automatic code splitting and optimization
Developer Experience: Hot reloading, TypeScript support
Deployment: Edge-ready with Vercel-style deployments
Why PostgreSQL?
Reliability: ACID compliance and data integrity
Performance: Advanced query optimization
Features: JSON support, full-text search, extensions
Open Source: No licensing costs
Why MinIO?
S3 Compatibility: Standard API for object storage
Self-Hosted: Complete control over data
Performance: High-throughput object storage
Cost-Effective: No per-request charges like AWS S3
Why Kubernetes?
Orchestration: Automated deployment and scaling
Resilience: Self-healing and automatic restarts
Portability: Cloud-agnostic infrastructure
Ecosystem: Rich tooling (Helm, Kustomize, etc.)
Environment Configuration
Pluto (Production)
Domain:
studio.pluto.luxoria.bluepelicansoft.comPurpose: Live production environment for end-users
Characteristics:
High availability configuration
Multi-replica deployments
Production-grade SSL certificates
Comprehensive monitoring and alerting
Saturn (Staging)
Domain:
studio.saturn.luxoria.bluepelicansoft.comPurpose: Pre-production testing and validation
Characteristics:
Mirror of production architecture
Test data and debugging enabled
Canary deployments for new features
Performance testing environment
Future Enhancements
Planned Features
WebRTC Video Calling: Real-time client consultations
AI-Powered Selection: Automatic best-photo recommendations
Mobile Apps: Native iOS/Android applications
Collaborative Editing: Real-time multi-user gallery curation
Payment Integration: Direct client billing for services
White-Label Solution: Custom branding for photographers
Technical Improvements
GraphQL API: Flexible data fetching
Redis Caching: Distributed cache for improved performance
Elasticsearch: Advanced search and filtering
Prometheus/Grafana: Enhanced observability
Service Mesh (Istio): Advanced traffic management
Conclusion
LuxStudio represents a modern, cloud-native web platform that seamlessly complements Luxoria Desktop. Built on a robust microservices architecture with ASP.NET Core, Next.js, PostgreSQL, and Kubernetes, LuxStudio provides photographers with enterprise-grade tools for client collaboration and gallery management.
The platform's containerized design ensures scalability, portability, and resilience, while its integration with Luxoria Desktop creates a unified workflow from capture to delivery. With multiple deployment environments (Pluto and Saturn) and comprehensive security measures, LuxStudio is production-ready for photographers of all scales.
Live Platforms:
Overall Conclusion
The Luxoria Platform (Desktop + Studio) represents a complete photography ecosystem built on modern, open-source technologies. From the modular WinUI 3 desktop application to the containerized Next.js web platform, every component is designed for extensibility, transparency, and community collaboration.
Luxoria Desktop represents a sophisticated, modular photography management platform built on modern .NET technologies. Its event-driven architecture, combined with a powerful module system, provides photographers with a flexible, extensible tool that can adapt to diverse workflows. The use of WinUI 3 ensures a polished, native Windows experience while maintaining high performance through careful architectural decisions.
The platform is available for download at luxoria.bluepelicansoft.com and continues to evolve with community feedback and contributions.
License: Apache 2.0 Repository: github.com/LuxoriaSoft/Luxoria Documentation: docs.luxoria.bluepelicansoft.com
Last updated