Tools for DJs and the people who book them, built on the AT Protocol. Each tool stands on its own; they share an Atmosphere account, a lexicon tree (computer.localnetwork.*), and file formats.
| Tool | What it is | Built with |
|---|---|---|
| Local Network | The website at localnetwork.computer: promoters find local DJs, DJs keep a profile, bookings run in private spaces | SvelteKit, atproto spaces |
| locallibrary | A command line tool and terminal player that keeps rekordbox USB drives in sync, backed up and edited | Rust |
| localtoolbox | A Chrome extension for digging on SoundCloud: track lists, download links, artists' socials, and a queue to batch them | Svelte, Manifest V3 |
apps/web/ Local Network, the website (its README covers setup and deployment)
apps/locallibrary/ locallibrary's command line tool, player and sidecar, with its docs
apps/localtoolbox/ localtoolbox, the Chrome extension (its README is also its spec, checked by its tests)
lexicons/ Every tool's lexicons (computer.localnetwork.*); others' they use are fetched as published
crates/ Rust libraries: locallibrary's core and the loclib-* crates other DJ tools can use
plugins/ locallibrary's own plugins, each a crate on its plugin SDK
packages/tokens/ Shared colours for DJ data
packages/atstore/ Makes each tool's AT Store listing pictures (pnpm atstore)
vendor/ Vendored Rust crates
tools/oxlint/ The vendored anti-slop Oxlint plugin, for every TypeScript app
The repo root is both the pnpm workspace and the Cargo workspace, so commands run from here.
packages/tokens/colors.json holds the colours that mean the same thing wherever DJ data is drawn: waveform bands, phrase kinds, cue defaults, track colours, good, warning and critical, and the playhead. The website imports it, and crates/loclib-model/src/tokens.rs is generated from it for the player and the HTML report (LOCALLIBRARY_BLESS=1 cargo test -p loclib-model --test tokens regenerates it).
The TypeScript apps need the Node.js version in .node-version (24) and pnpm. fnm picks up .node-version for you: run fnm install, then fnm use, or set up its shell hook (eval "$(fnm env --use-on-cd)") to switch on cd. The website's local network needs Docker (or OrbStack) running.
pnpm install # every TypeScript app's dependencies and the git hooks
pnpm dev # the website on a local network with demo accounts (http://127.0.0.1:5173), and the extension's watch build
pnpm verify # each app's format, lint, type check, tests and build, and the lexicons' format
pnpm atstore # each tool's AT Store icon, hero and screenshots (packages/atstore)
cargo build # locallibrary
cargo test --workspace --lockedThe TypeScript apps share one lint config (.oxlintrc.json, which each app's own extends) and one format config (.oxfmtrc.json). CI runs each tool's checks only when its files (or the shared ones) change, and comments on a pull request with each tool's coverage and, for the website and the extension, its size against main. The slow suites (mutation testing, fuzzing, the website in every browser, the CLI's timings, a release build) run weekly, in the *-scheduled.yml workflows; a weekly run that fails opens an issue, which the next one that passes closes.
Read .github/CONTRIBUTING.md before opening a pull request.
Adding an app or plugin covers the whole stack (development, tests, CI, production and releases) and every place a new app or locallibrary plugin is registered.
MIT, see LICENSE.