Super Metroid Colors - Browser-Based ROM Palette Patcher
A browser-based palette patcher for Super Metroid. Upload a ROM, toggle color effects, preview palettes in real-time, and download a patched ROM. Everything runs client-side — your ROM is never uploaded anywhere.
Try it live at supermetroidcolors.com.
The source code can be found on GitHub.
This is a companion tool to SMEDIT, my desktop Super Metroid ROM editor. Where SMEDIT gives you full control over rooms, tiles, sprites, and patches, Super Metroid Colors focuses on one thing: making it dead simple to re-color your ROM.
How It Works
Upload a .smc or .sfc ROM file. The app reads all palette data directly from the ROM binary — Samus suit palettes, beam colors, boss palettes, and LZ5-compressed tileset palettes for every environment in the game.
Pick an effect, and the palette preview updates instantly. Effects are applied per-category (Samus, Environment, Beams, Bosses), or you can click individual palette regions to override effects on a per-region basis. When you're happy, hit Download and get a patched ROM with corrected checksums, ready to play.
The ROM is stored in your browser's local storage between sessions so you don't have to re-upload each time.
Effects
There are 33 color effects, all operating on SNES BGR555 color values:
| Effect | Description |
|---|---|
| Grayscale | Luminance-weighted desaturation |
| Sepia | Warm brownish tone |
| Invert | Flip all color channels |
| Dark | Halve all channel values |
| Game Boy | 4-shade green palette |
| Red / Blue / Green Tint | Boost one channel, suppress others |
| Golden | Warm gold/amber tones |
| Ice Cold | Cool blue-white frost |
| Lava | Hot red-orange gradient |
| Underwater | Deep blue-green tint |
| Midnight | Very dark with a blue cast |
| Neon | Threshold each channel to 0 or max |
| Neon Pink | Luminance-mapped hot pink |
| Psychedelic | Triple the hue + boost saturation |
| Vaporwave | Pink-purple aesthetic |
| Pastel | Lighten and desaturate |
| Hue +90 / +180 / +270 | Rotate hue in HSV space |
| Hypersaturated / Desaturated | Saturation multiplier |
| Rainbow | Map index position to hue wheel |
| Cyberpunk | Hot pink + electric blue by luminance |
| Complementary / Triadic | Shift hue by 180 or 120 degrees |
| Acid Trip | Extreme hue warp + full saturation |
| Thermal | Heat-map: dark=blue, mid=red, bright=yellow |
| Hologram | Iridescent green-blue-purple |
| Random Chaos | Fully randomized RGB values |
| Ghost 10/25/50% | Randomly zero out colors for transparency |
Effects can be stacked. Apply Game Boy + Dark for a dim handheld look, or Psychedelic + Hypersaturated for something truly unhinged.
Per-Region Overrides
Click any palette card in the preview grid to select it. When a region is selected, effect toggles apply only to that region instead of the whole category. This lets you do things like give Samus a pink Power Suit while keeping the Varia Suit golden, or make Brinstar psychedelic while Norfair stays vanilla.
You can also edit individual colors directly. Click any swatch in the palette preview to open a BGR555 color picker with R/G/B sliders (0-31 range, matching the SNES hardware) and hex input.
Fully Randomize
Hit the "Fully Randomize" button and each palette region gets 1-2 random colorful effects assigned independently. Every Samus suit, every tileset, every beam — all different. It filters out effects like Grayscale and Dark that would flatten things, keeping results vibrant.
Environment Palettes
Beyond the uncompressed Samus/beam/boss palettes, Super Metroid Colors handles the LZ5-compressed tileset palettes that define every room's environment colors. The app decompresses all unique tilesets on ROM load, previews them as 8x16 swatch grids (8 sub-palettes of 16 colors each), and re-compresses them at export time.
This is what lets you turn Crateria ice-blue, Maridia golden, and Norfair cyberpunk — the environment colors that make up the vast majority of what you see on screen.
Map Rando Support
Super Metroid Colors auto-detects Map Rando ROMs. Map Rando stores palette data differently — expanded banks with raw (uncompressed) palette data instead of LZ5-compressed tilesets. The app reads palette entries from the expanded banks, deduplicates them, and patches them in place.
Compatibility
| ROM | Status |
|---|---|
| Super Metroid (Vanilla) | Supported |
| Containment Chamber | Supported |
| SM Map Rando | Supported |
| ROM Hacks built with SMILE | Supported |
| SM Arcade | Not yet supported |
Tech Stack
Built with React 19, TypeScript, and Vite. All ROM manipulation happens in the browser — palette reads, LZ5 decompression/recompression, effect application, checksum fixing, and ROM export. No server, no dependencies beyond the frontend.
Tests use Vitest for unit tests and Playwright for end-to-end tests.
Gallery
Arrived
Ninja Turdle