Batch background removal that runs entirely in your browser. WebGPU (BiRefNet) with a WASM fallback, guided-filter edges, a brush editor with every model knob exposed. No upload, no account, no watermark. Astro · Svelte · Three.js · onnxruntime-web.
0
stars
31
commits
TypeScript
primary language
Sep 8, 2026
updated
Batch background removal that runs entirely in the browser. Drop one image or a hundred; the model runs on your own GPU, the cutouts come back as transparent PNGs, and nothing is ever uploaded. No account, no watermark, no server.
Free and open source under the MIT licence.

git clone https://github.com/lightScout/light-converter
cd light-converter
npm install # also copies the onnxruntime WASM runtime into public/ort
npm run models # one-time: downloads and converts the two models (~160 MB in public/models)
npm run dev # http://localhost:4321
npm run models needs Python 3 with:
pip install onnx onnxruntime onnxconverter-common sympy
It downloads the original checkpoints from the authors' GitHub releases, converts BiRefNet to fp16 and quantises IS-Net to int8, and writes both into public/models/. The fp16 conversion takes a few minutes. Model files are git-ignored; they are never committed.
Production build:
npm run build # static output in dist/
npm run preview
The site is static — any host works. Two things matter:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
The dev and preview servers set them in astro.config.mjs. On Cloudflare Pages put them in a _headers file; on Netlify in netlify.toml; on nginx with add_header. Without them the WASM path still works, just single-threaded.public/models/ is ~160 MB. Serve it with long cache headers; the browser keeps a copy in Cache Storage after the first load anyway.| Layer | Choice |
|---|---|
| Framework | Astro 7 with ClientRouter for client-side navigation |
| Islands | Svelte 5 (runes) |
| 3D | Three.js — the landing hero and the ambient scene on every page |
| Inference | onnxruntime-web in a Web Worker |
| Scroll | Lenis with snap points on the landing |
| Storage | IndexedDB (batches) + Cache Storage (model bytes) |
src/
pages/ landing (/) and the app (/app, /app/batch, /app/batches, /app/settings)
layouts/ Base.astro (fonts, ClientRouter) · App.astro (rail, HUD, status bar)
components/ Frame, Loader, Scene, Spot, Star — the HUD vocabulary
islands/
hero3d.ts the Three.js scene: cut-out card, 11 SDF subjects, ribbons, beats
DropZone.svelte drop / paste / pick → creates a batch
BatchView.svelte the batch workspace, tiles, Preview / Edit / Download
Viewer.svelte preview + edit modes, brushes, model panel
Recent.svelte recent batches, with progress inside the card
lib/
remover.ts main-thread API: removeBackground(src, params), warmUp(), onStatus()
remover.worker.ts the pipeline: model load, inference, second look, fusion, cleanup
refine.ts guided-filter alpha refinement
batches.ts, db.ts, download.ts, scramble.ts
styles/global.css tokens and the shared HUD classes
scripts/
get-models.sh downloads + converts the models
copy-ort.mjs copies the onnxruntime WASM runtime into public/ort (runs on postinstall)
Every knob in that pipeline (sensitivity, secondLook, boost, cleanup, fillHoles, edge) is a RunParams field, and the Edit view's Model panel lets you change them and run again.
?backend=wasm or ?backend=webgpu on any app page forces a backend.?subject=0…10 on the landing pins a specific cut-out subject in the hero.| Model | Licence | Source |
|---|---|---|
| BiRefNet (swin_v1_tiny) | MIT | ZhengPeng7/BiRefNet |
| IS-Net (DIS) | Apache-2.0 | xuebinqin/DIS, ONNX export via rembg |
The code in this repository is MIT. The models keep their own licences.
Issues and pull requests are welcome. A few things that would help most:
Please keep the visual language of the app — minimal copy, few elements — when adding UI. src/styles/global.css has the tokens and shared classes.
31 commits
TypeScript
50.9%
Svelte
26.2%
Astro
14.2%
CSS
6.8%
Batch background removal that runs entirely in your browser. WebGPU (BiRefNet) with a WASM fallback, guided-filter edges, a brush editor with every model knob exposed. No upload, no account, no watermark. Astro · Svelte · Three.js · onnxruntime-web.
0
stars
31
commits
TypeScript
primary language
Sep 8, 2026
updated
Batch background removal that runs entirely in the browser. Drop one image or a hundred; the model runs on your own GPU, the cutouts come back as transparent PNGs, and nothing is ever uploaded. No account, no watermark, no server.
Free and open source under the MIT licence.

git clone https://github.com/lightScout/light-converter
cd light-converter
npm install # also copies the onnxruntime WASM runtime into public/ort
npm run models # one-time: downloads and converts the two models (~160 MB in public/models)
npm run dev # http://localhost:4321
npm run models needs Python 3 with:
pip install onnx onnxruntime onnxconverter-common sympy
It downloads the original checkpoints from the authors' GitHub releases, converts BiRefNet to fp16 and quantises IS-Net to int8, and writes both into public/models/. The fp16 conversion takes a few minutes. Model files are git-ignored; they are never committed.
Production build:
npm run build # static output in dist/
npm run preview
The site is static — any host works. Two things matter:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
The dev and preview servers set them in astro.config.mjs. On Cloudflare Pages put them in a _headers file; on Netlify in netlify.toml; on nginx with add_header. Without them the WASM path still works, just single-threaded.public/models/ is ~160 MB. Serve it with long cache headers; the browser keeps a copy in Cache Storage after the first load anyway.| Layer | Choice |
|---|---|
| Framework | Astro 7 with ClientRouter for client-side navigation |
| Islands | Svelte 5 (runes) |
| 3D | Three.js — the landing hero and the ambient scene on every page |
| Inference | onnxruntime-web in a Web Worker |
| Scroll | Lenis with snap points on the landing |
| Storage | IndexedDB (batches) + Cache Storage (model bytes) |
src/
pages/ landing (/) and the app (/app, /app/batch, /app/batches, /app/settings)
layouts/ Base.astro (fonts, ClientRouter) · App.astro (rail, HUD, status bar)
components/ Frame, Loader, Scene, Spot, Star — the HUD vocabulary
islands/
hero3d.ts the Three.js scene: cut-out card, 11 SDF subjects, ribbons, beats
DropZone.svelte drop / paste / pick → creates a batch
BatchView.svelte the batch workspace, tiles, Preview / Edit / Download
Viewer.svelte preview + edit modes, brushes, model panel
Recent.svelte recent batches, with progress inside the card
lib/
remover.ts main-thread API: removeBackground(src, params), warmUp(), onStatus()
remover.worker.ts the pipeline: model load, inference, second look, fusion, cleanup
refine.ts guided-filter alpha refinement
batches.ts, db.ts, download.ts, scramble.ts
styles/global.css tokens and the shared HUD classes
scripts/
get-models.sh downloads + converts the models
copy-ort.mjs copies the onnxruntime WASM runtime into public/ort (runs on postinstall)
Every knob in that pipeline (sensitivity, secondLook, boost, cleanup, fillHoles, edge) is a RunParams field, and the Edit view's Model panel lets you change them and run again.
?backend=wasm or ?backend=webgpu on any app page forces a backend.?subject=0…10 on the landing pins a specific cut-out subject in the hero.| Model | Licence | Source |
|---|---|---|
| BiRefNet (swin_v1_tiny) | MIT | ZhengPeng7/BiRefNet |
| IS-Net (DIS) | Apache-2.0 | xuebinqin/DIS, ONNX export via rembg |
The code in this repository is MIT. The models keep their own licences.
Issues and pull requests are welcome. A few things that would help most:
Please keep the visual language of the app — minimal copy, few elements — when adding UI. src/styles/global.css has the tokens and shared classes.
31 commits
TypeScript
50.9%
Svelte
26.2%
Astro
14.2%
CSS
6.8%