{"adoption": {"forks": 447, "observed_at": "2026-08-28T04:07:05.034938+00:00", "stars": 2621}, "canonical_url": "https://ross.abutalabs.com/products/iotsound", "card": {"archived": false, "artifact_type": "application", "description": "Build a single or multi-room streamer for an existing audio device using a Raspberry Pi! Supports Bluetooth, Airplay and Spotify Connect", "domain": ["media", "iot", "self-hosted", "hardware"], "enriched": true, "function": ["audio-processing", "streaming", "self-hosted", "plugin-system"], "health_score": 55, "homepage": "https://iotsound.github.io/iotsound/", "language": "TypeScript", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["iotsound/iotsound"], "name": "iotsound/iotsound", "platform": ["self-hosted", "embedded"], "pushed_at": "2025-08-13T19:53:03+00:00", "repo": "iotsound/iotsound", "stars": 2621, "tags": ["raspberry-pi", "multi-room-audio", "airplay", "spotify-connect", "bluetooth-audio", "balena", "snapcast", "diy-audio", "audio", "linux", "docker"], "topics": ["balena", "balenacloud", "raspberry-pi", "raspberrypi", "bluetooth-audio", "bluetooth", "airplay", "spotify-connect", "audio", "bluetooth-devices", "multi-room", "snapcast"], "urls": [], "use_cases": ["turn old speakers into an airplay receiver", "build a multi-room audio system with raspberry pi", "add spotify connect to a hifi", "stream bluetooth audio to dumb speakers", "synchronized audio playback across rooms", "diy alternative to sonos", "set up a raspberry pi music streamer"], "what_it_is": "IoTSound (formerly balenaSound) is a deployable application that turns a Raspberry Pi into an audio streamer for existing speakers, supporting Bluetooth, AirPlay 2, Spotify Connect, and UPnP with synchronized multi-room playback. It is deployed via balenaCloud and supports multiple DACs for improved audio quality.", "when_to_avoid": ["you need a guaranteed long-term maintained project - maintainers are being sought and alternatives are recommended", "you want a polished audiophile player with local library management (consider moOde, Volumio, or piCorePlayer)", "you don't have a Raspberry Pi or balena-compatible setup"], "when_to_choose": ["you want a one-click deployable multi-room audio streamer on Raspberry Pi", "you need Bluetooth, AirPlay 2, and Spotify Connect in one device", "you already use balenaCloud for device management", "you want to revive old speakers with open-source software"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/iotsound", "repo": "iotsound/iotsound", "role": "main", "score": 46}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "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:07:05.034938+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:05.034938+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T02:20:05.703440+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e25d3c8509421d61048d7a2d279b28ca4a263691fa71b9a9c159f466fc290321", "fetched_at": "2026-08-28T04:07:05.034938+00:00", "kind": "readme", "missing": false, "url": "https://github.com/iotsound/iotsound"}, {"content_hash": "01749b6235bf98597f0fba48ff56356a8caad2b2f093954f4cba904f4080398b", "fetched_at": "2026-08-29T10:03:22.442284+00:00", "kind": "homepage", "missing": false, "url": "https://iotsound.github.io/iotsound/"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 36, "longevity": 100, "rhythm": 28}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 2686, "days_push": 385, "days_rel": 426, "gap_med": 44, "n_releases_24m": 2}, "score": 46, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}