{"id":45821589,"url":"https://github.com/ryan-voitiskis/reklawdbox","last_synced_at":"2026-04-10T14:04:22.012Z","repository":{"id":338618033,"uuid":"1158471095","full_name":"ryan-voitiskis/reklawdbox","owner":"ryan-voitiskis","description":"AI-powered Rekordbox metadata tool for genre tagging, classification, and library management.","archived":false,"fork":false,"pushed_at":"2026-04-02T14:37:08.000Z","size":4216,"stargazers_count":10,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-03T01:07:40.160Z","etag":null,"topics":["audio","cli","dj","mcp"],"latest_commit_sha":null,"homepage":"https://reklawdbox.com/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ryan-voitiskis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-15T12:34:09.000Z","updated_at":"2026-04-02T20:01:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ryan-voitiskis/reklawdbox","commit_stats":null,"previous_names":["ryan-voitiskis/crate-dig","ryan-voitiskis/reklawdbox"],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/ryan-voitiskis/reklawdbox","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-voitiskis%2Freklawdbox","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-voitiskis%2Freklawdbox/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-voitiskis%2Freklawdbox/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-voitiskis%2Freklawdbox/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryan-voitiskis","download_url":"https://codeload.github.com/ryan-voitiskis/reklawdbox/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-voitiskis%2Freklawdbox/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31426193,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T02:22:46.605Z","status":"ssl_error","status_checked_at":"2026-04-05T02:22:33.263Z","response_time":75,"last_error":"SSL_read: 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","cli","dj","mcp"],"created_at":"2026-02-26T20:59:04.235Z","updated_at":"2026-04-10T14:04:22.006Z","avatar_url":"https://github.com/ryan-voitiskis.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# reklawdbox\n\nMCP server for [Rekordbox](https://rekordbox.com/) 7.x library management.\nGives an AI agent full read access to your encrypted Rekordbox database, stages\nmetadata edits in memory, and exports Rekordbox-compatible XML for safe\nreimport. The database is never written to directly.\n\n**Docs, workflows, and tool reference: [reklawdbox.com](https://reklawdbox.com)**\n\n## How it works\n\nYou have a conversation with Claude. Claude calls reklawdbox tools to search\nyour library, analyze audio, look up metadata from external sources, classify\ngenres, score transitions, and build DJ sets. When changes are proposed, they're\nheld in memory until you explicitly export them as an XML file. You then import\nthat file into Rekordbox yourself.\n\nThe result is an AI-assisted curation workflow where the agent handles the\ntedious work (metadata lookups, genre classification, harmonic analysis,\nset sequencing) while you retain full control over what actually changes in your\nlibrary.\n\n### Workflows\n\nThe server includes step-by-step SOPs (standard operating procedures) compiled\ninto the binary. Call `help()` in conversation to see the workflow menu.\n\n| Workflow             | What it does                                                  |\n| -------------------- | ------------------------------------------------------------- |\n| Collection Audit     | Fix naming, tagging, and convention violations                |\n| Metadata Backfill    | Fill missing labels, years, albums from enrichment            |\n| Genre Classification | Classify ungenred tracks using enrichment + audio evidence    |\n| Genre Audit          | Verify existing genre tags against evidence                   |\n| Library Health       | Scan for broken links, orphans, duplicates, coverage gaps     |\n| Set Building         | Sequence DJ sets with transition scoring and energy shaping   |\n| Pool Building        | Discover clusters of compatible tracks for live improvisation |\n| Chapter Set Planning | Plan multi-chapter sets with bridge tracks                    |\n| Batch Import         | Tag, rename, and embed cover art for new music                |\n\n## Architecture\n\n```mermaid\nflowchart TB\n    claude([\"Claude Code / Claude Desktop\"])\n    claude \u003c--\u003e|\"MCP (stdio)\"| router\n\n    subgraph binary[\"reklawdbox (single Rust binary)\"]\n        router[\"Tool Router\"]\n\n        subgraph acquire[\"Acquire\"]\n            library[\"Library Search\"]\n            analysis[\"Audio Analysis\u003cbr/\u003estratum-dsp + Essentia\"]\n            enrich[\"Enrichment\u003cbr/\u003eDiscogs · Beatport\u003cbr/\u003eBandcamp · MusicBrainz\"]\n        end\n\n        subgraph reason[\"Reason\"]\n            classify[\"Genre Classifier\u003cbr/\u003emulti-evidence decision tree\"]\n            scoring[\"Transition \u0026 Pool Scoring\u003cbr/\u003emulti-axis weighted\"]\n            sets[\"Set Sequencer\u003cbr/\u003ebeam search\"]\n        end\n\n        subgraph stage[\"Stage \u0026 Export\"]\n            changes[\"Change Manager\u003cbr/\u003e(in-memory)\"]\n            xml[\"XML Export\"]\n        end\n\n        router --\u003e acquire\n        router --\u003e reason\n        router --\u003e changes\n        changes --\u003e xml\n    end\n\n    library -.-\u003e|\"read-only\"| db[(\"Rekordbox master.db\u003cbr/\u003e(SQLCipher)\")]\n    analysis --\u003e files[\"Audio Files\"]\n    enrich \u003c--\u003e cache[(\"Cache Store\u003cbr/\u003e(SQLite)\")]\n    analysis --\u003e cache\n    enrich --\u003e broker[\"Discogs Broker\u003cbr/\u003eCloudflare Workers + D1\"]\n    enrich --\u003e apis[\"beatport.com\u003cbr/\u003ebandcamp.com\u003cbr/\u003emusicbrainz.org\"]\n\n    xml --\u003e|\".xml\"| rb([\"Rekordbox\u003cbr/\u003eFile → Import Collection\"])\n    rb -.-\u003e|\"applies changes\"| db\n```\n\n### Key design decisions\n\n- **Read-only database access.** The Rekordbox `master.db` is opened via\n  SQLCipher with `SQLITE_OPEN_READ_ONLY`. No write path exists in the codebase.\n\n- **Staged mutations.** All proposed changes live in an in-memory `ChangeManager`\n  until explicitly exported. You can preview, modify, or discard staged changes\n  before anything touches disk.\n\n- **XML as the write path.** Rekordbox has no scripting API. The only safe\n  programmatic write path is XML import. The server generates\n  Rekordbox-compatible XML that you import yourself via File → Import Collection.\n\n- **Separate cache store.** Enrichment results and audio analysis are cached in a\n  local SQLite database (WAL mode), separate from Rekordbox. Cache entries are\n  keyed by schema version and auto-evicted when the analysis pipeline changes.\n\n- **Two-tier audio analysis.** [stratum-dsp](https://github.com/ryan-voitiskis/stratum-dsp)\n  (Rust, always available) handles BPM and key detection. [Essentia](https://essentia.upf.edu/)\n  (Python, optional) adds energy, timbre, rhythm, and spectral features. All\n  scoring axes degrade gracefully when Essentia is absent.\n\n- **Broker-mediated enrichment.** Discogs API access is proxied through a\n  [Cloudflare Workers service](broker/) that handles OAuth, rate limiting, and\n  response caching. The Rust binary never holds Discogs consumer secrets.\n\n- **SOPs compiled in.** Workflow procedures are embedded in the binary via\n  `include_str!` so documentation can't drift from the release.\n\n## Install\n\nRequires macOS on Apple Silicon (M1 or later) and Rekordbox 7.x.\n\n```bash\nbrew tap ryan-voitiskis/reklawdbox\nbrew install reklawdbox\n```\n\nThen run interactive setup:\n\n```bash\nreklawdbox setup\n```\n\nThis installs Essentia (audio analysis), configures Claude Code and Claude\nDesktop, and verifies the Rekordbox database connection. See the\n[install guide](https://reklawdbox.com/getting-started/) for details.\n\n## Build from source\n\nRequires the [Rust toolchain](https://rustup.rs/) and Xcode Command Line Tools.\n\n```bash\ngit clone https://github.com/ryan-voitiskis/reklawdbox.git\ncd reklawdbox\ncargo build --release\n```\n\nThe binary is at `./target/release/reklawdbox`.\n\n## CLI subcommands\n\nThe binary runs as an MCP server by default. Subcommands are available for local\nworkflows outside your MCP host:\n\n| Subcommand          | Description                                            |\n| ------------------- | ------------------------------------------------------ |\n| `setup`             | Install Essentia and configure MCP hosts               |\n| `hydrate`           | Batch enrichment + analysis (Discogs, Beatport, audio) |\n| `analyze`           | Batch audio analysis (stratum-dsp + Essentia)          |\n| `backup`            | Manage Rekordbox library backups                       |\n| `read-tags`         | Read metadata tags from audio files                    |\n| `write-tags`        | Write metadata tags to audio files                     |\n| `extract-art`       | Extract embedded cover art from an audio file          |\n| `embed-art`         | Embed cover art into audio files                       |\n| `disconnect-broker` | Clear stored Discogs broker session                    |\n\nRun `reklawdbox \u003csubcommand\u003e --help` for usage details.\n\n## Development\n\n```bash\ncargo build --release\ncargo test\ncargo test -- --ignored        # integration tests\ndprint fmt \u0026\u0026 cargo fmt        # format\ndprint check \u0026\u0026 cargo fmt --check  # verify formatting\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for expectations and workflow.\n\nAgent-specific notes: [CLAUDE.md](CLAUDE.md), [AGENTS.md](AGENTS.md).\n\n## Releasing\n\n```bash\n./scripts/release.sh 0.25.0\n```\n\nTags and pushes. CI builds the binary, creates a GitHub Release, and updates the\n[Homebrew tap](https://github.com/ryan-voitiskis/homebrew-reklawdbox).\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryan-voitiskis%2Freklawdbox","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryan-voitiskis%2Freklawdbox","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryan-voitiskis%2Freklawdbox/lists"}