Emberify
Apply Ember color palettes to any image.
Palette & Docs · embertheme.com
What it does
Emberify recolors images using the Ember palette — 19 carefully chosen colors spanning warm graphite, coral, gold, olive, sage, steel, rose, and mauve.
emberify photo.png -c ember
Output: photo-ember-colorized.png
Install
The recommended way to install emberify is using pipx
pipx install emberify
# With GPU acceleration (Apple Silicon / NVIDIA):
pipx install 'emberify[gpu]'
Usage
# Auto-generated output: filename-{palette}-colorized.ext
emberify photo.jpg -c ember-light
# Custom output path
emberify photo.jpg -c ember -o output.png
# Adjust recolor strength (0.0 = original, 1.0 = full)
emberify photo.jpg -c ember-light -s 0.7
# Aggressive mode with more clusters for better accuracy
emberify photo.jpg -c ember -m aggressive -k 20
# GPU acceleration (requires aggressive mode)
emberify photo.jpg -c ember -m aggressive --use-gpu
Palettes
| Palette | Background | Type |
|---|---|---|
ember |
#1c1b19 |
dark |
ember-soft |
#242320 |
dark |
ember-light |
#e6dac4 |
light |
ember-lighter |
#e8e4de |
light |
Modes
Aggressive mode (-m aggressive)
Uses K-means clustering to analyze the image before recoloring.
How it works:
- K-means finds the 12 dominant colors in your image (configurable with
-k) - Each dominant color is mapped to its nearest Ember palette color (RGB Euclidean distance)
- Every pixel is reassigned to its cluster's mapped palette color
- Strength controls the blend between original and recolored
Result: Colors group naturally — sky areas stay coherent, skin tones stay unified. Best for photos and complex images.
Fast mode (-m fast)
Direct pixel-by-pixel RGB nearest-color mapping — no clustering, no filters. Each pixel independently maps to the closest Ember palette color using Euclidean distance in RGB space.
How it works:
- For each pixel, compute Euclidean distance to all palette colors in RGB space
- Replace the pixel with the nearest palette color
Result: Maximum detail preservation — edges, gradients, fine lines stay sharp. Best for anime, illustrations, line art, or when speed matters.
GPU acceleration (--use-gpu)
When --use-gpu is passed, K-means clustering runs on the GPU with smart downsampling — clusters on a 200K-pixel subset, then assigns all pixels vectorized.
Supported backends (auto-detected via pyopencl):
| Backend | Hardware | Package |
|---|---|---|
| cuML | NVIDIA GPU | cuml-cu12 |
| PyTorch MPS | Apple Silicon | torch |
| PyTorch CUDA | NVIDIA GPU | torch |
| sklearn | CPU fallback | (always available) |
Performance (5304×7952 image, 12 clusters):
| Backend | Time |
|---|---|
| CPU (sklearn) | ~127s |
| GPU (Apple MPS) | ~8s |
Key differences
| Aggressive | Fast | |
|---|---|---|
| Algorithm | K-means → cluster mapping | Direct RGB nearest-color |
| Speed | Slower (clustering pass) | Fastest (vectorized) |
| Accuracy | Higher (cluster coherence) | Good (per-pixel) |
| Best for | Photos, complex scenes | Anime, illustrations, line art |
| Control | -k clusters, -s strength |
-s strength only |
| GPU | --use-gpu supported |
CPU only |
Showcase
GPU acceleration (high-resolution)
CPU only (same image)
Fast mode (simple image)
As you can see, when processing a high-resolution image, GPU mode significantly accelerates the process.
This feature has been tested on Apple Silicon GPUs; it should also work on NVIDIA. If you encounter any issues with your GPU, feel free to open an issue.
License
GPL-3.0 — JesusChapman
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file emberify-0.1.0.post1.tar.gz.
File metadata
- Download URL: emberify-0.1.0.post1.tar.gz
- Upload date:
- Size: 8.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57f59c64bd26c0cd74f4401305e995985dc512d5075d277ffad542ce3c59538d
|
|
| MD5 |
ea7963e39b8b116ecb1f36a4d6c6ec90
|
|
| BLAKE2b-256 |
65dcddbe8e9999a00deb956f170363ff9c8e40ac4b42dc618c4cf5502ddea2ac
|
File details
Details for the file emberify-0.1.0.post1-py3-none-any.whl.
File metadata
- Download URL: emberify-0.1.0.post1-py3-none-any.whl
- Upload date:
- Size: 9.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07b9b2d3331f0efb49f4c80fdbfd8c26d0c9ae0de7e14c60d33e1f2682670b78
|
|
| MD5 |
b7e1135039f2e17a7ecb0c6c4a91ceea
|
|
| BLAKE2b-256 |
3004e5a7a69f40cfd236cc962431924c4a896a5fafc39e7f7060ef195a7756a7
|