{"id":50821533,"url":"https://github.com/sym-bot/melotune-plugin","last_synced_at":"2026-06-13T14:12:47.238Z","repository":{"id":352994848,"uuid":"1217486909","full_name":"sym-bot/melotune-plugin","owner":"sym-bot","description":"Claude Code console as a MeloTune music interface — view queue, see current track, play, skip, chat about your music. All via the SYM mesh to MeloTune on your iPhone.","archived":false,"fork":false,"pushed_at":"2026-04-22T03:13:42.000Z","size":53,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-22T03:33:10.349Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sym-bot.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-21T23:57:05.000Z","updated_at":"2026-04-22T03:13:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sym-bot/melotune-plugin","commit_stats":null,"previous_names":["sym-bot/melotune-plugin"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/sym-bot/melotune-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sym-bot%2Fmelotune-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sym-bot%2Fmelotune-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sym-bot%2Fmelotune-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sym-bot%2Fmelotune-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sym-bot","download_url":"https://codeload.github.com/sym-bot/melotune-plugin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sym-bot%2Fmelotune-plugin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34287358,"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-13T02:00:06.617Z","response_time":62,"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":[],"created_at":"2026-06-13T14:12:46.563Z","updated_at":"2026-06-13T14:12:47.232Z","avatar_url":"https://github.com/sym-bot.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# melotune-plugin\n\nClaude Code console as a MeloTune music interface. View the upcoming queue, see the current track, play, skip — while you vibe-code.\n\n```\n\u003e /melotune:queue\n\nNext up:\n  1. Kiasmos — Burn · focus · 5:52\n  2. Nils Frahm — Says · focus · 8:18\n  3. Ólafur Arnalds — re:member · focus · 4:44\n  4. Nala Sinephro — Space 1.8 · focus · 4:10\n\nUse the melotune_play or melotune_skip tools to control playback.\n```\n\n## How it works\n\nThe plugin is a peer node on the SYM mesh. It talks to MeloTune on your iPhone via the Mesh Memory Protocol (MMP). The Claude Code console becomes the UI surface; your phone is the speaker.\n\nNothing plays audio on your Mac. All playback happens on your iPhone — this plugin just gives you a place to see and steer it.\n\n## Install\n\n```\n/plugin marketplace add sym-bot/melotune-plugin\n```\n\nOr direct-install from a clone:\n\n```\ngit clone https://github.com/sym-bot/melotune-plugin.git\nclaude --plugin-dir ./melotune-plugin\n```\n\nPrerequisites:\n\n- MeloTune running on your iPhone (iOS 17+)\n- iPhone on the same LAN as your Mac, **or** both connected to the same SYM relay (`SYM_RELAY_URL` + `SYM_RELAY_TOKEN` env vars)\n- Node.js ≥ 18 (Claude Code plugin requirement)\n\n## Tools\n\n| Tool | What it does |\n|---|---|\n| `melotune_now_playing` | Show the track currently playing on your iPhone |\n| `melotune_queue` | Show the next few tracks MeloTune has queued for your current vibe |\n| `melotune_play` | Play / resume |\n| `melotune_skip` | Skip to the next track |\n| `melotune_favorite` | Star the current track (or a specific track by id) |\n| `melotune_unfavorite` | Remove favorite from the current (or specific) track |\n| `melotune_artist_info` | Bio, genres, top tracks, similar artists |\n| `melotune_listening_history` | Recent tracks, top artists of the week, top moods |\n| `melotune_search` | Search your MeloTune library and recommendations |\n| `melotune_request` | Ask MeloTune to curate music matching a free-text vibe/mood/activity (e.g. \"late night coding\") |\n\nYou can call these as tools or just chat — \"who's the artist on this one?\", \"show me something calmer\", \"what have I played most this week?\" — Claude Code picks the tool and surfaces the answer in the console.\n\n## Environment\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `MELOTUNE_PLUGIN_NODE_NAME` | `melotune-plugin-\u003cpid\u003e` | Mesh node identity for this plugin instance |\n| `MELOTUNE_SERVICE_TYPE` | `_melotune._tcp` | Bonjour service type — must match MeloTune iOS's `discoveryServiceType` |\n| `MELOTUNE_GROUP` | `default` | MMP §5.8 mesh group — must match MeloTune iOS |\n| `SYM_RELAY_URL` | (unset → LAN-only via Bonjour) | WebSocket URL of a SYM relay for cross-network mesh |\n| `SYM_RELAY_TOKEN` | (unset) | Relay auth token |\n\n## CMB contract (for MeloTune iOS implementers)\n\nThis plugin emits and expects typed CMBs. Any MeloTune iOS build that implements these handlers will work with the plugin.\n\n**Requests from plugin (focus field):**\n\n- `melotune:now-playing`\n- `melotune:queue`\n- `melotune:play`\n- `melotune:skip`\n- `melotune:favorite` (optional metadata `{ trackId }`)\n- `melotune:unfavorite` (optional metadata `{ trackId }`)\n- `melotune:artist-info` (optional metadata `{ artistName }`)\n- `melotune:history` (metadata `{ limit }`)\n- `melotune:search` (metadata `{ query }`)\n- `melotune:text-prompt` (metadata `{ text }`) — free-text vibe/mood request, parsed into a MusicCommand on iOS and dispatched through the same path as typed input\n\n**Responses expected (focus field = request + `:response`):**\n\n- `now-playing` → `{ title, artist, mood, durationSec, positionSec }`\n- `queue` → `{ tracks: [{ title, artist, mood, durationSec }, ...] }`\n- `play` / `skip` → `{ ok: bool, detail?: string }`\n- `favorite` / `unfavorite` → `{ ok: bool, title, artist, favorite: bool }`\n- `artist-info` → `{ name, bio?, genres: [], topTracks: [{ title }], similarArtists: [{ name }] }`\n- `history` → `{ tracks: [{ title, artist, mood, playedAt }], topArtists: [{ name, plays }], topMoods: [{ mood }] }`\n- `search` → `{ results: [{ title, artist, mood }] }`\n- `text-prompt` → `{ ok: bool, explanation?: string, curatingType?: string, detail?: string }`\n\nTransport is MMP §4.4 message frames (not CMBs). Control traffic bypasses SVAF — the music-agent SVAF profile would reject focus-only CMBs with no mood signal, so wire format is `node.send(JSON, {to: peerId})` both directions. Envelope: `{ protocol: \"melotune-plugin\", v: 1, id, focus, metadata?, intent? }` and `{ protocol, v, id, focus: \"\u003creq\u003e:response\", payload }`.\n\nPeer discovery: plugin matches any mesh peer on `_melotune._tcp` Bonjour service type that is not another plugin instance (user's phone may publish with a custom display name).\n\n## Architecture\n\n```\nClaude Code  ──MCP tool call──▶  melotune-plugin (this Node process)\n                                         │\n                                  SymNode (peer identity)\n                                         │\n                     ┌──────── MMP CMB over LAN/relay ────────┐\n                     ▼                                         ▼\n               MeloTune iOS                                sym-relay\n               (plays music)\n```\n\nPlugin does not handle audio. Plugin does not store music. Plugin does not call Spotify / Apple Music APIs. All of that lives in MeloTune on the phone.\n\n## License\n\nApache-2.0. © 2026 SYM.BOT.\n\n## Author\n\nHongwei Xu · hongwei@sym.bot · https://sym.bot\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsym-bot%2Fmelotune-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsym-bot%2Fmelotune-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsym-bot%2Fmelotune-plugin/lists"}