A retro desktop widget that displays your currently playing Spotify track as ASCII art in a Teenage Engineering-inspired shell.
Built with Tauri + Rust and the ascii-art conversion engine.
- ASCII album covers — converts album art to colored ASCII in real-time using 7 styles (braille, block, classic, edge, particles, retro-art, terminal)
- TE skin desktop mode — a clean Teenage Engineering-inspired monochrome shell with OLED display, spectrum visualizer, knobs, and transport controls
- Spotify sync — polls the Spotify Web API for currently playing track, artist, album, and progress
- Playback controls — play/pause, next/prev track, shuffle, repeat directly from the widget
- Error resilience — connection loss detection with automatic recovery and visual error indicators
- Desktop widget — frameless, transparent macOS window via pywebview
- Artist fallback — shows artist portrait when no album cover is available
- Auto token refresh — OAuth2 PKCE flow with persistent token storage
Download the latest .dmg from Releases, drag to Applications, and run.
git clone https://github.com/ar-gen-tin/spottt.git
cd spottt
bash setup.sh- Create a Spotify app at developer.spotify.com/dashboard
- Set redirect URI to
http://127.0.0.1:8888/callback - Copy your Client ID
- Set the environment variable:
export SPOTIFY_CLIENT_ID="your_client_id_here"python -m spottt.desktop.appA TE-inspired widget appears on your desktop with an OLED display panel, spectrum visualizer, and transport controls. Play something on Spotify and the ASCII album cover renders on the screen.
python run.pyTerminal mode keys:
| Key | Action |
|---|---|
s / S |
Next / previous ASCII style |
+ / - |
Increase / decrease art size |
0 |
Reset art size to auto |
q |
Quit |
Desktop widget keys:
| Key | Action |
|---|---|
S |
Cycle ASCII style |
K |
Switch viz mode (fullscreen) |
F |
Toggle fullscreen |
Escape |
Exit fullscreen |
Space |
Play / pause |
Arrow Left / Arrow Right |
Previous / next track |
- Authenticates with Spotify via OAuth2 PKCE (no client secret needed)
- Polls
/v1/me/player/currently-playingevery 3 seconds - Downloads album cover from Spotify CDN (
i.scdn.co) - Converts image to ASCII art via the ascii-art pipeline (PIL → brightness grid → style mapping → ANSI colors)
- Renders inside a TE-inspired shell via pywebview (native macOS WebKit)
- Playback controls call Spotify Web API (
/v1/me/player/play,/pause,/next,/previous)
| Style | Description |
|---|---|
| braille | Unicode braille dot patterns — highest detail |
| block | Unicode block elements — chunky retro pixels |
| classic | Density ramp ASCII characters |
| edge | Sobel edge detection outlines |
| particles | Sparse particle scatter |
| retro-art | CRT amber phosphor aesthetic |
| terminal | Green monochrome terminal |
- Python 3.9+
- macOS (pywebview uses WebKit)
- Spotify Premium account (for playback state access)
- Spotify Developer App (free, for Client ID)
- Pillow — image processing
- numpy — array operations
- pywebview — native desktop window
- ascii-art — image to ASCII conversion engine (bundled)
MIT
