{"id":45550516,"url":"https://github.com/strobe-audio/strobe-hub","last_synced_at":"2026-02-23T05:11:24.622Z","repository":{"id":51318494,"uuid":"81966335","full_name":"strobe-audio/strobe-hub","owner":"strobe-audio","description":"The server for the strobe audio system","archived":false,"fork":false,"pushed_at":"2022-12-06T15:22:07.000Z","size":14088,"stargazers_count":141,"open_issues_count":9,"forks_count":10,"subscribers_count":15,"default_branch":"master","last_synced_at":"2023-10-26T09:54:13.155Z","etag":null,"topics":["audio","elixir","elm","multi-room-audio"],"latest_commit_sha":null,"homepage":"http://strobe.audio","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/strobe-audio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-02-14T16:38:43.000Z","updated_at":"2023-10-23T14:15:28.000Z","dependencies_parsed_at":"2023-01-24T02:16:43.854Z","dependency_job_id":null,"html_url":"https://github.com/strobe-audio/strobe-hub","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/strobe-audio/strobe-hub","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strobe-audio%2Fstrobe-hub","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strobe-audio%2Fstrobe-hub/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strobe-audio%2Fstrobe-hub/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strobe-audio%2Fstrobe-hub/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/strobe-audio","download_url":"https://codeload.github.com/strobe-audio/strobe-hub/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/strobe-audio%2Fstrobe-hub/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29738083,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T04:51:08.365Z","status":"ssl_error","status_checked_at":"2026-02-23T04:49:15.865Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["audio","elixir","elm","multi-room-audio"],"created_at":"2026-02-23T05:11:23.794Z","updated_at":"2026-02-23T05:11:24.615Z","avatar_url":"https://github.com/strobe-audio.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Strobe Audio\n\nhttp://strobe.audio\n\n## Strobe Hub\n\nThis is the umbrella project for the code that comprises the Strobe Audio hub.\n\nStrobe is a multi-room audio system built from scratch in Elixir by\n[@magnetised](https://github.com/magnetised\").\n\n## Overview\n\nStrobe is comprised of this 'hub' or 'broadcaster' (or 'server'). This acts as\nboth a store of music and also the means for playing it.\n\nConnecting to the hub are some number of 'receivers'. These are Raspberry Pis\nwith IQaudIO DACs connected to some kind of hi-fi amplifier and speakers.\n\nIn order to play your music Strobe is currently* modelled around the following\ncore concepts:\n\n- Music is stored in a set of 'libraries'.\n\n  There are currently only two libraries: a disk-based 'your music' library\n  (think iTunes) and a set of live BBC radio streams. This should change with\n  time.\n\n- Tracks are added from libraries to named 'channels'.\n\n- Receivers are attached to channels.\n\n\n```\n┌────────────────────────────────────────────────────────────────────────────┐\n│                                 Strobe Hub                                 │\n│                                                                            │\n│ ┌─────────────────────────────────┐ ┌─────────────────────────────────┐    │\n│ │                                 │ │                                 │    │\n│ │                                 │ │                                 │    │\n│ │             Library             │ │             Library             │    │\n│ │                                 │ │                                 │    │\n│ │                                 │ │                                 │    │\n│ └─────────────────────────────────┘ └─────────────────────────────────┘    │\n│ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐    │\n│ │                     │ │                     │ │                     │    │\n│ │                     │ │                     │ │                     │    │\n│ │       Channel       │ │       Channel       │ │       Channel       │    │\n│ │                     │ │                     │ │                     │    │\n│ │                     │ │                     │ │                     │    │\n│ └─────────────────────┘ └─────────────────────┘ └─────────────────────┘    │\n│            ▲                       ▲                                       │\n│            │                       │                                       │\n└────────────┼───────────────────────┼───────────────────────────────────────┘\n             │                       │\n             │                       │\n             │                       │\n         ┌───┘               ┌───────┴───────────┬───────────────────┐\n         │                   │                   │                   │\n         │                   │                   │                   │\n         │                   │                   │                   │\n         │                   │                   │                   │\n         │                   │                   │                   │\n         │                   │                   │                   │\n┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐\n│                 │ │                 │ │                 │ │                 │\n│                 │ │                 │ │                 │ │                 │\n│    Reciever     │ │    Reciever     │ │    Reciever     │ │    Reciever     │\n│                 │ │                 │ │                 │ │                 │\n│                 │ │                 │ │                 │ │                 │\n└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘\n```\n\nChannels are the core of the strobe system. Strobe is capable of playing\nmultiple channels at the same time (hence the name). For instance you may want\nto listen to your music downstairs so you add your songs to a channel named\n\"Jane's Music\" and attach the \"Kitchen\" and \"Living room\" receivers, however\nyour partner may want to listen to the radio upstairs, so they use the existing\n\"Radio 6\" channel and attach the \"Bedroom\" and \"Bathroom\" receivers to it.\n\nLater if your partner goes out and you want to listen to your music throughout\nthe house you can reattach the \"Bedroom\" and \"Bathroom\" receivers to your music\nchannel.\n\nPart of the purpose of channels is to persist before and after they are in\nactive use and also provide convenient shortcuts for often used live streams.\nFor example if you suddenly remember that album you want to listen to at the\nweekend, then you can add the album you want to some channel and then, when the\nweekend comes, the music you wanted is there waiting for you.\n\n\\* 'Currently' because this mode of interaction is still in proof of concept\nphase. Though powerful and not overly complex, I'm still deciding if there\nisn't something simpler lurking. The only way to decide this is to gather more\nexperience of using the system from both myself and others.\n\n## Status\n\nStrobe is still in relatively early stages. Although the back-end functions are\nfairly solid (music playback is fully functional and extremely reliable) the\nuser-facing side of things is still in their infancy. This extends from the\ninstallation experience to the UI.\n\nNote that ongoing development is also a form of extreme 'mobile first'. To the\nextent that the current UI doesn't work well in desktop browsers. This is just\na temporary glitch while I work out the last details of the library\ninteraction.\n\n## Roadmap\n\nThis is a very high-level overview of the project aims over the short- to\nmid-term:\n\n- Complete basic interaction design (including wifi settings and music library\n  configuration)\n- Skin UI with reasonable \u0026 consistent visual design\n- Package hub for embedded deployment using Nerves\n- Manage music library through e.g. webdav\n- Expand library access:\n  -  DNLA renderer (to enable playback of audio files from a NAS)\n  -  add Shairport receiver (so a single channel can be setup to play music\n     from iOS/macOS device)\n  - Add more radio options\n  - Google Music (using [gmusicapi](https://github.com/simon-weber/gmusicapi))\n\nThe longer term aim is to provide some, potentially paid, form of over-the-air\nupdates for both hub and receiver.\n\n## Contribute\n\nIf you'd like to contribute then please, be my guest.\n\nI'm particularly keen on finding a front-end designer to help me transform a\nfunctional but very rough user interface into something beautiful.\n\n## Installation\n\nGenerating pre-built images is a WIP.\n\nStrobe requires the following dependencies to run.\n\n### Prerequisites\n\n#### Mac\n\nAn up-to-date homebrew installation is the easiest/recommended route to install\nthe required dependencies.\n\nhttps://brew.sh/\n\nbe sure to `brew update` before installation to get the latest versions.\n\n### Erlang 19\n\n#### Mac\n\n    brew install erlang\n\n### Elixir 1.4\n\nInstall the latest Elixir using the [installation instructions on the Elixir\nwebsite](http://elixir-lang.org/install.html).\n\n\n### Elm 0.18\n\n\nFollow the [instructions for your\nplatform](https://guide.elm-lang.org/install.html) at the [elm-lang\nwebsite](http://elm-lang.org/).\n\nThis should give you the `elm-package` command.\n\n    cd apps/elvis\n    elm-package install\n\n### Yarn\n\nThe UI is compiled using Webpack. To install this and its dependencies use\n[Yarn](https://yarnpkg.com/en/docs/install).\n\n    cd apps/elvis\n    yarn install\n\n\n### SQLite 3\n\nStrobe is backed by a SQLite database and you'll need the development libraries\nto compile the bindings.\n\n#### Mac\n\nmacOS comes with SQLite 3 pre-installed.\n\n### ffmpeg\n\nStrobe uses `ffmpeg` to transcode all audio into 16-bit 44,100 kHz PCM streams:\n\n#### Mac\n\n    brew install ffmpeg\n\n### Mediainfo\n\nCurrently during music library import Strobe uses the `mediainfo` binary to\nextract music metadata.\n\n#### Mac\n\n    brew install mediainfo\n\n### Bonjour/mDNS\n\nRecievers use various techniques to discover the active hub. One of those\ntechniques is to register a service using mDNS backed by Bonjour on macOS and\nAvahi on linux.\n\n#### Mac\n\nNo installation necessary -- macOS comes preinstalled with an mDNS framework.\n\n#### Ubuntu\n\n    apt-get install avahi-daemon libavahi-compat-libdnssd-dev\n\n### Bootstrapping\n\n#### Dependencies\n\nYou need to retrieve the Elixir dependencies:\n\n    mix deps.get\n\n#### Databases\n\nStrobe maintains two databases: the hub state and your music library.\n\nBoth of these databases require initialization.\n\n\nFrom the root of the project directory run\n\n    mix ecto.create -r Otis.State.Repo\n    mix ecto.migrate -r Otis.State.Repo\n\n    mix ecto.create -r Peel.Repo\n    mix ecto.migrate -r Peel.Repo\n\n\n### Importing your music\n\nThere is currently no UI for adding music to your library. To do this we must\nrun a command from the terminal which tells [Peel][] to recursively scan a\nparticular directory for music files and import them into your library.\n\n    mix run --eval 'Peel.scan([\"/path/to/music...\"])'\n\nThis may take some time.\n\nThe import will also attempt to provide cover art for any tracks that are\nmissing it. This uses the [musicbrainz cover art API][] which is rate-limited\nto 1 request per second. You can safely `ctrl-c ctrl-c` out of this part though\nas the update will proceed in the background next time (and any time) you start\nthe server.\n\n[Peel]: (https://github.com/strobe-audio/strobe-hub/tree/master/apps/peel)\n[musicbrainz cover art API]: (https://wiki.musicbrainz.org/Cover_Art_Archive/API)\n\n## Running\n\nFrom the root of the project directory run\n\n    mix phoenix.server\n\nall being well this should launch a HTML ui on\n[http://localhost:4000](http://localhost:4000)\n\n\n## License\n\nStobe Audio Hub\nCopyright (C) 2017 Garry Hill\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see \u003chttp://www.gnu.org/licenses/\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrobe-audio%2Fstrobe-hub","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstrobe-audio%2Fstrobe-hub","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstrobe-audio%2Fstrobe-hub/lists"}