chore(project-map): refresh .pi-map role/arch summaries

Regenerate project map artifacts across backend, docs, openspec, and
root to refresh role descriptions and architectural notes after recent
service-registry and observability changes.

Co-authored-by: el Gentleman <gentleman@pi.local>
This commit is contained in:
Developer
2026-06-26 09:10:19 +00:00
parent 7d252489de
commit 648320abfd
22 changed files with 55 additions and 57 deletions
+1 -1
View File
@@ -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
+7 -7
View File
@@ -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
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
@@ -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
@@ -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
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+1 -2
View File
@@ -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
+3 -4
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+1 -4
View File
@@ -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
+2 -2
View File
@@ -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
+4 -1
View File
@@ -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
+2 -2
View File
@@ -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
@@ -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
@@ -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