[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81621":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":44,"readmeContent":45,"aiSummary":46,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":47,"discoverSource":48},81621,"beatos","averatec0773\u002Fbeatos","averatec0773","Local-first beat library for music producers. MCP server (Claude Code \u002F Claude Desktop) for AI-driven cataloging, tagging, and multi-platform publishing.","https:\u002F\u002Faveratec.studio",null,"TypeScript",23,4,2,0,1,3,2.1,"Apache License 2.0",false,"main",true,[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"ai-tools","anthropic","audio-metadata","beat-maker","bpm-detection","claude-code","claude-mcp","desktop-app","electron","fastapi","key-detection","librosa","local-first","mcp","mcp-server","model-context-protocol","music-library","music-metadata","music-producer","music-production","2026-06-12 02:04:17","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"apps\u002Fdesktop\u002Fresources\u002Ficon.png\" width=\"96\" alt=\"BeatOS\" \u002F>\n\n# BeatOS\n\n**The operating system for beat producers.**\n\nA local-first desktop library that holds every beat on your hard drive — catalog it once, then ship it to every platform with an AI co-pilot doing the metadata grind for you.\n\n[![version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdynamic\u002Fjson?url=https:\u002F\u002Fraw.githubusercontent.com\u002Faveratec0773\u002Fbeatos\u002Fmain\u002Fapps\u002Fdesktop\u002Fpackage.json&query=$.version&label=version&prefix=v&color=7c5cff&style=flat-square)](CHANGELOG.md)\n[![platform](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-macOS%20%7C%20Windows-1f1f1f?style=flat-square)](#install)\n[![license](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache--2.0-1f1f1f?style=flat-square)](LICENSE)\n[![status](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstatus-pre--release-orange?style=flat-square)](ROADMAP.md)\n[![MCP](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FMCP-Claude%20Code%20%E2%80%A2%20Claude%20Desktop-7c5cff?style=flat-square)](#ai-integration)\n\n\u003C\u002Fdiv>\n\n---\n\n\u003Cdiv align=\"center\">\n  \u003Cbr\u002F>\n  \u003Cimg src=\"screenshots\u002Fmain.png\" alt=\"BeatOS — library view with sidebar, track list, and Now Focused preview panel\" width=\"1100\" \u002F>\n  \u003Cbr\u002F>\n  \u003Cbr\u002F>\n\u003C\u002Fdiv>\n\n## The problem\n\nA working beat producer ends up with hundreds of WAV\u002FMP3 files on disk, two versions of each (tagged + untagged), cover art that isn't always next to the file, and a different metadata vocabulary for every platform:\n\n- **NetEase \u002F QQ Music \u002F Suno \u002F BeatStars \u002F YouTube** — different genre trees, different mood tags, different description lengths, different price models.\n- A track that's \"Trap\" on one site is \"Hip Hop · 暗黑\" on another, \"Aggressive Lo-Fi\" on a third, \"未分类\" on a fourth.\n- **Every release means re-typing the same data in a different costume.** Multiply by 50 unfinished beats and 4 platforms — that's 200 metadata blocks to maintain by hand. Which is why most producers just don't publish.\n\nBeatOS fixes this by keeping **one canonical catalog** locally, then letting **either you or an AI agent** translate it into the per-platform metadata block on demand.\n\n## What it does today\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### 1. Local catalog\n\nA real SQLite database for every beat: title, BPM, key, genre (multi-value), mood (multi-value), producer credits, tags, license type, price, description, audio assets (WAV\u002FMP3 × tagged\u002Funtagged), cover art. Soft-delete trash with restore. Lists for curation. Rename + merge a producer across every track in one click.\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### 2. AI co-pilot (MCP)\n\nA first-class **MCP (Model Context Protocol)** server exposes the library to Claude Code, Claude Desktop, and any MCP client. 22 tools (7 read + 15 write): read your catalog, draft per-platform descriptions, rename producers, propose batch attachments. Every write goes through a `token → await_approval` flow — the AI proposes, you confirm in the Approvals panel.\n\n\u003C\u002Ftd>\n\u003Ctd width=\"33%\" valign=\"top\">\n\n### 3. Player + analysis\n\nSpotify-style bottom bar (Tone.js + Web Audio). Plays the FLOAT-32 WAVs your DAW actually exports. Four audio roles per track with instant switch; queue follows the visible filter; shuffle + repeat. On-demand BPM\u002Fkey analysis via a pluggable engine — Essentia (RhythmExtractor2013 + KeyExtractor \"bgate\") when the optional extra is installed, else the permissive librosa fallback — with per-field confidence scores.\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## AI integration\n\n> **BeatOS is the first beat library built for the AI-agent era.** The MCP surface is not a side feature — it's how publishing is going to scale to 10 platforms without manual labor.\n\n**Verified clients:** Claude Code CLI · Claude Desktop · any MCP client speaking stdio JSON-RPC.\n\n\u003Cdiv align=\"center\">\n  \u003Cbr\u002F>\n  \u003Cimg src=\"screenshots\u002Fmcp-claude-desktop.png\" alt=\"BeatOS surfaced as a Desktop connector in Claude Desktop, with all 22 tools listed under read-only and write\u002Fdelete permission groups\" width=\"900\" \u002F>\n  \u003Cbr\u002F>\n  \u003Cem>BeatOS registered as a Desktop MCP connector in Claude Desktop — read-only tools auto-allowed, writes gated behind approval.\u003C\u002Fem>\n  \u003Cbr\u002F>\n  \u003Cbr\u002F>\n\u003C\u002Fdiv>\n\n**Tools shipping today (20 total):**\n\n| Surface | Tools |\n|---|---|\n| **Read** | `list_tracks`, `get_track`, `list_lists`, `list_distinct_values`, `ping` |\n| **Lifecycle** | `create_tracks`, `trash_tracks`, `restore_tracks`, `purge_tracks` |\n| **Lists** | `create_list`, `update_list`, `delete_list`, `add_tracks_to_list`, `remove_tracks_from_list`, `reorder_list` |\n| **Metadata** | `update_tracks`, `merge_metadata` |\n| **Assets** | `attach_assets`, `detach_assets` |\n| **Flow control** | `await_approval` |\n\n**Why two-phase commit?** Every write tool returns a `token` (preview only) — nothing touches the database. The token surfaces in the **Approvals panel** in BeatOS; you review the diff, then confirm. The agent calls `await_approval` to learn the outcome. **An AI can never silently mutate your catalog**, batch-edit your producer credits, or trash a track without you signing off.\n\n**Why batches?** A folder-import of 50 tracks × 2 audio assets would otherwise be 100 approval clicks. `create_tracks` (≤100), `attach_assets` (≤500), `detach_assets` (≤500) all batch — one token, one click, atomic rollback if any file vanishes mid-approve.\n\n**Example flow** (driven by Claude Code from your terminal):\n\n```text\nYou:    \"Tag every beat above 140 BPM that has no genre with 'Trap' or 'Drill'\n         based on the cover art and title. Show me the diff before applying.\"\n\nClaude: [calls list_tracks(bpm_min=140) → 12 tracks]\n        [reads metadata, drafts a patch]\n        [calls update_tracks(items=[...]) → returns token abc123]\n\nYou:    [opens BeatOS Approvals panel, sees 12 proposed edits with rationale]\n        [reviews 3, rejects 1, approves the batch]\n\nClaude: [await_approval → status=approved, applies, reports back]\n```\n\nThe same pattern will drive per-platform description generation, NetEase publish drafts (v0.1), and self-corpus RAG drafts (v0.2).\n\n## Local-first, by design\n\n| | |\n|---|---|\n| **No server.** | The sidecar binds `127.0.0.1` on an ephemeral port. Nothing leaves the machine — including conversations with the MCP agent. |\n| **No account.** | Single-user. No login, no sync, no cloud. |\n| **No telemetry.** | Zero outbound calls from the app itself. |\n| **Your files stay put.** | BeatOS references paths; nothing is moved or renamed unless you ask. |\n| **Your data is yours.** | One SQLite file under `~\u002FLibrary\u002FApplication Support\u002FBeatOS\u002F` (macOS). Open it with any tool. |\n\n## Install\n\n> Packaged installers will arrive at `v0.1.0` together with the first publish adapter. Until then, run from source — see [Develop](#develop) below.\n\n**Targets:** macOS 12+ · Windows 10+. Linux works for development but isn't a supported install target.\n\n## Develop\n\n**Prerequisites**\n\n- Node ≥22 LTS\n- Python 3.11.x\n- [`uv`](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv) — `brew install uv` (macOS) or `pipx install uv`\n\n**Setup**\n\n```bash\nmake sync                              # resolve Python workspace\ncd apps\u002Fdesktop && npm install\n```\n\n**Run**\n\n```bash\nnpm run dev:fresh                      # kill orphans + launch Electron + sidecar\nnpm run logs:tail                      # follow main.log + sidecar.jsonl\n```\n\n**Wire up the MCP server (Claude Desktop \u002F Claude Code)**\n\nThe MCP server lives at `packages\u002Fbeatos-mcp` and speaks stdio. Add to your MCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"beatos\": {\n      \"command\": \"uv\",\n      \"args\": [\"run\", \"--directory\", \"\u002Fabsolute\u002Fpath\u002Fto\u002Fbeatos\", \"beatos-mcp\"]\n    }\n  }\n}\n```\n\nThen `list_tracks` and friends will be available as tools inside Claude.\n\n**Test**\n\n```bash\nnpx vitest run                         # renderer + main (249 tests)\nuv run pytest                          # sidecar (347 tests)\nnpm run build && npm run smoke         # Playwright _electron end-to-end\n```\n\n## Stack\n\n`Electron 39` · `React 19` · `Vite` · `Tailwind` · `Radix UI` · `Zustand` · `TanStack Virtual` · `dnd-kit` · `Tone.js`\n`Python 3.11` · `FastAPI` · `aiosqlite` · `structlog` · `mcp` (FastMCP) · `librosa` \u002F `essentia` (optional) · `Playwright`\n`SQLite` · `Pydantic v2`\n\n## Repository\n\n```\napps\u002Fdesktop\u002F              Electron shell + React renderer\napps\u002Fextension\u002F            Browser extension — auto-fills platform upload forms (v0.0.37, Phase 1)\npackages\u002F\n  beatos-core\u002F             Pure Python business logic (no web\u002FRPC deps)\n  beatos-http\u002F             FastAPI facade for the renderer\n  beatos-mcp\u002F              stdio MCP server for AI agents\n  beatos-platforms\u002F        Per-platform vocab maps (v0.1+ adapters)\nconventions\u002F               Architecture and design references\nscreenshots\u002F               README assets\n```\n\nFull architecture notes live in [`conventions\u002Farchitecture.md`](conventions\u002Farchitecture.md).\n\n## Roadmap\n\nCurrently in the **dogfood phase** — UI\u002FUX patches land as `0.0.X.Y` releases, with `v0.1.0` reserved for the first publish adapter (NetEase Cloudmusic).\n\nFull plan: [`ROADMAP.md`](ROADMAP.md) · Shipped history: [`CHANGELOG.md`](CHANGELOG.md).\n\n## License\n\nApache License 2.0 — see [`LICENSE`](LICENSE) and [`NOTICE`](NOTICE).\n\nCopyright 2026 Scott Huang ([averatec0773](https:\u002F\u002Fgithub.com\u002Faveratec0773)).\n\n---\n\n\u003Cdiv align=\"center\">\n\nMade by [averatec0773](https:\u002F\u002Fgithub.com\u002Faveratec0773) · [averatec.studio](https:\u002F\u002Faveratec.studio)\n\n\u003C\u002Fdiv>\n","BeatOS 是一个面向音乐制作人的本地优先节拍库。它利用AI驱动的目录管理、标签分类及多平台发布功能，帮助用户高效管理和发布音乐作品。项目采用TypeScript编写，支持BPM检测、音调识别等功能，并通过MCP协议与Claude Code\u002FClaude Desktop等AI工具集成，提供智能元数据处理服务。适用于拥有大量未完成或已完成音频文件的音乐制作者，特别是那些需要在多个平台上进行复杂元数据管理的场景。通过保持一个本地主目录并允许AI代理按需转换为特定平台所需的元数据格式，BeatOS极大地简化了跨平台发布的流程。","2026-06-11 04:05:43","CREATED_QUERY"]