{"id":44212655,"url":"https://github.com/sneakyselderey/datastream","last_synced_at":"2026-04-18T23:01:01.913Z","repository":{"id":323231561,"uuid":"1092538829","full_name":"SneakySelderey/Datastream","owner":"SneakySelderey","description":"Datastream is a self-hosted web-app for playing your music","archived":false,"fork":false,"pushed_at":"2026-02-09T22:58:26.000Z","size":46821,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-10T03:17:40.461Z","etag":null,"topics":["docker","music","nestjs","player","react","self-hosted","typescript","websocket"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/SneakySelderey.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-08T20:14:18.000Z","updated_at":"2026-02-09T22:52:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"c05e6be6-dc5d-4155-b973-38d0fb5e4a4f","html_url":"https://github.com/SneakySelderey/Datastream","commit_stats":null,"previous_names":["sneakyselderey/datastream"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/SneakySelderey/Datastream","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SneakySelderey%2FDatastream","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SneakySelderey%2FDatastream/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SneakySelderey%2FDatastream/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SneakySelderey%2FDatastream/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SneakySelderey","download_url":"https://codeload.github.com/SneakySelderey/Datastream/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SneakySelderey%2FDatastream/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31987884,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"ssl_error","status_checked_at":"2026-04-18T20:23:29.375Z","response_time":103,"last_error":"SSL_read: 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":["docker","music","nestjs","player","react","self-hosted","typescript","websocket"],"created_at":"2026-02-10T01:00:45.503Z","updated_at":"2026-04-18T23:01:01.901Z","avatar_url":"https://github.com/SneakySelderey.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Overview\n\n![Albums screenshot](docs/images/albums-page.png)\n\nMain features:\n\n- Automatic music library scanning from a mounted host folder\n- Browse and filter tracks, albums, and artists\n- Playlist management (create, update, and organize tracks)\n- JWT-based authentication with cookie support\n- HTTP audio streaming endpoints\n- Realtime scanner updates over WebSocket\n- Persistent SQLite database storage via Docker volume\n- One-command deployment with Docker Compose\n\n![Album screenshot](docs/images/album-page.png)\n\nThis project runs with two containers:\n\n- `server` (NestJS API + scanner + WebSocket)\n- `client` (built Vite frontend served by Nginx, with reverse proxy to backend for `/api` and `/stream`)\n\n## Installation\n\nCreate root `.env`:\n\n```bash\nJWT_SECRET=SUPER_SECRET_KEY\nCLIENT_PORT=8080\nMUSIC_HOST_PATH=./apps/server/temp-music-dir\nCOOKIE_SECURE=false\n```\n\nUse this `docker-compose.yml`:\n\n```yaml\nservices:\n  server:\n    image:\n      sneakyselderey/datastream-server:latest\n    environment:\n      JWT_SECRET: ${JWT_SECRET:-SUPER_SECRET_KEY}\n      COOKIE_SECURE: ${COOKIE_SECURE:-false}\n    volumes:\n      - datastream_db:/data\n      - ${MUSIC_HOST_PATH:-./apps/server/temp-music-dir}:/music:ro\n    restart: unless-stopped\n    networks:\n      - datastream\n\n  client:\n    image:\n      sneakyselderey/datastream-client:latest\n    depends_on:\n      - server\n    ports:\n      - \"${CLIENT_PORT:-8080}:80\"\n    restart: unless-stopped\n    networks:\n      - datastream\n\nnetworks:\n  datastream:\n    driver: bridge\n\nvolumes:\n  datastream_db:\n```\n\n## Run\n\n```bash\ndocker compose up -d\n```\n\nOpen:\n\n- `http://localhost:8080`\n\n## Routing\n\n- Browser calls `client` on port `8080`.\n- `client` Nginx proxies:\n  - `/api/*` -\u003e backend (`server:3000`) with `/api` prefix stripped\n  - `/stream/*` -\u003e backend (`server:3000`)\n- other paths are served as SPA routes by frontend.\n\nWebSocket path used by frontend:\n\n- `/api/socket.io` -\u003e backend Socket.IO endpoint `/socket.io` (via Nginx proxy)\n\n## Notes\n\n- SQLite DB is persisted in the named volume `datastream_db`.\n- Music library host path is configurable via `MUSIC_HOST_PATH` and is always mounted to fixed container path `/music`.\n- Cover cache path is configurable via `COVERS_CACHE_PATH` (default: `/data/covers`).\n- If you need HTTPS/HTTP/3, place an external reverse proxy in front later (Nginx/Caddy/Traefik/CDN).\n- `apps/server/.env` is for non-Docker local backend runs only (`npm run start:dev` in `apps/server`).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsneakyselderey%2Fdatastream","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsneakyselderey%2Fdatastream","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsneakyselderey%2Fdatastream/lists"}