Upload images with resumable parallel-chunk transfers and upscale them using AI via WaveSpeed.ai.
- Resumable uploads — tus protocol with auto-resume across sessions
- Parallel chunks — files split into 5 parts uploaded simultaneously for max bandwidth
- Progress tracking — real-time upload progress with retry on failure
- AI upscaling — WaveSpeed Real-ESRGAN (2x / 4x) at $0.0024 per image
- Side-by-side preview — compare original and upscaled before downloading
| Layer | Tech |
|---|---|
| Frontend | React 19, Tailwind CSS v4, Uppy Dashboard |
| Upload | tus protocol via @uppy/tus + @tus/server |
| Backend | Express, Node.js HTTP server |
| AI | WaveSpeed.ai REST API (Real-ESRGAN) |
| Deploy | Render (render.yaml included) |
git clone https://github.com/auroracapital/image-upscaler.git
cd image-upscaler
npm install
cp .env.example .env # add your WaveSpeed API key
npm run dev # client on :5173, server on :3001| Variable | Required | Default | Description |
|---|---|---|---|
WAVESPEED_API_KEY |
Yes | — | Your WaveSpeed API key |
WAVESPEED_UPSCALE_MODEL |
No | wavespeed-ai/real-esrgan |
Model path (browse models) |
PORT |
No | 3001 |
Server port |
- Fork or push this repo
- Create a new Web Service on Render
- Connect your repo — Render auto-detects
render.yaml - Set
WAVESPEED_API_KEYin environment variables - Deploy
Browser Server WaveSpeed
│ │ │
├─ tus PATCH (5 chunks) ──►│ │
│ parallel, resumable │ │
│◄── upload complete ──────│ │
│ │ │
├─ POST /api/upscale ─────►├─ POST /media/upload ─────►│
│ │◄── download_url ──────────│
│ ├─ POST /real-esrgan ───────►│
│◄── { taskId } ──────────│◄── { id, status } ────────│
│ │ │
├─ GET /api/upscale/:id ──►├─ GET /predictions/:id ───►│
│◄── { status, outputs } ──│◄── result ───────────────│
MIT