A beautiful, minimalist music player with built-in guitar tuner and chord library. Built with Tauri for desktop and deployable to web via Vercel.
- Play audio files (MP3, WAV, OGG, FLAC, M4A)
- Responsive layout:
- Mobile: Sliding playlist drawer from bottom (60px collapsed, 80% expanded)
- Desktop: Two-column layout (400px controls + playlist)
- Playback modes: Repeat One, Repeat All, Shuffle (PlaylistController class)
- Playlist management:
- Multi-select with checkboxes for bulk removal
- Automatic deduplication (uses file path as ID)
- Context menu for track operations (reorder, remove)
- Save and load playlists (
.jplformat)
- Playback controls: Previous, Play/Pause, Next with SVG icons
- Seek slider with current/total time displays
- Volume control with mute toggle and dynamic SVG icon
- Animated gradient background during playback (purple/blue tones)
- Automatic track duration detection
- Strip file extensions from track names for cleaner display
- Real-time pitch detection from microphone
- 6 guitar tuning presets (button grid selector)
- Large, centered tuner display
- Visual cents indicator (Β±50 cents range)
- Active listening indicator (fading green dot)
- String reference display with active highlighting
- Dimmed display when inactive (opacity-based feedback)
- Standardized chords across all tunings
- Root notes: C, D, E, F, G, A, B (button grid)
- Chord variants: Major, Minor, 7, m7, Maj7 (button grid)
- No inversions (all root position for simplicity)
- Button-based selectors throughout (no dropdowns)
- Reusable TuningSelector component (shared with Tuner tab)
- Interactive fretboard visualization
- Vertical orientation (traditional chord shape display)
- Flip button to reverse string order
- Chord selection persists across tuning changes
- Clean, minimalist black theme (#000 background)
- Styled-components for all UI (CSS-in-JS)
- Responsive: Mobile-first with tablet/desktop enhancements
- Mobile: Sliding playlist drawer from bottom (60px collapsed, 80% expanded)
- Desktop: Two-column layout (400px player controls + playlist)
- Tab-level scrolling configuration
- Feature-based architecture for maintainability
- Desktop: Native Tauri app (macOS, Windows, Linux)
- Web: Deployable to Vercel via Vite build
- Platform-agnostic services (FileService, StorageService)
- Environment detection (EnvironmentService)
- Dynamic imports for Tauri APIs (web build compatibility)
- Space: Play/pause current track
- Arrow Right (β): Skip forward 5 seconds
- Arrow Left (β): Skip backward 5 seconds
- Cmd/Ctrl + 1: Switch to Player tab
- Cmd/Ctrl + 2: Switch to Tuner tab
- Cmd/Ctrl + 3: Switch to Chords tab
Before you begin, ensure you have the following installed:
- Clone the repository:
git clone <your-repo-url>
cd jota- Install dependencies:
npm installRun the Tauri desktop app:
npm run tauri devThis will start the Vite dev server and launch the Tauri app.
Run the web version:
npm run devThe app will be available at http://localhost:5173
Build the desktop app for your platform:
npm run tauri buildThe built application will be available in src-tauri/target/release.
Build for web deployment:
npm run buildDeploy to Vercel:
vercel --prodSee DEPLOY.md for detailed deployment instructions.
If you modify the icon SVG, regenerate all formats:
./scripts/icon.shRequires ImageMagick to be installed:
brew install imagemagickjota/
βββ src/ # React source files
β βββ App.tsx # Main app entry (12 lines)
β βββ App.styles.ts # App-level styled components
β βββ main.tsx # React entry point
β βββ styles.css # Global CSS reset
β βββ features/ # Feature-based modules
β β βββ navigation/ # Tab management (3 tabs: Player, Tuner, Chords)
β β β βββ Navigation.tsx # Main navigation component
β β β βββ Navigation.styles.ts # Tab bar and content styles
β β βββ player/ # Music player
β β β βββ PlayerTab.tsx # Main player container with state
β β β βββ Playlist.tsx # Playlist UI with multi-select
β β β βββ PlaylistController.ts # Playback logic (repeat, shuffle, history)
β β β βββ *.styles.ts # Responsive styled components
β β βββ tuner/ # Guitar tuner & chords
β β βββ Tuner.tsx # Pitch detection tuner
β β βββ ChordsTab.tsx # Chord library viewer (separate tab)
β β βββ TuningSelector.tsx # Reusable button grid tuning selector
β β βββ Fretboard.tsx # Chord visualization (vertical/flipped)
β β βββ chords.ts # Chord database (6 tunings)
β β βββ usePitchDetection.ts # Pitch detection hook
β β βββ *.styles.ts # Styled components
β βββ shared/ # Shared utilities
β βββ components/ # Reusable UI components
β β βββ Button.tsx # Button variants (primary, ghost, danger, text)
β β βββ Icons.tsx # SVG icons (playback, volume, chevron)
β β βββ ContextMenu.tsx # Right-click menus
β β βββ Select.tsx # Dropdown select
β β βββ Modal.tsx # Modal dialogs
β βββ types/ # Track interface (with displayName)
β βββ FileService.ts # Platform-agnostic file handling
β βββ FileService.tauri.ts # Desktop file operations
β βββ FileService.web.ts # Web file operations
β βββ StorageService.ts # Platform-agnostic storage
β βββ StorageService.tauri.ts # Desktop storage
β βββ StorageService.web.ts # Web storage (localStorage)
β βββ EnvironmentService.ts # Platform detection
βββ src-tauri/ # Tauri backend
β βββ src/
β β βββ main.rs # Rust main file
β βββ icons/ # App icons
β β βββ icon.svg # Source SVG icon
β β βββ *.png, *.icns, *.ico # Generated icons
β βββ Cargo.toml # Rust dependencies
β βββ tauri.conf.json # Tauri configuration
β βββ entitlements.plist # macOS microphone permissions
βββ scripts/
β βββ icon.sh # Icon generation script (ImageMagick)
βββ index.html # HTML entry point
βββ vite.config.ts # Vite configuration
βββ vercel.json # Vercel deployment config
βββ package.json # Node dependencies
βββ README.md # This file
βββ DEPLOY.md # Deployment guide
βββ ARCHITECTURE.md # Architecture documentation
βββ PROJECT_SUMMARY.md # Comprehensive project summary
- Top Bar: Switch between Player, Tuner, and Chords tabs
- Mobile: Tabs span full width
- Desktop: Side-by-side layout with responsive controls
Desktop Layout:
- Left column (400px): Album cover (200Γ200), track title, seek slider, playback controls (prev/play/next), repeat/shuffle buttons, volume control
- Right column: Full playlist with checkboxes and controls
Mobile Layout:
- Main area: Vertically centered album cover (150Γ150), track title, seek slider, playback controls, repeat/shuffle, volume
- Bottom drawer: Sliding playlist (collapsed = 60px, expanded = 80% of screen)
- Header always shows: "Playlist (X)", chevron toggle, "+ Add", "β―" menu
- Tap chevron to expand/collapse
Features:
- Add tracks: Click "+ Add" to select audio files (auto-deduplication)
- Play tracks: Click any track in the playlist
- Select tracks: Check boxes on the left of each track
- Remove tracks: Select multiple tracks β "Remove (X)" button appears
- Seek: Drag slider or click to scrub through track
- Volume: Slider + mute button (SVG icon changes based on level)
- Repeat modes: None β Repeat All β Repeat One (cycle)
- Shuffle: Random playback with history for "previous"
- Context menu: Right-click tracks for move up/down/remove
- Save/Load: "β―" menu β Load or Save playlist (.jpl format)
- Visual feedback: Animated gradient background during playback
- Select a guitar tuning from the button grid
- Click "Start Tuner" to begin pitch detection
- Play a note on your guitar near the microphone
- The tuner displays detected note, frequency, and cents deviation
- String reference notes highlight when matched
- Display dims when inactive (full opacity when listening)
- A green dot on the Tuner tab indicates active listening
- Select tuning: Choose from 6 guitar tuning presets (button grid)
- Select root note: Click one of 7 natural notes (C-B)
- Select variant: Choose chord type (Major, Minor, 7, m7, Maj7)
- View fretboard: Chord shape displays automatically
- Flip orientation: Toggle vertical string order
- Persistence: Chord selection preserved across tuning changes (resets only if chord doesn't exist in new tuning)
- Tauri v1: Lightweight desktop application framework
- React 18: UI library with hooks
- TypeScript: Type-safe JavaScript
- Vite: Fast build tool and dev server
- Styled-Components: CSS-in-JS for component styling
- Web Audio API: Pitch detection and audio analysis
- Rust: Backend for file system and dialog operations
- Vercel: Web deployment platform
MIT
Contributions are welcome! Please feel free to submit a Pull Request.