{"id":33319253,"url":"https://github.com/mondominator/opsdec","last_synced_at":"2026-04-13T14:33:04.591Z","repository":{"id":324933237,"uuid":"1099119231","full_name":"mondominator/opsdec","owner":"mondominator","description":"A modern, self-hosted media server monitoring platform for Plex, Emby, Audiobookshelf, and Sappho. Real-time statistics, user tracking, and beautiful dark-themed UI.","archived":false,"fork":false,"pushed_at":"2025-11-18T17:29:58.000Z","size":1730,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-18T18:12:19.936Z","etag":null,"topics":["analytics","audiobookshelf","dashboard","docker","emby","express","homelab","media-server","media-tracking","monitoring","nodejs","plex","react","real-time","self-hosted","sqlite","statistics","tailwindcss","tautulli-alternative","websocket"],"latest_commit_sha":null,"homepage":"https://github.com/mondominator/opsdec","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mondominator.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-11-18T15:36:12.000Z","updated_at":"2025-11-18T17:30:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mondominator/opsdec","commit_stats":null,"previous_names":["mondominator/opsdec"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mondominator/opsdec","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondominator%2Fopsdec","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondominator%2Fopsdec/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondominator%2Fopsdec/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondominator%2Fopsdec/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mondominator","download_url":"https://codeload.github.com/mondominator/opsdec/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mondominator%2Fopsdec/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":285319005,"owners_count":27151474,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-19T02:00:05.673Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["analytics","audiobookshelf","dashboard","docker","emby","express","homelab","media-server","media-tracking","monitoring","nodejs","plex","react","real-time","self-hosted","sqlite","statistics","tailwindcss","tautulli-alternative","websocket"],"created_at":"2025-11-19T20:00:29.001Z","updated_at":"2026-04-13T14:33:04.576Z","avatar_url":"https://github.com/mondominator.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpsDec\n\n\u003e [!WARNING]\n\u003e **Early Development** - Functional but expect rough edges. Feedback and contributions welcome.\n\nSelf-hosted media server monitoring platform. Tracks activity from Plex, Emby, Jellyfin, Audiobookshelf, and Sappho with real-time session tracking, watch history, and per-user analytics. Integrates with Overseerr/Jellyseerr for request management.\n\n![OpsDec](https://img.shields.io/badge/version-0.1.0-blue)\n![License](https://img.shields.io/badge/license-MIT-green)\n[![Docker Image](https://ghcr-badge.egpl.dev/mondominator/opsdec/latest_tag?trim=major\u0026label=latest)](https://github.com/mondominator/opsdec/pkgs/container/opsdec)\n\n## Quick Start\n\n### Docker Compose\n\n```yaml\nservices:\n  opsdec:\n    image: ghcr.io/mondominator/opsdec:latest\n    ports:\n      - \"3001:3001\"\n    volumes:\n      - ./data:/app/backend/data\n    environment:\n      # Add the servers you use (all optional — can also configure via UI)\n      - PLEX_URL=http://plex:32400\n      - PLEX_TOKEN=your_token\n      - EMBY_URL=http://emby:8096\n      - EMBY_API_KEY=your_key\n      - JELLYFIN_URL=http://jellyfin:8096\n      - JELLYFIN_API_KEY=your_key\n      - AUDIOBOOKSHELF_URL=http://abs:13378\n      - AUDIOBOOKSHELF_TOKEN=your_token\n      - SAPPHO_URL=http://sappho:3000\n      - SAPPHO_API_KEY=your_key\n```\n\n```bash\ndocker-compose up -d\n```\n\nAccess at `http://localhost:3001`. First visit prompts account creation.\n\n### Unraid\n\nInstall via Community Applications (search \"OpsDec\") or manually add the [template XML](https://raw.githubusercontent.com/mondominator/opsdec/main/opsdec-unraid-template.xml).\n\n### Manual\n\nRequires Node.js \u003e= 18.\n\n```bash\ngit clone https://github.com/mondominator/opsdec.git\ncd opsdec \u0026\u0026 npm install\ncp backend/.env.example backend/.env  # edit with your server details\nnpm run dev\n```\n\n## Supported Servers\n\n| Server | Monitoring | Notes |\n|--------|-----------|-------|\n| **Plex** | Sessions, history | WebSocket + polling |\n| **Emby** | Sessions, history | WebSocket + polling |\n| **Jellyfin** | Sessions, history | WebSocket + polling |\n| **Audiobookshelf** | Sessions, history | Polling + history import |\n| **Sappho** | Sessions, history | WebSocket-based |\n| **Overseerr / Jellyseerr** | Recently added, health | Periodic polling |\n\n## Notifications\n\nTelegram notifications for:\n- Playback start/complete\n- Recently added media (batched with posters)\n- Server up/down alerts\n- New user detection\n\nConfigure in Settings \u003e Notifications.\n\n## Server Configuration\n\n**Environment variables** — Set `*_URL` and `*_TOKEN`/`*_API_KEY` pairs. Appear read-only in Settings.\n\n**Settings UI** — Add, edit, and remove servers from the web interface.\n\n### API Keys\n\n| Server | Where to find it |\n|--------|-----------------|\n| **Plex** | Plex Web \u003e media item \u003e ... \u003e Get Info \u003e View XML \u003e `X-Plex-Token` in URL |\n| **Emby** | Settings \u003e Advanced \u003e API Keys \u003e New API Key |\n| **Jellyfin** | Dashboard \u003e Advanced \u003e API Keys |\n| **Audiobookshelf** | Profile \u003e Settings \u003e Account \u003e Generate New API Token |\n| **Sappho** | Settings \u003e API Keys \u003e Create New API Key |\n| **Overseerr** | Settings \u003e General \u003e API Key |\n\n## Image Tags\n\n| Tag | Description |\n|-----|-------------|\n| `latest` | Latest main branch build |\n| `YYYYMMDD` | Date-pinned (e.g., `20251118`) |\n| `main-abc1234` | Commit SHA |\n| `x.y.z` | Semantic version (when tagged) |\n\n## Development\n\n```bash\nnpm run dev       # Backend (3001) + frontend (3000) with hot reload\nnpm run build     # Production build\nnpm test          # Run all tests\n```\n\n**Stack:** Node.js/Express, React 18/Vite/TailwindCSS, SQLite, WebSocket\n\n## Contributing\n\nPull requests welcome. Please open an issue first for significant changes.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmondominator%2Fopsdec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmondominator%2Fopsdec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmondominator%2Fopsdec/lists"}