{"id":15593324,"url":"https://github.com/derhuerst/friendly-audio-streaming-protocol","last_synced_at":"2025-10-12T23:18:01.456Z","repository":{"id":66219473,"uuid":"128629982","full_name":"derhuerst/friendly-audio-streaming-protocol","owner":"derhuerst","description":"A simple and open protocol for streaming audio in local networks.","archived":false,"fork":false,"pushed_at":"2019-11-16T22:06:03.000Z","size":18,"stargazers_count":9,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-19T17:14:52.278Z","etag":null,"topics":["audio","fasp","streaming"],"latest_commit_sha":null,"homepage":"https://github.com/derhuerst/friendly-audio-streaming-protocol#friendly-audio-streaming-protocol-fasp","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc-by-sa-4.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/derhuerst.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","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},"funding":{"liberapay":"derhuerst","patreon":"derhuerst","github":"derhuerst"}},"created_at":"2018-04-08T10:33:33.000Z","updated_at":"2023-06-04T06:11:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"80ba04bf-3b55-492f-a39c-379fdea307cb","html_url":"https://github.com/derhuerst/friendly-audio-streaming-protocol","commit_stats":{"total_commits":9,"total_committers":1,"mean_commits":9.0,"dds":0.0,"last_synced_commit":"19326b406ba1604453014bd63f3a9c092e43da37"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/derhuerst/friendly-audio-streaming-protocol","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derhuerst%2Ffriendly-audio-streaming-protocol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derhuerst%2Ffriendly-audio-streaming-protocol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derhuerst%2Ffriendly-audio-streaming-protocol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derhuerst%2Ffriendly-audio-streaming-protocol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/derhuerst","download_url":"https://codeload.github.com/derhuerst/friendly-audio-streaming-protocol/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/derhuerst%2Ffriendly-audio-streaming-protocol/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279013463,"owners_count":26085274,"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-10-12T02:00:06.719Z","response_time":53,"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":["audio","fasp","streaming"],"created_at":"2024-10-03T00:08:26.197Z","updated_at":"2025-10-12T23:18:01.411Z","avatar_url":"https://github.com/derhuerst.png","language":null,"funding_links":["https://liberapay.com/derhuerst","https://patreon.com/derhuerst","https://github.com/sponsors/derhuerst"],"categories":[],"sub_categories":[],"readme":"# Friendly Audio Streaming Protocol (FASP)\n\nA simple and open **protocol for streaming audio in local networks**.\n\nSort of like [*AirPlay*](https://nto.github.io/AirPlay.html#introduction) and *DLNA*, but\n\n- code \u0026 spec are openly available\n- no [DRM](https://en.wikipedia.org/wiki/Digital_rights_management)\n- un-overengineered: ~~XML~~ JSON, ~~[reverse HTTP](https://tools.ietf.org/id/draft-lentczner-rhttp-00.txt)~~ [WebSockets](https://en.wikipedia.org/wiki/WebSocket)\n- flexible: any client can control playback \u0026 play new media\n\n**If you want to try it out, head over to [Getting started](getting-started.md).**\n\n![CC-licensed](https://img.shields.io/github/license/public-transport/friendly-public-transport-format.svg)\n[![chat on gitter](https://badges.gitter.im/public-transport/Lobby.svg)](https://gitter.im/public-transport/Lobby)\n\n## How it works\n\nA FASP *receiver* is a WebSocket server. Any number of *clients* can connect to it and send the following commands, encoded as JSON:\n\n- `[\"play\", \"http://example.org/some-url\"]`\n- `[\"queue\", \"http://example.org/some-url\"]`\n- `[\"next\"]`\n- `[\"previous\"]`\n- `[\"remove\", 2]`\n- `[\"stop\"]`\n- `[\"resume\"]`\n- `[\"pause\"]`\n- `[\"seek\", 123, false, false]` (relative, in seconds)\n- `[\"seek\", 123, true, false]` (absolute, in seconds)\n- `[\"seek\", 123, true, true]` (absolute, in percent)\n- `[\"seek\", 123, false, true]` (relative, in percent)\n- `[\"set-volume\", 70]`\n- `[\"get-props\"]`\n\nThe *receiver* may send the following commands to the client, encoded as JSON:\n\n- `[\"prop\", {\"filename\": …, \"title\": …, \"album\": …, \"artist\": …, \"length\": …, \"progress\": …, \"volume\": …, \"playing\": …}]`\n- `[\"prop\", \"filename\", \"some-file.ogg\"]`\n- `[\"prop\", \"path\", \"path/to/some-file.ogg\"]`\n- `[\"prop\", \"duration\", 219.5]`\n- `[\"prop\", \"percent-pos\", 2,477]`\n- `[\"prop\", \"time-pos\", 54.5]`\n- `[\"prop\", \"pause\", false]`\n- `[\"prop\", \"volume\", 70]`\n- `[\"prop\", \"metadata\", {title, album, artist, album_artist, track, disc}]`\n- `[\"prop\", \"artwork\", \"https://example.org/path/to/artwork.jpg\"]`\n- `[\"prop\", \"queue\", [\"some-file.ogg\", \"another-file.mp3\"]]`\n\nA *receiver* announces itself via [mDNS](https://en.wikipedia.org/wiki/Multicast_DNS), with the following properties:\n\n- service type: `_fasp._tcp.`\n- `name`: a url-safe, ASCII string\n- `id`: a random hex ID, 16 characters\n- `version`: the version of the protocol, `2` currently\n- hostname\n- port\n\n## Existing implementations\n\n- [`fasp-server-cli`](https://github.com/derhuerst/fasp-server-cli) – A proof-of-concept *receiver* based on [`mpv`](https://mpv.io/).\n- [`fasp-client-cli`](https://github.com/derhuerst/fasp-client-cli) – A proof-of-concept command line *client*.\n- [`fasp-web-client`](https://github.com/derhuerst/fasp-web-client) – A proof-of-concept *client* web app.\n\n## Libraries\n\n- [`fasp-client`](https://github.com/derhuerst/fasp-client) – A JS lib to connect to a *receiver* and send commands. It can also serve local files on demand, for the *receiver* to fetch. [`fasp-client-cli`](https://github.com/derhuerst/fasp-client-cli) and [`fasp-web-client`](https://github.com/derhuerst/fasp-web-client) use it.\n- [`search-fasp-receivers`](https://github.com/derhuerst/search-fasp-receivers) – Search for *receivers* in the local network.\n- [`fasp-receiver`](https://github.com/derhuerst/fasp-receiver) – A JS lib to create \u0026 announce a *receiver*. You have to implement the audio playing.\n- [`fasp-server`](https://github.com/derhuerst/fasp-server) – A JS lib to run a *receiver*, including audio playing. [`fasp-server-cli`](https://github.com/derhuerst/fasp-server-cli) uses it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderhuerst%2Ffriendly-audio-streaming-protocol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fderhuerst%2Ffriendly-audio-streaming-protocol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderhuerst%2Ffriendly-audio-streaming-protocol/lists"}