UpRes (upres-cli)
AI image and video upscaling MCP server and CLI up to 8K across 14 specialist neural models.
Documentation
upres-cli
Official CLI + SDK for upres.ai — image, video, and speech restoration. One API, 14 public aliases, up to 8K output.
$ upres upscale photo.jpg --model flare --scale 4
Submitting job... model=flare
Job created: 550e8400-e29b-41d4-a716-446655440000 (status: pending)
Waiting for result.......
Downloading to photo_upscaled.jpg... done.
Result: photo_upscaled.jpg
Why we built this
- Topaz is $200/yr, desktop-only, no API, no automation
- Upscayl is great for one-offs but can't handle bulk exports or CI pipelines
- Every other SaaS upscaler either watermarks your output, caps resolution at 2K, or charges per image with no monthly plan
upres.ai gives you a clean REST API, 14 public aliases, batch processing, and predictable pricing starting at $9/mo on the Creator launch deal.
Quickstart
Node.js
npx upres-cli upscale photo.jpg
Or install globally:
npm install -g upres-cli
upres upscale photo.jpg --model lumen --scale 8 --output photo_8k.jpg
Python
pip install upres-ai
upres upscale photo.jpg --model flare --scale 4
Authentication
- Sign up at upres.ai (free — 5 upscales/month)
- Go to upres.ai/account/api-keys
- Generate a key — it's shown once
export UPRES_API_KEY=upres_yourkey
Or save permanently:
mkdir -p ~/.config/upres
echo '{"apiKey":"upres_yourkey"}' > ~/.config/upres/config.json
Key resolution order: --api-key flag → UPRES_API_KEY env var → ~/.config/upres/config.json
Commands
# Upscale a single image (local file or URL)
upres upscale photo.jpg --model flare --scale 4
upres upscale photo.jpg --model lumen --scale 8 --output out.jpg
upres upscale https://example.com/photo.jpg --model prism
# Upscale video (AI-generated video from Sora, Kling, Runway etc.)
upres upscale clip.mp4 --model motion --scale 4
# Batch upscale a folder
upres batch ./photos/ --model flare --output ./upscaled/ --concurrency 5
# List available models
upres models
# List recent jobs
upres jobs --limit 20 --status completed
# Account / quota info
upres account
Node.js SDK
import { UpresClient } from "upres-cli";
const client = new UpresClient(); // reads UPRES_API_KEY from env
// Upscale a local file
const job = await client.createJobFromFile("photo.jpg", {
model: "flare",
scale: 4,
});
// Wait for completion
const completed = await client.waitForJob(job.id);
// Download result
await client.downloadResult(completed, "photo_4k.jpg");
console.log("Done:", completed.result_url);
Files over 50 MB are automatically uploaded via TUS resumable protocol.
Python SDK
from upres import UpresClient
with UpresClient() as client: # reads UPRES_API_KEY from env
job = client.create_job_from_file(
"photo.jpg",
model="flare",
scale=4,
)
completed = client.wait_for_job(job["id"])
client.download_result(completed, "photo_4k.jpg")
print("Done:", completed["result_url"])
The Python SDK uses httpx — async-ready, no heavy dependencies.
Examples
| Example | What it does |
|---|---|
| batch-upscale-folder.js | Upscale all images in a folder with configurable concurrency |
| restore-photo-folder.py | Restore old/scanned photos with Lumen |
| ecommerce-pipeline.js | Product image pipeline: raw shots → 4K → publish-ready |
| lightroom-export-hook.md | Auto-upscale Lightroom exports via post-processing hook |
| figma-plugin-stub.md | Figma plugin integration guide |
Models
14 public aliases across image, video, and speech. Each one tells you up front whether it invents detail or leaves your file alone. Aliases that do not enlarge ignore --scale.
| Alias | Kind | Best for |
|---|---|---|
flare | Image | Everyday photos, fastest default |
prism | Image | Text, logos, product shots — keeps edges true |
lumen | Image | Maximum detail recovery for print, up to 8x |
mirage | Image | Invents new detail — art and hero images |
hush | Image | Faithful denoise, same size as the source |
keen | Image | Deblur and sharpen, same size |
visage | Image | Faces only, does not enlarge |
atelier | Image | Hush, Visage if a portrait, then Lumen |
motion | Video | Fast 4K finish for AI video |
motion-x | Video | Cinema-grade, for film and commercials |
still | Video | Temporal denoise, resolution stays put |
cadence | Video | Frame interpolation, does not enlarge |
atelier-x | Video | Still, then Motion X |
voice | Speech | Speech denoise to 48 kHz. Not for music |
Full model catalogue: upres.ai/models · Live spec: api.upres.ai/v1/openapi.json
Pricing
| Plan | Price | Includes | API | Watermark |
|---|---|---|---|---|
| Free | $0 | 5 upscales/mo | — | Yes |
| Creator | $9/mo (launch deal, was $19) | 50 stills + 20 min 4K video/mo | — | No |
| Studio | $39/mo | 250 stills + 90 min 4K video/mo | Yes | No |
Studio tier unlocks the full API, batch processing, and no output watermark.
Compare plans → · vs. Topaz → · vs. Upscayl →
MCP (Claude, Cursor, Hermes)
claude mcp add upres -- npx -y github:auroracapital/upres-cli mcp
Or in claude_desktop_config.json / Cursor:
{
"mcpServers": {
"upres": {
"command": "npx",
"args": ["-y", "github:auroracapital/upres-cli", "mcp"],
"env": { "UPRES_API_KEY": "upres_yourkey" }
}
}
}
Tools: upres_list_models, upres_get_credits, upres_upscale_image, upres_upscale_video, upres_enhance_audio, upres_get_job.
Free tier for open-source projects
If you're building something open-source on top of the API, email support@upres.ai with your repo link. We offer 500 ops/month for qualifying OSS projects.
Error handling
The SDK handles these errors automatically:
| Status | Behavior |
|---|---|
401 | Prints API key error + link to key management, exits |
402 | Prints quota exceeded + link to pricing, exits |
429 | Prints rate limit message (60 req/min), exits |
5xx | Throws UpresError with message |
In Python: raises AuthError, QuotaExceededError, or UpresError.
Contributing
See CONTRIBUTING.md. Tests run with:
# Node
npm test
# Python
pip install -e ".[dev]"
pytest tests/test_client.py -v
License
MIT — see LICENSE