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 upscayl2. Linux, from Flathub (AppImage, DEB, RPM and Snap are also offered)
flatpak install flathub org.upscayl.Upscayl3. 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 startUpscayl 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
| Check | Result |
|---|---|
| Secrets | 1 candidate found and read; see the notes above. |
| Suspicious code | None found. |
| Install-time code | None: nothing runs at install beyond the package manager itself. |
| Committed binaries | 15 executable or compiled objects committed; listed under the raw findings. |
| CI workflows | 3 workflows. None use pull_request_target. 1 of 1 third-party action pinned to a tag rather than a commit. |
| Network hosts | 10 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 vulnerabilities | 182 advisories across 966 pinned packages: 6 critical, 99 high, 66 moderate, 11 low. package-lock.json: 1,038 packages, 182 advisories. |
| Project hygiene | Has licence file. Missing security policy, automated dependency updates, CodeQL, contributing guide. |
| OpenSSF Scorecard | Not 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)
| Where | Rule | Match |
|---|---|---|
| renderer/firebase.ts:12 | google-api-key | AIzaSy…9wU (39 chars) |
Committed binaries (15)
resources/models/high-fidelity-4x.bin: .bin, 33 MBresources/models/remacri-4x.bin: .bin, 33 MBresources/models/ultramix-balanced-4x.bin: .bin, 33 MBresources/models/ultrasharp-4x.bin: .bin, 33 MBresources/models/upscayl-standard-4x.bin: .bin, 33 MBresources/mac/bin/upscayl-bin: Mach-O, 29 MBresources/linux/bin/upscayl-bin: ELF, 12 MBresources/models/digital-art-4x.bin: .bin, 9 MBresources/win/bin/upscayl-bin.exe: PE (Windows executable), 6 MBresources/models/upscayl-lite-4x.bin: .bin, 2 MBmodels/realesr-animevideov3-x2.bin: .bin, 1 MBmodels/realesr-animevideov3-x3.bin: .bin, 1 MBmodels/realesr-animevideov3-x4.bin: .bin, 1 MBresources/win/bin/vcomp140d.dll: PE (Windows executable), 223 KBresources/win/bin/vcomp140.dll: PE (Windows executable), 197 KB
Worst known vulnerabilities (24 of 182)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-2xp9-vwfh-vxw4 | critical | next@15.2.4 | Next.js: Unauthenticated Remote Code Execution in Image Optimization API when AVIF files are used |
| GHSA-9qr9-h5gf-34mp | critical | next@15.2.4 | Next.js is vulnerable to RCE in React flight protocol |
| GHSA-p293-qw3h-jr36 | critical | next@15.2.4 | Next.js: Unauthenticated Remote Code Execution on windows-hosted servers |
| GHSA-xq3m-2v4x-88gg | critical | protobufjs@7.4.0 | Arbitrary code execution in protobufjs |
| GHSA-23hp-3jrh-7fpw | critical | tar@6.2.1 | node-tar: Decompression/parse DoS via unlimited input |
| GHSA-xv26-6w52-cph6 | critical | websocket-driver@0.7.4 | websocket-driver: Message corruption via abuse of protocol length headers |
| GHSA-3jxr-9vmj-r5cp | high | brace-expansion@1.1.12 | brace-expansion: DoS via exponential-time expansion of consecutive non-expanding {} groups |
| GHSA-mh99-v99m-4gvg | high | brace-expansion@1.1.12 | brace-expansion: DoS via unbounded expansion length causing an out-of-memory process crash |
| GHSA-rgw5-rvv9-x895 | high | brace-expansion@1.1.12 | brace-expansion: DoS via unbounded intermediate arrays, bypassing the CVE-2026-14257 mitigation |
| GHSA-23c5-xmqv-rm74 | high | minimatch@3.1.2 | minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions |
| GHSA-3ppc-4f35-3m26 | high | minimatch@3.1.2 | minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern |
| GHSA-7r86-cg39-jmmj | high | minimatch@3.1.2 | minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments |
| GHSA-23c5-xmqv-rm74 | high | minimatch@9.0.5 | minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions |
| GHSA-3ppc-4f35-3m26 | high | minimatch@9.0.5 | minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern |
| GHSA-7r86-cg39-jmmj | high | minimatch@9.0.5 | minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments |
| GHSA-5375-pq7m-f5r2 | high | @grpc/grpc-js@1.9.15 | @grpc/grpc-js: A malformed request can cause a server crash |
| GHSA-99f4-grh7-6pcq | high | @grpc/grpc-js@1.9.15 | @grpc/grpc-js: An incoming malformed compressed message can cause a client or server crash |
| GHSA-5j98-mcp5-4vw2 | high | glob@10.3.10 | glob CLI: Command injection via -c/--cmd executes matches with shell:true |
| GHSA-23c5-xmqv-rm74 | high | minimatch@9.0.3 | minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions |
| GHSA-3ppc-4f35-3m26 | high | minimatch@9.0.3 | minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern |
| GHSA-7r86-cg39-jmmj | high | minimatch@9.0.3 | minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments |
| GHSA-27p8-2357-5qqv | high | @xmldom/xmldom@0.8.10 | xmldom: DocType `name` Injection Bypasses requireWellFormed |
| GHSA-2v35-w6hq-6mfw | high | @xmldom/xmldom@0.8.10 | xmldom: Uncontrolled recursion in XML serialization leads to DoS |
| GHSA-4w3w-2rp5-g8jm | high | @xmldom/xmldom@0.8.10 | xmldom: Attribute name injection via setAttribute() bypasses requireWellFormed |
By the numbers
| Stars | 49.9K |
|---|---|
| Forks | 2,531 |
| Contributors | 49 |
| Commits | 1,114 |
| Open issues | 43 |
| Open pull requests | 0 |
| Releases | 29 |
| Latest release | v2.15.0 |
| Licence | AGPL-3.0 |
| Main language | TypeScript |
| Project age | 4 years |
| Last push | Sep 15, 2026 |
| Tracked files | 283 |
| Lines of code | 17.6K |
| Checkout size | 242 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.
