UpRes (upres-cli)

AI image and video upscaling MCP server and CLI up to 8K across 14 specialist neural models.

Documentation

upres-cli

npm version PyPI version License: MIT

Star this repo if UpRes helps you. GitHub stars

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

  1. Sign up at upres.ai (free — 5 upscales/month)
  2. Go to upres.ai/account/api-keys
  3. 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

ExampleWhat it does
batch-upscale-folder.jsUpscale all images in a folder with configurable concurrency
restore-photo-folder.pyRestore old/scanned photos with Lumen
ecommerce-pipeline.jsProduct image pipeline: raw shots → 4K → publish-ready
lightroom-export-hook.mdAuto-upscale Lightroom exports via post-processing hook
figma-plugin-stub.mdFigma 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.

AliasKindBest for
flareImageEveryday photos, fastest default
prismImageText, logos, product shots — keeps edges true
lumenImageMaximum detail recovery for print, up to 8x
mirageImageInvents new detail — art and hero images
hushImageFaithful denoise, same size as the source
keenImageDeblur and sharpen, same size
visageImageFaces only, does not enlarge
atelierImageHush, Visage if a portrait, then Lumen
motionVideoFast 4K finish for AI video
motion-xVideoCinema-grade, for film and commercials
stillVideoTemporal denoise, resolution stays put
cadenceVideoFrame interpolation, does not enlarge
atelier-xVideoStill, then Motion X
voiceSpeechSpeech denoise to 48 kHz. Not for music

Full model catalogue: upres.ai/models · Live spec: api.upres.ai/v1/openapi.json


Pricing

PlanPriceIncludesAPIWatermark
Free$05 upscales/mo—Yes
Creator$9/mo (launch deal, was $19)50 stills + 20 min 4K video/mo—No
Studio$39/mo250 stills + 90 min 4K video/moYesNo

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:

StatusBehavior
401Prints API key error + link to key management, exits
402Prints quota exceeded + link to pricing, exits
429Prints rate limit message (60 req/min), exits
5xxThrows 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