Silhouette is the JumpStation image preprocessing pipeline. It prepares visual assets — app icons, sprites, UI artwork — for use on JumpStation devices by normalizing them to device-appropriate formats, resolutions, and color depths.
Every image that ships inside a JumpBundle or is displayed in the launcher passes through Silhouette at build time. The goal is that no runtime image processing is needed on-device; assets arrive ready to render.
App icons on JumpStation use a transparent or solid-color compositing model. Silhouette can detect and remove backgrounds from source artwork, producing clean subject-only images suitable for layered UI rendering.
Supported techniques:
Many JumpStation devices have constrained display capabilities — limited color depth, indexed palettes, or monochrome outputs. Silhouette remaps images to a target palette at build time so the launcher and runtime never need to perform color conversion.
Supported modes:
Assets are resized and cropped to standard dimensions defined by the target device profile. Standard icon sizes are defined in each device profile under devices/<device-name>/.
Silhouette exports processed images in the format expected by the target device:
Source Image
│
▼
[preprocessing.py]
- Load and validate source
- Normalize orientation (EXIF rotation)
- Convert to working color space
│
▼
[extractor.py]
- Background removal
- Alpha mask generation
- Edge sharpening
│
▼
[preprocessing.py]
- Resize to target dimensions
- Apply palette reduction
- Output format conversion
│
▼
Processed Asset (embedded in JumpBundle)
core/silhouette/preprocessing.pyHandles ingestion, normalization, resizing, palette reduction, and export. This is the outer shell of the pipeline — it calls into extractor.py for the extraction stage.
core/silhouette/extractor.pyHandles the background removal and alpha extraction stage. Accepts an image array and a target extraction mode, returns an RGBA image with the background separated.
from core.silhouette.preprocessing import SilhouettePipeline
pipeline = SilhouettePipeline(device_profile="jumpcade")
output = pipeline.process("source_icon.png", mode="extract_bg")
output.save("icon_processed.png")