Skip to content
Menu

> projects

reklawdbox

Rust
MCP
CLI
Rekordbox

reklawdbox is an MCP server for managing Rekordbox 7.x DJ libraries through AI-assisted workflows. It provides read-only access to Rekordbox's encrypted SQLCipher database, letting AI agents search tracks, browse playlists, analyse audio, and enrich metadata from Discogs and Beatport.

All changes are staged in memory and exported as Rekordbox-compatible XML files, so nothing touches the master database without manual reimport. This keeps your library safe while unlocking powerful batch operations like genre normalisation, audio analysis, and DJ set building.

Built as a single Rust binary with no external dependencies. Runs as a stdio MCP server for use with Claude Desktop or any MCP host, with CLI subcommands available for shell workflows.

reklawdbox logo, a crab on a vinyl record

Crate Guide

Nuxt
Vue.js
TypeScript
Supabase

Crate Guide is a companion for DJing with a physical record collection. Records can be imported from Discogs or entered manually, organised into colour-coded crates, and searched as a library of tracks with BPM, musical key, genre, label, and catalogue metadata.

Session mode combines up to four SL-1200-inspired virtual decks with pitch controls, tempo- and key-aware track suggestions, transition history and ratings, and reusable saved sets. The goal is to make finding the next compatible record quick enough to stay useful during a mix.

The current rebuild uses Nuxt 4, Vue, TypeScript, Pinia, Tailwind CSS, and Supabase. Missing BPM and key data can be staged from a Rekordbox XML export or estimated from local audio in the browser, with a review-before-write workflow that keeps existing metadata intact and never uploads audio files.

Crate Guide session with two virtual turntables, harmonic suggestions, and transition history.
Crate Guide record library with six album cards and collection controls.
Crate Guide track browser showing BPM, musical key, genre, and record metadata.
Crate Guide crates view with three colour-coded record collections.
Crate Guide BPM and key enrichment workflow with Rekordbox XML and local audio options.

bpm tap

Vue.js
TypeScript
PWA
Vite

bpm tap is a deliberately simple tap-tempo app I made for comparing tracks while DJing. Tap anywhere on a phone—or press Space on a keyboard—and it calculates the tempo in real time; pause for two seconds to save the reading and start a fresh measurement.

The saved tempo stays visible as a reference while measuring another track. Locking it prevents later readings from replacing it, which makes quick tempo comparisons possible without leaving the full-screen tapping surface.

A 2026 refresh made the calculation more resilient by keeping a rolling window of recent taps and trimming outliers once there are enough samples. It also improved the responsive layout, accessible status text, reduced-motion behaviour, and visual feedback while keeping the original one-purpose PWA intact.

Panel layout generator

Vue.js
TypeScript
Pinia
Vite

Panel layout generator began as a quick way to help a friend plan an acoustic panel installation. Each colour was available in a fixed quantity, and matching panels could not sit next to one another, making a larger layout surprisingly awkward to plan by hand.

The app turns those constraints into an editable grid. Rows, columns, colours, and quantities can be changed at any time; it generates a proportional layout, keeps horizontally and vertically adjacent panels different, and can show coordinates or print the result.

I revisited the project in 2026 to update its foundations without redesigning away its original character. It now uses Vue 3, TypeScript, Vite, and Pinia (external link), with the generation logic separated from the interface and covered by automated tests. Colour editing is provided by vue-accessible-color-picker (external link).

Default 8 by 12 panel layout in warm colours.
Panel layout showing row and column coordinates.
Large 24 by 40 panel layout using pastel colours.
8 by 12 panel layout using a custom pastel palette.