{"adoption": {"forks": 111, "observed_at": "2026-08-28T04:04:13.354340+00:00", "stars": 1278}, "canonical_url": "https://ross.abutalabs.com/products/subwave", "card": {"archived": false, "artifact_type": "application", "description": "Personal internet radio: Agentic AI DJ", "domain": ["artificial-intelligence", "large-language-models", "media", "self-hosted", "web-development"], "enriched": true, "function": ["audio-processing", "tts", "llm-inference", "agent-framework", "chatbot", "http-server", "self-hosted"], "health_score": 100, "homepage": "https://www.getsubwave.com", "language": "TypeScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["perminder-klair/subwave"], "name": "perminder-klair/subwave", "platform": ["self-hosted", "cross-platform", "windows"], "pushed_at": "2026-08-26T14:25:25+00:00", "repo": "perminder-klair/subwave", "stars": 1278, "tags": ["internet-radio", "icecast", "ai-dj", "music-streaming", "broadcast", "voice-personas", "pwa", "radio-station", "audio", "web-server", "docker", "ios", "android", "macos", "linux", "nodejs"], "topics": [], "urls": [], "use_cases": ["run a personal internet radio station with an AI DJ", "broadcast one shared music stream to friends or family", "have an AI host announce tracks, weather, and time checks between songs", "request songs in plain language on a live radio stream", "self-host a radio station using my own music library", "listen to a synced radio broadcast on web, mobile, desktop, or VLC"], "what_it_is": "SUB/WAVE is a self-hostable personal internet radio station that broadcasts a single shared Icecast stream to all listeners simultaneously. An agentic AI DJ with cloned-voice personas picks tracks from your music library and speaks between songs - station idents, time checks, weather, and intros - and accepts plain-language music requests.", "when_to_avoid": ["you want personalized per-listener playlists, shuffle, or skip buttons", "you need a simple static music playlist server without AI hosting", "you don't want to run LLM and TTS workloads or pay for their API usage", "you need licensed commercial streaming rather than your own library"], "when_to_choose": ["you want a real radio experience - one shared broadcast, no per-listener shuffle or skips", "you want an LLM-driven DJ with voice personas hosting your station", "you want to broadcast from your own music library with web, iOS, Android, and desktop players", "you want Icecast compatibility so any player or hardware radio can tune in"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/subwave", "repo": "perminder-klair/subwave", "role": "main", "score": 77}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.354340+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T05:02:46.772658+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "5f7bef8bfeb7a423fe08c2580ebb30b47d80a8fdcbf391021694f50b9f62d358", "fetched_at": "2026-08-28T04:04:13.354340+00:00", "kind": "readme", "missing": false, "url": "https://github.com/perminder-klair/subwave"}, {"content_hash": "b45e952f235ec10d6db5b95714beb266b307f4021b7e314d56c641a6926a35cf", "fetched_at": "2026-08-29T12:13:46.037133+00:00", "kind": "homepage", "missing": false, "url": "https://www.getsubwave.com"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 8, "rhythm": 87}, "computed_at": "2026-09-03T02:39:23.370411+00:00", "flags": ["young"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 114, "days_push": 7, "days_rel": 7, "gap_med": 0.0, "n_releases_24m": 95}, "score": 77, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}