A beautiful, cross-platform music player built with Tauri v2, React 18, TypeScript, and Rust.
- Universal Playback: MP3, FLAC, WAV, AAC, OGG, OPUS, ALAC, AIFF, WMA, APE
- Gapless Playback with Symphonia decoder
- 10-Band Equalizer with real-time visualization
- Recursive Library Scanning with hierarchical folder view
- Metadata Extraction: Title, Artist, Album, Year, Genre, Bitrate, Cover Art
- Vinyl Turntable View with rotating disc & tonearm animation
- Reflection Bar Visualizer with mirrored frequency bars
- Adaptive Gradient Background from album art colors
- Custom Theming with preset colors & color pickers
- Media Session API integration for system controls
- Keyboard Shortcuts for power users
- Cross-platform: Windows, macOS, Linux (mobile-ready architecture)
- Frontend: React 18, TypeScript, Vite, Tailwind CSS, Zustand
- Backend: Tauri v2, Rust (symphonia, rodio, lofty)
- Audio: Web Audio API + native rodio/cpal backend
- Visualization: Canvas 2D with requestAnimationFrame
- Node.js 18+
- Rust 1.75+
- Tauri CLI:
cargo install tauri-cli
# Install dependencies
npm install
# Start dev server (frontend)
npm run dev
# Run Tauri app (in another terminal)
npm run tauri dev# Build for production
npm run tauri buildceol/
├── src/ # Frontend (React + TypeScript)
│ ├── components/ # React components
│ │ ├── LibraryView.tsx # Hierarchical library browser
│ │ ├── PlayerControls.tsx # Playback controls
│ │ ├── VinylView.tsx # Vinyl turntable visualization
│ │ ├── VisualizerView.tsx # Reflection bar visualizer
│ │ ├── NowPlayingBar.tsx # Bottom playback bar
│ │ ├── SettingsPanel.tsx # Settings modal
│ │ └── GradientBackground.tsx # Animated background
│ ├── hooks/ # Custom React hooks
│ ├── store/ # Zustand state management
│ ├── utils/ # Helper functions
│ ├── shared/types.ts # Shared TypeScript types
│ ├── styles/globals.css # Tailwind + custom styles
│ ├── App.tsx # Main app component
│ └── main.tsx # Entry point
├── src-tauri/ # Backend (Rust)
│ ├── src/
│ │ ├── main.rs # Tauri entry point
│ │ ├── audio.rs # Audio engine (rodio/symphonia)
│ │ ├── metadata.rs # Metadata extraction (lofty)
│ │ ├── cover.rs # Cover art processing
│ │ ├── commands.rs # Tauri command handlers
│ │ └── state/ # App state management
│ ├── Cargo.toml # Rust dependencies
│ └── tauri.conf.json # Tauri configuration
├── package.json
├── tsconfig.json
├── vite.config.ts
├── tailwind.config.js
└── index.html
| Key | Action |
|---|---|
| Space | Play/Pause |
| → / ← | Next/Previous track |
| Shift+→ / Shift+← | Seek forward/backward 10s |
| Ctrl+→ / Ctrl+← | Seek forward/backward 30s |
| ↑ / ↓ | Volume up/down |
| M | Mute toggle |
| S | Shuffle toggle |
| R | Repeat toggle |
Settings are stored in platform-specific config directories:
- Linux:
~/.config/ceol/ - macOS:
~/Library/Application Support/ceol/ - Windows:
%APPDATA%\ceol\
MIT