-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ
Frequently asked questions and troubleshooting tips.
Yes. GrainLab is completely free, open-source (MIT license), and requires no account or sign-up.
No. GrainLab runs entirely in your browser. Open the live demo and start editing immediately.
JPG · PNG · GIF · WebP · BMP · TIFF
The image is read by the browser's built-in image decoder, so support depends slightly on your browser version.
No. All processing happens locally in your browser using the Canvas API and Web Workers. Your images never leave your device.
Yes. GrainLab stores your full gallery — including the original image data and per-image settings — in your browser's IndexedDB database (grainlab_gallery). They are restored automatically the next time you open the app.
IndexedDB data is tied to the browser profile and origin. It can be lost if you:
- Cleared your browser's site data or cookies.
- Used a private / incognito window (data is cleared when the window closes).
- Switched browsers or browser profiles.
Not with automatic sync. Because all data is stored locally in IndexedDB, each device has its own independent gallery. You can transfer images by exporting them and re-importing on the other device.
Click the ✕ button on each thumbnail in the film strip, or clear the site data for seamys.github.io in your browser's developer tools / privacy settings.
Export processing runs in a Web Worker using OffscreenCanvas at full resolution, which takes longer than the downscaled live preview. The UI remains responsive during export. Processing time scales roughly with the number of pixels in the image.
- Try using a smaller image for editing.
- Disable effects you aren't using (set their intensity to 0 — the pipeline skips them instantly).
- Make sure your browser is hardware-accelerated (check your browser's graphics settings).
Not yet. You can adjust all sliders manually and the settings are saved to localStorage, so they persist across page refreshes. A custom preset save/load feature may be added in a future version.
Both create a glow around bright areas, but:
- Halation simulates the physical phenomenon of light bouncing off the back of the film base — it produces a tight, colored (red, warm, or gold) glow, most visible on specular highlights and backlit scenes.
- Bloom is a larger, softer, color-neutral glow used to give images a dreamy or cinematic quality.
- Fade lifts the black point uniformly — it adds a fixed floor to all dark pixels, simulating overexposed or aged film.
- Shadows (in Color Grading) is a tone-curve-style adjustment that brightens or darkens the shadow range while leaving midtones and highlights relatively untouched.
The preview renders a scaled-down version of the image for speed. Export renders at full resolution. In rare cases, effects that depend on the absolute pixel count (such as grain size or blur radius) may look slightly different at very different resolutions. If you notice a systematic difference, please open a GitHub issue.
git clone https://github.com/seamys/grainlab.git
cd grainlab
npm install
npm run devSee Contributing for the full development guide.
See Adding a Film Preset.
See Localization.
In src/filters/. Each effect is a self-contained module. See Filter Pipeline for an explanation of the processing order.
Yes. GrainLab is a Progressive Web App (PWA) and can be installed on any platform:
- Desktop (Chrome / Edge): click the install icon (⊕) in the address bar.
- Android: tap Add to Home Screen from the browser menu.
- iOS (Safari): tap Share → Add to Home Screen.
Once installed, it opens in its own window without browser chrome, just like a native app.
Yes. After the first visit, all app assets (JS, CSS, images) are cached by the service worker. You can open and use GrainLab with no internet connection. Your gallery is stored in IndexedDB on-device, so your images are always available offline.
The service worker uses autoUpdate mode. When a new version is deployed, the service worker updates itself silently in the background. The new version is active the next time you reload or reopen the app — no manual action needed.
- Close all GrainLab tabs/windows.
- Reopen the app — the updated service worker should now be active.
- If still stale, open DevTools → Application → Service Workers → click Unregister, then reload.
Using GrainLab
Developer Docs