WebGPU · runs on your machine

Upscaler — sharper,
on your own GPU

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

v0.1.0 · Apple silicon  ·  no sudo  ·  no Xcode

webgpu Upscaler — local session
> adapter      apple metal-3
> model        2x-ESRGAN.onnx
> backend      webgpu (local)
> upload       none — stays in tab
> in           300 × 180
> out          600 × 360
> status       done █
Live

Upscale something

The first run downloads the model (~68 MB) and your browser caches it. Everything after that is local compute.

Scale
Download as
Tile

Pick an image to start.

source
result
How it works

The model runs on your hardware

Most “AI upscalers” upload your photo to a GPU somewhere and bill per job. This one ships the network to you instead.

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.

WebGPU, not WASM

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.

Overlapped tiling

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.

Real-ESRGAN

The same ESRGAN weights the desktop build uses, so browser output is identical to the CLI — verified pixel-for-pixel, not assumed.

Video

Video runs on the desktop build

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.

Resolution targets

720p, 1080p, 1440p and 4K. Height is exact; width follows the source aspect ratio. 8K is coming soon.

Audio and timing preserved

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.

Hardware encode

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.

Install

One line, no password

curl -fsSL https://chopstickshq.com/upscaler/install.sh | bash
1 · Checks your Mac

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.

2 · Verifies the download

SHA-256 checked before anything is unpacked. A mismatch aborts with nothing installed.

3 · Builds a private environment

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.

4 · Adds one command

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.

Using it

upscalerweb 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 uninstallremoves everything

What it touches

App~/Applications/Upscaler.app
Engine~/.local/share/chopsticks-upscaler
Command~/.local/bin/upscaler
Weights~/.cache/video-upscaler
sudonever asked
Telemetrynone

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.

Specs

What you need

Browser build

BrowserChrome / Edge 113+, Safari 18+
GPUAny WebGPU adapter
Model download~68 MB, cached after first run
InputPNG, JPG, WebP, GIF (first frame)
OutputPNG, JPG, WebP at ×2 or ×4
Accountnot required

macOS build

OSmacOS 13+, Apple silicon only
BackendONNX Runtime + CoreML
VideoFFmpeg decode / encode
InterfaceSwiftUI app, web UI, two CLIs
Speed~7× the browser build
Installone line, no sudo
Changelog

Releases

v0.1.0 — browser preview

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.

Copied