# Projects

## reklawdbox
URL: https://ryanvoitiskis.com/projects#reklawdbox
Summary: MCP server for managing Rekordbox DJ libraries through AI-powered workflows. Read-only database access with safe XML exports.
Tags: Rust, MCP, CLI, Rekordbox
Links: [reklawdbox.com](https://reklawdbox.com) | [GitHub](https://github.com/ryan-voitiskis/reklawdbox)

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.

## Crate Guide
URL: https://ryanvoitiskis.com/projects#crate-guide
Summary: DJ-focused vinyl library and session companion with Discogs import, harmonic track suggestions, turntable simulation, and private BPM/key enrichment.
Tags: Nuxt, Vue.js, TypeScript, Supabase
Links: [crate.guide](https://crate.guide) | [GitHub](https://github.com/ryan-voitiskis/crate-guide)

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.

## bpm tap
URL: https://ryanvoitiskis.com/projects#bpm-tap
Summary: Mobile-first tap-tempo PWA for DJs, with touch and keyboard input, resilient live BPM estimates, and a lockable reference tempo.
Tags: Vue.js, TypeScript, PWA, Vite
Links: [Live app](https://bpm-tap-0.netlify.app/) | [GitHub](https://github.com/ryan-voitiskis/bpm-tap)

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
URL: https://ryanvoitiskis.com/projects#panel-layout-generator
Summary: Constraint-aware acoustic panel planner that balances limited colour quantities and avoids matching adjacent panels.
Tags: Vue.js, TypeScript, Pinia, Vite
Links: [Live app](https://panel-layout-generator.netlify.app/) | [GitHub](https://github.com/ryan-voitiskis/panel-layout-generator)

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](https://pinia.vuejs.org/), with the generation logic separated from the interface and covered by automated tests. Colour editing is provided by [vue-accessible-color-picker](https://vue-accessible-color-picker.netlify.app/).
