Studio-grade background removal tool β entirely in your browser.
Zero uploads. Zero servers. Zero cost per image. Just unmistakable clarity.
LumaCut is a zero-server, zero-latency AI background removal tool that runs the entire inference pipeline directly inside your web browser using WebAssembly and ONNX Runtime Web.
Most background-removal tools upload your images to a cloud server, charge per API call, and introduce latency and privacy risks. LumaCut flips that model completely β the AI model is downloaded once to your device (~40 MB, cached forever), and every subsequent cut happens locally, instantly, and for free.
| Before | After |
|---|---|
![]() |
![]() |
Original .jpg β full background intact |
Transparent .png β subject isolated with hair-fine edge precision |
| Before | After |
|---|---|
![]() |
![]() |
Original .jpg β complex background with crowd and environment |
Transparent .png β subject perfectly separated, even across complex edges |
Both cuts were made using LumaCut in a standard browser window β no server, no API key, no upload.
The AI model (@imgly/background-removal powered by ONNX Runtime Web) runs entirely inside a WebWorker in your browser. Your images never leave your device β not even for a millisecond. This is privacy by architecture, not by policy.
Drop an entire folder of images at once. LumaCut accepts multiple files simultaneously and processes them sequentially in a FIFO queue. A real-time "Processing 2 of 5β¦" indicator keeps you informed while the queue drains.
- Each processed image has its own Download PNG button β one click, instant save.
- When a batch finishes, a "Download All as ZIP" button appears, bundling every transparent PNG into a single archive using
jszipβ generated entirely in memory, no server required.
Every successful cut is automatically saved to IndexedDB via localforage. Your session history survives page reloads, browser restarts, and even device reboots (as long as you're on the same browser). The history card in the Ledger section shows your 5 most recent before/after pairs with relative timestamps.
The very first time you process an image, the browser downloads the ONNX model (~40 MB). LumaCut shows a prominent, frosted-glass loading overlay with a progress bar and byte counter so you always know what's happening. After that, the model is cached in the browser's Cache API and loads instantly forever.
Built with a dark-first editorial design system:
- Glassmorphism cards with
backdrop-blurand layered transparency - Cursor-reveal animation on the Hero β move your mouse to unveil the before/after split with a slanted, spring-eased reveal strip
- Sticky parallax hero β the hero blurs and scales away as you scroll, revealing the workspace beneath
- Fraunces + Inter typography for that editorial editorial premium feel
- Smooth-scroll navigation throughout
| Concern | LumaCut's Answer |
|---|---|
| Where does my image go? | Nowhere. It stays in RAM. |
| Does it need an account? | No. |
| Does it have usage limits? | No. |
| Does it work offline? | Yes, after the first model download. |
| Is the model stored forever? | Yes, in your browser's Cache API. |
Browser
βββ Next.js 16 (Turbopack)
β βββ app/page.tsx β 3-slide page layout
β βββ components/
β β βββ hero-slide.tsx β Cursor-reveal hero
β β βββ workspace-slide.tsx β Processing orchestrator
β β β βββ dropzone.tsx β Multi-file DnD zone
β β β βββ result-card.tsx β Before/after card
β β β βββ model-loader-overlay.tsx
β β β βββ batch-progress-bar.tsx
β β βββ features-slide.tsx β Ledger / session history
β βββ lib/
β βββ bg-removal.ts β @imgly wrapper + progress aggregation
β βββ session-store.ts β localforage IndexedDB layer
β
βββ @imgly/background-removal β ONNX Runtime Web (WASM)
β βββ Fetches model from CDN once, caches in Cache API
β
βββ jszip β In-memory ZIP generation
βββ localforage β IndexedDB abstraction (session history)
Drop image(s)
β
βΌ
Add to queue (status: "queued")
β
βΌ
processOne() β calls removeBackground(file, { progress })
β βββ First call: download ONNX model (~40MB) β ModelLoaderOverlay
β βββ Cached calls: load from Cache API β instant
β
βΌ
Blob + DataURL returned
β
βββ Save to IndexedDB (input + output DataURL)
βββ Update item status β "done"
βββ Drain queue β processOne(next item)
| Layer | Technology |
|---|---|
| Framework | Next.js 16 with Turbopack |
| Language | TypeScript |
| Styling | Tailwind CSS v4 |
| AI Engine | @imgly/background-removal (ONNX Runtime Web) |
| ZIP Export | jszip |
| Persistence | localforage (IndexedDB) |
| Fonts | Inter (UI) + Fraunces (editorial serif) via next/font/google |
| Icons | lucide-react |
- Node.js 18+
- npm, pnpm, or yarn
# Clone the repository
git clone https://github.com/your-username/lumacut.git
cd lumacut
# Install dependencies
npm install
# Start the development server
npm run devOpen http://localhost:3000 in your browser.
- The Hero loads instantly β move your cursor to see the before/after cursor-reveal
- Click "Start your cut" or scroll down to the Workspace section
- Drag one or more images onto the drop zone (or click to browse)
- On your very first image: a loading overlay appears while the AI model downloads (~40 MB, one-time only)
- The background is removed and a transparent PNG result appears
- Click the β¬ download button on any result card, or wait for the full batch then click "Download All as ZIP"
- Scroll to the Ledger section to see your session history (persists across reloads)
npm run build
npm startturbopack: {
resolveAlias: {
// Prevents Turbopack from bundling Node.js-only ONNX backend in browser bundle
'sharp': './lib/empty-shim.js',
'onnxruntime-node': './lib/empty-shim.js',
},
},@imgly/background-removal performs best with SharedArrayBuffer enabled, which requires:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
These are intentionally omitted in the default config to avoid breaking cross-origin assets. The library falls back gracefully to single-threaded WASM, which works excellently for most images. If you need maximum performance for very high-resolution batch processing, you can add these headers selectively to the / route in next.config.mjs.
lumacut/
βββ app/
β βββ globals.css β Design tokens, mesh-checker, animations
β βββ layout.tsx β Font loading, metadata, viewport
β βββ page.tsx β 3-section page layout
βββ components/
β βββ hero-slide.tsx β Slide 1: Cursor-reveal hero
β βββ workspace-slide.tsx β Slide 2: Processing pipeline orchestrator
β βββ features-slide.tsx β Slide 3: Ledger (history + why Luma Cut)
β βββ site-nav.tsx β Sticky glassmorphism navigation
β βββ dropzone.tsx β Multi-file drag-and-drop zone
β βββ result-card.tsx β Before/after comparison card
β βββ model-loader-overlay.tsx β First-run model download overlay
β βββ batch-progress-bar.tsx β Sequential batch progress indicator
βββ lib/
β βββ bg-removal.ts β @imgly wrapper with progress aggregation
β βββ session-store.ts β localforage IndexedDB CRUD
β βββ empty-shim.js β Browser stub for Node.js packages
βββ public/
β βββ girl_2.jpg β Hero demo image (original)
β βββ girl_bgremoved.png β Hero demo image (background removed)
βββ beforeafter/
βββ 8692651.jpg β Lewis Hamilton demo (original)
βββ lumacut_8692651.png β Lewis Hamilton demo (cut out)
Pull requests are welcome. For major changes, please open an issue first.
- Fork the repo
- Create your feature branch:
git checkout -b feature/my-feature - Commit your changes:
git commit -m 'Add some feature' - Push to the branch:
git push origin feature/my-feature - Open a Pull Request
MIT Β© LumaCut contributors
Made with β₯ and WebAssembly Β Β·Β No servers were harmed in the making of this tool.



