Remove image backgrounds entirely in your browser. Free, no account, no upload — your photos never leave your device. FAST (MODNet) and PRO (BEN2) modes, batch up to 20 images, transparent PNG or custom background. Public Beta .
HTML
2
28 commits
updated Oct 15, 2026
Remove image backgrounds in your browser. Free, no account, no upload, no watermark. The AI model runs on your own device, so your photos never leave it.
Live site: https://scadavide55.github.io/cutout/
Status: public beta. Four engines, tested on a MacBook Air (M5) and a Samsung Galaxy A25. Not yet verified on enough other devices or browsers, see Beta status.
There is no build step, no dependency and no backend: one static index.html (inline CSS and
JavaScript) plus a tiny service worker.
Main Reason : remove.bg is going away and wanted to make my own alternative. Most background removers upload your photo to a server, then cap the resolution, add a watermark, ask for an account or charge per image. Cutout has no server to receive anything and charges nothing. Its size limits exist only to keep your own browser tab from running out of memory.
.zip| Low | Medium | High | Ultra | |
|---|---|---|---|---|
| Model | MODNet | BEN2 compact (int8) | BEN2 | BEN2, two passes |
| Download | 25.9 MB on GPU, 6.6 MB on CPU | 130 MB | 223 MB | 223 MB (shared with High) |
| Runs on | GPU first, CPU fallback | GPU first, computer CPU fallback | GPU only | GPU only |
| Phone (4 GB) | works, GPU | off | off | off |
| Licence | Apache-2.0 | MIT | MIT | MIT |
Every engine tries WebGPU first. CPU is a last resort, used only where it is safe: Low falls back to a small quantized model, Medium falls back on computers only, and High and Ultra never use the CPU because their memory needs exceed what a tab can allocate.
Details:
Cast and Mul nodes, because the standard DequantizeLinear operator misbehaves on
ONNX Runtime's WebGPU backend. It is off on low-memory phones: on a 4 GB Galaxy A25 it froze the tab even on the GPU.An engine is shown as unavailable, with a reason, when WebGPU is missing, the GPU's buffer limit is too small, or the browser reports too little memory. These checks are heuristics, not a guarantee that every driver can run the model. Only one model session is kept in memory; switching engines releases the previous one (High and Ultra share one).
Decoded images may be up to 24 MP on desktop and 12 MP on phones or low-memory devices, at most 8192 px per side. A batch may total 48 MP (desktop) or 24 MP (mobile). Images over the limit get a readable error rather than a silent downscale. Exports keep the original resolution.
sw.js only adds the Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers
that GitHub Pages cannot send, enabling multi-threaded WebAssembly. It caches nothing and never
sees your images. The first visit may reload once.| Piece | Source |
|---|---|
| MODNet (float and quantized) | huggingface.co/Xenova/modnet |
| BEN2 compact (int8) | huggingface.co/Davide531/ben2-int8 |
| BEN2 | huggingface.co/PramaLLC/BEN2 |
| ONNX Runtime Web 1.24.3 | cdn.jsdelivr.net/npm/onnxruntime-web |
Why the runtime is pinned. ONNX Runtime Web 1.22 computed BEN2 wrongly on the GPU (corrupted masks) while the same models were fine natively. 1.24.3 is the version verified here. Re-test before changing it.
No analytics, no cookies, no accounts, no telemetry. Images are decoded, processed and encoded in memory on your device and are never uploaded or stored. The page does contact the CDNs above to fetch the runtime and models, which tells them the site was used, like any site that loads a library.
https:// or localhost. Plain http:// on a LAN address
cannot use it.python3 server.py 8080 # this machine only
python3 server_lan.py 8080 # also reachable from a phone on the same Wi-Fi
Both serve only the site's own files and send the isolation headers.
Any static host works. Keep index.html, sw.js and og.png at the root. For GitHub Pages:
push to main, then Settings → Pages → Deploy from a branch → main → / (root).
Verified on 14 Oct 2026 (release check, reproduce with tests/README.md):
Not verified: other phones and GPUs, Safari, Firefox, older drivers, and mixed batches near the size limits. Results are good enough to use, not guaranteed. Please report bugs in Issues.
Website code: Apache-2.0, see LICENSE. The models and libraries downloaded at runtime keep their own licences (MODNet Apache-2.0; BEN2, the int8 BEN2 build and ONNX Runtime Web MIT).
Built by scadavide55. Model weights by the MODNet and BEN2 authors, repackaged for the browser by Xenova and PramaLLC. Inference by ONNX Runtime Web.
Remove image backgrounds entirely in your browser. Free, no account, no upload — your photos never leave your device. FAST (MODNet) and PRO (BEN2) modes, batch up to 20 images, transparent PNG or custom background. Public Beta .
HTML
2
28 commits
updated Oct 15, 2026
Remove image backgrounds in your browser. Free, no account, no upload, no watermark. The AI model runs on your own device, so your photos never leave it.
Live site: https://scadavide55.github.io/cutout/
Status: public beta. Four engines, tested on a MacBook Air (M5) and a Samsung Galaxy A25. Not yet verified on enough other devices or browsers, see Beta status.
There is no build step, no dependency and no backend: one static index.html (inline CSS and
JavaScript) plus a tiny service worker.
Main Reason : remove.bg is going away and wanted to make my own alternative. Most background removers upload your photo to a server, then cap the resolution, add a watermark, ask for an account or charge per image. Cutout has no server to receive anything and charges nothing. Its size limits exist only to keep your own browser tab from running out of memory.
.zip| Low | Medium | High | Ultra | |
|---|---|---|---|---|
| Model | MODNet | BEN2 compact (int8) | BEN2 | BEN2, two passes |
| Download | 25.9 MB on GPU, 6.6 MB on CPU | 130 MB | 223 MB | 223 MB (shared with High) |
| Runs on | GPU first, CPU fallback | GPU first, computer CPU fallback | GPU only | GPU only |
| Phone (4 GB) | works, GPU | off | off | off |
| Licence | Apache-2.0 | MIT | MIT | MIT |
Every engine tries WebGPU first. CPU is a last resort, used only where it is safe: Low falls back to a small quantized model, Medium falls back on computers only, and High and Ultra never use the CPU because their memory needs exceed what a tab can allocate.
Details:
Cast and Mul nodes, because the standard DequantizeLinear operator misbehaves on
ONNX Runtime's WebGPU backend. It is off on low-memory phones: on a 4 GB Galaxy A25 it froze the tab even on the GPU.An engine is shown as unavailable, with a reason, when WebGPU is missing, the GPU's buffer limit is too small, or the browser reports too little memory. These checks are heuristics, not a guarantee that every driver can run the model. Only one model session is kept in memory; switching engines releases the previous one (High and Ultra share one).
Decoded images may be up to 24 MP on desktop and 12 MP on phones or low-memory devices, at most 8192 px per side. A batch may total 48 MP (desktop) or 24 MP (mobile). Images over the limit get a readable error rather than a silent downscale. Exports keep the original resolution.
sw.js only adds the Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy headers
that GitHub Pages cannot send, enabling multi-threaded WebAssembly. It caches nothing and never
sees your images. The first visit may reload once.| Piece | Source |
|---|---|
| MODNet (float and quantized) | huggingface.co/Xenova/modnet |
| BEN2 compact (int8) | huggingface.co/Davide531/ben2-int8 |
| BEN2 | huggingface.co/PramaLLC/BEN2 |
| ONNX Runtime Web 1.24.3 | cdn.jsdelivr.net/npm/onnxruntime-web |
Why the runtime is pinned. ONNX Runtime Web 1.22 computed BEN2 wrongly on the GPU (corrupted masks) while the same models were fine natively. 1.24.3 is the version verified here. Re-test before changing it.
No analytics, no cookies, no accounts, no telemetry. Images are decoded, processed and encoded in memory on your device and are never uploaded or stored. The page does contact the CDNs above to fetch the runtime and models, which tells them the site was used, like any site that loads a library.
https:// or localhost. Plain http:// on a LAN address
cannot use it.python3 server.py 8080 # this machine only
python3 server_lan.py 8080 # also reachable from a phone on the same Wi-Fi
Both serve only the site's own files and send the isolation headers.
Any static host works. Keep index.html, sw.js and og.png at the root. For GitHub Pages:
push to main, then Settings → Pages → Deploy from a branch → main → / (root).
Verified on 14 Oct 2026 (release check, reproduce with tests/README.md):
Not verified: other phones and GPUs, Safari, Firefox, older drivers, and mixed batches near the size limits. Results are good enough to use, not guaranteed. Please report bugs in Issues.
Website code: Apache-2.0, see LICENSE. The models and libraries downloaded at runtime keep their own licences (MODNet Apache-2.0; BEN2, the int8 BEN2 build and ONNX Runtime Web MIT).
Built by scadavide55. Model weights by the MODNet and BEN2 authors, repackaged for the browser by Xenova and PramaLLC. Inference by ONNX Runtime Web.