{"id":50580834,"url":"https://github.com/foonerd/evo-device-audio","last_synced_at":"2026-06-05T02:01:23.113Z","repository":{"id":354240409,"uuid":"1222745349","full_name":"foonerd/evo-device-audio","owner":"foonerd","description":"Reference generic audio device for the evo framework. Brand-neutral audio plugins (MPD playback, ALSA composition, file metadata, local artwork).","archived":false,"fork":false,"pushed_at":"2026-06-01T08:33:05.000Z","size":3230,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T10:20:53.102Z","etag":null,"topics":["alsa","arm64","armv7","audio","embedded-linux","evo-framework","mpd","music-player","plugin-set","rust","x86-64"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foonerd.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-27T17:03:57.000Z","updated_at":"2026-05-21T11:36:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/foonerd/evo-device-audio","commit_stats":null,"previous_names":["foonerd/evo-plugins-audio","foonerd/evo-device-audio"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/foonerd/evo-device-audio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foonerd%2Fevo-device-audio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foonerd%2Fevo-device-audio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foonerd%2Fevo-device-audio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foonerd%2Fevo-device-audio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foonerd","download_url":"https://codeload.github.com/foonerd/evo-device-audio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foonerd%2Fevo-device-audio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33927313,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"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":["alsa","arm64","armv7","audio","embedded-linux","evo-framework","mpd","music-player","plugin-set","rust","x86-64"],"created_at":"2026-06-05T02:01:22.355Z","updated_at":"2026-06-05T02:01:23.108Z","avatar_url":"https://github.com/foonerd.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# evo-device-audio\n\n\u003e Brand-neutral audio-player plugins for the [evo](https://github.com/foonerd/evo-core) fabric. The reference generic device for the audio domain — and the canonical demonstration of the framework's full surface.\n\nA distribution that builds an audio player on top of evo does not need to invent an MPD warden, a local-file metadata respondent, an ALSA delivery, or an ID3 tag reader. Those exist here, signed by the evo project, ready to be admitted into any catalogue that declares the audio domain.\n\nThis repository is also the framework's own showcase. Every core function evo-core ships — admission, custody, projections, happenings bus, durable persistence, plugin packaging, the wire protocol — is exercised end-to-end by the plugins in this repo against a real audio workload. A vendor adopting evo for an audio device starts here; a contributor reading the framework starts here too, because the contracts the framework defines become concrete in the plugins below.\n\n## How it fits together\n\n```mermaid\nflowchart LR\n    core[\"\u003cb\u003eevo-core\u003c/b\u003e\u003cbr/\u003e\u003ci\u003eframework\u003c/i\u003e\u003cbr/\u003esteward + SDK + contracts\u003cbr/\u003edomain-neutral\"]\n    commons[\"\u003cb\u003eevo-device-audio\u003c/b\u003e\u003cbr/\u003e\u003ci\u003ethis repo\u003c/i\u003e\u003cbr/\u003ebrand-neutral plugins\u003cbr/\u003efor the audio domain\"]\n    dist[\"\u003cb\u003eevo-device-\u0026lt;vendor\u0026gt;\u003c/b\u003e\u003cbr/\u003e\u003ci\u003edistribution\u003c/i\u003e\u003cbr/\u003ecatalogue + branding\u003cbr/\u003e+ packaging + curation\"]\n    art[\"\u003cb\u003eartefacts repos\u003c/b\u003e\u003cbr/\u003e\u003ci\u003erelease planes\u003c/i\u003e\u003cbr/\u003esigned bytes per piece\"]\n\n    core ==\u003e|SDK pinned by tag| commons\n    core ==\u003e|SDK pinned by tag| dist\n    commons ==\u003e|admitted by name| dist\n    commons -.-\u003e art\n    dist -.-\u003e art\n```\n\nThree repository tiers, each with one job.\n\n-   **Framework (`evo-core`)** ships the steward, SDK, and contracts. Domain-neutral. Pinned by tag.\n-   **Plugin commons (this repo)** ships brand-neutral plugins for one domain. Pinned by tag. Signed under the evo project's commons key. Distributions admit commons plugins by name.\n-   **Distribution (`evo-device-\u003cvendor\u003e`)** ships the catalogue, branding, frontend integration, packaging, and any plugins that are genuinely vendor-specific.\n\nA second audio distribution stocks its catalogue from this commons unchanged. A non-audio distribution (signage, home automation, scientific instrument) follows the same pattern with its own `evo-plugins-\u003cdomain\u003e` commons.\n\n## What this repository contains\n\nPlugins, and only plugins.\n\n-   Brand-neutral plugin crates that wrap commodity audio infrastructure (MPD, ALSA, NetworkManager, Samba, ID3/FLAC/Vorbis tag readers, NAS mounts, file sharing, library scanning).\n-   A workspace-internal shared crate (`crates/evo-device-audio-shared`) for utilities used across plugins (path normalisation, library scanning, common error types). Compiled into plugins; not shipped as a separate artefact.\n-   The plugin commons signing key (public half).\n-   Build, test, and signing pipelines that produce signed artefacts for the release plane.\n\nIt does **not** contain:\n\n-   A catalogue. Catalogues are authored by distributions.\n-   Branding. Logos, colour palettes, product names live with the distribution.\n-   A frontend. Web UIs and HMIs live with the distribution.\n-   Vocabulary as a separately-pinned contract. Subject types and relation predicates are declared in distribution catalogues; this commons publishes plugins that speak whatever vocabulary their slot contracts require.\n\n## Plugin namespace\n\nPlugins published from this repository live under the reverse-DNS namespace `org.evoframework.*`.\n\n-   `org.evoframework.playback.mpd`\n-   `org.evoframework.metadata.local`\n-   `org.evoframework.artwork.local`\n-   `org.evoframework.composition.alsa`\n-   ...\n\nThe namespace is reserved for plugin commons artefacts signed by the evo project's commons key. Vendors do not publish under this namespace. Per-vendor namespaces (`com.volumio.*`, `com.acme.*`, etc.) remain the home for genuinely vendor-specific plugins.\n\n## Trust posture\n\nEvery plugin published from this repository is signed by the evo project under a single commons signing key. The public half lives in [`keys/commons-plugin-signing-public.pem`](keys/commons-plugin-signing-public.pem) with sidecar metadata in [`keys/commons-plugin-signing-public.meta.toml`](keys/commons-plugin-signing-public.meta.toml).\n\nDistributions bundle this public key in their trust material by default, alongside their own vendor key. An operator may override the trust posture per `VENDOR_CONTRACT.md`'s operator-sovereignty position - the operator decides what runs on their device.\n\nThe private signing key lives only in the GitHub Actions repository secret `PLUGIN_SIGNING_KEY_PEM`. It never leaves the runner.\n\n## How a distribution consumes a commons plugin\n\n```mermaid\nsequenceDiagram\n    autonumber\n    participant Vendor as Distribution build\n    participant Commons as evo-device-audio-artefacts\n    participant Device as Device\n    participant Op as Operator\n\n    Vendor-\u003e\u003eCommons: fetch signed plugin bundle\n    Vendor-\u003e\u003eVendor: include in distribution package\n    Vendor-\u003e\u003eDevice: install (with commons trust root)\n    Device-\u003e\u003eDevice: verify signature against commons key\n    Device--\u003e\u003eOp: plugin admitted at platform trust class\n    Op-\u003e\u003eDevice: optional: revoke / restrict per local policy\n```\n\nA distribution catalogue admits the commons plugin by its `org.evoframework.*` name. The steward verifies the signature against the commons trust root and admits the plugin at the trust class declared in the manifest.\n\n## Status\n\nThree brand-neutral audio plugins live in this repository, signed by the evo project commons key. They are consumed by any vendor distribution that adopts the audio reference; `evo-device-volumio` is one such adopter today, and the plugins remain available unchanged to any future audio distribution.\n\n| Plugin | Slot | Version |\n|--------|------|---------|\n| `org.evoframework.playback.mpd` | `audio.playback` | 0.1.0 |\n| `org.evoframework.metadata.local` | `metadata.providers` | 0.1.1 |\n| `org.evoframework.artwork.local` | `artwork.providers` | 0.1.0 |\n| `org.evoframework.composition.alsa` | `audio.composition` | 0.1.0 |\n\n`org.evoframework.delivery.alsa` currently provides deterministic ALSA pipeline composition (`alsa.pipeline.compose`) as a responder surface. Steward-side reconciliation hooks (trigger compose + reproject on plugin/output changes) are tracked at the framework tier (`evo-core`).\n\nA workspace-internal shared crate, `evo-device-audio-shared`, holds utilities common across plugins (local-library tag scanning, `mpd-album` value parsing). It is compiled into plugins; not shipped as a separate artefact.\n\n`evo-core` is pinned at tag `v0.1.9` via `[workspace.dependencies]` in `Cargo.toml`. Bumps are deliberate; see [DEVELOPING.md](DEVELOPING.md) for the procedure.\n\n## For other domains\n\n`evo-plugins-video`, `evo-plugins-home`, `evo-plugins-instrument`, whichever commons comes next reads this repository as the worked example. The pattern is the same:\n\n-   A source repo named `evo-plugins-\u003cdomain\u003e` and an artefacts repo named `evo-plugins-\u003cdomain\u003e-artefacts`.\n-   The framework pinned by tag.\n-   Every plugin signed with the evo project's commons key.\n-   No catalogue, no branding, no vocabulary versioning - those stay at the distribution tier.\n\n## Related\n\n-   [foonerd/evo-core](https://github.com/foonerd/evo-core) - the framework.\n-   [foonerd/evo-device-audio-artefacts](https://github.com/foonerd/evo-device-audio-artefacts) - the release plane for this commons.\n-   [foonerd/evo-device-volumio](https://github.com/foonerd/evo-device-volumio) - the first audio distribution; consumes plugins from this commons.\n\n## License\n\nApache 2.0. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoonerd%2Fevo-device-audio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoonerd%2Fevo-device-audio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoonerd%2Fevo-device-audio/lists"}