diff --git a/.pi-map.index.md b/.pi-map.index.md index 4079c7b..dafa928 100644 --- a/.pi-map.index.md +++ b/.pi-map.index.md @@ -16,7 +16,7 @@ dir: . Trust boundary: index routes, map orients, source decides. ## role -Root project directory for "Manage," a media library viewer and server operations tool with a FastAPI backend and React frontend. +Root configuration and documentation hub for a containerized media library management application with FastAPI backend, React frontend, and full observability stack. ## parent - ## children diff --git a/.pi-map.md b/.pi-map.md index 049d3b0..592d1f6 100644 --- a/.pi-map.md +++ b/.pi-map.md @@ -18,25 +18,25 @@ index: ./.pi-map.index.md Trust boundary: index routes, map orients, source decides. ## role -Root project directory for "Manage," a media library viewer and server operations tool with a FastAPI backend and React frontend. +Root configuration and documentation hub for a containerized media library management application with FastAPI backend, React frontend, and full observability stack. ## files - .dockerignore | Specifies files and directories to exclude from Docker build context to reduce image size and improve build performance | dep: Docker - .env.example | Provides a template of environment variables for configuring application hosts, backend settings, OIDC authentication, SMTP, Grafana, and alerting across a Docker Compose deployment. - .gitignore | Configures Git to ignore Python artifacts, virtual environments, secrets, editor files, frontend builds, and tool-specific metadata from version control. - AGENTS.md | Provides project-specific guidance for AI agents working on a media library viewer application with FastAPI backend and Vite React frontend | dep: FastAPI, Vite, React, Docker Compose, uvicorn, pytest, Ruff, TypeScript, Python 3.11 -- CHANGELOG.md | Documents notable changes, breaking changes, and migration steps for the Manage project across versions. -- CONTRIBUTING.md | Provides guidelines for setting up a development environment, coding standards, validation steps, and contribution requirements for a Streamlit-based media library viewer application. | dep: python, venv, pip, streamlit, py_compile +- CHANGELOG.md | Documents notable changes, breaking changes, and migration steps for the Manage application across recent versions. +- CONTRIBUTING.md | Provides contribution guidelines and setup instructions for the Manage project's backend (FastAPI) and frontend (React) codebases. | dep: FastAPI, React, Vite, TypeScript, Ruff, pytest, Docker Compose, Tailwind CSS, TanStack Query - LICENSE | Provides the MIT open-source software license terms for the project -- README.md | This file is the project README, serving as the primary documentation and setup guide for "Manage," a media and server operations tool with a FastAPI + React architecture. | dep: FastAPI, React, Jellyfin, Docker Compose, SQLite, Prometheus, Grafana, Alertmanager +- README.md | Project README documenting a media and server operations tool with Jellyfin integration, SSH file inspection, and server monitoring capabilities. | dep: FastAPI, React, TypeScript, Docker Compose, SQLite, Traefik, OIDC/Authentik, Jellyfin, Prometheus, Grafana, Alertmanager - context.md | Documentation file providing a historical and architectural overview of an observability stack (Prometheus, Grafana, Loki, Alertmanager) for a containerized media management application. | dep: Prometheus, Grafana, Loki, Alertmanager, Grafana Alloy, Node Exporter, Docker Compose, FastAPI - docker-compose.dev.yml | Defines a development Docker Compose stack for a backend (FastAPI/Uvicorn) and frontend (Vite) application with hot-reload and disabled authentication. | dep: uvicorn, Docker - docker-compose.observability.yml | Defines an optional standalone Docker Compose observability stack with Prometheus, Loki, Grafana, Alertmanager, Alloy, and Node Exporter for monitoring hosts without the main Manage application. | dep: prom/prometheus, grafana/loki, grafana/alloy, grafana/grafana, prom/alertmanager, prom/node-exporter, Traefik -- docker-compose.yml | Defines a Docker Compose production stack for a backend and frontend application with OIDC authentication, Traefik reverse proxy routing, and Prometheus metrics exposure. | dep: Traefik, OIDC provider, Docker, SMTP server, external observability stack (Prometheus/Grafana/Loki/Alertmanager) +- docker-compose.yml | Defines a production Docker Compose stack for a backend-frontend application with OIDC authentication, Traefik routing, TLS, and Prometheus metrics exposure. | dep: Traefik, OIDC provider, Docker, Vite, external observability stack - token-usage-output.txt | Displays a detailed token usage and cost analysis report for an AI coding session, including breakdowns by category, tool usage, cache efficiency, subagent costs, and pricing comparisons. ## arch -Containerized full-stack architecture using Docker Compose for orchestration, Traefik for reverse proxy routing, OIDC for authentication, and an optional observability stack (Prometheus, Grafana, Loki, Alertmanager). +Docker Compose-based multi-service architecture with Traefik reverse proxy, OIDC authentication, and optional Prometheus/Grafana/Loki/Alertmanager observability stack; supports dev (hot-reload) and prod (TLS) deployments. ## tags -docker, grafana, application, compose, fastapi, prometheus, alertmanager, loki +docker, grafana, application, fastapi, compose, prometheus, backend, frontend ## symbols - ## workflows diff --git a/backend/.pi-map.index.md b/backend/.pi-map.index.md index 6281045..6ee1160 100644 --- a/backend/.pi-map.index.md +++ b/backend/.pi-map.index.md @@ -2,7 +2,7 @@ dir: backend ## role -FastAPI backend service providing REST API endpoints for Jellyfin media browsing, SSH file inspection, and server monitoring. +FastAPI backend service providing JWT-protected REST APIs for Jellyfin media browsing, SSH file inspection, and server monitoring. ## parent index: ./.pi-map.index.md map: ./.pi-map.md diff --git a/backend/.pi-map.md b/backend/.pi-map.md index 001e593..8dcc239 100644 --- a/backend/.pi-map.md +++ b/backend/.pi-map.md @@ -4,13 +4,13 @@ dir: backend index: backend/.pi-map.index.md ## role -FastAPI backend service providing REST API endpoints for Jellyfin media browsing, SSH file inspection, and server monitoring. +FastAPI backend service providing JWT-protected REST APIs for Jellyfin media browsing, SSH file inspection, and server monitoring. ## files - Dockerfile | Builds a Docker container for a Python 3.11 backend API service using uvicorn | dep: python:3.11-slim, pip, uvicorn, pyproject.toml-based package -- README.md | Documentation describing the setup, configuration, Docker deployment, and API endpoints of a FastAPI backend for Jellyfin media browsing, SSH file inspection, and server monitoring. | dep: FastAPI, uvicorn, pydantic-settings, Jellyfin, Jellyseerr, SSH, Docker Compose, Alertmanager, Prometheus, Grafana, Authentik/OIDC +- README.md | Documentation describing the setup, configuration, Docker deployment, and API endpoints for a FastAPI backend that provides Jellyfin media browsing, SSH file inspection, server monitoring, and JWT-protected access. | dep: FastAPI, uvicorn, pydantic-settings, Docker Compose - pyproject.toml | Project configuration file defining dependencies, build system, linting, and testing settings for a FastAPI media library viewer backend. | dep: FastAPI, uvicorn, pydantic-settings, paramiko, requests, python-dotenv, pandas, PyJWT, prometheus-client, python-json-logger, cryptography, hatchling, ruff, pytest, httpx ## arch -Containerized Python 3.11 service using FastAPI with uvicorn ASGI server, configured via pyproject.toml with linting/testing pipelines and Docker-based deployment. +Layered Python 3.11 API using FastAPI with uvicorn ASGI server, containerized via Docker for deployment. ## tags uvicorn, fastapi, python, backend, pyproject, settings, docker, api ## symbols diff --git a/backend/src/.pi-map.index.md b/backend/src/.pi-map.index.md index 36aea8c..5a13d4a 100644 --- a/backend/src/.pi-map.index.md +++ b/backend/src/.pi-map.index.md @@ -2,7 +2,7 @@ dir: backend/src ## role -Root source directory serving as the entry point for the backend application. +Backend application source directory containing the core business logic, API endpoints, data models, and server configuration for the project. ## parent index: backend/.pi-map.index.md map: backend/.pi-map.md diff --git a/backend/src/.pi-map.md b/backend/src/.pi-map.md index f7838e0..626c515 100644 --- a/backend/src/.pi-map.md +++ b/backend/src/.pi-map.md @@ -4,10 +4,10 @@ dir: backend/src index: backend/src/.pi-map.index.md ## role -Root source directory serving as the entry point for the backend application. +Backend application source directory containing the core business logic, API endpoints, data models, and server configuration for the project. ## files ## arch -Likely follows a modular/framework-dependent architecture (e.g., MVC, layered, or hexagonal); contains core application setup, routing, configuration, and business logic modules. +Likely follows a layered/n-tier architecture (controllers/services/models) with possible modular or hexagonal patterns; structure depends on framework conventions (e.g., Express, NestJS, Django, Spring Boot). ## tags - ## symbols diff --git a/backend/src/media_library_viewer_api/.pi-map.index.md b/backend/src/media_library_viewer_api/.pi-map.index.md index 7a04886..9f0a7da 100644 --- a/backend/src/media_library_viewer_api/.pi-map.index.md +++ b/backend/src/media_library_viewer_api/.pi-map.index.md @@ -2,7 +2,7 @@ dir: backend/src/media_library_viewer_api ## role -FastAPI backend providing authenticated API endpoints and remote SSH job execution for viewing and managing media library metadata from Jellyfin/Jellyseerr services. +FastAPI backend service that provides authenticated APIs for viewing, analyzing, and managing media libraries across Jellyfin/Jellyseerr with remote SSH job execution. ## parent index: backend/src/.pi-map.index.md map: backend/src/.pi-map.md diff --git a/backend/src/media_library_viewer_api/.pi-map.md b/backend/src/media_library_viewer_api/.pi-map.md index 2cf9a18..c528330 100644 --- a/backend/src/media_library_viewer_api/.pi-map.md +++ b/backend/src/media_library_viewer_api/.pi-map.md @@ -4,12 +4,12 @@ dir: backend/src/media_library_viewer_api index: backend/src/media_library_viewer_api/.pi-map.index.md ## role -FastAPI backend providing authenticated API endpoints and remote SSH job execution for viewing and managing media library metadata from Jellyfin/Jellyseerr services. +FastAPI backend service that provides authenticated APIs for viewing, analyzing, and managing media libraries across Jellyfin/Jellyseerr with remote SSH job execution. ## files - __init__.py | Swaps the position of two tmux panes within a window or between windows | dep: tmux, sh - auth.py | Implements OIDC/JWT and API key authentication for a FastAPI backend with middleware-based route protection. | exp: func:_normalize_issuer_url(issuer_url: str) → str, call:issuer_url.rstrip, func:get_oidc_metadata(issuer_url: str) → dict[str, Any], call:_normalize_issuer_url, call:urljoin, call:requests.get, call:response.raise_for_status, call:response.json, call:isinstance, raise:RuntimeError, func:get_jwk_client(jwks_url: str) → PyJWKClient, call:PyJWKClient, func:_split_audience(audience: str) → list[str], call:item.strip, call:audience.split, func:validate_auth_settings(settings: Settings) → None, raise:RuntimeError, func:validate_bearer_jwt(authorization: str | None, settings) → dict[str, Any], call:get_settings, call:validate_auth_settings, call:authorization.partition, call:scheme.lower, call:token.strip, call:_normalize_issuer_url, call:get_oidc_metadata, call:settings.oidc_jwks_url.strip, call:str, call:metadata.get, call:get_jwk_client, call:jwk_client.get_signing_key_from_jwt, call:_split_audience, call:jwt.decode, call:list, call:len, call:int, raise:PermissionError, raise:RuntimeError, func:require_jwt_auth(request: Request, call_next), call:get_settings, call:path.startswith, call:call_next, call:validate_bearer_jwt, call:request.headers.get, call:logger.warning, call:JSONResponse, call:str, call:logger.exception, call:claims.get, call:isinstance, func:get_api_key() → str, call:get_settings_store, call:store.get_settings, call:settings.get, call:secrets.token_urlsafe, call:store.update_setting, func:require_api_key(authorization) → str, call:get_api_key, call:secrets.compare_digest, raise:HTTPException | dep: logging, secrets, functools, typing, urllib.parse, jwt, requests, fastapi, fastapi.responses, jwt.exceptions, media_library_viewer_api.config, media_library_viewer_api.dependencies - config.py | Defines a flat pydantic-settings configuration model that loads application settings from environment variables and .env files with cached access. | exp: class:Settings, func:_find_env_file() → str | None, call:Path.cwd, call:candidate.is_file, call:str, call:(directory / ".git").exists, func:get_settings() → Settings, call:_find_env_file, call:Settings, call:logger.info, call:describe_settings | dep: logging, functools, pathlib, pydantic_settings, media_library_viewer_api.logging_utils, functools.lru_cache, pathlib.Path, pydantic_settings.BaseSettings -- dependencies.py | Provides FastAPI dependency injection for Jellyfin/Jellyseerr clients and SSH/local command clients, resolving service instances from query parameters or configuration with caching and fallback logic. | exp: func:_request_machine_id(request: Request | None) → str | None, call:request.query_params.get, func:_request_jellyfin_service_id(request: Request | None) → str | None, call:request.query_params.get, func:_service_record(store: SettingsStore, service_type: str, service_id: str | None) → dict[str, Any] | None, call:store.get_service, call:candidate.get, call:store.list_services, call:s.get, call:row.get, call:decrypt_secrets, call:logger.exception, func:_jellyfin_client_for(cache_key: tuple[str, str, str]) → JellyfinClient, call:logger.info, call:url.rstrip, call:JellyfinClient, func:_ssh_client_for(cache_key: tuple[str, str, str, int, str, str | None, str | None, str | None, str | None]) → RemoteSSHClient, call:logger.info, call:RemoteSSHClient, call:client.connect, call:str, call:message.lower, call:logger.exception, raise:HTTPException, func:_resolve_machine(service: str, request) → dict[str, Any] | None, call:get_settings_store, call:_request_machine_id, call:store.get_machine, call:machine.get, call:store.list_machines_for_service, func:get_jellyfin_client(request) → JellyfinClient, call:get_settings_store, call:_request_jellyfin_service_id, call:_service_record, call:str, call:service.get("config", {}).get, call:service.get("secrets", {}).get, call:_jellyfin_client_for, raise:RuntimeError, func:get_jellyseerr_client(request) → JellyseerrClient | None, call:get_settings_store, call:_request_jellyfin_service_id, call:_service_record, call:logger.info, call:str, call:service.get("config", {}).get, call:service.get("secrets", {}).get, call:JellyseerrClient, func:_ssh_client_from_machine_config(machine: dict[str, Any], store) → RemoteSSHClient, call:get_settings_store, call:get_settings, call:str(machine.get("ssh_key_id") or "").strip, call:machine.get, call:store.get_ssh_key, call:ssh_key.get, call:int, call:_ssh_client_for, func:get_ssh_client(request), call:get_settings_store, call:_request_machine_id, call:store.get_machine_config, call:_resolve_machine, call:str(machine.get("mode") or "local").strip().lower, call:machine.get, call:logger.info, call:LocalCommandClient, call:_ssh_client_from_machine_config, call:get_settings, call:_ssh_client_for, raise:RuntimeError, func:get_mail_queue() → MailQueue, call:_get_mail_queue, func:get_settings_store() → SettingsStore, call:_get_settings_store, func:get_user_id(request) → str, call:get_settings_store, call:_request_jellyfin_service_id, call:_service_record, call:service.get("config", {}).get, call:str, call:get_jellyfin_client, call:client.users, raise:RuntimeError | dep: logging, functools, typing, fastapi, media_library_viewer_api.clients.jellyfin, media_library_viewer_api.clients.jellyseerr, media_library_viewer_api.clients.local, media_library_viewer_api.clients.ssh, media_library_viewer_api.config, media_library_viewer_api.services.mail_queue, media_library_viewer_api.services.settings_store, media_library_viewer_api.services.secrets +- dependencies.py | Provides FastAPI dependency injection functions for resolving and caching service clients (Jellyfin, Jellyseerr, SSH/Local) and settings based on request query parameters. | exp: func:_request_machine_id(request: Request | None) → str | None, call:request.query_params.get, func:_request_jellyfin_service_id(request: Request | None) → str | None, call:request.query_params.get, func:_service_record(store: SettingsStore, service_type: str, service_id: str | None) → dict[str, Any] | None, call:store.get_service, call:candidate.get, call:store.list_services, call:s.get, call:row.get, call:decrypt_secrets, call:logger.exception, func:_jellyfin_client_for(cache_key: tuple[str, str, str]) → JellyfinClient, call:logger.info, call:url.rstrip, call:JellyfinClient, func:_ssh_client_for(cache_key: tuple[str, str, str, int, str, str | None, str | None, str | None, str | None]) → RemoteSSHClient, call:logger.info, call:RemoteSSHClient, call:client.connect, call:str, call:message.lower, call:logger.exception, raise:HTTPException, func:_resolve_machine(service: str, request) → dict[str, Any] | None, call:get_settings_store, call:_request_machine_id, call:store.get_machine, call:machine.get, call:store.list_machines_for_service, func:get_jellyfin_client(request) → JellyfinClient, call:get_settings_store, call:_request_jellyfin_service_id, call:_service_record, call:str, call:service.get("config", {}).get, call:service.get("secrets", {}).get, call:_jellyfin_client_for, raise:HTTPException, func:get_jellyseerr_client(request) → JellyseerrClient | None, call:get_settings_store, call:_request_jellyfin_service_id, call:_service_record, call:logger.info, call:str, call:service.get("config", {}).get, call:service.get("secrets", {}).get, call:JellyseerrClient, func:_ssh_client_from_machine_config(machine: dict[str, Any], store) → RemoteSSHClient, call:get_settings_store, call:get_settings, call:str(machine.get("ssh_key_id") or "").strip, call:machine.get, call:store.get_ssh_key, call:ssh_key.get, call:int, call:_ssh_client_for, func:get_ssh_client(request), call:get_settings_store, call:_request_machine_id, call:store.get_machine_config, call:_resolve_machine, call:str(machine.get("mode") or "local").strip().lower, call:machine.get, call:logger.info, call:LocalCommandClient, call:_ssh_client_from_machine_config, call:get_settings, call:_ssh_client_for, raise:HTTPException, func:get_mail_queue() → MailQueue, call:_get_mail_queue, func:get_settings_store() → SettingsStore, call:_get_settings_store, func:get_user_id(request) → str, call:get_settings_store, call:_request_jellyfin_service_id, call:_service_record, call:service.get("config", {}).get, call:str, call:get_jellyfin_client, call:client.users, raise:HTTPException | dep: logging, functools, typing, fastapi, media_library_viewer_api.clients.jellyfin, media_library_viewer_api.clients.jellyseerr, media_library_viewer_api.clients.local, media_library_viewer_api.clients.ssh, media_library_viewer_api.config, media_library_viewer_api.services.mail_queue, media_library_viewer_api.services.settings_store, media_library_viewer_api.services.secrets - jobs.py | Defines template-based remote SSH jobs with shell-safe rendering for a media library viewer API. | exp: class:JobTemplate, method:render(self, values: Mapping[str, str]) → str, call:shlex.quote, call:values.items, call:self.command_template.format, func:run_job(ssh: RemoteSSHClient, job_key: str, path: str, timeout) → CommandResult, call:template.render, call:logger.info, call:ssh.run | dep: logging, shlex, dataclasses, typing, media_library_viewer_api.clients.ssh - logging_utils.py | Configures structured JSON/text logging with secret-safe settings introspection and log field sanitization for a backend application. | exp: func:_json_formatter() → logging.Formatter, call:jsonlogger.JsonFormatter, func:_text_formatter() → logging.Formatter, call:logging.Formatter, func:configure_logging(level_name, log_format) → int, call:(level_name or os.getenv("LOG_LEVEL", "INFO")).upper, call:os.getenv, call:getattr, call:(log_format or os.getenv("LOG_FORMAT", "text")).lower, call:logging.StreamHandler, call:handler.setFormatter, call:_json_formatter, call:_text_formatter, call:logging.basicConfig, call:root.setLevel, call:logging.getLogger("media_library_viewer_api").setLevel, call:logging.getLogger("uvicorn").setLevel, call:logging.getLogger("uvicorn.error").setLevel, call:logging.getLogger("uvicorn.access").setLevel, call:logging.getLogger("paramiko").setLevel, call:logging.getLogger("urllib3").setLevel, func:_sanitize_url(url: str | None) → str, call:urlsplit, call:url.strip, call:url.rstrip, func:describe_settings(settings: object) → dict[str, str], call:str(getattr(settings, "log_level", "INFO") or "INFO").upper, call:getattr, call:str(getattr(settings, "log_format", "text") or "text").lower, call:bool, call:_sanitize_url, func:sanitize_log_extra(extra: dict[str, Any] | None) → dict[str, Any], call:extra.items, call:key.lower, call:any, call:lower_key.endswith | dep: logging, os, typing, urllib.parse, pythonjsonlogger - main.py | FastAPI application entrypoint that configures middleware, registers routers, manages startup/shutdown lifecycle, and exposes health/version/metrics endpoints. | exp: func:lifespan(app: FastAPI), call:get_settings, call:configure_logging, call:validate_auth_settings, call:validate_encryption_key, call:logger.info, call:describe_settings, call:get_settings_store().ensure_defaults, call:logger.exception, call:get_mail_queue, call:get_backup_poller, call:mail_queue.start, call:backup_poller.start, call:backup_poller.stop, call:mail_queue.stop, func:enforce_jwt_auth(request: Request, call_next), call:call_next, call:require_jwt_auth, func:log_requests(request: Request, call_next), call:time.perf_counter, call:get_request_id, call:set_current_request_id, call:sanitize_log_extra, call:logger.info, call:call_next, call:logger.exception, call:record_request, call:round, func:health_check() → dict[str, str], call:logger.debug, func:version_info() → dict[str, str], call:logger.debug, call:get_version_info, func:metrics() → Response, call:metrics_payload, call:FastAPIResponse | dep: logging, time, contextlib, uvicorn, fastapi, fastapi.middleware.cors, fastapi.responses, media_library_viewer_api.auth, media_library_viewer_api.config, media_library_viewer_api.dependencies, media_library_viewer_api.logging_utils, media_library_viewer_api.observability, media_library_viewer_api.routers, media_library_viewer_api.routers.settings, .services.backup_poller, .version, media_library_viewer_api.services.secrets, media_library_viewer_api.services.backup_poller, media_library_viewer_api.version @@ -18,7 +18,7 @@ FastAPI backend providing authenticated API endpoints and remote SSH job executi - utils.py | Provides UI-framework-independent formatting helpers and ffprobe output summarizers for video, audio, and subtitle streams. | exp: func:ticks_to_minutes(ticks: int | None) → int | None, call:round, func:human_size(num: int | float | None) → str, call:float, call:int, func:timestamp_to_local(ts: float | None) → str, call:datetime.fromtimestamp(ts).strftime, func:is_known_video_file(path: str | None) → bool, call:PurePosixPath(path).suffix.lower, func:format_duration(seconds: str | int | float | None) → str, call:float, call:str, call:int, func:format_bitrate(bit_rate: str | int | float | None) → str, call:float, call:str, func:_tags(stream: dict[str, Any]) → dict[str, Any], call:stream.get, func:_disposition(stream: dict[str, Any], key: str) → str, call:(stream.get("disposition") or {}).get, call:stream.get, func:_side_data_types(stream: dict[str, Any]) → str, call:stream.get, call:item.get, call:values.append, call:", ".join, func:ffprobe_format_summary(ffprobe: dict[str, Any]) → dict[str, str], call:ffprobe.get, call:fmt.get, call:format_duration, call:human_size, call:float, call:format_bitrate, call:str, func:summarize_video_streams(ffprobe: dict[str, Any]) → list[dict[str, Any]], call:ffprobe.get, call:stream.get, call:_tags, call:rows.append, call:format_bitrate, call:_side_data_types, call:tags.get, call:_disposition, func:summarize_audio_streams(ffprobe: dict[str, Any]) → list[dict[str, Any]], call:ffprobe.get, call:stream.get, call:_tags, call:rows.append, call:format_bitrate, call:tags.get, call:_disposition, func:summarize_subtitle_streams(ffprobe: dict[str, Any]) → list[dict[str, Any]], call:ffprobe.get, call:stream.get, call:_tags, call:rows.append, call:tags.get, call:_disposition, func:summarize_streams(ffprobe: dict[str, Any]) → list[dict[str, Any]], call:ffprobe.get, call:rows.append, call:format_bitrate, call:stream.get("tags", {}).get | dep: datetime, pathlib, typing - version.py | Provides version retrieval and formatting utilities for a backend service, falling back through environment variables, package metadata, and default values. | exp: func:get_backend_version() → str, call:os.getenv("APP_VERSION", "").strip, call:package_version, func:get_backend_build_info() → str, call:os.getenv("APP_BUILD_INFO", "").strip, call:os.getenv("GIT_COMMIT", "").strip, call:os.getenv("BUILD_COMMIT", "").strip, func:format_version_label(version: str, build_info: str) → str, call:version.strip, call:build_info.strip, func:get_version_info() → dict[str, str], call:get_backend_version, call:get_backend_build_info, call:format_version_label | dep: os, importlib.metadata ## arch -Layered FastAPI architecture using dependency injection (providers/clients), Pydantic settings configuration, OIDC/API-key middleware authentication, and template-based remote SSH execution with structured observability (Prometheus/JSON logging). +Layered FastAPI architecture using dependency injection, pydantic-settings configuration, middleware-based OIDC/JWT/API-key authentication, template-based remote job execution, and Prometheus-based observability. ## tags call:, settings, call:get, request, get, client, call:str, id ## symbols diff --git a/docs/.pi-map.index.md b/docs/.pi-map.index.md index e5f3996..9aab6bc 100644 --- a/docs/.pi-map.index.md +++ b/docs/.pi-map.index.md @@ -2,7 +2,7 @@ dir: docs ## role -Documentation package containing architectural plans, requirements, and operational guides for the "Manage" media library application and its observability stack. +Documentation directory containing architecture, planning, and operational reference materials for the project. ## parent index: ./.pi-map.index.md map: ./.pi-map.md diff --git a/docs/.pi-map.md b/docs/.pi-map.md index b981db9..dd687a6 100644 --- a/docs/.pi-map.md +++ b/docs/.pi-map.md @@ -4,16 +4,16 @@ dir: docs index: docs/.pi-map.index.md ## role -Documentation package containing architectural plans, requirements, and operational guides for the "Manage" media library application and its observability stack. +Documentation directory containing architecture, planning, and operational reference materials for the project. ## files - MIGRATION_PLAN.md | This file documents the architecture, API design, and step-by-step migration plan for transitioning an application from a Streamlit monolith to a FastAPI and React SPA. | dep: FastAPI, React, Vite, TypeScript, pydantic-settings, @tanstack/react-query, ag-grid-react, recharts, tailwindcss -- REQUIREMENTS.md | Living requirements and decision log document for "Manage," a web application for browsing Jellyfin media libraries and inspecting corresponding media files on disk over SSH. | dep: React, TypeScript, shadcn/ui, Tailwind CSS, lucide-react, TanStack Table, Vitest, Jellyfin API, SQLite, Prometheus, Grafana, Alertmanager, OIDC +- REQUIREMENTS.md | This file is a living requirements and decision log detailing the product goals, architecture, and feature specifications for a web application that manages a remote Jellyfin media library and inspects server files over SSH. - monitoring-logging-design.md | Design document detailing a self-hosted observability architecture (metrics, logs, dashboards, alerting) for integration with a platform called Manage. | dep: Prometheus, Grafana, Node Exporter, Grafana Loki, Grafana Alloy, Alertmanager, Authentik, Traefik - observability-runbooks.md | Provides operational runbooks, configuration, and maintenance procedures for deploying and managing a standalone observability stack. | dep: Prometheus, Grafana, Loki, Alloy, Alertmanager, Node Exporter, Docker Compose, Traefik ## arch -Static markdown documentation organized as living specs, design docs, and runbooks without code structure or dependencies. +Flat collection of standalone Markdown documents covering requirements tracking, migration planning, and observability/operational runbooks. ## tags -react, design, observability, migration, plan, requirements, prometheus, grafana +design, react, observability, architecture, migration, plan, requirements, runbooks ## symbols - ## workflows diff --git a/docs/superpowers/.pi-map.index.md b/docs/superpowers/.pi-map.index.md index d052175..b9dd802 100644 --- a/docs/superpowers/.pi-map.index.md +++ b/docs/superpowers/.pi-map.index.md @@ -2,7 +2,7 @@ dir: docs/superpowers ## role -Documentation directory for advanced features, capabilities, or customization guides within the project. +Documentation directory for advanced features, plugins, or capabilities (currently empty). ## parent index: docs/.pi-map.index.md map: docs/.pi-map.md diff --git a/docs/superpowers/.pi-map.md b/docs/superpowers/.pi-map.md index 3add6ea..00be2b7 100644 --- a/docs/superpowers/.pi-map.md +++ b/docs/superpowers/.pi-map.md @@ -4,10 +4,10 @@ dir: docs/superpowers index: docs/superpowers/.pi-map.index.md ## role -Documentation directory for advanced features, capabilities, or customization guides within the project. +Documentation directory for advanced features, plugins, or capabilities (currently empty). ## files ## arch -Flat-file documentation structure (currently empty of content files), serving as a namespace for specialized or extended documentation topics. +Flat file structure intended for Markdown or supplementary documentation resources. ## tags - ## symbols diff --git a/docs/superpowers/specs/.pi-map.index.md b/docs/superpowers/specs/.pi-map.index.md index c95ab43..e5f94ce 100644 --- a/docs/superpowers/specs/.pi-map.index.md +++ b/docs/superpowers/specs/.pi-map.index.md @@ -2,14 +2,13 @@ dir: docs/superpowers/specs ## role -Specification documents defining approved architectural designs for major features of the media library viewer project. +Contains design specification documents for major features and system modules. ## parent index: docs/superpowers/.pi-map.index.md map: docs/superpowers/.pi-map.md ## children - ## files -- 2026-05-08-obsidian-documentation-design.md - 2026-05-11-backup-monitoring-design.md ## links index: docs/superpowers/specs/.pi-map.index.md diff --git a/docs/superpowers/specs/.pi-map.md b/docs/superpowers/specs/.pi-map.md index 74cba2b..9bf9c44 100644 --- a/docs/superpowers/specs/.pi-map.md +++ b/docs/superpowers/specs/.pi-map.md @@ -4,14 +4,13 @@ dir: docs/superpowers/specs index: docs/superpowers/specs/.pi-map.index.md ## role -Specification documents defining approved architectural designs for major features of the media library viewer project. +Contains design specification documents for major features and system modules. ## files -- 2026-05-08-obsidian-documentation-design.md | Defines the approved documentation structure for an Obsidian-based knowledge vault for the Manage media library viewer project, targeting developers, contributors, operators, and deployers. | dep: Obsidian, FastAPI, React, TypeScript, Vite, MUI, D3, AG Grid, Docker, Traefik, Authentik, Paramiko, PyJWT, SQLite - 2026-05-11-backup-monitoring-design.md | Design document for a standalone backup monitoring module with HTTP API ingestion, SQLite storage, automated alerting, and React frontend for a media library viewer application. | dep: FastAPI, React, SQLite, OIDC/JWT, D3, existing MonitoringPoller ## arch -Dated Markdown design documents following a specification pattern, each capturing requirements, architecture decisions, and implementation plans for distinct system components. +Dated markdown files following a specification-driven development pattern, each documenting complete system designs including storage, APIs, alerting, and frontend integration. ## tags -design, obsidian, 2026, 05, documentation, react, sqlite, backup +design, backup, monitoring, sqlite, react, 2026, 05, 11 ## symbols - ## workflows diff --git a/openspec/.pi-map.index.md b/openspec/.pi-map.index.md index 23651a4..a4c65c5 100644 --- a/openspec/.pi-map.index.md +++ b/openspec/.pi-map.index.md @@ -2,7 +2,7 @@ dir: openspec ## role -Defines project-wide coding standards, architecture constraints, and development guidelines for a homelab media dashboard UI migration. +Central configuration and documentation package defining coding standards, architecture context, and development rules for a homelab media dashboard project. ## parent index: ./.pi-map.index.md map: ./.pi-map.md diff --git a/openspec/.pi-map.md b/openspec/.pi-map.md index b902d76..ed4aa5b 100644 --- a/openspec/.pi-map.md +++ b/openspec/.pi-map.md @@ -4,11 +4,11 @@ dir: openspec index: openspec/.pi-map.index.md ## role -Defines project-wide coding standards, architecture constraints, and development guidelines for a homelab media dashboard UI migration. +Central configuration and documentation package defining coding standards, architecture context, and development rules for a homelab media dashboard project. ## files - config.yaml | Configuration file specifying coding standards, architecture context, and development rules for a homelab media dashboard migration from MUI to shadcn/ui + Tailwind CSS | dep: FastAPI, React 18, TypeScript, Vite, TanStack Query, Tailwind CSS v4, shadcn/ui, Radix primitives, lucide-react, react-router-dom, react-oidc-context, TanStack Table, @mui/material, @mui/icons-material, @mui/x-data-grid, @emotion/react, @emotion/styled ## arch -Single-source-of-truth declarative configuration using YAML to enforce rules and conventions for an MUI to shadcn/ui + Tailwind CSS migration. +Single-file declarative configuration pattern using YAML to establish project conventions, migration guidelines (MUI to shadcn/ui + Tailwind CSS), and governance constraints. ## tags react, @mui, context, shadcn, material, @emotion, config, configuration ## symbols diff --git a/openspec/changes/.pi-map.index.md b/openspec/changes/.pi-map.index.md index ab41dd3..a22ac9f 100644 --- a/openspec/changes/.pi-map.index.md +++ b/openspec/changes/.pi-map.index.md @@ -2,7 +2,7 @@ dir: openspec/changes ## role -Contains OpenSpec change records documenting proposed, accepted, and rejected modifications to the project's API specification or design. +Directory for tracking proposed and applied changes to the project's OpenAPI specification. ## parent index: openspec/.pi-map.index.md map: openspec/.pi-map.md @@ -10,9 +10,6 @@ map: openspec/.pi-map.md - openspec/changes/archive index: openspec/changes/archive/.pi-map.index.md map: openspec/changes/archive/.pi-map.md -- openspec/changes/jellyfin-service-registry - index: openspec/changes/jellyfin-service-registry/.pi-map.index.md - map: openspec/changes/jellyfin-service-registry/.pi-map.md ## files ## links index: openspec/changes/.pi-map.index.md diff --git a/openspec/changes/.pi-map.md b/openspec/changes/.pi-map.md index 7c7b11c..ef45ca8 100644 --- a/openspec/changes/.pi-map.md +++ b/openspec/changes/.pi-map.md @@ -4,10 +4,10 @@ dir: openspec/changes index: openspec/changes/.pi-map.index.md ## role -Contains OpenSpec change records documenting proposed, accepted, and rejected modifications to the project's API specification or design. +Directory for tracking proposed and applied changes to the project's OpenAPI specification. ## files ## arch -Artifact-based directory pattern storing individual change proposals as structured files (likely YAML or Markdown) for specification governance and audit trails. +Follows the "changes folder" pattern where each change proposal is stored as a structured markdown file describing modifications, rationale, and migration steps. ## tags - ## symbols diff --git a/openspec/changes/archive/.pi-map.index.md b/openspec/changes/archive/.pi-map.index.md index 2748e2b..4811c0e 100644 --- a/openspec/changes/archive/.pi-map.index.md +++ b/openspec/changes/archive/.pi-map.index.md @@ -2,7 +2,7 @@ dir: openspec/changes/archive ## role -Archive directory for superseded or completed OpenSpec change proposals. +Archive directory for historical change records and specifications that have been completed or superseded. ## parent index: openspec/changes/.pi-map.index.md map: openspec/changes/.pi-map.md @@ -16,6 +16,9 @@ map: openspec/changes/.pi-map.md - openspec/changes/archive/decommission-monitoring-poller index: openspec/changes/archive/decommission-monitoring-poller/.pi-map.index.md map: openspec/changes/archive/decommission-monitoring-poller/.pi-map.md +- openspec/changes/archive/jellyfin-service-registry + index: openspec/changes/archive/jellyfin-service-registry/.pi-map.index.md + map: openspec/changes/archive/jellyfin-service-registry/.pi-map.md - openspec/changes/archive/observability-service-registry index: openspec/changes/archive/observability-service-registry/.pi-map.index.md map: openspec/changes/archive/observability-service-registry/.pi-map.md diff --git a/openspec/changes/archive/.pi-map.md b/openspec/changes/archive/.pi-map.md index 8e79257..3116119 100644 --- a/openspec/changes/archive/.pi-map.md +++ b/openspec/changes/archive/.pi-map.md @@ -4,10 +4,10 @@ dir: openspec/changes/archive index: openspec/changes/archive/.pi-map.index.md ## role -Archive directory for superseded or completed OpenSpec change proposals. +Archive directory for historical change records and specifications that have been completed or superseded. ## files ## arch -Flat directory pattern serving as a historical repository of YAML or Markdown change specification files. +Simple file-based archive pattern storing obsolete or completed change documents without active processing logic. ## tags - ## symbols diff --git a/openspec/changes/archive/jellyfin-service-registry/.pi-map.index.md b/openspec/changes/archive/jellyfin-service-registry/.pi-map.index.md index b20120b..819c456 100644 --- a/openspec/changes/archive/jellyfin-service-registry/.pi-map.index.md +++ b/openspec/changes/archive/jellyfin-service-registry/.pi-map.index.md @@ -1,11 +1,11 @@ -# openspec/changes/jellyfin-service-registry (index) -dir: openspec/changes/jellyfin-service-registry +# openspec/changes/archive/jellyfin-service-registry (index) +dir: openspec/changes/archive/jellyfin-service-registry ## role -Documentation and planning package for migrating Jellyfin service configuration from machine-level settings to a service-registry model. +Archived change specification for migrating Jellyfin configuration from machine-level settings to a service-registry model. ## parent -index: openspec/changes/.pi-map.index.md -map: openspec/changes/.pi-map.md +index: openspec/changes/archive/.pi-map.index.md +map: openspec/changes/archive/.pi-map.md ## children - ## files @@ -13,8 +13,8 @@ map: openspec/changes/.pi-map.md - proposal.md - tasks.md ## links -index: openspec/changes/jellyfin-service-registry/.pi-map.index.md -map: openspec/changes/jellyfin-service-registry/.pi-map.md +index: openspec/changes/archive/jellyfin-service-registry/.pi-map.index.md +map: openspec/changes/archive/jellyfin-service-registry/.pi-map.md ## workflows - ## dirty diff --git a/openspec/changes/archive/jellyfin-service-registry/.pi-map.md b/openspec/changes/archive/jellyfin-service-registry/.pi-map.md index 0aef1c5..281a7ee 100644 --- a/openspec/changes/archive/jellyfin-service-registry/.pi-map.md +++ b/openspec/changes/archive/jellyfin-service-registry/.pi-map.md @@ -1,16 +1,16 @@ -# openspec/changes/jellyfin-service-registry -dir: openspec/changes/jellyfin-service-registry +# openspec/changes/archive/jellyfin-service-registry +dir: openspec/changes/archive/jellyfin-service-registry -index: openspec/changes/jellyfin-service-registry/.pi-map.index.md +index: openspec/changes/archive/jellyfin-service-registry/.pi-map.index.md ## role -Documentation and planning package for migrating Jellyfin service configuration from machine-level settings to a service-registry model. +Archived change specification for migrating Jellyfin configuration from machine-level settings to a service-registry model. ## files - design.md | Design document for completing the migration of Jellyfin service configuration from machine-level settings to service-registry instances, involving removal of legacy media_root and path_prefix fields across backend, frontend, and docs. | dep: integrations/jellyfin.py, integrations/jellyseerr.py, dependencies.py, settings_store.py, path_utils.py, routers/files.py, types/index.ts, Settings.tsx, docs/REQUIREMENTS.md, CHANGELOG.md - proposal.md | Proposes completing a migration of Jellyfin configuration from machine-level settings to a service registry, removing dead fields and legacy UI elements. - tasks.md | Defines a task checklist for completing the migration of Jellyfin from machine-level configuration to a service registry, including backend/frontend cleanup and documentation updates. | dep: backend/src/media_library_viewer_api/services/settings_store.py, backend/src/media_library_viewer_api/path_utils.py, backend/tests, frontend/src/types/index.ts, frontend/src/pages/Settings.tsx, frontend/src/pages/__tests__/Settings.test.tsx, docs/REQUIREMENTS.md, CHANGELOG.md ## arch -OpenSpec change-proposal structure consisting of three coordinated documents (design, proposal, tasks) that define the rationale, technical approach, and implementation checklist for a cross-stack refactoring effort. +OpenSpec change-document pattern consisting of three coordinated documents: proposal (rationale), design (technical approach), and tasks (implementation checklist). ## tags py, settings, backend, frontend, src, jellyfin, service, md ## symbols