About This Site

A personal collection of videos from my mountain adventures — hiking, rock climbing, bouldering, and gym sessions. No cloud, no database, just files on disk and a fast Blazor Server interface.

Features

  • 🏔️ Four video galleries — Mountains, Rock Climbing, Bouldering, Indoor Climbing
  • 🎬 Automatic H.264 compression on upload via FFmpeg (~720p, configurable quality)
  • 🖱️ Hover card expansion with fullscreen overlay (close with X, background click, or Escape)
  • 🔐 Login-protected upload, edit, and delete
  • 📁 Zero database — metadata stored as JSON files alongside each video
  • 🖼️ Custom SVG icons throughout the UI

Technology

  • ASP.NET Core 8.0 with Blazor Server
  • Xabe.FFmpeg — H.264 video compression (auto-downloaded on first run)
  • Cookie authentication with credentials.json
  • File-based JSON storage — no SQL Server, no Entity Framework
  • Responsive CSS with glassmorphism, gradients and smooth transitions

Architecture & Design Patterns

The codebase is built around SOLID principles with the following patterns:

  • RepositoryIVideoRepository / JsonVideoRepository decouples persistence from business logic
  • DecoratorLoggingVideoRepository wraps any repository with transparent structured logging
  • StrategyICompressionStrategy / H264CompressionStrategy makes the video codec swappable without touching the service layer
  • ResultOperationResult<T> replaces raw bool + string tuples with expressive, type-safe outcomes
  • OptionsVideoStorageOptions via IOptions<T> exposes all codec settings in appsettings.json
  • Factory MethodVideo.Create(...) centralises object construction
  • Value Object / DTOVideoUploadRequest sealed record groups upload parameters immutably
  • Template / DRYCategoryGallery.razor is one reusable component behind all four category pages

SOLID

  • S — each class has one job: VideoService orchestrates, JsonVideoRepository persists, FileStorageService handles files, H264CompressionStrategy encodes
  • O — new compression codec or new category requires only a new class / constant, zero existing code modified
  • L — LoggingVideoRepository is a fully valid drop-in for JsonVideoRepository via IVideoRepository
  • I — five small focused interfaces instead of one large service class
  • D — every component and service injects interfaces, never concrete classes

Related Projects

An error has occurred. This application may no longer respond until reloaded. Reload 🗙