A real-time bloom/glow effect tool for images. Works as a standalone web app, a Photopea plugin, or a Photoshop plugin.
- Threshold-based highlight isolation — extracts the brightest parts of an image to use as a glow source
- Layered bloom — stacks multiple blur passes with screen blending for a natural, cinematic glow
- Full control — adjust threshold, depth, radius, brightness, saturation, hue shift, colorization, and anamorphic stretch
- Presets — built-in presets (Soft Haze, Jedi, Cinematic, Sunset) plus import/export of custom presets
- Live preview — see changes in real time with adjustable preview quality
- Multi-platform — runs standalone in the browser, as a Photopea plugin, or as a Photoshop plugin
- Node.js 18+
- npm (comes with Node.js)
git clone https://github.com/lunalgraphics/superbloom.git
cd superbloom
npm installnpm run devOpens a dev server at http://localhost:5173.
# Standalone web app
npm run build
# Photoshop plugin variant
npm run build:photoshopThe standalone build outputs to build/. The Photoshop build outputs to webview-contents/.
npm run preview- Open the app in your browser
- Click Upload Image to load a photo
- Adjust the controls in the right panel
- Click Export Full Image or Export Bloom Layer
- In Photopea, go to More → Plugins → SuperBloom
- The active document is loaded automatically
- Adjust settings and click Add to Document to insert the bloom as a new layer
Requires Adobe Photoshop 2022 (v23.3+) and the UXP Developer Tool.
- Build the plugin UI:
npm run build:photoshop - Open the UXP Developer Tool
- Click Add Plugin and select
photoshop-plugin/manifest.json - Click Load — the SuperBloom panel appears under Plugins → SuperBloom
- Open a document, click New SuperBloom Layer, adjust settings, and click Finish
The bloom is inserted as a Smart Object with Screen blending. You can re-edit it later by selecting the layer and clicking Edit Selected Layer.
See photoshop-plugin/README.md for full architecture details.
Presets are JSON files that store effect parameters. Built-in presets live in src/lib/presets/. You can export your current settings as a preset file and import presets from disk.
{
"threshold": 222,
"glowLayers": 16,
"glowRadius": 1,
"colorize": false,
"tintcolor": "#FF5500",
"saturation": 100,
"hue": 0,
"tintopacity": 100,
"brightness": 100,
"anamorph": 0
}src/
├── lib/
│ ├── assets/ # Banner, cover art, icon
│ ├── bloom.js # Core bloom rendering pipeline
│ ├── presets.js # Preset serialization and validation
│ ├── components/
│ │ ├── Controls.svelte # Effect parameter UI panel
│ │ └── LandingScreen.svelte # Upload / loading splash screen
│ ├── presets/ # Built-in preset JSON files
│ └── scripts/
│ └── isolate-highlights.js # Pixel-level highlight extraction
├── routes/
│ ├── +layout.js # Enables prerendering
│ └── +page.svelte # App shell (wires components + platform logic)
photoshop-plugin/
├── index.html # UXP panel markup
├── index.js # UXP host logic (pixel transfer, Smart Object creation)
├── manifest.json # UXP plugin manifest
├── icons/ # Plugin icons
└── webview-contents/ # (generated) SvelteKit build for the webview
static/ # Favicon, plugin icon
See CONTRIBUTING.md for guidelines on how to contribute.
MIT © Yikuan Sun