Nothing leaves the tab
There is no upload endpoint. The image is decoded into a canvas and fed to the model in page memory — no server ever receives a pixel.
Real-ESRGAN super-resolution running entirely in the browser through WebGPU. Your image is never uploaded, never queued, and never sees a server — the model runs on your GPU, in your tab.
curl -fsSL https://chopstickshq.com/upscaler/install.sh | bash
> adapter apple metal-3 > model 2x-ESRGAN.onnx > backend webgpu (local) > upload none — stays in tab > in 300 × 180 > out 600 × 360 > status done █
The first run downloads the model (~68 MB) and your browser caches it. Everything after that is local compute.
Most “AI upscalers” upload your photo to a GPU somewhere and bill per job. This one ships the network to you instead.
There is no upload endpoint. The image is decoded into a canvas and fed to the model in page memory — no server ever receives a pixel.
ONNX Runtime Web executes the graph on your GPU. WebGPU needs static shapes, so each tile is padded to one fixed size the session is compiled for.
Large images are cut into tiles with a 16 px overlap so the network sees real context past every edge, then the valid core of each tile is stitched back.
The same ESRGAN weights the desktop build uses, so browser output is identical to the CLI — verified pixel-for-pixel, not assumed.
Browser upscaling is images only for now — a single 1080p frame takes long enough that a video would run for days in a tab. The macOS build uses CoreML and is roughly 7× faster, with FFmpeg handling decode, audio and container.
720p, 1080p, 1440p and 4K. Height is exact; width follows the source aspect ratio. 8K is coming soon.
The original audio track is stream-copied and the frame rate is carried through, so nothing drifts. MP4 or MOV out, regardless of what went in.
Encoding goes through VideoToolbox on Apple silicon rather than a software encoder.
1080p → 4K is a clean ×2. That means the whole jump is done by the network, with no plain resize afterwards. Targets that aren't an exact ×2 or ×4 finish with a lanczos pass.
curl -fsSL https://chopstickshq.com/upscaler/install.sh | bash
Apple silicon on macOS 13 or later, and roughly 1.5 GB free. Intel Macs are refused outright rather than installed and left broken — the model runs through CoreML. A shell running under Rosetta is caught too.
SHA-256 checked before anything is unpacked. A mismatch aborts with nothing installed.
Everything lands in ~/.local/share/chopsticks-upscaler. If your Mac has no usable Python — the Xcode stub doesn't count — the script fetches a checksum-verified one just for this app, without touching your PATH.
upscaler in ~/.local/bin, plus Upscaler.app in ~/Applications — a native SwiftUI app with drag-and-drop, live progress and a video preview. No launch agents, no login items, nothing running in the background.
| upscaler | web UI on 127.0.0.1:7860 |
| upscaler image | −i in.png −o out.png −s 4 |
| upscaler video | −i in.mp4 −o out.mp4 −r 1080p |
| upscaler uninstall | removes everything |
| App | ~/Applications/Upscaler.app |
| Engine | ~/.local/share/chopsticks-upscaler |
| Command | ~/.local/bin/upscaler |
| Weights | ~/.cache/video-upscaler |
| sudo | never asked |
| Telemetry | none |
FFmpeg is only needed for video. The installer checks for it and tells you if it's missing; image upscaling works either way. Uninstalling is upscaler uninstall — it removes the app, the command and the cached weights.
| Browser | Chrome / Edge 113+, Safari 18+ |
| GPU | Any WebGPU adapter |
| Model download | ~68 MB, cached after first run |
| Input | PNG, JPG, WebP, GIF (first frame) |
| Output | PNG, JPG, WebP at ×2 or ×4 |
| Account | not required |
| OS | macOS 13+, Apple silicon only |
| Backend | ONNX Runtime + CoreML |
| Video | FFmpeg decode / encode |
| Interface | SwiftUI app, web UI, two CLIs |
| Speed | ~7× the browser build |
| Install | one line, no sudo |
WebGPU image upscaling at ×2 and ×4 with overlapped tiling, PNG/JPG/WebP download, and output verified identical to the CoreML desktop build. The macOS install adds a native SwiftUI app, video upscaling with 720p–4K targets, and the web UI.