Fixes (post-launch)
Queue stuck / auto-restart — items stuck at `processing` or `loading` status (e.g. after navigating away mid-inference) are now automatically reset to `queued` on next mount; processing resumes immediately without a page reload
Worker crash recovery — a 10-minute hard timeout and `onerror` handler on the inference worker now guarantee that a stalled Best Quality model download or unexpected worker crash surfaces as a clear error message instead of freezing the queue forever
Live progress labels — the queue now shows human-readable status during model download ("Downloading model…", "Starting…") instead of staying at 0% during the first Best Quality inference
Editor blank canvas — when the AI returns a near-zero mask (socks in packaging, low-contrast subjects), the editor now shows the original image with a "No foreground detected" overlay instead of a blank transparent canvas; the overlay now also suggests switching to Best Quality mode
Low-foreground hint in queue — after a Fast mode result with < 1% foreground, the queue row shows an amber hint recommending Best Quality mode for that image
Edge refinement presets — two new one-click presets: "Soft edges" (hair/fur/feathers) and "Hard edges" (logos/products); "Reset to defaults" button now correctly restores decontamination ON state
PNG export CPU encoder — switched from `OffscreenCanvas.convertToBlob` to `HTMLCanvasElement.toBlob` (CPU path) to fix a Chromium/Windows GPU driver bug that silently produced JPEG bytes in PNG exports; magic-byte verification now aborts export if encoding fails instead of delivering a corrupt file
React #185 root causes fixed — primitive Zustand selector in `page.tsx` prevents re-triggering on every inference progress tick; `startTransition` in Canvas RAF callbacks prevents synchronous flush cascades
Processing stability — fixed infinite re-render loop (React #185) that could stall the queue and crash ZIP export
Session restore — prompt now appears at most once per tab session; restored items no longer duplicate if the page is revisited
Gradient and image backgrounds — these now render correctly in the editor canvas and in exported files (previously fell through to transparent)
Export pipeline consolidated — all export paths (quick-download, export panel, batch ZIP) now go through a single `exportImage()` function; magic-byte verification and alpha integrity check run on every export
Export panel redesigned — radio-button format selector with per-format descriptions; JPG automatically composites background; export button shows "Done ✓" confirmation for 3 s after success
Quick-download fixed — the queue-list PNG button previously used an unverified `convertToBlob()` path that could silently produce corrupt output; now routes through `exportImage()` with full verification
Canvas rendering fixed — stale closure bug caused edge refinement sliders, background changes, and preview mode to not update the canvas; fixed with a render-frame ref pattern
Editor auto-fit — guarded against negative zoom if container dimensions are not yet available on first paint
Clear all — now requires confirmation to prevent accidental queue wipes
Editor back navigation — "← Queue" link added to the editor title bar; returns to the queue without removing any images
No-foreground warning — when the AI returns a near-empty mask (complex outdoor scenes, cluttered backgrounds), the editor now shows a "No foreground detected" overlay with guidance to use the Restore brush
Best Quality model auth error — `RMBG-2.0` requires accepting a free HuggingFace licence; the app now fails fast on 401/403 with a clear message instead of retrying three times
What's new
This is the initial public release of NSS Background Remover.
AI Upscaler (new tool)
Standalone `/upscale` page — drop any image and upscale 2× or 4× with Swin2SR AI super-resolution; all processing is 100% local, no upload
Tile-based processing — large images are split into 512×512 tiles, processed sequentially with progress feedback; images up to any size are supported
2× mode — full AI super-resolution using Swin2SR; model (~47 MB) downloads once and caches in the browser
4× mode — AI 2× upscale followed by bicubic 2× for 4× total output; faster than two full AI passes
Export panel integration — "Export & Upscale ×2/×4" button in the editor export panel chains: remove background → export → AI upscale → download
Queue quick-action — "↑ Upscale" button on every completed BG removal queues the image in the AI Upscaler with one click
Navigation — "Upscaler" added to the top navigation bar and Product menu
Core features
AI background removal — RMBG-1.4 (Fast) and RMBG-2.0 (Best Quality) models running locally via Transformers.js
WebGPU acceleration — 1–5 second inference on supported browsers; WASM fallback for Firefox and older Safari
True straight alpha export — verified PNG, WebP, and AVIF exports; automated integrity check on every file
Brush tool — erase and restore with adjustable size (1–500 px), hardness, and opacity
Edge refinement — feather, smooth, expand/contract, decontaminate colour spill
Background replacement — transparent, solid colour, gradient, or image
Batch processing — up to 20 images with ZIP export
Session persistence — IndexedDB auto-save; resume session on reload
PWA support — install as app; works offline after first model download
HEIC support — iPhone photos converted via WASM before processing
Privacy
All processing is 100% local — images never leave the browser
No account required
GDPR-compatible cookie consent (PIPEDA-first)
Transparency verification
Every export passes an automated alpha integrity check:
Decodes the exported blob back into pixel data
Samples 100 pixels where the mask was semi-transparent
Verifies alpha values are soft (not binary) and RGB is not zeroed
Shows a warning if the check fails — before the file downloads
Browser support
| Browser | Support |
|---------|---------|
| Chrome 94+ | Full (WebGPU) |
| Edge 94+ | Full (WebGPU) |
| Firefox 90+ | Good (WASM) |
| Safari 16.4+ | Good (WASM / WebGPU on Safari 18+) |
| iOS Safari 16+ | Supported (slower) |