{"id":33583057,"url":"https://github.com/regix1/lancache-manager","last_synced_at":"2026-02-17T03:45:08.156Z","repository":{"id":311281416,"uuid":"1043040666","full_name":"regix1/lancache-manager","owner":"regix1","description":"  LANCache Manager - Self-hosted web dashboard for monitoring Lancache data, Real-time download tracking, bandwidth analytics, cache management, and client monitoring. Docker deployment with Prometheus metrics and Grafana integration.","archived":false,"fork":false,"pushed_at":"2026-02-12T02:11:25.000Z","size":98539,"stargazers_count":19,"open_issues_count":4,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-12T06:05:00.613Z","etag":null,"topics":["cache-server","data","docker","game-cache","grafana","lancache","lancache-interface","lancache-manager","lancache-ui","lancachenet","prometheus","react","real-time-download-tracking","rust","self-hosted","ui","web-interface"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/regix1.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-23T03:02:06.000Z","updated_at":"2026-02-12T02:11:28.000Z","dependencies_parsed_at":"2025-10-02T00:15:35.456Z","dependency_job_id":"39bc43b6-348d-4588-bc2f-c6be9751b672","html_url":"https://github.com/regix1/lancache-manager","commit_stats":null,"previous_names":["regix1/lancache-manager"],"tags_count":73,"template":false,"template_full_name":null,"purl":"pkg:github/regix1/lancache-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regix1%2Flancache-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regix1%2Flancache-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regix1%2Flancache-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regix1%2Flancache-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/regix1","download_url":"https://codeload.github.com/regix1/lancache-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/regix1%2Flancache-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29532488,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T03:01:11.216Z","status":"ssl_error","status_checked_at":"2026-02-17T03:00:31.803Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cache-server","data","docker","game-cache","grafana","lancache","lancache-interface","lancache-manager","lancache-ui","lancachenet","prometheus","react","real-time-download-tracking","rust","self-hosted","ui","web-interface"],"created_at":"2025-11-29T03:08:24.802Z","updated_at":"2026-02-17T03:45:08.145Z","avatar_url":"https://github.com/regix1.png","language":"TypeScript","funding_links":["https://www.buymeacoffee.com/regix"],"categories":["Software"],"sub_categories":["Caching"],"readme":"# LANCache Manager\n\nLANCache Manager is a simple web UI for monitoring and managing your [LANCache](https://lancache.net/). You can watch downloads in real time, see which games are cached, measure bandwidth savings, and prefill the cache before LAN parties.\n\n-----\n\n## Docker Installation\n\n\u003e [!IMPORTANT]\n\u003e **Always use the `latest` tag:**\n\u003e\n\u003e ```bash\n\u003e docker pull ghcr.io/regix1/lancache-manager:latest\n\u003e ```\n\u003e\n\u003e GitHub's package page shows `:dev` because dev builds are published more often. The `:dev` tag is for testing only and can be unstable.\n\n-----\n\n## Table of Contents\n\n- [Screenshots](#screenshots)\n- [Features](#features)\n- [Quick Start](#quick-start)\n- [Docker Compose Reference](#docker-compose-reference)\n- [Configuration Options](#configuration-options)\n- [Tabs Overview](#tabs-overview)\n- [Steam Prefill](#steam-prefill)\n- [Custom Themes](#custom-themes)\n- [Grafana \u0026 Prometheus](#grafana--prometheus)\n- [Multiple Datasources](#multiple-datasources)\n- [Nginx Reverse Proxy](#nginx-reverse-proxy)\n- [Troubleshooting](#troubleshooting)\n- [Building from Source](#building-from-source)\n- [Contributing Translations](#contributing-translations)\n- [Need Help?](#need-help)\n\n-----\n\n\u003ca id=\"screenshots\"\u003e\u003c/a\u003e\n## Screenshots\n\n\u003cdiv align=\"center\"\u003e\n\n### Dashboard\n\u003cimg width=\"1517\" height=\"1150\" alt=\"Dashboard Overview\" src=\"https://github.com/user-attachments/assets/a9a7e9a5-ca5d-44e0-ad80-fac163782ee9\" /\u003e\n\u003cimg width=\"1526\" height=\"988\" alt=\"Dashboard Charts\" src=\"https://github.com/user-attachments/assets/695c61cc-f2cd-4bc5-bbed-a5f7e6b0f11c\" /\u003e\n\n*Stats at a glance with draggable cards and time range filtering*\n\n### Downloads\n\n**Normal View**\n\u003cimg width=\"1517\" height=\"1236\" alt=\"Downloads - Normal View\" src=\"https://github.com/user-attachments/assets/29dbd4ba-ef24-4796-a527-ae50add3570d\" /\u003e\n\n**Compact View**\n\u003cimg width=\"1527\" height=\"1124\" alt=\"Downloads - Compact View\" src=\"https://github.com/user-attachments/assets/87f61e41-9c11-4aac-89a9-aad7e60f86f6\" /\u003e\n\n**Retro View**\n\u003cimg width=\"1516\" height=\"1248\" alt=\"Downloads - Retro View\" src=\"https://github.com/user-attachments/assets/6588f68e-ee72-4226-ae08-f5bd92ff81c2\" /\u003e\n\n*Three view modes to browse your cached games*\n\n### Clients\n\u003cimg width=\"1521\" height=\"909\" alt=\"Clients\" src=\"https://github.com/user-attachments/assets/0a80fcdb-d51e-42a8-8d9b-1b0a436e2ab1\" /\u003e\n\n*Monitor which devices are using your cache*\n\n### Users\n\u003cimg width=\"1523\" height=\"510\" alt=\"Users - Session Overview\" src=\"https://github.com/user-attachments/assets/0c5e4a95-7fad-4fa7-819d-bf49fc7355e0\" /\u003e\n\u003cimg width=\"1497\" height=\"899\" alt=\"Users - Details\" src=\"https://github.com/user-attachments/assets/84194a8c-e574-4e5e-abbb-a48840c32d36\" /\u003e\n\n*Manage sessions and access controls*\n\n### Events\n\u003cimg width=\"1523\" height=\"1249\" alt=\"Events Calendar\" src=\"https://github.com/user-attachments/assets/123dd833-d300-49e5-8023-62ea8d4e4acc\" /\u003e\n\n*Calendar view of download activity and LAN events*\n\n### Prefill\n\u003cimg width=\"1522\" height=\"1069\" alt=\"Steam Prefill\" src=\"https://github.com/user-attachments/assets/a42963cd-cf5a-45a4-a538-638bf43e7c06\" /\u003e\n\n*Pre-download games to your cache before your LAN party*\n\n\u003c/div\u003e\n\n-----\n\n\u003ca id=\"features\"\u003e\u003c/a\u003e\n## Features\n\n### Dashboard\n- **Draggable stat cards** - Move or hide cards to match your layout\n- **Time range filtering** - Live, 1h, 24h, 7 days, 30 days, or custom\n- **Service breakdown** - Bandwidth usage per platform (Steam, Epic, Battle.net, and more)\n- **Recent downloads** - A quick view of what is being cached\n- **Top clients** - Find your heaviest users\n\n### Downloads\n- **Three view modes** - Normal (cards), Compact (list), and Retro (terminal style)\n- **Flexible sorting** - Date, size, cache efficiency, session count, or name\n- **Powerful filtering** - Filter by service, client, or hide small and unknown downloads\n- **Data export** - JSON or CSV\n\n### Clients\n- **Device tracking** - See every device that has used the cache\n- **Client grouping** - Add friendly names to keep things organized\n- **Bandwidth stats** - Usage breakdown per client\n\n### Users\n- **Session management** - View active authenticated and guest sessions\n- **Guest access** - Configurable read only access duration\n- **Access control** - Revoke sessions when needed\n\n### Events\n- **Calendar view** - Visualize download activity over time\n- **Custom events** - Create events for LAN parties\n- **Activity tracking** - See what was downloaded during each event\n\n### Prefill\n- **Steam integration** - Pre-download games directly to your cache\n- **Steam Guard support** - Works with all authentication methods\n- **Library selection** - Choose which games to prefill\n- **Real-time progress** - Monitor downloads as they happen\n\n### Management\n- **Cache operations** - Clear cache by service or remove specific games\n- **Log processing** - Reprocess logs and handle corruption\n- **Game detection** - See what games are in your cache with accurate sizes\n- **Depot mappings** - Download 290,000+ game mappings from GitHub\n- **Theme editor** - Create and import custom themes\n- **Prometheus metrics** - Export data to Grafana\n\n-----\n\n\u003ca id=\"quick-start\"\u003e\u003c/a\u003e\n## Quick Start\n\n```bash\ndocker run -d \\\n  --name lancache-manager \\\n  -p 8080:80 \\\n  -v ./data:/data \\\n  -v /path/to/lancache/logs:/logs:ro \\\n  -v /path/to/lancache/cache:/cache:ro \\\n  -e TZ=America/Chicago \\\n  -e LanCache__LogPath=/logs/access.log \\\n  -e LanCache__CachePath=/cache \\\n  ghcr.io/regix1/lancache-manager:latest\n```\n\n### Getting Your API Key\n\n```bash\ndocker logs lancache-manager | grep \"API Key\"\n```\n\nThe key is also saved at `/data/security/api_key.txt`.\n\n### First Steps\n\n1. Open `http://localhost:8080`\n2. Go to Management and enter your API key\n3. Click **Process Logs** to analyze existing cache data\n\n-----\n\n\u003ca id=\"docker-compose-reference\"\u003e\u003c/a\u003e\n## Docker Compose Reference\n\nA complete docker-compose.yml with all available options:\n\n```yaml\nversion: '3.8'\n\nservices:\n  lancache-manager:\n    image: ghcr.io/regix1/lancache-manager:latest\n    container_name: lancache-manager\n    restart: unless-stopped\n    ports:\n      - \"8080:80\"\n    volumes:\n      # Required: Data directory for database, API key, themes, and cached images\n      - ./data:/data\n\n      # Required: LANCache log directory\n      # Add :ro for read-only (recommended for monitoring-only setups)\n      - /mnt/lancache/logs:/logs:ro\n\n      # Required: LANCache cache directory\n      # Add :ro for read-only monitoring\n      # Remove :ro to enable cache clearing, corruption removal, and game removal\n      - /mnt/lancache/cache:/cache:ro\n\n      # Optional: Docker socket for nginx log rotation and Steam Prefill\n      # Required for: signaling nginx to reopen logs, spawning prefill containers\n      - /var/run/docker.sock:/var/run/docker.sock\n\n    environment:\n      #=========================================================================\n      # REQUIRED - You must configure these for your environment\n      #=========================================================================\n\n      # User ID the application runs as (match your filesystem permissions)\n      # Common values: 33 (www-data on Debian/Ubuntu), 1000 (default user)\n      - PUID=33\n\n      # Group ID the application runs as\n      - PGID=33\n\n      # Timezone for log timestamps and display\n      # See: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones\n      - TZ=America/Chicago\n\n      # Path to LANCache access log file (inside the container)\n      - LanCache__LogPath=/logs/access.log\n\n      # Path to LANCache cache directory (inside the container)\n      - LanCache__CachePath=/cache\n\n      # Path to lancache .env file (for reading CACHE_DISK_SIZE when Docker socket unavailable)\n      # If not set, auto-searches: /srv/lancache/.env, /opt/lancache/.env, /lancache/.env\n      # - LanCache__EnvFilePath=/lancache/.env\n\n      #=========================================================================\n      # OPTIONAL - Defaults work for most users (auto-detected or sensible defaults)\n      #=========================================================================\n\n      # Internal port binding (do not change unless you know what you're doing)\n      - ASPNETCORE_URLS=http://+:80\n\n      #---------------------------------------------------------------------------\n      # Security Settings\n      #---------------------------------------------------------------------------\n\n      # Master switch for authentication\n      # true = require API key for admin features (recommended)\n      # false = disable ALL authentication (development only)\n      # - Security__EnableAuthentication=true\n\n      # Number of devices that can share the same API key simultaneously\n      # - Security__MaxAdminDevices=3\n\n      # Default guest session duration in hours (configurable in UI after first run)\n      # - Security__GuestSessionDurationHours=6\n\n      # Require API key for Prometheus /metrics endpoint\n      # true = Prometheus must use Bearer token authentication\n      # false = /metrics endpoint is publicly accessible\n      # - Security__RequireAuthForMetrics=false\n\n      # Require authentication to access Swagger API documentation\n      # - Security__ProtectSwagger=true\n\n      # Comma-separated list of allowed CORS origins (empty = allow all)\n      # Example: http://localhost:3000,https://mysite.com\n      # - Security__AllowedOrigins=\n\n      # Allowed file browser root paths (comma-separated)\n      # Example: /data,/mnt\n      # - Security__AllowedBrowsePaths=\n\n      #---------------------------------------------------------------------------\n      # API Options\n      #---------------------------------------------------------------------------\n\n      # Max number of clients returned in a single stats request\n      # - ApiOptions__MaxClientsPerRequest=1000\n\n      # Default limit for clients when no limit is provided\n      # - ApiOptions__DefaultClientsLimit=100\n\n      #---------------------------------------------------------------------------\n      # Nginx Log Rotation (auto-detects LANCache container)\n      #---------------------------------------------------------------------------\n\n      # Automatically signal nginx to reopen logs after manipulation\n      # Prevents LANCache monolithic container from losing log file handle\n      # Requires docker.sock volume mount\n      # - NginxLogRotation__Enabled=true\n\n      # Name of the LANCache container (auto for auto-detection)\n      # Auto-detection finds containers with \"lancache\" in the name\n      # - NginxLogRotation__ContainerName=auto\n\n      # How often to check for log rotation needs (in hours)\n      # - NginxLogRotation__ScheduleHours=24\n\n      #---------------------------------------------------------------------------\n      # Optimization Settings\n      #---------------------------------------------------------------------------\n\n      # Show memory management controls in Management page\n      # Enable for low-memory systems or if memory usage climbs over time\n      # Most users should leave this disabled\n      # - Optimizations__EnableGarbageCollectionManagement=false\n\n      #---------------------------------------------------------------------------\n      # Steam Prefill (auto-detects host paths from container mounts)\n      # Pre-download games to your cache before LAN parties\n      # Powered by: https://github.com/regix1/steam-prefill-daemon\n      # (Fork of https://github.com/tpill90/steam-lancache-prefill)\n      #---------------------------------------------------------------------------\n\n      # Docker image for per-user prefill containers\n      # - Prefill__DockerImage=ghcr.io/regix1/steam-prefill-daemon:latest\n\n      # Session timeout in minutes (inactive sessions get cleaned up)\n      # - Prefill__SessionTimeoutMinutes=120\n\n      # Base path for daemon session data (commands/responses)\n      # Must be inside /data for Docker sibling container access\n      # - Prefill__DaemonBasePath=/data/prefill\n\n      # Host path that maps to /data in this container (auto for auto-detection)\n      # Auto-detected from container mounts. Only set if auto-detection fails.\n      # Example: If docker-compose.yml is at /srv/lancache/docker-compose.yml\n      # and you have ./data:/data, set this to /srv/lancache/data\n      # - Prefill__HostDataPath=auto\n\n      # Use TCP mode for prefill daemon communication\n      # Options: true, false, or auto (auto = true on Windows, false on Linux)\n      # - Prefill__UseTcp=auto\n\n      # TCP port inside the prefill container\n      # - Prefill__TcpPort=4379\n\n      # TCP port exposed on the host for prefill containers\n      # - Prefill__HostTcpPort=4379\n\n      # TCP host used by the prefill daemon\n      # - Prefill__TcpHost=127.0.0.1\n\n\n      # Network configuration for prefill containers (AUTO-DETECTED)\n      # The app auto-detects your lancache-dns setup:\n      #   - If lancache-dns uses host networking -\u003e prefill uses host networking\n      #   - If lancache-dns uses bridge -\u003e prefill uses its IP for DNS\n      # Only set these if auto-detection fails or you have a custom setup.\n\n      # Network mode for prefill containers\n      # Options: \"host\", \"bridge\", a custom Docker network name, or \"auto\"\n      # - Prefill__NetworkMode=auto\n\n      # Explicit lancache-dns IP (auto for auto-detection)\n      # Find with: docker inspect lancache-dns | grep IPAddress\n      # - Prefill__LancacheDnsIp=auto\n\n      #=========================================================================\n      # ADVANCED - Multiple Datasources (Optional)\n      # Configure multiple LANCache instances or outsourced services\n      # When DataSources are configured, LogPath/CachePath above are ignored\n      #=========================================================================\n\n      # Example: Main LANCache + outsourced Steam on separate drive\n      #\n      # - LanCache__DataSources__0__Name=Default\n      # - LanCache__DataSources__0__CachePath=/cache\n      # - LanCache__DataSources__0__LogPath=/logs\n      # - LanCache__DataSources__0__Enabled=true\n      #\n      # - LanCache__DataSources__1__Name=Steam\n      # - LanCache__DataSources__1__CachePath=/steam-cache\n      # - LanCache__DataSources__1__LogPath=/steam-logs\n      # - LanCache__DataSources__1__Enabled=true\n      #\n      # With additional volume mounts:\n      # - /mnt/steam-drive/cache:/steam-cache:ro\n      # - /mnt/steam-drive/logs:/steam-logs:ro\n\n      # Auto-detect datasources by scanning for matching subdirectories\n      # Scans /cache and /logs for folders that exist in both locations\n      # Example: /cache/steam + /logs/steam -\u003e creates \"Steam\" datasource\n      # - LanCache__AutoDiscoverDatasources=true\n\n      #=========================================================================\n      # DEBUGGING - Enable verbose logging for troubleshooting\n      #=========================================================================\n\n      # Enable debug logging for platform-specific operations\n      # - Logging__LogLevel__LancacheManager.Infrastructure.Platform=Debug\n```\n\n\u003e [!NOTE]\n\u003e Remove `:ro` from the cache volume if you want cache clearing and game removal. The Docker socket is optional but required for nginx log rotation and Steam Prefill.\n\n-----\n\n\u003ca id=\"configuration-options\"\u003e\u003c/a\u003e\n## Configuration Options\n\n### Volumes\n\n| Volume | Purpose | Notes |\n|--------|---------|-------|\n| `/data` | Database, security, state/config, themes, cached images | Required |\n| `/logs` | LANCache access logs | Add `:ro` for read-only |\n| `/cache` | LANCache cached files | Add `:ro` for monitoring only |\n| `/var/run/docker.sock` | Docker API access | Optional. Required for nginx rotation and Steam Prefill |\n\n### User/Group Settings\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `PUID` | 33 | User ID the app runs as. Match your filesystem permissions. |\n| `PGID` | 33 | Group ID the app runs as. |\n| `TZ` | UTC | Timezone for log timestamps (e.g., `America/Chicago`). |\n\n### Path Settings\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `LanCache__LogPath` | - | Path to the LANCache access log file. |\n| `LanCache__CachePath` | - | Path to the LANCache cache directory. |\n| `LanCache__EnvFilePath` | (auto) | Path to lancache `.env` file for reading `CACHE_DISK_SIZE`. Auto-searches common paths if not set. |\n| `LanCache__AutoDiscoverDatasources` | false | Auto-detect datasources from matching subdirectories. |\n\n### Security\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `Security__EnableAuthentication` | true | Require API key for admin features. Set `false` for dev only. |\n| `Security__MaxAdminDevices` | 3 | Number of devices that can share the same API key. |\n| `Security__GuestSessionDurationHours` | 6 | Default guest session length (configurable in UI). |\n| `Security__RequireAuthForMetrics` | false | Require API key for `/metrics` endpoint. |\n| `Security__ProtectSwagger` | true | Require auth for Swagger API docs in production. |\n| `Security__AllowedOrigins` | (empty) | Comma-separated CORS allow list. Empty allows all. |\n| `Security__AllowedBrowsePaths` | (empty) | Comma-separated list of allowed file browser roots. |\n\n#### Access Levels\n\nThe API has two protection levels:\n\n| Level | Description | Examples |\n|-------|-------------|----------|\n| **Admin Only** | Requires API key authentication | Cache clearing, log processing, settings changes |\n| **Guest Session** | Requires admin auth or a valid guest session | Viewing downloads, stats, events, client data |\n\n**Guest sessions** allow read-only access without sharing your API key. Guests must have a valid session created by an admin. No endpoints are public without authentication.\n\nTo grant guest access:\n1. Go to the **Users** tab\n2. Click **Create Guest Link**\n3. Share the link with your guests\n\nGuests can view dashboards, downloads, and events but cannot modify settings or clear cache.\n\n### Nginx Log Rotation\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `NginxLogRotation__Enabled` | true | Signal nginx to reopen logs after manipulation. |\n| `NginxLogRotation__ContainerName` | auto | LANCache container name (`auto` for auto-detection). |\n| `NginxLogRotation__ScheduleHours` | 24 | How often to check for rotation needs. |\n\n### Optimization\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `Optimizations__EnableGarbageCollectionManagement` | false | Enable memory management controls. Useful for low-memory systems. |\n\n### Cache Clearing\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n\n### API Options\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ApiOptions__MaxClientsPerRequest` | 1000 | Max clients returned in a single stats request. |\n| `ApiOptions__DefaultClientsLimit` | 100 | Default client limit when none is provided. |\n\n### Steam Prefill\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `Prefill__DockerImage` | ghcr.io/regix1/steam-prefill-daemon:latest | Docker image for prefill containers. |\n| `Prefill__SessionTimeoutMinutes` | 120 | Inactive session cleanup timeout. |\n| `Prefill__DaemonBasePath` | /data/prefill | Session data storage path. |\n| `Prefill__HostDataPath` | auto | Host path mapping to `/data` (`auto` for auto-detection). |\n| `Prefill__LancacheDnsIp` | auto | IP of your lancache-dns container (`auto` for auto-detection). |\n| `Prefill__NetworkMode` | auto | Network mode for prefill containers: `host`, `bridge`, a network name, or `auto`. |\n| `Prefill__UseTcp` | auto | Use TCP for daemon communication (`true`, `false`, or `auto`). Auto defaults to true on Windows and false on Linux. |\n| `Prefill__TcpPort` | 4379 | TCP port inside the prefill container. |\n| `Prefill__HostTcpPort` | 4379 | TCP port exposed on the host for prefill containers. |\n| `Prefill__TcpHost` | 127.0.0.1 | TCP host used by the prefill daemon. |\n\n-----\n\n\u003ca id=\"tabs-overview\"\u003e\u003c/a\u003e\n## Tabs Overview\n\n### Dashboard\nYour home base for cache statistics. See overall performance, recent activity, and service breakdowns. Stat cards are draggable so you can arrange them your way.\n\n### Downloads\nBrowse everything that has been cached. Choose Normal view (cards with game art), Compact view (dense list for scanning), or Retro view (terminal look). Filter and sort to find what you want.\n\n### Clients\nTrack every device that has downloaded through your cache. Group clients with friendly names so it is easy to identify machines at a LAN party.\n\n### Users\nManage active sessions, create guest access links, configure session duration, and revoke sessions when needed. Guest sessions provide read-only access to dashboards, downloads, and events without sharing your API key.\n\n### Events\nA calendar view of download activity over time. Create custom events for LAN parties and review what was downloaded during each one.\n\n### Prefill\nPre-download games to your cache before people arrive. Log in with Steam, pick games from your library, and let them run overnight.\n\n### Management\nThe admin panel (requires authentication). Process logs, clear cache, download depot mappings, configure Steam API access, manage themes, and handle database operations.\n\n-----\n\n\u003ca id=\"steam-prefill\"\u003e\u003c/a\u003e\n## Steam Prefill\n\nThe Prefill tab helps you download games to your cache before your LAN party starts. It is powered by [steam-prefill-daemon](https://github.com/regix1/steam-prefill-daemon), a fork of [steam-lancache-prefill](https://github.com/tpill90/steam-lancache-prefill) by [@tpill90](https://github.com/tpill90).\n\n### Requirements\n\n- Docker socket mounted\n- Authenticated as admin\n- Lancache-dns container running, or manual DNS configuration\n\n### Network Configuration\n\nFor prefill to work, the prefill container needs:\n1. **Internet access** - to authenticate with Steam and download game data\n2. **DNS resolution** - Steam CDN domains should resolve to your cache server\n\nThe app **auto-detects** network settings in most cases:\n- If your lancache-dns uses `network_mode: host`, prefill containers also use host networking\n- Otherwise, it uses the lancache-dns container IP address for DNS resolution\n\n**Network Diagnostics:**\nWhen a prefill session starts, the app tests the container network and logs the results. Check your container logs for output like:\n```\n═══════════════════════════════════════════════════════════════════════\n  PREFILL CONTAINER NETWORK DIAGNOSTICS - prefill-daemon-abc123\n═══════════════════════════════════════════════════════════════════════\n  ✓ Internet connectivity: OK (reached api.steampowered.com)\n  lancache.steamcontent.com resolved to 192.168.1.5\n  ✓ DNS looks correct (private IP - likely your lancache server)\n═══════════════════════════════════════════════════════════════════════\n```\n\n**Manual configuration** (if auto-detection fails):\n\n```yaml\nenvironment:\n  # Option 1: Use bridge networking (recommended for most setups)\n  - Prefill__NetworkMode=bridge\n\n  # Option 2: Use host networking (for host-networked lancache-dns)\n  - Prefill__NetworkMode=host\n\n  # Option 3: Explicit DNS IP (when lancache-dns IP is not auto-detected)\n  - Prefill__LancacheDnsIp=192.168.1.10\n```\n\n\u003e [!TIP]\n\u003e If prefill containers have no internet access, try `Prefill__NetworkMode=bridge`. This is a common fix when Docker's default network isolation blocks outbound connections.\n\n### How It Works\n\n1. Go to the Prefill tab\n2. Log in with your Steam account (Steam Guard supported)\n3. Select games from your library\n4. Start the prefill\n\nDownloads run in a separate container with real-time progress updates. When your guests arrive, the games are already cached and ready to serve at full speed.\n\n### Importing App IDs\n\nIf you are migrating from [steam-lancache-prefill](https://github.com/tpill90/steam-lancache-prefill) or you already have a list of Steam App IDs, you can import them directly:\n\n1. Click **Select Apps** to open the game selection modal\n2. Click **Import App IDs** to expand the import section\n3. Paste your App IDs in any of these formats:\n   - Comma-separated: `730, 570, 440`\n   - JSON array: `[730, 570, 440]`\n   - One per line\n4. Click **Import**\n\nThe import tells you how many games were added, how many were already selected, and how many IDs are not in your Steam library (these are skipped during prefill).\n\n**Migrating from steam-lancache-prefill:** Copy the contents of your `selectedAppsToPrefill.json` file and paste it directly into the import field.\n\n-----\n\n\u003ca id=\"custom-themes\"\u003e\u003c/a\u003e\n## Custom Themes\n\n### Theme Editor\n\nGo to **Management \u003e Preferences \u003e Theme Management** to:\n- Create themes from scratch with live preview\n- Browse and install community themes\n- Import and export themes as TOML files\n\n### Theme Format\n\n```toml\n[meta]\nname = \"My Theme\"\nid = \"my-theme\"\nisDark = true\nversion = \"1.0.0\"\nauthor = \"Your Name\"\n\n[colors]\nprimaryColor = \"#3b82f6\"\nbgPrimary = \"#111827\"\ntextPrimary = \"#ffffff\"\n```\n\nThemes are stored in `/data/themes/`.\n\n-----\n\n\u003ca id=\"grafana--prometheus\"\u003e\u003c/a\u003e\n## Grafana \u0026 Prometheus\n\n### Available Metrics\n\n| Metric | Description |\n|--------|-------------|\n| `lancache_cache_capacity_bytes` | Total storage capacity |\n| `lancache_cache_size_bytes` | Currently used space |\n| `lancache_cache_hit_bytes_total` | Bandwidth saved (cache hits) |\n| `lancache_cache_miss_bytes_total` | New data downloaded |\n| `lancache_active_downloads` | Current active downloads |\n| `lancache_cache_hit_ratio` | Cache effectiveness (0-1) |\n| `lancache_downloads_by_service` | Downloads per service |\n| `lancache_bytes_served_by_service` | Bandwidth per service |\n\n### Prometheus Configuration\n\n```yaml\nscrape_configs:\n  - job_name: 'lancache-manager'\n    static_configs:\n      - targets: ['lancache-manager:80']\n    scrape_interval: 30s\n    metrics_path: /metrics\n```\n\nFor authenticated metrics, set `Security__RequireAuthForMetrics=true` and add:\n\n```yaml\n    authorization:\n      type: Bearer\n      credentials: 'your-api-key-here'\n```\n\n### Example Queries\n\n```promql\n# Cache hit rate as percentage\nlancache_cache_hit_ratio * 100\n\n# Bandwidth saved in last 24 hours\nincrease(lancache_cache_hit_bytes_total[24h])\n\n# Cache size in GB\nlancache_cache_size_bytes / 1024 / 1024 / 1024\n```\n\n-----\n\n\u003ca id=\"multiple-datasources\"\u003e\u003c/a\u003e\n## Multiple Datasources\n\nMost users run a single LANCache instance and never touch this. If you have outsourced specific services to separate cache directories or you run multiple LANCache instances, you can configure multiple datasources and view them together in one dashboard.\n\n### When You Need This\n\n- **Outsourced services** - LANCache stores Steam on a separate drive from other services\n- **Multiple LANCache instances** - Separate cache servers for different purposes\n- **Segmented storage** - Different services on different drives or partitions\n\n### How It Works\n\nEach datasource represents a log and cache directory pair. The app processes logs and tracks cache usage separately for each one, then combines the results in the dashboard and downloads views.\n\n-----\n\n### Auto-Discovery (Recommended)\n\nThe easiest approach is to let the app scan for matching subdirectories:\n\n```yaml\nenvironment:\n  - LanCache__LogPath=/logs\n  - LanCache__CachePath=/cache\n  - LanCache__AutoDiscoverDatasources=true\n```\n\n**What it detects:**\n\n1. **Root-level datasource** - If `/logs/access.log` exists and `/cache` contains LANCache hash directories (`00/`, `01/`, and so on), it creates a \"Default\" datasource\n2. **Subdirectory datasources** - For each folder that exists in both `/cache` and `/logs`, it creates a named datasource (e.g., `/cache/steam` + `/logs/steam` -\u003e \"Steam\")\n\n**Example directory structure:**\n\n```\n/mnt/lancache/\n├── cache/\n│   ├── 00/, 01/, a1/, ff/    ← Default cache (hash dirs at root)\n│   ├── steam/\n│   │   └── 00/, 01/, ...     ← Outsourced Steam\n│   └── epic/\n│       └── 00/, 01/, ...     ← Outsourced Epic\n└── logs/\n    ├── access.log            ← Default log\n    ├── steam/\n    │   └── access.log        ← Steam log\n    └── epic/\n        └── access.log        ← Epic log\n```\n\nThis creates three datasources: **Default**, **Steam**, and **Epic**.\n\n\u003e [!NOTE]\n\u003e Folder matching is case-insensitive. `Steam`, `steam`, and `STEAM` all match.\n\n-----\n\n### Manual Configuration\n\nFor precise control or when directories are on separate drives, define each datasource explicitly:\n\n```yaml\nenvironment:\n  # Main LANCache\n  - LanCache__DataSources__0__Name=Default\n  - LanCache__DataSources__0__CachePath=/cache\n  - LanCache__DataSources__0__LogPath=/logs\n  - LanCache__DataSources__0__Enabled=true\n\n  # Steam on a separate drive\n  - LanCache__DataSources__1__Name=Steam\n  - LanCache__DataSources__1__CachePath=/steam-cache\n  - LanCache__DataSources__1__LogPath=/steam-logs\n  - LanCache__DataSources__1__Enabled=true\n```\n\nWith corresponding volume mounts:\n\n```yaml\nvolumes:\n  - /mnt/lancache/cache:/cache:ro\n  - /mnt/lancache/logs:/logs:ro\n  - /mnt/steam-drive/cache:/steam-cache:ro\n  - /mnt/steam-drive/logs:/steam-logs:ro\n```\n\n\u003e [!NOTE]\n\u003e Manual datasource configuration takes priority over auto-discovery.\n\n-----\n\n\u003ca id=\"nginx-reverse-proxy\"\u003e\u003c/a\u003e\n## Nginx Reverse Proxy\n\nLANCache Manager works well behind Nginx. HTTPS is recommended and required for guest session cookies on cross-origin image requests.\n\n### Single origin (recommended)\n\nServe the UI and API from the same origin. This keeps cookies first-party and avoids cross-origin issues.\n\n```nginx\nserver {\n  listen 443 ssl http2;\n  server_name lancache.example.com;\n\n  ssl_certificate     /etc/letsencrypt/live/lancache.example.com/fullchain.pem;\n  ssl_certificate_key /etc/letsencrypt/live/lancache.example.com/privkey.pem;\n\n  # Increase if you have large responses\n  client_max_body_size 50m;\n\n  location / {\n    proxy_pass http://127.0.0.1:8080;\n    proxy_http_version 1.1;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_set_header X-Forwarded-Host $host;\n\n    # SignalR (WebSockets)\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_read_timeout 600s;  # Must match SignalR timeout (10 min) to prevent nginx killing idle WebSocket connections\n  }\n}\n\nserver {\n  listen 80;\n  server_name lancache.example.com;\n  return 301 https://$host$request_uri;\n}\n```\n\n### Separate API origin (only if required)\n\nIf you split UI and API across hosts, use HTTPS and allow credentials. In that case:\n\n- Set `VITE_API_URL=https://api.lancache.example.com` when building the Web UI.\n- Keep `SameSite=None; Secure` cookies (configured by the app).\n- Ensure CORS allows credentials for your UI origin.\n\nExample API proxy:\n\n```nginx\nserver {\n  listen 443 ssl http2;\n  server_name api.lancache.example.com;\n\n  ssl_certificate     /etc/letsencrypt/live/api.lancache.example.com/fullchain.pem;\n  ssl_certificate_key /etc/letsencrypt/live/api.lancache.example.com/privkey.pem;\n\n  location / {\n    proxy_pass http://127.0.0.1:8080;\n    proxy_http_version 1.1;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_set_header X-Forwarded-Host $host;\n\n    # SignalR (WebSockets)\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_read_timeout 600s;  # Must match SignalR timeout (10 min) to prevent nginx killing idle WebSocket connections\n  }\n}\n```\n\n-----\n\n\u003ca id=\"troubleshooting\"\u003e\u003c/a\u003e\n## Troubleshooting\n\n### Logs Not Processing\n\n1. Verify the log path in **Management \u003e Settings**\n2. Confirm your volume mount matches `LanCache__LogPath`\n3. Click **Process Logs** in Management\n4. Check container logs: `docker logs lancache-manager`\n\n### Games Not Identified\n\n1. Download the latest mappings from **Management \u003e Depot Mappings**\n2. Add custom mappings for private depots if needed\n3. Click **Reprocess All Logs** after adding mappings\n\n### Lost API Key\n\n```bash\ncat ./data/security/api_key.txt\n# or\ndocker logs lancache-manager | grep \"API Key\"\n```\n\nTo generate a new key, stop the container, delete `./data/security/api_key.txt`, and restart.\n\n### Permission Issues\n\nVerify PUID and PGID match your file ownership:\n```bash\nls -n /path/to/cache\n```\n\n### Prefill Not Working\n\n1. Ensure the Docker socket is mounted\n2. Confirm you are authenticated as admin\n3. Check container logs for network diagnostics output (look for `═══ PREFILL CONTAINER NETWORK DIAGNOSTICS ═══`)\n4. **Container has no internet access:** The prefill container cannot reach Steam. Common fixes:\n   - Set `Prefill__NetworkMode=bridge` in your docker-compose.yml (recommended for most setups)\n   - Ensure your Docker network has outbound internet access\n   - Check firewall rules for outbound connections\n5. **HTTP 400 errors during download:** The prefill container cannot resolve Steam CDN domains to your cache. Try one of the following:\n   - Set `Prefill__NetworkMode=host` if your lancache-dns uses host networking\n   - Set `Prefill__LancacheDnsIp` to your lancache-dns IP address\n   - The app auto-detects this if your lancache-dns container is running\n6. **DNS bypassing lancache via IPv6:** If your network uses IPv6, DNS queries might bypass lancache-dns. The app automatically disables IPv6 in prefill containers to prevent this.\n\n**Network Diagnostics:**\nWhen a prefill container starts, the app runs network diagnostics that appear in the logs:\n- Internet connectivity test (can reach api.steampowered.com)\n- DNS resolution for `lancache.steamcontent.com` and `steam.cache.lancache.net`\n- Warnings if DNS resolves to public IPs instead of your cache\n\n**Finding your lancache-dns IP:**\n```bash\ndocker inspect lancache-dns | grep IPAddress\n```\n\n**Example configurations:**\n\nBridge mode (recommended for most Docker setups):\n```yaml\nenvironment:\n  - Prefill__NetworkMode=bridge\n```\n\nHost networking (when lancache-dns uses host mode):\n```yaml\nenvironment:\n  - Prefill__NetworkMode=host\n```\n\nExplicit DNS IP (when auto-detection fails):\n```yaml\nenvironment:\n  - Prefill__LancacheDnsIp=192.168.1.10\n```\n\n### Debug Logging\n\nIf you're experiencing issues with path resolution, file system detection, Docker communication, or other platform-specific operations, you can enable verbose debug logging:\n\n```yaml\nenvironment:\n  - Logging__LogLevel__LancacheManager.Infrastructure.Platform=Debug\n```\n\n**What it logs:**\n- Path resolution and validation (container vs host paths)\n- File system operations and permission checks\n- Docker socket communication and container detection\n- Volume mount detection and mapping\n- Platform-specific behavior (Linux vs Windows differences)\n\n**How to use:**\n1. Add the environment variable to your docker-compose.yml\n2. Restart the container: `docker compose up -d`\n3. Reproduce the issue\n4. View logs: `docker logs lancache-manager`\n5. Remove the variable when done (debug logging is verbose)\n\nThis is especially helpful when:\n- Auto-detection of paths or Docker settings fails\n- Prefill containers aren't spawning correctly\n- Volume mounts don't seem to be recognized\n- You're running on an unusual platform or Docker setup\n\n-----\n\n\u003ca id=\"building-from-source\"\u003e\u003c/a\u003e\n## Building from Source\n\n**Requirements:** .NET 8 SDK, Node.js 20+, Rust 1.75+\n\n```bash\ngit clone https://github.com/regix1/lancache-manager.git\ncd lancache-manager\n\n# Rust processor\ncd rust-processor \u0026\u0026 cargo build --release\n\n# Web interface\ncd ../Web \u0026\u0026 npm install \u0026\u0026 npm run dev  # http://localhost:3000\n\n# API\ncd ../Api/LancacheManager \u0026\u0026 dotnet run  # http://localhost:5000\n```\n\n**Docker build:**\n```bash\ndocker buildx build \\\n  --platform linux/amd64,linux/arm64 \\\n  -t ghcr.io/regix1/lancache-manager:latest \\\n  --push .\n```\n\n-----\n\n\u003ca id=\"contributing-translations\"\u003e\u003c/a\u003e\n## Contributing Translations\n\nLANCache Manager supports internationalization (i18n) and welcomes community translations. The app is ready for localization and all UI strings are already externalized.\n\n### How to Contribute\n\n1. **Fork the repository** on GitHub\n2. Navigate to `Web/src/i18n/locales/`\n3. Copy `en.json` to a new file named with your language code (e.g., `de.json`, `fr.json`, `es.json`, `pt-BR.json`)\n4. Translate all the string values (keep the keys unchanged)\n5. Submit a **Pull Request** with your translation\n\n### Translation File Structure\n\n```\nWeb/src/i18n/locales/\n├── en.json          ← English (reference)\n├── de.json          ← German (your contribution)\n├── fr.json          ← French (your contribution)\n└── ...\n```\n\n### Guidelines\n\n- **Keep JSON keys unchanged** - Only translate the string values\n- **Preserve placeholders** - Keep `{{variable}}` placeholders intact (e.g., `{{name}}`)\n- **Maintain formatting** - Preserve any HTML tags like `\u003cstrong\u003e` if present\n- **Test your translation** - Run the app locally to verify your translations display correctly\n\n### Example\n\n```json\n// en.json\n{\n  \"dashboard\": {\n    \"title\": \"Dashboard\",\n    \"recentDownloads\": \"Recent Downloads\",\n    \"totalCache\": \"Total Cache: {{size}}\"\n  }\n}\n\n// de.json\n{\n  \"dashboard\": {\n    \"title\": \"Übersicht\",\n    \"recentDownloads\": \"Letzte Downloads\",\n    \"totalCache\": \"Gesamter Cache: {{size}}\"\n  }\n}\n```\n\n\u003ca id=\"need-help\"\u003e\u003c/a\u003e\n## Need Help?\n\nIf you run into issues, feel free to [open an issue](https://github.com/regix1/lancache-manager/issues) on GitHub.\n\nYou can also find the LANCache community at the [LanCache.NET Discord](https://discord.com/invite/BKnBS4u).\n\n-----\n\n## Support\n\n\u003cdiv align=\"center\"\u003e\n\n### Enjoying LANCache Manager?\n\nIf this project has been helpful, consider supporting development.\n\n\u003cbr\u003e\n\n\u003ca href=\"https://www.buymeacoffee.com/regix\"\u003e\n  \u003cimg src=\"https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExcGw1bHduZGxrNjVzYnM3ZnppZmZ1YmV5Z2J3dThjMGJnNWswejFyaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9cw/kmIZ4lx2ZHpr5jY0W4/giphy.gif\" alt=\"Buy Me A Coffee\" width=\"600\"\u003e\n\u003c/a\u003e\n\n**[☕ Click to donate](https://www.buymeacoffee.com/regix)**\n\n\u003cbr\u003e\n\n*Every coffee helps keep this project alive!*\n\n\u003c/div\u003e\n\n-----\n\n## License\n\n[MIT License](https://github.com/regix1/lancache-manager/blob/main/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fregix1%2Flancache-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fregix1%2Flancache-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fregix1%2Flancache-manager/lists"}