6 min read

Upscayl: Free AI Image Upscaling on Your Desktop (GitHub, Scanned)

A free desktop app that enlarges and sharpens images with AI models, entirely on your own GPU.

Upscayl logo
✅
Scan: safe. Nothing malicious. Two things to know: the upscaling engine ships as prebuilt binaries from a sibling repository, and the app sends anonymous usage events to PostHog with an opt-out that, in this code, does not appear to stop them. Scanned Mar 27, 2026; the full report is below.

Upscayl does one job with no setup: drop in a low-resolution image, pick a model, and get it back at four times the size with detail filled in. It is an Electron app for Windows, macOS and Linux that runs Real-ESRGAN-style models through NCNN and Vulkan, handles whole folders in batch, and accepts custom models converted from the wider upscaling community. There is no Python to install and no model to download separately; the models ship with the app.

It earns its place as the open-source answer to paid upscalers such as Topaz Gigapixel, and at about 50,000 stars it is the most popular one. It is built by two developers, Nayam Amarshe and TGS963, and licensed AGPL-3.0, as is the upscayl-ncnn engine it bundles. The app code in this repository is small, under 18,000 lines, which made it practical to read the parts that talk to the network.

  • Repository: github.com/upscayl/upscayl
  • Licence: AGPL-3.0 (GNU Affero General Public License v3.0)
  • Language: TypeScript. Stars: 49.9K. Forks: 2,531. Last push: Sep 15, 2026.
  • Scan: safe, Mar 27, 2026, commit a00d55f

Who it is for

Photographers, designers and anyone restoring old photos or enlarging artwork who wants good results without a subscription or a command line, and who has a reasonably modern graphics card.

Getting started

1. macOS, with Homebrew (a Mac App Store version also exists)

brew install --cask upscayl

2. Linux, from Flathub (AppImage, DEB, RPM and Snap are also offered)

flatpak install flathub org.upscayl.Upscayl

3. Windows: download upscayl-x.x.x-win.exe from the releases page, or run from source on any platform

git clone https://github.com/upscayl/upscayl && cd upscayl && npm install && npm run start

Upscayl needs a Vulkan-compatible GPU; the README warns that many integrated GPUs do not work. On Windows the installer is unsigned, so SmartScreen will ask you to choose More Info and Run Anyway.

Safety scan

We cloned upscayl/upscayl at commit a00d55f on Mar 27, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.

  • One secret hit: renderer/firebase.ts line 12, a Firebase web API key. That is a public client identifier every Firebase web app ships, not a credential; the file only writes a name and email to a waitlist collection for Upscayl Cloud when you fill in that form, and what it can write is governed by Firestore rules on Upscayl's side.
  • 15 committed binaries. The engine is upscayl-bin for macOS (Mach-O), Linux (ELF) and Windows (.exe), plus two Microsoft OpenMP runtime DLLs, copied in from the upscayl-ncnn repository's GitHub releases by update_upscayl_ncnn_binaries.sh. That source is public and AGPL-3.0, but a scan cannot prove the binaries match it: you are trusting that project's release builds. The other ten files are NCNN model weights, 1.2 MB to 33 MB.
  • We read the telemetry code. posthog-js sends an app_launched event with your OS, release, CPU model and count and GPU, and a model_selected event with the IP address zeroed and GeoIP off; no images or file names. The Help Improve Upscayl setting is on by default and only decides whether a React provider is mounted, while posthog.init and both events run outside that check. A log-upload helper that posts to termbin.com exists but is never called.
  • 182 known advisories (6 critical, 99 high) in package-lock.json. The Next.js 15.2.4 criticals concern a running Next server; Upscayl uses Next only as a static export (output: export) inside Electron, so no Next server runs. protobufjs and grpc-js arrive with the Firebase SDK, and most of the rest (tar, minimatch, xmldom, app-builder-lib) is electron-builder packaging tooling.
  • Three workflows, none using pull_request_target, with one third-party action (a release uploader) pinned to a tag. Licence present; no security policy, Dependabot or CodeQL. The latest tagged release, 2.15.0, is from December 2024, while the scanned main branch is from March 2026, so the build you download is older than the code read here.

What the scanner counted

CheckResult
Secrets1 candidate found and read; see the notes above.
Suspicious codeNone found.
Install-time codeNone: nothing runs at install beyond the package manager itself.
Committed binaries15 executable or compiled objects committed; listed under the raw findings.
CI workflows3 workflows. None use pull_request_target. 1 of 1 third-party action pinned to a tag rather than a commit.
Network hosts10 distinct hosts referenced from source; most often github.com, docs.upscayl.org, goo.gl, www.youtube-nocookie.com. No URLs to bare IP addresses.
Known vulnerabilities182 advisories across 966 pinned packages: 6 critical, 99 high, 66 moderate, 11 low. package-lock.json: 1,038 packages, 182 advisories.
Project hygieneHas licence file. Missing security policy, automated dependency updates, CodeQL, contributing guide.
OpenSSF ScorecardNot scored: the project is not in Scorecard's weekly index.

The raw findings

Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.

Secret candidates (1, redacted)
WhereRuleMatch
renderer/firebase.ts:12google-api-keyAIzaSy…9wU (39 chars)
Committed binaries (15)
  • resources/models/high-fidelity-4x.bin: .bin, 33 MB
  • resources/models/remacri-4x.bin: .bin, 33 MB
  • resources/models/ultramix-balanced-4x.bin: .bin, 33 MB
  • resources/models/ultrasharp-4x.bin: .bin, 33 MB
  • resources/models/upscayl-standard-4x.bin: .bin, 33 MB
  • resources/mac/bin/upscayl-bin: Mach-O, 29 MB
  • resources/linux/bin/upscayl-bin: ELF, 12 MB
  • resources/models/digital-art-4x.bin: .bin, 9 MB
  • resources/win/bin/upscayl-bin.exe: PE (Windows executable), 6 MB
  • resources/models/upscayl-lite-4x.bin: .bin, 2 MB
  • models/realesr-animevideov3-x2.bin: .bin, 1 MB
  • models/realesr-animevideov3-x3.bin: .bin, 1 MB
  • models/realesr-animevideov3-x4.bin: .bin, 1 MB
  • resources/win/bin/vcomp140d.dll: PE (Windows executable), 223 KB
  • resources/win/bin/vcomp140.dll: PE (Windows executable), 197 KB
Worst known vulnerabilities (24 of 182)
AdvisorySeverityPackageSummary
GHSA-2xp9-vwfh-vxw4criticalnext@15.2.4Next.js: Unauthenticated Remote Code Execution in Image Optimization API when AVIF files are used
GHSA-9qr9-h5gf-34mpcriticalnext@15.2.4Next.js is vulnerable to RCE in React flight protocol
GHSA-p293-qw3h-jr36criticalnext@15.2.4Next.js: Unauthenticated Remote Code Execution on windows-hosted servers
GHSA-xq3m-2v4x-88ggcriticalprotobufjs@7.4.0Arbitrary code execution in protobufjs
GHSA-23hp-3jrh-7fpwcriticaltar@6.2.1node-tar: Decompression/parse DoS via unlimited input
GHSA-xv26-6w52-cph6criticalwebsocket-driver@0.7.4websocket-driver: Message corruption via abuse of protocol length headers
GHSA-3jxr-9vmj-r5cphighbrace-expansion@1.1.12brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups
GHSA-mh99-v99m-4gvghighbrace-expansion@1.1.12brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash
GHSA-rgw5-rvv9-x895highbrace-expansion@1.1.12brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation
GHSA-23c5-xmqv-rm74highminimatch@3.1.2minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
GHSA-3ppc-4f35-3m26highminimatch@3.1.2minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
GHSA-7r86-cg39-jmmjhighminimatch@3.1.2minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
GHSA-23c5-xmqv-rm74highminimatch@9.0.5minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
GHSA-3ppc-4f35-3m26highminimatch@9.0.5minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
GHSA-7r86-cg39-jmmjhighminimatch@9.0.5minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
GHSA-5375-pq7m-f5r2high@grpc/grpc-js@1.9.15@grpc/grpc-js: A malformed request can cause a server crash
GHSA-99f4-grh7-6pcqhigh@grpc/grpc-js@1.9.15@grpc/grpc-js: An incoming malformed compressed message can cause a client or server crash
GHSA-5j98-mcp5-4vw2highglob@10.3.10glob CLI: Command injection via -c/--cmd executes matches with shell:true
GHSA-23c5-xmqv-rm74highminimatch@9.0.3minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
GHSA-3ppc-4f35-3m26highminimatch@9.0.3minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
GHSA-7r86-cg39-jmmjhighminimatch@9.0.3minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
GHSA-27p8-2357-5qqvhigh@xmldom/xmldom@0.8.10xmldom: DocType `name` Injection Bypasses requireWellFormed
GHSA-2v35-w6hq-6mfwhigh@xmldom/xmldom@0.8.10xmldom: Uncontrolled recursion in XML serialization leads to DoS
GHSA-4w3w-2rp5-g8jmhigh@xmldom/xmldom@0.8.10xmldom: Attribute name injection via setAttribute() bypasses requireWellFormed

By the numbers

Stars49.9K
Forks2,531
Contributors49
Commits1,114
Open issues43
Open pull requests0
Releases29
Latest releasev2.15.0
LicenceAGPL-3.0
Main languageTypeScript
Project age4 years
Last pushSep 15, 2026
Tracked files283
Lines of code17.6K
Checkout size242 MB

Lines by language: TypeScript 7,649, JSON 7,168, YAML 1,049, Markdown 852, JavaScript 360, CSS 307.

Questions

Is Upscayl free?

Yes. Upscayl is AGPL-3.0 and free to download on Windows, macOS and Linux, with no account, watermark or image limit, and the engine it bundles is AGPL-3.0 too. A Mac App Store version exists as an alternative to the direct download, and the app carries a waitlist form for a hosted Upscayl Cloud; neither is needed to upscale locally.

Does Upscayl need a GPU?

Yes. The engine runs on Vulkan, so it needs a graphics card with Vulkan support; the README says most integrated GPUs and CPUs will not work, though trying costs nothing. Any recent NVIDIA or AMD card is fine, and Apple Silicon Macs work through Vulkan's Metal translation. If you have several GPUs, a GPU ID setting picks one.

Does Upscayl upload my images?

No. Upscaling happens on your machine through the bundled engine, and images never leave it. The app does talk to the network: anonymous usage events to PostHog (see the safety notes on the opt-out), update checks against GitHub, and the Upscayl Cloud waitlist form if you choose to fill it in.


This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.