Generate bold, unique, production-ready Spotify playlist cover art from the command line.
CoverForge is a Python CLI tool that produces 3000×3000px playlist cover images with zero design skills required. Every cover is deterministic — the same playlist name always generates the same artwork — but with 14 colour themes, 9 pattern engines, a matte black mode, and 9 text positions, you have complete creative control.
| Cyberpunk + Carbon (Matte) | Obsidian Gold + Hexgrid (Matte) | Glacier Neon + Circuit |
|---|---|---|
![]() |
![]() |
![]() |
| Violet Dusk + Shatter | Deep Abyss + Starfield | Midnight Rose + Waves |
|---|---|---|
![]() |
![]() |
![]() |
- 14 colour themes — Cyberpunk, Matte Black, Obsidian Gold, Glacier Neon, Void Crimson, Violet Dusk, and more
- 9 pattern engines — Carbon fibre, Hex grid, Plasma field, Circuit board, Voronoi shatter, Starfield bokeh, Concentric waves, Scanlines, Geometric mesh
- Matte black mode (
--matte) — kills all background glows, cranks pattern contrast for carbon and hexgrid - 9 text positions — bottom-left, center, top-right, and everything in between
- Smart filenames — theme + pattern + position + matte all reflected in the output filename, never overwrites
- Batch mode — generate all 14 themes in one command with
--theme all - Custom fonts — point at any
.ttf/.otffile or directory, bold and light weights auto-detected - Auto directory creation —
--outputcreates nested paths if they don't exist - 3000×3000px output — Spotify's full native resolution, ready to upload
pip install pillow numpygit clone https://github.com/yourusername/coverforge.git
cd coverforge
pip install pillow numpyNo further setup required. The script auto-detects fonts installed on your system.
CoverForge looks for fonts in this order:
~/.fonts/truetype/google-fonts/— recommended location- System-wide
/usr/share/fonts/— most Linux distros - Any path you pass via
--font
Recommended: Poppins (free, by Google Fonts)
# Download from fonts.google.com/specimen/Poppins
# Extract and place at:
~/.fonts/truetype/google-fonts/Poppins-Bold.ttf
~/.fonts/truetype/google-fonts/Poppins-Light.ttf
Other great free fonts: Raleway, Montserrat, Bebas Neue, Playfair Display — all on Google Fonts.
python3 coverforge.py "Playlist Name" [options]# Auto theme and pattern — deterministic from the name
python3 coverforge.py "Late Night Drive"
# Specific theme
python3 coverforge.py "Chill Vibes" --theme neon
# Specific theme + pattern
python3 coverforge.py "Night City" --theme cyberpunk --pattern carbon
# Matte black background — makes carbon and hexgrid pop
python3 coverforge.py "Night City" --theme cyberpunk --pattern carbon --matte
python3 coverforge.py "Night City" --theme matte --pattern hexgrid --matte
# Custom text position
python3 coverforge.py "Night City" --theme gold --text-pos center
python3 coverforge.py "Night City" --theme neon --text-pos top-right
python3 coverforge.py "Night City" --text-pos br
# Custom font
python3 coverforge.py "Power Hour" --font ~/Downloads/Raleway/
# Save to a specific directory (created automatically)
python3 coverforge.py "Night City" --output ~/Desktop/covers/
# Generate ALL themes at once
python3 coverforge.py "Night City" --theme all --output ./covers/| Flag | Short | Default | Description |
|---|---|---|---|
--theme |
-t |
auto |
Colour theme key, or all. See --list-themes. |
--pattern |
-p |
auto |
Pattern engine key, or auto. See --list-patterns. |
--text-pos |
-x |
bottom-left |
Text block position (see below). |
--matte |
-m |
off | Flat matt black background, high-contrast patterns. |
--font |
-f |
system | Font file or directory path. |
--output |
-o |
cwd | Output file or directory. Created if missing. |
--list-themes |
Print all theme keys and exit. | ||
--list-patterns |
Print all pattern keys and exit. |
Run python3 coverforge.py --list-themes to see the full list, or use any of these keys:
| Key | Name |
|---|---|
auto |
Auto-selected by hashing the playlist name |
matte |
Matte Black |
cyberpunk |
Cyberpunk |
crimson |
Void Crimson |
neon |
Glacier Neon |
gold |
Obsidian Gold |
violet |
Violet Dusk |
forest |
Forest Pulse |
rust |
Rust & Ice |
rose |
Midnight Rose |
chrome |
Arctic Chrome |
solar |
Solar Flare |
abyss |
Deep Abyss |
sakura |
Sakura Mist |
toxic |
Toxic Lime |
Run python3 coverforge.py --list-patterns to see the full list:
| Key | Description |
|---|---|
auto |
Auto-selected by hashing the playlist name |
carbon |
Carbon fibre weave texture |
hexgrid |
Honeycomb hex grid overlay |
plasma |
Smooth sine-wave plasma field |
circuit |
Circuit board traces and nodes |
starfield |
Deep space bokeh starfield |
waves |
Concentric ripple rings |
shatter |
Broken glass / Voronoi shatter |
scanlines |
CRT-style horizontal scanlines |
mesh |
Geometric grid mesh with nodes |
Tip:
carbonandhexgridhave enhanced matte rendering. Use--mattewith these for the best results.
Use --text-pos with any of these values (or their two-letter aliases):
tl (top-left) tc (top-center) tr (top-right)
cl (center-left) c (center) cr (center-right)
bl (bottom-left) bc (bottom-center) br (bottom-right)
[default]
python3 coverforge.py "My Playlist" --text-pos center
python3 coverforge.py "My Playlist" --text-pos tr
python3 coverforge.py "My Playlist" --text-pos bottom-centerFilenames are always unique and self-describing. Non-default options are embedded:
Playlist_Name_theme.png
Playlist_Name_theme_pattern.png
Playlist_Name_theme_pattern_top_right.png
Playlist_Name_theme_pattern_top_right_matte.png
Each cover is built from composited layers:
- Background — radial gradient glows from palette colours (or flat black in matte mode)
- Pattern — the selected procedural engine (carbon, hexgrid, plasma, etc.)
- Geometry — randomised arcs, diagonal lines, glow orb, and accent dots
- Grain — subtle film noise for texture depth
- Vignette — darkened edges to focus attention
- Typography — bold Poppins (or custom font), auto-sized and wrapped, with gradient accent bar and PLAYLIST label
All randomness is seeded from the playlist name — the same name always produces the same image.
Pull requests are welcome. To add a new theme, add an entry to the THEMES dict following the existing structure. To add a new pattern engine, add a pattern_yourname(size, palette, rng) function and register it in PATTERNS and build_pattern_layer.
MIT — free for personal and commercial use.





