Your music doesn't belong to a corporation. Take it back.
OLED-black. Styx Cyan. Digital rain. Tidal catalog → your Navidrome library in lossless. Zero compromise.
CHARON is a desktop application that rips music from Tidal and deposits it directly into your self-hosted Navidrome server. Search Tidal's entire catalog — artists, albums, tracks — queue what you want, pick your quality, and CHARON ferries it across the digital river into your personal library.
It's the companion app to AETHER — AETHER plays, CHARON harvests. Two halves of the same system.
Built on Electron with a Python bridge to tiddl and tidalapi. Every pixel matches the Styx Cyan design language — OLED black backgrounds with a monochromatic cyan/teal palette. A multi-layered Tron-style canvas (perspective grid, energy streams, circuit traces, floating particles) drifts behind frosted-glass panels.
SEARCH & BROWSE
├─ Full Tidal catalog search (artists, albums, tracks)
├─ Tabbed search type switcher (Artists / Albums / Tracks)
├─ Artist pages (discography, top tracks, download all)
├─ Album pages (track listing, metadata, artwork)
├─ One-click download entire artist discography
└─ Real-time search with result categorization
DOWNLOAD ENGINE
├─ Quality tiers: Master (MQA/HiRes), Lossless (FLAC CD), High (AAC 320), Normal (AAC 96)
├─ Download queue with per-track progress tracking
├─ Batch operations (queue entire albums/discographies)
├─ Automatic metadata, lyrics & artwork embedding
├─ Downloads continue in background when window is closed
└─ Downloads directly to your Navidrome music directory
NAVIDROME INTEGRATION
├─ Auto-detect running Navidrome instance
├─ Server management (start/stop/restart from within CHARON)
├─ One-click Navidrome installation wizard
├─ Trigger library scan after downloads complete
├─ Server health monitoring & stats
└─ Configuration editor (TOML)
AUTHENTICATION
├─ Tidal OAuth session (via tiddl)
├─ Auto-detect existing tiddl credentials
├─ Token refresh handling
└─ Session status indicator
INTERFACE
├─ OLED-optimized (true #000000 black)
├─ Monochromatic cyan palette (Styx Cyan — 12 shades)
├─ Tron-style canvas background (perspective grid, energy streams, circuit traces)
├─ Glassmorphism panels with frosted-glass layering
├─ Frameless window with custom titlebar
├─ System tray (minimize-to-tray, background downloads)
├─ Animated micro-interactions & card entrance stagger
└─ Responsive layout
┌──────────────────────────────────────────────┐
│ CHARON (Electron) │
│ │
┌─────────┐ │ ┌────────────┐ IPC ┌─────────────┐ │
│ Tidal │◄────┼──│ Python │◄──────────►│ Electron │ │
│ API │────►┼──│ Bridge │ stdin/ │ Main │ │
│ │ │ │ (tidalapi) │ stdout │ Process │ │
└─────────┘ │ └────────────┘ JSON └──────┬──────┘ │
│ │ │
┌─────────┐ │ ┌────────────┐ ┌─────┴──────┐ │
│ tiddl │◄────┼──│ Download │◄─────────────│ Renderer │ │
│ CLI │────►┼──│ Queue │ preload │ (UI) │ │
│ │ │ └─────┬──────┘ bridge └────────────┘ │
└─────────┘ │ │ │
└────────┼──────────────────────────────────────┘
│
▼
┌──────────────────┐
│ Music Library │──► Navidrome Scan
│ (FLAC/MQA) │──► Your Library
└──────────────────┘
| Layer | Technology |
|---|---|
| Runtime | Electron 33 |
| Renderer | Vanilla HTML/CSS/JS (single file) |
| Bridge | Python 3.10+ (JSON IPC over stdin/stdout) |
| Tidal Auth | tiddl (OAuth session management) |
| Tidal API | tidalapi (search, browse, metadata) |
| Download | tiddl CLI (MQA, FLAC, AAC support) |
| Server | Navidrome (Subsonic API) |
| Build | electron-builder (NSIS installer) |
| Design | Canvas 2D Tron background + glassmorphism |
CHARON/
├── main.js # Electron main process — IPC, bridge, queue, Navidrome mgmt
├── preload.js # Context bridge — 19 invoke channels, 3 send channels
├── ripper.html # THE APP — search, browse, queue, settings, digital rain
├── index.html # Website / landing page
├── python/
│ └── charon_bridge.py # Python bridge — tidalapi session, search, metadata
├── package.json # Electron + builder config
├── icon.ico # App icon (cyan on black)
└── .gitignore # Security-first exclusions
Renderer (ripper.html)
│
│ contextBridge (preload.js)
│ 19 invoke channels / 3 send channels
▼
Main Process (main.js)
│
├──► Window controls (minimize, maximize, close)
├──► Settings (get/set, persisted JSON)
├──► Download queue (add, remove, get, clear)
├──► Navidrome (scan, start, stop, install, config, stats)
├──► System (check-deps, open-folder, open-url)
│
└──► Python Bridge (stdin/stdout JSON)
│
├──► search (query, type, limit)
├──► get_artist / get_album / get_track
├──► get_artist_albums / get_artist_top_tracks
├──► auth_status / auth_login
└──► download (url, quality, path)
CHARON follows the Styx Cyan design language — AETHER's twin, shifted from purple to cyan:
/* Backgrounds — true OLED black */
--bg-void: #000000
--bg-surface: #060B0F
--bg-raised: #0A1419
--bg-elevated: #0C1820
/* Cyan scale — single hue, 8 stops */
--cyan-dim: #0D2B36
--cyan-muted: #0E4D64
--cyan-core: #06B6D4
--cyan-bright: #22D3EE
--cyan-vivid: #67E8F9
--cyan-hot: #A5F3FC
--cyan-white: #ECFEFF
/* Tron canvas — perspective grid, energy streams, circuit traces */
/* Floating particles, scanlines, vignette */
/* All panels use glassmorphism (backdrop-filter: blur) */Fonts: Orbitron (display) / Rajdhani (body) / JetBrains Mono (technical)
- Node.js 18+
- Python 3.10+
- tiddl —
pip install tiddl - tidalapi —
pip install tidalapi - A Tidal account (HiFi or HiFi Plus for lossless/MQA)
- Navidrome (optional — for auto-scan after download)
git clone https://github.com/GeneralDussDuss/charon.git
cd charon
npm install
npm start# First, authenticate tiddl with your Tidal account
tiddl
# Follow the OAuth prompts — this creates your session token- Launch CHARON
- Open Settings (gear icon)
- Set your music download directory
- Set your Navidrome server URL (if using)
- Select default quality (Master / Lossless / High / Normal)
- Start searching and ripping
npm run distOutputs to dist/ — NSIS installer for Windows x64.
| Tier | Format | Bitrate | tiddl Flag |
|---|---|---|---|
| Master | MQA / HiRes FLAC | Up to 9216 kbps | master |
| Lossless | FLAC 16-bit/44.1kHz | ~1411 kbps | high |
| High | AAC | 320 kbps | normal |
| Normal | AAC | 96 kbps | low |
CHARON is one half of a two-app ecosystem:
| AETHER | CHARON | |
|---|---|---|
| Purpose | Play your library | Build your library |
| Color | Tron Purple | Styx Cyan |
| Backend | Navidrome (Subsonic API) | Tidal (tidalapi + tiddl) |
| Repo | GeneralDussDuss/aether | You're here |
| Website | aether-player.netlify.app | charon-ripper.netlify.app |
AETHER plays. CHARON harvests. Your music, your server, your rules.
- Tidal search (artists, albums, tracks)
- Artist/album/track detail pages
- Download queue with progress
- Quality selection (Master/Lossless/High/Normal)
- Navidrome server management (start/stop/restart/install)
- Auto-scan Navidrome after downloads
- Styx Cyan design system + Tron background
- Batch artist discography download
- Per-track download progress
- Background downloads (minimize to tray)
- macOS & Linux builds
- Playlist import (Tidal → local)
- Download history & duplicate detection
- Scheduled downloads
- Auto-updater
MIT License. Do whatever you want. Credit appreciated but not required.
Built for OLED. Engineered for digital river crossings. Designed from 2077.
[ CHARON v1.1.0 ]
