Sound Snackboard

A playful “audio bento box” where users assemble short sound clips (tap-to-play pads) into looping mini soundscapes, with each pad showing a simple visual meter and a label. Users can create multiple boards, set loop length, adjust per-pad volume/mute/solo, and save/share boards via a compact JSON export/import string (plus localStorage persistence). The UI is split into clear components: Board List, Pad Grid, Transport Controls (play/stop/tempo/loop), Pad Editor (label/color/volume), and Export/Import modal.

To Do30
Scaffold Vite app

Run: npm create vite@latest . -- --template react-ts && npm i && npm i -D tailwindcss postcss autoprefixer && npx tailwindcss init -p && npm i class-variance-authority clsx tailwind-merge lucide-react && npx shadcn@latest init

by system

Add Tailwind globals

Configure Tailwind content + add @tailwind directives in src/index.css.

by system

Add shadcn utils

Create src/lib/utils.ts with cn() helper for Tailwind class merging.

by system

Define app types

Add src/types/soundboard.ts defining Board, Pad, TransportState, and export/import schema types.

by system

Seed clip library

Create src/data/clips.ts exporting a small list of built-in sound clip URLs/labels for pads.

by system

LocalStorage helpers

Add src/lib/storage.ts with load/save functions and schema versioning.

by system

Board store hook

Implement src/state/useBoards.ts for CRUD boards, select active board, and persist to localStorage.

by system

Transport store hook

Implement src/state/useTransport.ts for play/stop, tempo, loop length, and playhead position.

by system

Audio engine skeleton

Create src/audio/engine.ts with AudioContext init, master gain, and pad player registry.

by system

Clip loading utility

Add src/audio/loadAudioBuffer.ts to fetch/decode audio into AudioBuffers in the browser.

by system

Pad playback scheduler

Implement src/audio/scheduler.ts to loop-trigger active pads based on transport tempo/loop length.

by system

Per-pad gain control

Add src/audio/padGain.ts to apply per-pad volume and mute/solo routing into the audio graph.

by system

Peak meter analyzer

Create src/audio/meter.ts exposing a lightweight analyser node and function to read RMS/peak for UI.

by system

App layout shell

Implement src/App.tsx with a two/three-column layout wiring placeholders for main UI sections.

by system

Board list component

Create src/components/BoardList.tsx to show boards, select active, add, rename, and delete.

by system

Transport controls UI

Create src/components/TransportControls.tsx with play/stop, tempo input, and loop length selector.

by system

Pad grid component

Create src/components/PadGrid.tsx rendering pads in a responsive grid for the active board.

by system

Pad tile component

Create src/components/PadTile.tsx for tap-to-play, label display, color, and mini meter bar.

by system

Pad meter hook

Implement src/hooks/usePadMeter.ts to subscribe to analyser updates and return normalized meter level.

by system

Pad interaction logic

Add src/hooks/usePadActions.ts to handle pad trigger, toggle enabled, and select for editing.

by system

Pad editor panel

Create src/components/PadEditor.tsx to edit selected pad label, color, assigned clip, and volume.

by system

Mute/solo controls

Add src/components/PadMuteSolo.tsx with per-pad mute/solo toggles integrated with pad state.

by system

Volume slider component

Create src/components/PadVolumeSlider.tsx using shadcn Slider to edit a pad’s gain value.

by system

Loop length selector

Create src/components/LoopLengthSelect.tsx for choosing bars/beats and updating transport state.

by system

Tempo input control

Create src/components/TempoInput.tsx with clamped numeric input and step buttons.

by system

Export/import codec

Implement src/lib/codec.ts to serialize/deserialize boards to a compact JSON string with validation.

by system

Export/import modal UI

Create src/components/ExportImportModal.tsx with text area, copy/paste buttons, and error display.

by system

Share actions wiring

Add src/components/BoardShareButtons.tsx to open the modal and export/import the active board.

by system

Keyboard shortcuts

Implement src/hooks/useHotkeys.ts for space play/stop and number keys to trigger pads.

by system

Polish empty states

Add src/components/EmptyState.tsx for no boards/no pads selected and wire into App sections.

by system

In Progress0
In Review0
Done0