diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 00000000..8c8d6930 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,62 @@ +name: pages + +# The website (site/) on GitHub Pages: https://phantomptr.github.io/ps5upload/ +# +# The page reads GitHub's releases API live in the visitor's browser, so a new release shows +# up without a deploy. Each deploy also writes site/releases.json, the copy the page falls +# back on when the API can't be reached (offline, or GitHub's anonymous rate limit). +# +# When it deploys: +# - a change to site/ (or this file) on main; +# - after the publish workflow finishes. A release made by publish.yml does not fire the +# `release` event below: GitHub doesn't start workflows from its own token's actions; +# - a release published, edited or deleted by hand (promoting a pre-release is an edit); +# - once a day, so the snapshot never drifts far; +# - by hand (Actions → pages → Run workflow). + +on: + push: + branches: [main] + paths: ["site/**", "scripts/site-releases.mjs", ".github/workflows/pages.yml"] + workflow_run: + workflows: [publish] + types: [completed] + release: + types: [published, edited, deleted] + schedule: + - cron: "17 6 * * *" + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + deploy: + runs-on: ubuntu-24.04 + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v7 + with: + ref: main + - uses: actions/setup-node@v7 + with: + node-version: 22 + - name: Snapshot the releases (fallback for the page) + run: node scripts/site-releases.mjs + env: + GH_TOKEN: ${{ github.token }} + GITHUB_TOKEN: ${{ github.token }} + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v4 + with: + path: site + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/scripts/site-releases.mjs b/scripts/site-releases.mjs new file mode 100644 index 00000000..f2e4376b --- /dev/null +++ b/scripts/site-releases.mjs @@ -0,0 +1,49 @@ +#!/usr/bin/env node +// Writes site/releases.json: the website's fallback copy of the newest releases, used when a +// visitor's browser can't reach GitHub's API (offline, or over its anonymous rate limit). +// Run by .github/workflows/pages.yml on every deploy and every published release; run it by +// hand to refresh a local preview: node scripts/site-releases.mjs +// +// Uses `gh` when it is installed and signed in (no rate limit worth worrying about), else +// GITHUB_TOKEN with fetch, else an anonymous fetch. +import { execFileSync } from "node:child_process"; +import { writeFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import path from "node:path"; + +const REPO = "phantomptr/ps5upload"; +const out = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "site", "releases.json"); + +/** Only what the page reads, so the snapshot stays small. */ +const slim = (list) => + list + .filter((r) => !r.draft) + .slice(0, 12) + .map((r) => ({ + tag_name: r.tag_name, + prerelease: r.prerelease, + published_at: r.published_at, + html_url: r.html_url, + body: r.body, + assets: r.assets.map((a) => ({ name: a.name, browser_download_url: a.browser_download_url, size: a.size })), + })); + +async function fetchReleases() { + try { + const json = execFileSync("gh", ["api", `repos/${REPO}/releases?per_page=12`], { + encoding: "utf8", + stdio: ["ignore", "pipe", "ignore"], + }); + return JSON.parse(json); + } catch { + const headers = { Accept: "application/vnd.github+json" }; + if (process.env.GITHUB_TOKEN) headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`; + const res = await fetch(`https://api.github.com/repos/${REPO}/releases?per_page=12`, { headers }); + if (!res.ok) throw new Error(`GitHub answered ${res.status}`); + return res.json(); + } +} + +const list = slim(await fetchReleases()); +writeFileSync(out, `${JSON.stringify(list, null, 1)}\n`); +console.log(`site/releases.json: ${list.length} releases, newest ${list[0]?.tag_name ?? "none"}`); diff --git a/site/app.js b/site/app.js new file mode 100644 index 00000000..907e91ed --- /dev/null +++ b/site/app.js @@ -0,0 +1,300 @@ +// PS5Upload website: live releases, the right download for this visitor, the news list, and +// the light/dark switch. No build step and no dependencies. +// +// Releases come from GitHub's API when the page loads, so a new release shows up without a +// redeploy. If that fails (offline, or GitHub's 60-requests-an-hour limit for anonymous +// visitors), releases.json is used: a snapshot the Pages workflow writes on every deploy and +// every published release (scripts/site-releases.mjs). +"use strict"; + +const REPO = "phantomptr/ps5upload"; +const API = `https://api.github.com/repos/${REPO}/releases?per_page=12`; +const NEWS_COUNT = 4; + +// ── Theme ────────────────────────────────────────────────────────────────── + +const root = document.documentElement; +const systemDark = () => window.matchMedia("(prefers-color-scheme: dark)").matches; +const store = { + get: (k) => { + try { + return localStorage.getItem(k); + } catch { + return null; + } + }, + set: (k, v) => { + try { + localStorage.setItem(k, v); + } catch { + /* private window: the choice lasts this visit */ + } + }, +}; + +function applyTheme(theme) { + if (theme) root.dataset.theme = theme; + else delete root.dataset.theme; + const dark = theme ? theme === "dark" : systemDark(); + // The screenshots follow the page, not only the system. + document.querySelectorAll("[data-theme-src]").forEach((s) => { + s.media = theme ? "not all" : "(prefers-color-scheme: dark)"; + }); + document.querySelectorAll("img[data-theme-img]").forEach((img) => { + img.src = `assets/${img.dataset.themeImg}-${dark ? "dark" : "light"}.webp`; + }); +} +applyTheme(store.get("ps5upload.site.theme")); +document.getElementById("theme").addEventListener("click", () => { + const dark = root.dataset.theme ? root.dataset.theme === "dark" : systemDark(); + const next = dark ? "light" : "dark"; + store.set("ps5upload.site.theme", next); + applyTheme(next); +}); + +// ── Copy buttons ─────────────────────────────────────────────────────────── + +document.addEventListener("click", async (e) => { + const btn = e.target.closest("[data-copy]"); + if (!btn) return; + const text = document.getElementById(btn.dataset.copy)?.textContent ?? ""; + try { + await navigator.clipboard.writeText(text); + btn.textContent = "Copied"; + } catch { + btn.textContent = "Select and copy"; + } + setTimeout(() => (btn.textContent = "Copy"), 1600); +}); + +// ── Releases ─────────────────────────────────────────────────────────────── + +/** What a release file is, from its name (scripts/gen-updater-manifest.py names them). */ +const KINDS = [ + { re: /-mac-arm64\.dmg$/, os: "mac", label: "Apple Silicon", note: ".dmg" }, + { re: /-mac-x64\.dmg$/, os: "mac", label: "Intel", note: ".dmg" }, + { re: /-win-x64-setup\.exe$/, os: "windows", label: "x64 installer", note: ".exe" }, + { re: /-win-x64\.zip$/, os: "windows", label: "x64 portable", note: ".zip" }, + { re: /-win-arm64-setup\.exe$/, os: "windows", label: "ARM64 installer", note: ".exe" }, + { re: /-win-arm64\.zip$/, os: "windows", label: "ARM64 portable", note: ".zip" }, + { re: /-linux-x64\.deb$/, os: "linux", label: "x64 Debian, Ubuntu", note: ".deb" }, + { re: /-linux-x64\.rpm$/, os: "linux", label: "x64 Fedora, openSUSE", note: ".rpm" }, + { re: /-linux-x64\.zip$/, os: "linux", label: "x64 any distro", note: ".zip" }, + { re: /-linux-arm64\.deb$/, os: "linux", label: "ARM64 Debian, Ubuntu", note: ".deb" }, + { re: /-linux-arm64\.rpm$/, os: "linux", label: "ARM64 Fedora, openSUSE", note: ".rpm" }, + { re: /-linux-arm64\.zip$/, os: "linux", label: "ARM64 any distro", note: ".zip" }, + { re: /-android\.apk$/, os: "android", label: "Phones and tablets", note: ".apk" }, + { re: /^ps5upload-[\d.]+\.elf$/, os: "extra", label: "PS5 helper (payload)", note: ".elf" }, + { re: /^ps5upload-engine-/, os: "extra", label: null, note: "" }, +]; +const OS = { + mac: "macOS", + windows: "Windows", + linux: "Linux", + android: "Android", +}; + +function detectOs() { + const ua = navigator.userAgent; + if (/android/i.test(ua)) return "android"; + if (/windows/i.test(ua)) return "windows"; + if (/mac os x|macintosh/i.test(ua) && !/iphone|ipad/i.test(ua)) return "mac"; + if (/linux|x11/i.test(ua)) return "linux"; + return null; +} + +const mb = (n) => (n >= 1e9 ? `${(n / 1e9).toFixed(1)} GB` : `${Math.max(1, Math.round(n / 1e6))} MB`); +const date = (iso) => + iso ? new Date(iso).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric" }) : ""; + +function normalize(list) { + return (list || []) + .filter((r) => !r.draft) + .map((r) => ({ + tag: r.tag_name, + prerelease: !!r.prerelease, + published: r.published_at, + body: r.body || "", + url: r.html_url, + assets: (r.assets || []).map((a) => ({ name: a.name, url: a.browser_download_url, size: a.size })), + })); +} + +async function loadReleases() { + const ctl = new AbortController(); + const timer = setTimeout(() => ctl.abort(), 6000); + try { + const res = await fetch(API, { signal: ctl.signal, headers: { Accept: "application/vnd.github+json" } }); + if (!res.ok) throw new Error(String(res.status)); + const list = normalize(await res.json()); + if (list.length) return list; + throw new Error("empty"); + } catch { + const res = await fetch("releases.json", { cache: "no-cache" }); + return normalize(await res.json()); + } finally { + clearTimeout(timer); + } +} + +// ── Markdown, the little the release notes use ───────────────────────────── + +const esc = (s) => s.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]); +function inline(s) { + return esc(s) + .replace(/`([^`]+)`/g, "$1") + .replace(/\*\*(.+?)\*\*/g, "$1") + .replace(/\[([^\]]+)\]\((https?:\/\/[^)\s]+)\)/g, '$1'); +} +/** The start of a release's notes for the news list: everything up to its first `maxItems` + * bullets. `more` says whether anything was left out. */ +function excerpt(md, maxItems = 6) { + const lines = md.split(/\r?\n/); + let items = 0; + for (let i = 0; i < lines.length; i++) { + if (lines[i].trim().startsWith("- ") && ++items > maxItems) { + return { md: lines.slice(0, i).join("\n"), more: true }; + } + } + return { md, more: false }; +} + +/** Paragraphs and "- " bullets (with wrapped continuation lines); headings become bold lines. */ +function markdown(md) { + const out = []; + let list = null; + let para = null; + const flush = () => { + if (para) out.push(`

${inline(para)}

`); + para = null; + }; + for (const raw of md.split(/\r?\n/)) { + const line = raw.trim(); + if (!line || line === "---") { + flush(); + if (list) out.push(``); + list = null; + continue; + } + if (line.startsWith("- ")) { + flush(); + (list ??= []).push(line.slice(2)); + } else if (list && /^\s{2,}/.test(raw)) { + list[list.length - 1] += ` ${line}`; + } else if (/^#{1,6}\s/.test(line)) { + flush(); + out.push(`

${inline(line.replace(/^#+\s*/, ""))}

`); + } else { + para = para ? `${para} ${line}` : line; + } + } + flush(); + if (list) out.push(``); + return out.join(""); +} + +// ── Render ───────────────────────────────────────────────────────────────── + +function renderDownloads(rel, mine) { + const groups = { mac: [], windows: [], linux: [], android: [], extra: [] }; + for (const a of rel.assets) { + const i = KINDS.findIndex((k) => k.re.test(a.name)); + if (i < 0) continue; + const k = KINDS[i]; + groups[k.os].push({ ...a, order: i, label: k.label ?? a.name.replace(/^ps5upload-engine-[\d.]+-/, "Engine · "), note: k.note }); + } + // KINDS order (x64 before ARM64, installer before portable), not GitHub's alphabetical one. + for (const g of Object.values(groups)) g.sort((a, b) => a.order - b.order); + const order = ["mac", "windows", "linux", "android"].sort((a, b) => (a === mine ? -1 : b === mine ? 1 : 0)); + const el = document.getElementById("downloads"); + el.innerHTML = order + .filter((os) => groups[os].length) + .map( + (os) => ` +
+

${OS[os]}

${os === mine ? 'Your system' : ""}
+
+ ${groups[os] + .map( + (f) => + `${esc(f.label)} ${esc(f.note)}${mb(f.size)}`, + ) + .join("")} +
+
`, + ) + .join(""); + document.getElementById("extras").innerHTML = groups.extra + .map((f) => `${esc(f.label)} · ${mb(f.size)}`) + .join(""); + return groups; +} + +function renderHero(rel, stable, groups, mine) { + const pre = rel.prerelease ? " · pre-release" : ""; + document.getElementById("hero-version").textContent = `${rel.tag}${pre} · ${date(rel.published)}`; + const first = mine && groups[mine]?.[0]; + const btn = document.getElementById("hero-download"); + if (first) { + btn.href = first.url; + document.getElementById("hero-download-label").textContent = `Download for ${OS[mine]}`; + document.getElementById("hero-fine").innerHTML = + `${esc(first.label)} ${esc(first.note)} · ${mb(first.size)} · Other platforms`; + } else { + btn.href = "#download"; + document.getElementById("hero-download-label").textContent = "Download"; + } + document.getElementById("release-link").href = rel.url; + const lead = document.getElementById("download-lead"); + lead.textContent = rel.prerelease + ? `${rel.tag} is a pre-release: new and being tested.${stable ? ` The last stable release is ${stable.tag}.` : ""}` + : `${rel.tag}, released ${date(rel.published)}.`; + if (rel.prerelease && stable) { + lead.insertAdjacentHTML("beforeend", ` Get ${esc(stable.tag)}`); + } + document.getElementById("docker-cmd").textContent = + `docker run -d --name ps5upload --network host -v ps5upload-data:/data ghcr.io/${REPO.split("/")[0]}/ps5upload-engine-webui:${rel.tag.replace(/^v/, "")}`; +} + +function renderNews(list) { + const el = document.getElementById("news-list"); + const shown = list.slice(0, NEWS_COUNT); + el.innerHTML = + shown + .map( + (r) => ` +
+
+

${esc(r.tag)}

+ ${r.prerelease ? 'Pre-release' : 'Release'} + +
+
${markdown(excerpt(r.body).md)}
+ ${excerpt(r.body).more ? "Read the rest, and downloads →" : "Downloads and full notes →"} +
`, + ) + .join("") + + (list.length > NEWS_COUNT + ? `
${list + .slice(NEWS_COUNT) + .map((r) => `${esc(r.tag)}`) + .join("")}
` + : ""); +} + +(async () => { + try { + const list = await loadReleases(); + if (!list.length) throw new Error("no releases"); + const latest = list[0]; + const stable = list.find((r) => !r.prerelease) ?? null; + const mine = detectOs(); + const groups = renderDownloads(latest, mine); + renderHero(latest, stable && stable !== latest ? stable : null, groups, mine); + renderNews(list); + } catch { + const msg = `

Couldn't load the releases here. See them on GitHub.

`; + document.getElementById("downloads").innerHTML = msg; + document.getElementById("news-list").innerHTML = msg; + } +})(); diff --git a/site/assets/convert-dark.webp b/site/assets/convert-dark.webp new file mode 100644 index 00000000..cfb3bd8c Binary files /dev/null and b/site/assets/convert-dark.webp differ diff --git a/site/assets/convert-light.webp b/site/assets/convert-light.webp new file mode 100644 index 00000000..63506f61 Binary files /dev/null and b/site/assets/convert-light.webp differ diff --git a/site/assets/favicon.png b/site/assets/favicon.png new file mode 100644 index 00000000..d08aa97c Binary files /dev/null and b/site/assets/favicon.png differ diff --git a/site/assets/home-dark.webp b/site/assets/home-dark.webp new file mode 100644 index 00000000..6f1e3960 Binary files /dev/null and b/site/assets/home-dark.webp differ diff --git a/site/assets/home-light.webp b/site/assets/home-light.webp new file mode 100644 index 00000000..4b663f53 Binary files /dev/null and b/site/assets/home-light.webp differ diff --git a/site/assets/logo.png b/site/assets/logo.png new file mode 100644 index 00000000..c208b65b Binary files /dev/null and b/site/assets/logo.png differ diff --git a/site/assets/upload-dark.webp b/site/assets/upload-dark.webp new file mode 100644 index 00000000..d4a9a0ac Binary files /dev/null and b/site/assets/upload-dark.webp differ diff --git a/site/assets/upload-light.webp b/site/assets/upload-light.webp new file mode 100644 index 00000000..57442d8c Binary files /dev/null and b/site/assets/upload-light.webp differ diff --git a/site/index.html b/site/index.html new file mode 100644 index 00000000..2608757d --- /dev/null +++ b/site/index.html @@ -0,0 +1,195 @@ + + + + + + PS5Upload — move games to your PS5, fast + + + + + + + + + + + + + +
+
+ + + PS5Upload + + +
+ + + + +
+
+
+ +
+
+
+

Free and open source

+

Move games to your PS5, fast.

+

+ PS5Upload sends files, installs packages and manages games on a jailbroken PS5, + from your computer or your phone. Encrypted, resumable transfers at the full speed of + your network. +

+ +

macOS · Windows · Linux · Android · Docker

+
+
+ + + The PS5Upload Home screen: upload, install, games, files, saves and convert, with the console's status beside them. + +
+
+ +
+

Everything between your computer and your PS5

+

One app for the whole round trip, built on its own fast transfer protocol.

+
+
+ +

Fast uploads

+

Folders, game images and archives go straight to the console over an encrypted, resumable connection. Thousands of small files are packed together so they don't crawl.

+
+
+ +

Install packages

+

Stream a .pkg from your computer, a link or a NAS while it installs, or copy it first. Updates and DLC install from each game's own page.

+
+
+ +

Convert games

+

Turn a game folder into a package, an exFAT image or a compressed .ffpfsc for ShadowMount+, with AMPR LZ4 asset packs to make images smaller.

+
+
+ +

Your collection

+

Every game on your drives and network shares, grouped by game with its updates, DLC and duplicates, and what each console is missing.

+
+
+ +

Games, saves and files

+

Launch, stop and uninstall games, back up and restore saves, browse the console's drives, and copy straight from one PS5 to another.

+
+
+ +

Desktop, phone or browser

+

Native apps for macOS, Windows, Linux and Android, and a Docker image that serves the same app as a web page from your NAS. In 21 languages.

+
+
+
+ +
+
+
+ + + Upload: drop a file or folder and it is detected automatically. + +
Drop anything on Upload: what it is gets detected.
+
+
+ + + Convert: make a package or a game image from a game folder. + +
Convert a folder into a package or a ShadowMount+ image.
+
+
+
+ +
+
+
+

Download

+

The newest release for every platform.

+
+ Release notes +
+
+

Loading the latest release…

+
+
+
+

Docker (web UI on your NAS or server)

+

Serves the full app as a web page on your network. Open port 19113 in a browser.

+
+
+ docker run -d --name ps5upload --network host -v ps5upload-data:/data ghcr.io/phantomptr/ps5upload-engine-webui:latest + +
+
+
+ The PS5 helper and the engine on its own +
+
+
+ +
+
+

News

+ Full changelog +
+
+

Loading releases…

+
+
+ +
+

Community

+ +
+
+ + + + + + diff --git a/site/releases.json b/site/releases.json new file mode 100644 index 00000000..16766932 --- /dev/null +++ b/site/releases.json @@ -0,0 +1,1370 @@ +[ + { + "tag_name": "v7.0.0", + "prerelease": false, + "published_at": "2026-10-11T01:14:51Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v7.0.0", + "body": "A new look for the whole app, a better Android app, and a long list of fixes.\r\n\r\n- **New look, modelled on macOS 27.** Light and dark themes with a calm neutral window, a sidebar\r\n that runs to the window edge, rounded cards, one blue accent and your system's own typeface.\r\n Home has simple action tiles and a console panel that stays beside the page; every screen,\r\n desktop and phone, was brought into the new style. Your old theme choice carries over.\r\n- **Android catches up.** Install or download from a link, install straight from a saved server,\r\n community cheat search and online covers now work on Android too, and the app icon is the\r\n PS5Upload logo. Layout fixes for phones throughout.\r\n- **Convert:** AMPR LZ4 asset packs for exFAT game images (for games that use ampr_emu 0.4 or\r\n newer), one place to choose what to make and what happens after, and a queue that only adds\r\n real games and takes several game folders at once.\r\n- **Captures:** view the app's own screenshots large, page through and delete them; delete PS5\r\n screenshots and clips too.\r\n- **Game page:** install updates and DLC right where they are listed.\r\n- **Sturdier:** uploads, installs, builds, link downloads and PS5 to PS5 copies recover from\r\n missed checks, crashes and interruptions instead of failing or hanging; status checks no\r\n longer slow transfers down.\r\n- **Easier to use:** keyboard focus stays inside dialogs, right-to-left languages are mirrored,\r\n narrow windows no longer clip, error cards have Retry, and every string is translated into\r\n all 21 languages.\r\n- **Under the hood:** the payload is built with PS5 Payload SDK v0.44 (`make update-sdk` moves\r\n to the latest), and the engine refuses console actions that don't name a console.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/latest.json", + "size": 3434 + }, + { + "name": "PS5Upload-7.0.0-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-android.apk", + "size": 97603539 + }, + { + "name": "PS5Upload-7.0.0-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-linux-arm64.deb", + "size": 24316842 + }, + { + "name": "PS5Upload-7.0.0-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-linux-arm64.rpm", + "size": 24313588 + }, + { + "name": "PS5Upload-7.0.0-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-linux-arm64.zip", + "size": 98174587 + }, + { + "name": "PS5Upload-7.0.0-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-linux-x64.deb", + "size": 24190396 + }, + { + "name": "PS5Upload-7.0.0-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-linux-x64.rpm", + "size": 24197066 + }, + { + "name": "PS5Upload-7.0.0-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-linux-x64.zip", + "size": 100258576 + }, + { + "name": "PS5Upload-7.0.0-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-mac-arm64.dmg", + "size": 22423120 + }, + { + "name": "PS5Upload-7.0.0-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-mac-x64.dmg", + "size": 23558985 + }, + { + "name": "PS5Upload-7.0.0-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-win-arm64-setup.exe", + "size": 14368748 + }, + { + "name": "PS5Upload-7.0.0-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-win-arm64.zip", + "size": 20817608 + }, + { + "name": "PS5Upload-7.0.0-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-win-x64-setup.exe", + "size": 16143892 + }, + { + "name": "PS5Upload-7.0.0-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/PS5Upload-7.0.0-win-x64.zip", + "size": 22055179 + }, + { + "name": "ps5upload-7.0.0.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/ps5upload-7.0.0.elf", + "size": 3289744 + }, + { + "name": "ps5upload-engine-7.0.0-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/ps5upload-engine-7.0.0-linux-arm64", + "size": 43938384 + }, + { + "name": "ps5upload-engine-7.0.0-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/ps5upload-engine-7.0.0-linux-x64", + "size": 46329360 + }, + { + "name": "ps5upload-engine-7.0.0-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/ps5upload-engine-7.0.0-macos-arm64", + "size": 39691872 + }, + { + "name": "ps5upload-engine-7.0.0-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/ps5upload-engine-7.0.0-macos-x64", + "size": 41545688 + }, + { + "name": "ps5upload-engine-7.0.0-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/ps5upload-engine-7.0.0-windows-arm64.exe", + "size": 32157696 + }, + { + "name": "ps5upload-engine-7.0.0-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v7.0.0/ps5upload-engine-7.0.0-windows-x64.exe", + "size": 37905408 + } + ] + }, + { + "tag_name": "v6.8.2", + "prerelease": false, + "published_at": "2026-10-10T17:18:38Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.8.2", + "body": "A clean-up release: every screen was gone through for things that no longer make sense, and\r\nthe code nothing used was removed.\r\n\r\n### Fixed\r\n\r\n- **The upload speed limit was up to 8× too high.** It held each of a transfer's connections to\r\n the limit instead of the whole transfer, so 10 MB/s could run at 80. It now limits the whole\r\n upload, and also applies to uploads from Files and to single files, which ignored it before.\r\n- **Stop on Upload and on Files downloads now really cancels.** It only stopped watching\r\n before; the transfer kept running.\r\n- **First-time setup and \"Bring up PS5\" now pair with a new console** instead of timing out:\r\n they send the helper the same way the rest of the app does.\r\n- **Home's Servers card** could show twice or vanish once you had activity; it shows once.\r\n- **Kill on Running apps** now uses the same close as Close game, which works on firmware where\r\n the plain close fails. The game page can close a running game too.\r\n- **Fan presets were labelled backwards** (the quiet one said it was louder). Fixed, and fan\r\n changes ask first.\r\n- **Profile, Shell and Payloads in the web UI**: Profile's confirms work there, Shell is hidden\r\n there (it can't run), and Payloads offers the ShadowMount+ and nanoDNS tabs that do work.\r\n- **Send payload** no longer says an unreadable or empty file \"looks OK\".\r\n- **Cheats**: Refresh only re-reads the list; re-applying to the running game is its own button.\r\n- **Reset all settings & data** now names everything it deletes (pairings, the Collection,\r\n saved servers and passwords, backport libraries and more).\r\n- Search results open the folder in Files.\r\n\r\n### Changed\r\n\r\n- **Bug report** sits right under Home in the sidebar and can't be hidden.\r\n- **Removed screens that only repeated others:** Dashboard (Home has it all), Fan Curve (the\r\n console only takes one target temperature; the Console screen sets it), the speed test\r\n (Health has it), and the typed \"From another PS5\" card on Upload (Files → Send to another\r\n console does it better). Stats is a tab of Tasks.\r\n- **Game page:** fewer tabs (Media, Storage and Play Time repeated the overview); play time\r\n everywhere comes from the console's helper.\r\n- **Settings:** grouped by what they affect (Console, Installs, Files & saves, Backporting);\r\n options that did nothing (Color blind palette, Screen reader hints, Density, the PS5 power\r\n tick) are gone; desktop-only options are hidden in the web UI.\r\n- \"Connections\" is now **Servers**; \"Backup\" is **Console snapshots**, and says the snapshots stay\r\n on the PS5.\r\n- Many texts were corrected to say what the app does today (no FTP, current screen names).\r\n- **Removed dead code** across the app, engine and console helper, including the old FTP server\r\n and the FTX2 upgrade shims, and 415 unused translations.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/latest.json", + "size": 4532 + }, + { + "name": "PS5Upload-6.8.2-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-android.apk", + "size": 94556115 + }, + { + "name": "PS5Upload-6.8.2-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-linux-arm64.deb", + "size": 23828062 + }, + { + "name": "PS5Upload-6.8.2-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-linux-arm64.rpm", + "size": 23827419 + }, + { + "name": "PS5Upload-6.8.2-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-linux-arm64.zip", + "size": 97708316 + }, + { + "name": "PS5Upload-6.8.2-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-linux-x64.deb", + "size": 23684984 + }, + { + "name": "PS5Upload-6.8.2-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-linux-x64.rpm", + "size": 23687618 + }, + { + "name": "PS5Upload-6.8.2-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-linux-x64.zip", + "size": 99774281 + }, + { + "name": "PS5Upload-6.8.2-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-mac-arm64.dmg", + "size": 22000266 + }, + { + "name": "PS5Upload-6.8.2-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-mac-x64.dmg", + "size": 23102580 + }, + { + "name": "PS5Upload-6.8.2-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-win-arm64-setup.exe", + "size": 14070417 + }, + { + "name": "PS5Upload-6.8.2-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-win-arm64.zip", + "size": 20396982 + }, + { + "name": "PS5Upload-6.8.2-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-win-x64-setup.exe", + "size": 15788488 + }, + { + "name": "PS5Upload-6.8.2-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/PS5Upload-6.8.2-win-x64.zip", + "size": 21579869 + }, + { + "name": "ps5upload-6.8.2.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/ps5upload-6.8.2.elf", + "size": 3286520 + }, + { + "name": "ps5upload-engine-6.8.2-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/ps5upload-engine-6.8.2-linux-arm64", + "size": 42981200 + }, + { + "name": "ps5upload-engine-6.8.2-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/ps5upload-engine-6.8.2-linux-x64", + "size": 45229968 + }, + { + "name": "ps5upload-engine-6.8.2-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/ps5upload-engine-6.8.2-macos-arm64", + "size": 38827712 + }, + { + "name": "ps5upload-engine-6.8.2-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/ps5upload-engine-6.8.2-macos-x64", + "size": 40608896 + }, + { + "name": "ps5upload-engine-6.8.2-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/ps5upload-engine-6.8.2-windows-arm64.exe", + "size": 31474176 + }, + { + "name": "ps5upload-engine-6.8.2-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.2/ps5upload-engine-6.8.2-windows-x64.exe", + "size": 36984832 + } + ] + }, + { + "tag_name": "v6.8.1", + "prerelease": false, + "published_at": "2026-10-10T12:12:04Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.8.1", + "body": "### Fixed\r\n\r\n- **Convert's queue always made a package.** Picking a game image (.ffpkg, .exfat or .ffpfs, or\r\n compressed into a .ffpfsc) and then queueing the game still built a .pkg: the queue only ever\r\n made packages. The queue now has a **Make** choice, a package or a game image, and choosing\r\n image options under ③ switches it to the image you picked. Each queued game shows the file it\r\n becomes (.pkg, .ffpfsc, ...) and is built as exactly that. A queued image can be kept or sent\r\n to the PS5 through the Upload queue. Only game folders on this computer can become images;\r\n others are skipped with a note.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/latest.json", + "size": 2307 + }, + { + "name": "PS5Upload-6.8.1-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-android.apk", + "size": 100917203 + }, + { + "name": "PS5Upload-6.8.1-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-linux-arm64.deb", + "size": 25012590 + }, + { + "name": "PS5Upload-6.8.1-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-linux-arm64.rpm", + "size": 25020147 + }, + { + "name": "PS5Upload-6.8.1-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-linux-arm64.zip", + "size": 98760703 + }, + { + "name": "PS5Upload-6.8.1-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-linux-x64.deb", + "size": 24874546 + }, + { + "name": "PS5Upload-6.8.1-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-linux-x64.rpm", + "size": 24875133 + }, + { + "name": "PS5Upload-6.8.1-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-linux-x64.zip", + "size": 100810078 + }, + { + "name": "PS5Upload-6.8.1-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-mac-arm64.dmg", + "size": 23055686 + }, + { + "name": "PS5Upload-6.8.1-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-mac-x64.dmg", + "size": 24248847 + }, + { + "name": "PS5Upload-6.8.1-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-win-arm64-setup.exe", + "size": 14809470 + }, + { + "name": "PS5Upload-6.8.1-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-win-arm64.zip", + "size": 21454396 + }, + { + "name": "PS5Upload-6.8.1-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-win-x64-setup.exe", + "size": 16582908 + }, + { + "name": "PS5Upload-6.8.1-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/PS5Upload-6.8.1-win-x64.zip", + "size": 22676689 + }, + { + "name": "ps5upload-6.8.1.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/ps5upload-6.8.1.elf", + "size": 3340056 + }, + { + "name": "ps5upload-engine-6.8.1-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/ps5upload-engine-6.8.1-linux-arm64", + "size": 43799248 + }, + { + "name": "ps5upload-engine-6.8.1-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/ps5upload-engine-6.8.1-linux-x64", + "size": 46045240 + }, + { + "name": "ps5upload-engine-6.8.1-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/ps5upload-engine-6.8.1-macos-arm64", + "size": 39599168 + }, + { + "name": "ps5upload-engine-6.8.1-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/ps5upload-engine-6.8.1-macos-x64", + "size": 41415352 + }, + { + "name": "ps5upload-engine-6.8.1-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/ps5upload-engine-6.8.1-windows-arm64.exe", + "size": 32055808 + }, + { + "name": "ps5upload-engine-6.8.1-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.1/ps5upload-engine-6.8.1-windows-x64.exe", + "size": 37628928 + } + ] + }, + { + "tag_name": "v6.8.0", + "prerelease": true, + "published_at": "2026-10-10T06:42:59Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.8.0", + "body": "\n### New\n\n- **Send files from one console to another (#433).** In Files, select files or folders and choose\n **Send to another console…** (in the toolbar or a row's menu). Pick the console and the folder\n on it; before anything runs you see whether it fits and which names already there get replaced.\n Each item is queued on that console as a copy, and the originals stay where they are. The queue\n row says where it came from.\n- **Straight between the consoles (Beta).** When the two consoles can reach each other, the copy\n now goes directly from one to the other instead of through this computer, so the computer's\n network and disk no longer slow it down. When they can't (different networks, an older helper,\n a firewall), it goes through this computer as before, and the queue row says which way it went\n and why. Both routes pick up where the other left off. Both consoles need the 6.8.0 helper for\n the direct route.\n\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/latest.json", + "size": 2628 + }, + { + "name": "PS5Upload-6.8.0-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-android.apk", + "size": 100941779 + }, + { + "name": "PS5Upload-6.8.0-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-linux-arm64.deb", + "size": 25012184 + }, + { + "name": "PS5Upload-6.8.0-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-linux-arm64.rpm", + "size": 25012008 + }, + { + "name": "PS5Upload-6.8.0-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-linux-arm64.zip", + "size": 98756880 + }, + { + "name": "PS5Upload-6.8.0-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-linux-x64.deb", + "size": 24873446 + }, + { + "name": "PS5Upload-6.8.0-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-linux-x64.rpm", + "size": 24876201 + }, + { + "name": "PS5Upload-6.8.0-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-linux-x64.zip", + "size": 100819516 + }, + { + "name": "PS5Upload-6.8.0-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-mac-arm64.dmg", + "size": 23050305 + }, + { + "name": "PS5Upload-6.8.0-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-mac-x64.dmg", + "size": 24247551 + }, + { + "name": "PS5Upload-6.8.0-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-win-arm64-setup.exe", + "size": 14808969 + }, + { + "name": "PS5Upload-6.8.0-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-win-arm64.zip", + "size": 21447153 + }, + { + "name": "PS5Upload-6.8.0-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-win-x64-setup.exe", + "size": 16578301 + }, + { + "name": "PS5Upload-6.8.0-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/PS5Upload-6.8.0-win-x64.zip", + "size": 22667902 + }, + { + "name": "ps5upload-6.8.0.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/ps5upload-6.8.0.elf", + "size": 3340056 + }, + { + "name": "ps5upload-engine-6.8.0-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/ps5upload-engine-6.8.0-linux-arm64", + "size": 43785216 + }, + { + "name": "ps5upload-engine-6.8.0-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/ps5upload-engine-6.8.0-linux-x64", + "size": 46055960 + }, + { + "name": "ps5upload-engine-6.8.0-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/ps5upload-engine-6.8.0-macos-arm64", + "size": 39582848 + }, + { + "name": "ps5upload-engine-6.8.0-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/ps5upload-engine-6.8.0-macos-x64", + "size": 41420096 + }, + { + "name": "ps5upload-engine-6.8.0-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/ps5upload-engine-6.8.0-windows-arm64.exe", + "size": 32049152 + }, + { + "name": "ps5upload-engine-6.8.0-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.8.0/ps5upload-engine-6.8.0-windows-x64.exe", + "size": 37620736 + } + ] + }, + { + "tag_name": "v6.7.4", + "prerelease": false, + "published_at": "2026-10-10T05:26:41Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.7.4", + "body": "### Fixed\r\n\r\n- **Send helper took 20 to 40 seconds.** The console showed the helper arriving at once, but the\r\n app kept waiting. When you pressed Send helper while the app was also re-sending the helper on\r\n its own (after a reconnect, or to update it), two helpers started together and spent that time\r\n fighting over which one stays. The app now sends one helper per console at a time: a press\r\n during an automatic send waits for that helper instead of starting a second.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/latest.json", + "size": 2158 + }, + { + "name": "PS5Upload-6.7.4-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-android.apk", + "size": 100745171 + }, + { + "name": "PS5Upload-6.7.4-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-linux-arm64.deb", + "size": 24902776 + }, + { + "name": "PS5Upload-6.7.4-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-linux-arm64.rpm", + "size": 24903491 + }, + { + "name": "PS5Upload-6.7.4-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-linux-arm64.zip", + "size": 98658283 + }, + { + "name": "PS5Upload-6.7.4-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-linux-x64.deb", + "size": 24785826 + }, + { + "name": "PS5Upload-6.7.4-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-linux-x64.rpm", + "size": 24786909 + }, + { + "name": "PS5Upload-6.7.4-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-linux-x64.zip", + "size": 100713093 + }, + { + "name": "PS5Upload-6.7.4-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-mac-arm64.dmg", + "size": 22956162 + }, + { + "name": "PS5Upload-6.7.4-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-mac-x64.dmg", + "size": 24137249 + }, + { + "name": "PS5Upload-6.7.4-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-win-arm64-setup.exe", + "size": 14720035 + }, + { + "name": "PS5Upload-6.7.4-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-win-arm64.zip", + "size": 21313231 + }, + { + "name": "PS5Upload-6.7.4-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-win-x64-setup.exe", + "size": 16494742 + }, + { + "name": "PS5Upload-6.7.4-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/PS5Upload-6.7.4-win-x64.zip", + "size": 22556105 + }, + { + "name": "ps5upload-6.7.4.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/ps5upload-6.7.4.elf", + "size": 3297392 + }, + { + "name": "ps5upload-engine-6.7.4-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/ps5upload-engine-6.7.4-linux-arm64", + "size": 43528416 + }, + { + "name": "ps5upload-engine-6.7.4-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/ps5upload-engine-6.7.4-linux-x64", + "size": 45826848 + }, + { + "name": "ps5upload-engine-6.7.4-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/ps5upload-engine-6.7.4-macos-arm64", + "size": 39397600 + }, + { + "name": "ps5upload-engine-6.7.4-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/ps5upload-engine-6.7.4-macos-x64", + "size": 41157832 + }, + { + "name": "ps5upload-engine-6.7.4-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/ps5upload-engine-6.7.4-windows-arm64.exe", + "size": 31766528 + }, + { + "name": "ps5upload-engine-6.7.4-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.4/ps5upload-engine-6.7.4-windows-x64.exe", + "size": 37365760 + } + ] + }, + { + "tag_name": "v6.7.3", + "prerelease": false, + "published_at": "2026-10-09T20:54:45Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.7.3", + "body": "### Fixed\r\n\r\n- **A failed or interrupted conversion no longer leaves files behind (#432).** Making a game image\r\n wrote a temporary `.partial` file the size of the image into the output folder. If the build\r\n failed (on Windows the cleanup often lost to an antivirus still reading the file) or was cut\r\n short, it stayed there, taking up the drive with nothing showing where. Each conversion now\r\n clears those leftovers and unpacked archives that no running job is using, before it starts and\r\n after it fails. Only the app's own temporary files are touched.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/latest.json", + "size": 2243 + }, + { + "name": "PS5Upload-6.7.3-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-android.apk", + "size": 100736979 + }, + { + "name": "PS5Upload-6.7.3-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-linux-arm64.deb", + "size": 24902984 + }, + { + "name": "PS5Upload-6.7.3-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-linux-arm64.rpm", + "size": 24905650 + }, + { + "name": "PS5Upload-6.7.3-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-linux-arm64.zip", + "size": 98647177 + }, + { + "name": "PS5Upload-6.7.3-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-linux-x64.deb", + "size": 24781484 + }, + { + "name": "PS5Upload-6.7.3-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-linux-x64.rpm", + "size": 24784087 + }, + { + "name": "PS5Upload-6.7.3-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-linux-x64.zip", + "size": 100712670 + }, + { + "name": "PS5Upload-6.7.3-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-mac-arm64.dmg", + "size": 22958490 + }, + { + "name": "PS5Upload-6.7.3-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-mac-x64.dmg", + "size": 24144476 + }, + { + "name": "PS5Upload-6.7.3-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-win-arm64-setup.exe", + "size": 14720508 + }, + { + "name": "PS5Upload-6.7.3-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-win-arm64.zip", + "size": 21311302 + }, + { + "name": "PS5Upload-6.7.3-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-win-x64-setup.exe", + "size": 16498372 + }, + { + "name": "PS5Upload-6.7.3-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/PS5Upload-6.7.3-win-x64.zip", + "size": 22553372 + }, + { + "name": "ps5upload-6.7.3.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/ps5upload-6.7.3.elf", + "size": 3297392 + }, + { + "name": "ps5upload-engine-6.7.3-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/ps5upload-engine-6.7.3-linux-arm64", + "size": 43527920 + }, + { + "name": "ps5upload-engine-6.7.3-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/ps5upload-engine-6.7.3-linux-x64", + "size": 45823608 + }, + { + "name": "ps5upload-engine-6.7.3-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/ps5upload-engine-6.7.3-macos-arm64", + "size": 39397136 + }, + { + "name": "ps5upload-engine-6.7.3-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/ps5upload-engine-6.7.3-macos-x64", + "size": 41164416 + }, + { + "name": "ps5upload-engine-6.7.3-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/ps5upload-engine-6.7.3-windows-arm64.exe", + "size": 31762432 + }, + { + "name": "ps5upload-engine-6.7.3-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.3/ps5upload-engine-6.7.3-windows-x64.exe", + "size": 37362688 + } + ] + }, + { + "tag_name": "v6.7.2", + "prerelease": true, + "published_at": "2026-10-09T20:12:26Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.7.2", + "body": "\n### Fixed\n\n- **Collection covers, for real this time.** 6.7.1 let the covers through the engine's guard only\n in a form the desktop app's window never uses, so they stayed blank there. The app now fetches\n them the same way it already fetches console icons when the window can't load them directly,\n so every game read from your drives shows its cover in the Collection and on its page.\n\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/latest.json", + "size": 2073 + }, + { + "name": "PS5Upload-6.7.2-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-android.apk", + "size": 100716499 + }, + { + "name": "PS5Upload-6.7.2-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-linux-arm64.deb", + "size": 24893590 + }, + { + "name": "PS5Upload-6.7.2-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-linux-arm64.rpm", + "size": 24898720 + }, + { + "name": "PS5Upload-6.7.2-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-linux-arm64.zip", + "size": 98651745 + }, + { + "name": "PS5Upload-6.7.2-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-linux-x64.deb", + "size": 24778046 + }, + { + "name": "PS5Upload-6.7.2-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-linux-x64.rpm", + "size": 24782861 + }, + { + "name": "PS5Upload-6.7.2-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-linux-x64.zip", + "size": 100716936 + }, + { + "name": "PS5Upload-6.7.2-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-mac-arm64.dmg", + "size": 22944469 + }, + { + "name": "PS5Upload-6.7.2-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-mac-x64.dmg", + "size": 24140708 + }, + { + "name": "PS5Upload-6.7.2-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-win-arm64-setup.exe", + "size": 14710103 + }, + { + "name": "PS5Upload-6.7.2-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-win-arm64.zip", + "size": 21299737 + }, + { + "name": "PS5Upload-6.7.2-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-win-x64-setup.exe", + "size": 16469902 + }, + { + "name": "PS5Upload-6.7.2-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/PS5Upload-6.7.2-win-x64.zip", + "size": 22543789 + }, + { + "name": "ps5upload-6.7.2.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/ps5upload-6.7.2.elf", + "size": 3297392 + }, + { + "name": "ps5upload-engine-6.7.2-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/ps5upload-engine-6.7.2-linux-arm64", + "size": 43526784 + }, + { + "name": "ps5upload-engine-6.7.2-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/ps5upload-engine-6.7.2-linux-x64", + "size": 45815400 + }, + { + "name": "ps5upload-engine-6.7.2-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/ps5upload-engine-6.7.2-macos-arm64", + "size": 39324528 + }, + { + "name": "ps5upload-engine-6.7.2-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/ps5upload-engine-6.7.2-macos-x64", + "size": 41157528 + }, + { + "name": "ps5upload-engine-6.7.2-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/ps5upload-engine-6.7.2-windows-arm64.exe", + "size": 31741440 + }, + { + "name": "ps5upload-engine-6.7.2-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.2/ps5upload-engine-6.7.2-windows-x64.exe", + "size": 37341184 + } + ] + }, + { + "tag_name": "v6.7.1", + "prerelease": false, + "published_at": "2026-10-09T19:12:19Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.7.1", + "body": "**Fixes: Collection covers, multi-part RAR uploads, and a full drive's leftover file.**\r\n\r\n### Fixed\r\n\r\n- **Collection covers.** The engine refused the app's requests for the covers it had read out of\r\n your games, so a game with no online cover showed its initials and the game's page showed a\r\n broken image. They show now.\r\n- **Cheats on a game's page** no longer shows \"no cheat files found\" as an error when a game simply\r\n has none.\r\n- **Multi-part RAR uploads (#429).** Resuming an upload from a `.part1.rar`/`.r00` set failed with\r\n \"the archive lists its entries in a different order than it extracts them\" whenever a file\r\n already sent was split across two parts. Resuming works now.\r\n- **When the PS5's drive fills up during an upload,** what was sent is kept so Retry continues it,\r\n but nothing said so and it holds its whole size. The failed upload now names that partial file\r\n and offers to delete it.\r\n- **Stopping a stream install right after it started** removed it from the list but left it\r\n running; it is stopped now.\r\n- **0x80B21104** explains that this console will not take this package, and links to the FAQ.\r\n- **Can't reach the PS5?** The Connection screen now suggests turning a VPN off.\r\n- **Sending a new helper** now also ends any stray copy of the old one still running on the PS5,\r\n once the old one has had time to finish exiting.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/latest.json", + "size": 3059 + }, + { + "name": "PS5Upload-6.7.1-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-android.apk", + "size": 100634579 + }, + { + "name": "PS5Upload-6.7.1-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-linux-arm64.deb", + "size": 24886060 + }, + { + "name": "PS5Upload-6.7.1-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-linux-arm64.rpm", + "size": 24890520 + }, + { + "name": "PS5Upload-6.7.1-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-linux-arm64.zip", + "size": 98626834 + }, + { + "name": "PS5Upload-6.7.1-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-linux-x64.deb", + "size": 24769970 + }, + { + "name": "PS5Upload-6.7.1-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-linux-x64.rpm", + "size": 24772314 + }, + { + "name": "PS5Upload-6.7.1-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-linux-x64.zip", + "size": 100712895 + }, + { + "name": "PS5Upload-6.7.1-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-mac-arm64.dmg", + "size": 22945034 + }, + { + "name": "PS5Upload-6.7.1-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-mac-x64.dmg", + "size": 24121773 + }, + { + "name": "PS5Upload-6.7.1-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-win-arm64-setup.exe", + "size": 14712083 + }, + { + "name": "PS5Upload-6.7.1-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-win-arm64.zip", + "size": 21296089 + }, + { + "name": "PS5Upload-6.7.1-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-win-x64-setup.exe", + "size": 16467948 + }, + { + "name": "PS5Upload-6.7.1-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/PS5Upload-6.7.1-win-x64.zip", + "size": 22542461 + }, + { + "name": "ps5upload-6.7.1.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/ps5upload-6.7.1.elf", + "size": 3297392 + }, + { + "name": "ps5upload-engine-6.7.1-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/ps5upload-engine-6.7.1-linux-arm64", + "size": 43523088 + }, + { + "name": "ps5upload-engine-6.7.1-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/ps5upload-engine-6.7.1-linux-x64", + "size": 45835728 + }, + { + "name": "ps5upload-engine-6.7.1-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/ps5upload-engine-6.7.1-macos-arm64", + "size": 39328320 + }, + { + "name": "ps5upload-engine-6.7.1-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/ps5upload-engine-6.7.1-macos-x64", + "size": 41148232 + }, + { + "name": "ps5upload-engine-6.7.1-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/ps5upload-engine-6.7.1-windows-arm64.exe", + "size": 31741440 + }, + { + "name": "ps5upload-engine-6.7.1-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.1/ps5upload-engine-6.7.1-windows-x64.exe", + "size": 37337600 + } + ] + }, + { + "tag_name": "v6.7.0", + "prerelease": false, + "published_at": "2026-10-09T17:06:29Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.7.0", + "body": "**One page per game: every console and every copy, wherever you open it from.**\r\n\r\n### New\r\n\r\n- **A page for every game.** Open a game from Ready to play, Game files, the Collection,\r\n Upload, Install Package's package menu, or the command palette, and you get one page that shows:\r\n - **Each of your consoles:** installed or not, which version, and how old that is (\"now\" for\r\n the one you're connected to, \"as of 2 h ago\" for the others). A refresh button checks a\r\n console again.\r\n - **Every copy on your drives,** with Send, Convert, Copy install link and Move to Trash.\r\n - **What each console could take from your drives:** the game with its update and DLC, a\r\n newer update, or missing DLC. Install it on any console, not only the connected one. The\r\n console's row shows how it's going, and Open goes to that console's activity.\r\n- **The app remembers what each console has,** so the page works while a console is asleep. It\r\n forgets a console you remove or move to a new address.\r\n- **Updates and Add-ons** on a game's page now also list newer packages from your drives.\r\n- **The command palette** finds games in your Collection by name or title ID.\r\n\r\n### Changed\r\n\r\n- Clicking a game in the Collection opens its page instead of a pop-up.\r\n- \"Open library\" now says \"Open Games\". Install Package says \"screen\" (not \"tab\") for the\r\n Connection and File System screens.\r\n- On a phone, the Games tab stays highlighted while you're in the Collection, and screen readers\r\n are told which section is open.\r\n\r\n### Fixed\r\n\r\n- The Collection's \"Progress shows in Install Package\" link went to Home.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/latest.json", + "size": 3313 + }, + { + "name": "PS5Upload-6.7.0-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-android.apk", + "size": 100642771 + }, + { + "name": "PS5Upload-6.7.0-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-linux-arm64.deb", + "size": 24879756 + }, + { + "name": "PS5Upload-6.7.0-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-linux-arm64.rpm", + "size": 24879289 + }, + { + "name": "PS5Upload-6.7.0-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-linux-arm64.zip", + "size": 98628989 + }, + { + "name": "PS5Upload-6.7.0-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-linux-x64.deb", + "size": 24774842 + }, + { + "name": "PS5Upload-6.7.0-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-linux-x64.rpm", + "size": 24771004 + }, + { + "name": "PS5Upload-6.7.0-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-linux-x64.zip", + "size": 100715059 + }, + { + "name": "PS5Upload-6.7.0-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-mac-arm64.dmg", + "size": 22965035 + }, + { + "name": "PS5Upload-6.7.0-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-mac-x64.dmg", + "size": 24112129 + }, + { + "name": "PS5Upload-6.7.0-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-win-arm64-setup.exe", + "size": 14703207 + }, + { + "name": "PS5Upload-6.7.0-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-win-arm64.zip", + "size": 21295714 + }, + { + "name": "PS5Upload-6.7.0-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-win-x64-setup.exe", + "size": 16453297 + }, + { + "name": "PS5Upload-6.7.0-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/PS5Upload-6.7.0-win-x64.zip", + "size": 22535267 + }, + { + "name": "ps5upload-6.7.0.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/ps5upload-6.7.0.elf", + "size": 3296952 + }, + { + "name": "ps5upload-engine-6.7.0-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/ps5upload-engine-6.7.0-linux-arm64", + "size": 43517400 + }, + { + "name": "ps5upload-engine-6.7.0-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/ps5upload-engine-6.7.0-linux-x64", + "size": 45838672 + }, + { + "name": "ps5upload-engine-6.7.0-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/ps5upload-engine-6.7.0-macos-arm64", + "size": 39310032 + }, + { + "name": "ps5upload-engine-6.7.0-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/ps5upload-engine-6.7.0-macos-x64", + "size": 41129408 + }, + { + "name": "ps5upload-engine-6.7.0-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/ps5upload-engine-6.7.0-windows-arm64.exe", + "size": 31746560 + }, + { + "name": "ps5upload-engine-6.7.0-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.7.0/ps5upload-engine-6.7.0-windows-x64.exe", + "size": 37339136 + } + ] + }, + { + "tag_name": "v6.6.3", + "prerelease": false, + "published_at": "2026-10-09T11:11:48Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.6.3", + "body": "**Housekeeping.** No changes to the app. The engine's own tests now clean up their temporary\r\nfiles when they finish.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/latest.json", + "size": 1796 + }, + { + "name": "PS5Upload-6.6.3-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-android.apk", + "size": 100339667 + }, + { + "name": "PS5Upload-6.6.3-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-linux-arm64.deb", + "size": 24793420 + }, + { + "name": "PS5Upload-6.6.3-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-linux-arm64.rpm", + "size": 24796540 + }, + { + "name": "PS5Upload-6.6.3-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-linux-arm64.zip", + "size": 98545643 + }, + { + "name": "PS5Upload-6.6.3-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-linux-x64.deb", + "size": 24684110 + }, + { + "name": "PS5Upload-6.6.3-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-linux-x64.rpm", + "size": 24681933 + }, + { + "name": "PS5Upload-6.6.3-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-linux-x64.zip", + "size": 100631185 + }, + { + "name": "PS5Upload-6.6.3-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-mac-arm64.dmg", + "size": 22877211 + }, + { + "name": "PS5Upload-6.6.3-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-mac-x64.dmg", + "size": 24031603 + }, + { + "name": "PS5Upload-6.6.3-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-win-arm64-setup.exe", + "size": 14659979 + }, + { + "name": "PS5Upload-6.6.3-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-win-arm64.zip", + "size": 21200353 + }, + { + "name": "PS5Upload-6.6.3-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-win-x64-setup.exe", + "size": 16404756 + }, + { + "name": "PS5Upload-6.6.3-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/PS5Upload-6.6.3-win-x64.zip", + "size": 22418858 + }, + { + "name": "ps5upload-6.6.3.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/ps5upload-6.6.3.elf", + "size": 3296952 + }, + { + "name": "ps5upload-engine-6.6.3-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/ps5upload-engine-6.6.3-linux-arm64", + "size": 43273352 + }, + { + "name": "ps5upload-engine-6.6.3-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/ps5upload-engine-6.6.3-linux-x64", + "size": 45568544 + }, + { + "name": "ps5upload-engine-6.6.3-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/ps5upload-engine-6.6.3-macos-arm64", + "size": 38991184 + }, + { + "name": "ps5upload-engine-6.6.3-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/ps5upload-engine-6.6.3-macos-x64", + "size": 40810328 + }, + { + "name": "ps5upload-engine-6.6.3-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/ps5upload-engine-6.6.3-windows-arm64.exe", + "size": 31522304 + }, + { + "name": "ps5upload-engine-6.6.3-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.3/ps5upload-engine-6.6.3-windows-x64.exe", + "size": 37032448 + } + ] + }, + { + "tag_name": "v6.6.2", + "prerelease": true, + "published_at": "2026-10-09T10:32:02Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.6.2", + "body": "\n**Fixes: the Windows app connects again, one game goes to two consoles, and bug reports work on\ndesktop.**\n\n### Fixed\n\n- **Windows: \"engine failed to start\" and no connection (#427).** An older engine still running\n in the background, or an antivirus scan, kept the app from writing its new engine, so it never\n connected. The app now starts its engine anyway, and the error says why if it still fails. An\n engine that crashes while starting is reported straight away instead of after 30 seconds, and\n a leftover engine from an older version is shut down more reliably.\n- **The same game to two consoles.** A game being sent or installed on one PS5 showed as busy on\n every PS5, so it could not go to a second one; the engine also refused to stream a package that\n another console was still installing, and Convert refused the same game for a second console.\n Each console is now separate.\n- **Bug reports on desktop.** Creating a report failed every time with \"Duplicate filename:\n README.txt\". Two screenshots with the same name no longer fail it either. Switching consoles\n keeps each console's draft, and a failed Download zip now says so.\n- **Leftover files.** A browser upload that stops halfway no longer leaves the partial package on\n this computer for a week, and a link download that fails can be retried.\n\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/latest.json", + "size": 3026 + }, + { + "name": "PS5Upload-6.6.2-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-android.apk", + "size": 100335571 + }, + { + "name": "PS5Upload-6.6.2-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-linux-arm64.deb", + "size": 24788744 + }, + { + "name": "PS5Upload-6.6.2-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-linux-arm64.rpm", + "size": 24790646 + }, + { + "name": "PS5Upload-6.6.2-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-linux-arm64.zip", + "size": 98564499 + }, + { + "name": "PS5Upload-6.6.2-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-linux-x64.deb", + "size": 24683908 + }, + { + "name": "PS5Upload-6.6.2-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-linux-x64.rpm", + "size": 24681297 + }, + { + "name": "PS5Upload-6.6.2-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-linux-x64.zip", + "size": 100630444 + }, + { + "name": "PS5Upload-6.6.2-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-mac-arm64.dmg", + "size": 22877476 + }, + { + "name": "PS5Upload-6.6.2-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-mac-x64.dmg", + "size": 24035230 + }, + { + "name": "PS5Upload-6.6.2-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-win-arm64-setup.exe", + "size": 14661747 + }, + { + "name": "PS5Upload-6.6.2-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-win-arm64.zip", + "size": 21200067 + }, + { + "name": "PS5Upload-6.6.2-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-win-x64-setup.exe", + "size": 16396434 + }, + { + "name": "PS5Upload-6.6.2-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/PS5Upload-6.6.2-win-x64.zip", + "size": 22420181 + }, + { + "name": "ps5upload-6.6.2.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/ps5upload-6.6.2.elf", + "size": 3296952 + }, + { + "name": "ps5upload-engine-6.6.2-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/ps5upload-engine-6.6.2-linux-arm64", + "size": 43269320 + }, + { + "name": "ps5upload-engine-6.6.2-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/ps5upload-engine-6.6.2-linux-x64", + "size": 45586152 + }, + { + "name": "ps5upload-engine-6.6.2-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/ps5upload-engine-6.6.2-macos-arm64", + "size": 38992928 + }, + { + "name": "ps5upload-engine-6.6.2-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/ps5upload-engine-6.6.2-macos-x64", + "size": 40799136 + }, + { + "name": "ps5upload-engine-6.6.2-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/ps5upload-engine-6.6.2-windows-arm64.exe", + "size": 31522816 + }, + { + "name": "ps5upload-engine-6.6.2-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.2/ps5upload-engine-6.6.2-windows-x64.exe", + "size": 37028864 + } + ] + }, + { + "tag_name": "v6.6.1", + "prerelease": false, + "published_at": "2026-10-09T08:04:08Z", + "html_url": "https://github.com/phantomptr/ps5upload/releases/tag/v6.6.1", + "body": "**A new Bug report page that gathers everything we need, and two or more consoles no longer\r\nstep on each other.**\r\n\r\n### New\r\n\r\n- **Bug report.** Open it from the command palette, or from the link on any error. One page:\r\n say what went wrong, add screenshots, check your setup (filled in for you), and pick how far\r\n back the logs go (the last 15 minutes up to the last 7 days, or a time you choose). Everything\r\n the app, the engine and the PS5 recorded in that time goes in. Then post it as a GitHub issue,\r\n copy it for the Discord #bugs-report channel, or download the zip. IP addresses, serials, MAC\r\n addresses, home folders and keys are removed before anything leaves your computer.\r\n- **Screenshots for reports.** The Capture button at the bottom right of the desktop app takes a\r\n picture of any screen. The Bug report lists your captures to pick from and adds one you take\r\n while writing it. You can also add, drop or paste any image.\r\n- **The app now keeps a timeline.** Connection drops, reconnects, helper crashes, failed installs\r\n and engine restarts are noted as they happen, along with the helper's own log from each PS5,\r\n so a report shows what happened even when the console has since restarted. It also notes when\r\n the web UI reloads itself and why (#418).\r\n- **Buy me a coffee** is now on Home too, under the connection badge.\r\n\r\n### Fixed\r\n\r\n- **Switching consoles mid-task.** A check, a payload send, a bring-up or a folder pick that\r\n finishes after you switched to another PS5 now lands on the console it started on, not the\r\n one on screen.\r\n\r\n", + "assets": [ + { + "name": "latest.json", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/latest.json", + "size": 3262 + }, + { + "name": "PS5Upload-6.6.1-android.apk", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-android.apk", + "size": 100306899 + }, + { + "name": "PS5Upload-6.6.1-linux-arm64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-linux-arm64.deb", + "size": 24791534 + }, + { + "name": "PS5Upload-6.6.1-linux-arm64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-linux-arm64.rpm", + "size": 24797569 + }, + { + "name": "PS5Upload-6.6.1-linux-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-linux-arm64.zip", + "size": 98547187 + }, + { + "name": "PS5Upload-6.6.1-linux-x64.deb", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-linux-x64.deb", + "size": 24674236 + }, + { + "name": "PS5Upload-6.6.1-linux-x64.rpm", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-linux-x64.rpm", + "size": 24675308 + }, + { + "name": "PS5Upload-6.6.1-linux-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-linux-x64.zip", + "size": 100636437 + }, + { + "name": "PS5Upload-6.6.1-mac-arm64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-mac-arm64.dmg", + "size": 22855769 + }, + { + "name": "PS5Upload-6.6.1-mac-x64.dmg", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-mac-x64.dmg", + "size": 24032398 + }, + { + "name": "PS5Upload-6.6.1-win-arm64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-win-arm64-setup.exe", + "size": 14668030 + }, + { + "name": "PS5Upload-6.6.1-win-arm64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-win-arm64.zip", + "size": 21202327 + }, + { + "name": "PS5Upload-6.6.1-win-x64-setup.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-win-x64-setup.exe", + "size": 16406562 + }, + { + "name": "PS5Upload-6.6.1-win-x64.zip", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/PS5Upload-6.6.1-win-x64.zip", + "size": 22416658 + }, + { + "name": "ps5upload-6.6.1.elf", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/ps5upload-6.6.1.elf", + "size": 3296952 + }, + { + "name": "ps5upload-engine-6.6.1-linux-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/ps5upload-engine-6.6.1-linux-arm64", + "size": 43267688 + }, + { + "name": "ps5upload-engine-6.6.1-linux-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/ps5upload-engine-6.6.1-linux-x64", + "size": 45581872 + }, + { + "name": "ps5upload-engine-6.6.1-macos-arm64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/ps5upload-engine-6.6.1-macos-arm64", + "size": 38972976 + }, + { + "name": "ps5upload-engine-6.6.1-macos-x64", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/ps5upload-engine-6.6.1-macos-x64", + "size": 40807000 + }, + { + "name": "ps5upload-engine-6.6.1-windows-arm64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/ps5upload-engine-6.6.1-windows-arm64.exe", + "size": 31538176 + }, + { + "name": "ps5upload-engine-6.6.1-windows-x64.exe", + "browser_download_url": "https://github.com/phantomptr/ps5upload/releases/download/v6.6.1/ps5upload-engine-6.6.1-windows-x64.exe", + "size": 37035008 + } + ] + } +] diff --git a/site/style.css b/site/style.css new file mode 100644 index 00000000..e94caa9f --- /dev/null +++ b/site/style.css @@ -0,0 +1,537 @@ +/* PS5Upload website. The app's look (client/src/index.css): a calm neutral page, white or + * graphite cards a step off it, one blue accent, the system typeface. Light and dark follow + * the visitor's system; the header button overrides it (data-theme on ). */ + +:root { + color-scheme: light; + --bg: #f5f5f7; + --card: #ffffff; + --card-2: rgb(0 0 0 / 0.03); + --line: rgb(0 0 0 / 0.1); + --line-strong: rgb(0 0 0 / 0.18); + --text: #1d1d1f; + --muted: #5f5f66; + --accent: #0064d2; + --accent-fill: #0071e3; + --accent-soft: rgb(0 113 227 / 0.1); + --good: #1a7f43; + --warn: #8a5200; + --shadow: 0 1px 2px rgb(0 0 0 / 0.05); + --shadow-big: 0 30px 80px -30px rgb(0 0 0 / 0.35), 0 0 0 0.5px rgb(0 0 0 / 0.1); + --radius: 14px; + --radius-big: 20px; +} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) { + color-scheme: dark; + --bg: #1e1e20; + --card: #2a2a2c; + --card-2: rgb(255 255 255 / 0.04); + --line: rgb(255 255 255 / 0.1); + --line-strong: rgb(255 255 255 / 0.2); + --text: #f5f5f7; + --muted: #a1a1a8; + --accent: #4da3ff; + --accent-fill: #0a72e8; + --accent-soft: rgb(10 132 255 / 0.16); + --good: #32d074; + --warn: #ffb340; + --shadow: 0 1px 2px rgb(0 0 0 / 0.25); + --shadow-big: 0 30px 80px -30px rgb(0 0 0 / 0.8), 0 0 0 0.5px rgb(255 255 255 / 0.08); + } +} +:root[data-theme="dark"] { + color-scheme: dark; + --bg: #1e1e20; + --card: #2a2a2c; + --card-2: rgb(255 255 255 / 0.04); + --line: rgb(255 255 255 / 0.1); + --line-strong: rgb(255 255 255 / 0.2); + --text: #f5f5f7; + --muted: #a1a1a8; + --accent: #4da3ff; + --accent-fill: #0a72e8; + --accent-soft: rgb(10 132 255 / 0.16); + --good: #32d074; + --warn: #ffb340; + --shadow: 0 1px 2px rgb(0 0 0 / 0.25); + --shadow-big: 0 30px 80px -30px rgb(0 0 0 / 0.8), 0 0 0 0.5px rgb(255 255 255 / 0.08); +} + +* { + box-sizing: border-box; +} +html { + scroll-behavior: smooth; + scroll-padding-top: 80px; +} +body { + margin: 0; + background: var(--bg); + color: var(--text); + font: 16px/1.55 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans", + Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; +} +a { + color: var(--accent); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + border-radius: 6px; +} +h1, +h2, +h3 { + letter-spacing: -0.02em; + line-height: 1.1; + margin: 0; +} +code { + font: 0.85em ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace; + background: var(--card-2); + border: 1px solid var(--line); + border-radius: 6px; + padding: 0.1em 0.4em; +} +.muted { + color: var(--muted); +} +.skip { + position: absolute; + left: -999px; +} +.skip:focus { + left: 16px; + top: 12px; + z-index: 10; + background: var(--card); + padding: 8px 12px; + border-radius: 10px; +} +.wrap { + width: min(1180px, 100% - 32px); + margin-inline: auto; +} + +/* ── Header ─────────────────────────────────────────────────────────────── */ +.top { + position: sticky; + top: 0; + z-index: 5; + background: color-mix(in srgb, var(--bg) 82%, transparent); + -webkit-backdrop-filter: blur(20px) saturate(1.4); + backdrop-filter: blur(20px) saturate(1.4); + border-bottom: 1px solid var(--line); +} +.top-row { + display: flex; + align-items: center; + gap: 16px; + height: 60px; +} +.brand { + display: flex; + align-items: center; + gap: 10px; + color: var(--text); + font-weight: 650; + font-size: 18px; + letter-spacing: -0.02em; +} +.brand:hover { + text-decoration: none; +} +.brand img { + border-radius: 9px; +} +.nav { + display: flex; + gap: 4px; + margin-inline-start: auto; +} +.nav a { + color: var(--text); + padding: 6px 12px; + border-radius: 999px; + font-size: 15px; +} +.nav a:hover { + background: var(--card-2); + text-decoration: none; +} +.top-actions { + display: flex; + gap: 6px; +} +.icon-btn { + display: grid; + place-items: center; + width: 36px; + height: 36px; + border-radius: 999px; + border: 1px solid var(--line); + background: var(--card); + color: var(--text); + cursor: pointer; +} +.icon-btn svg { + width: 18px; + height: 18px; +} + +/* ── Buttons ────────────────────────────────────────────────────────────── */ +.btn { + display: inline-flex; + align-items: center; + gap: 8px; + min-height: 44px; + padding: 0 20px; + border-radius: 999px; + border: 1px solid var(--line-strong); + background: var(--card); + color: var(--text); + font: inherit; + font-weight: 550; + cursor: pointer; + box-shadow: var(--shadow); +} +.btn:hover { + text-decoration: none; + background: var(--card-2); +} +.btn svg { + width: 18px; + height: 18px; +} +.btn.primary { + background: var(--accent-fill); + border-color: transparent; + color: #fff; +} +.btn.primary:hover { + filter: brightness(1.08); +} +.btn.small { + min-height: 34px; + padding: 0 14px; + font-size: 14px; +} + +/* ── Hero ───────────────────────────────────────────────────────────────── */ +.hero { + display: grid; + gap: 40px; + padding: 72px 0 32px; + text-align: center; +} +.eyebrow { + display: inline-block; + margin: 0 0 16px; + padding: 4px 12px; + border-radius: 999px; + background: var(--accent-soft); + color: var(--accent); + font-size: 14px; + font-weight: 600; +} +.hero h1 { + font-size: clamp(40px, 7vw, 76px); + font-weight: 750; + letter-spacing: -0.04em; +} +.lead { + max-width: 680px; + margin: 20px auto 0; + font-size: clamp(17px, 2vw, 21px); + color: var(--muted); +} +.hero-cta { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 12px; + margin-top: 28px; +} +.fine { + margin: 14px 0 0; + font-size: 14px; + color: var(--muted); +} +.shot { + margin: 0; +} +.shot img { + display: block; + width: 100%; + height: auto; + border-radius: var(--radius-big); + box-shadow: var(--shadow-big); +} +.shot figcaption { + margin-top: 14px; + color: var(--muted); + font-size: 15px; + text-align: center; +} + +/* ── Sections ───────────────────────────────────────────────────────────── */ +.section { + padding: 64px 0 8px; +} +.section h2 { + font-size: clamp(28px, 4vw, 40px); + font-weight: 700; +} +.section-lead { + margin: 10px 0 0; + color: var(--muted); + font-size: 18px; +} +.section-head { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + justify-content: space-between; + gap: 12px; +} +.grid { + display: grid; + gap: 16px; + margin-top: 28px; +} +.features { + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); +} +.screens { + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); + gap: 32px; + margin-top: 0; +} +.card { + background: var(--card); + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 22px; + box-shadow: var(--shadow); +} +.card h3 { + font-size: 18px; + font-weight: 650; +} +.card p { + margin: 8px 0 0; + color: var(--muted); + font-size: 15px; +} +.ico { + display: grid; + place-items: center; + width: 42px; + height: 42px; + margin-bottom: 14px; + border-radius: 12px; + background: var(--accent-soft); + color: var(--accent); +} +.ico svg { + width: 21px; + height: 21px; + fill: none; + stroke: currentColor; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; +} + +/* ── Downloads ──────────────────────────────────────────────────────────── */ +.downloads { + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); +} +.dl { + display: flex; + flex-direction: column; + gap: 12px; +} +.dl.mine { + border-color: var(--accent); + box-shadow: 0 0 0 3px var(--accent-soft); +} +.dl-head { + display: flex; + align-items: center; + gap: 10px; +} +.dl-head .tag { + margin-inline-start: auto; +} +.dl-files { + display: grid; + gap: 8px; +} +.dl-file { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 10px 12px; + border-radius: 10px; + background: var(--card-2); + border: 1px solid var(--line); + color: var(--text); + font-size: 15px; +} +.dl-file:hover { + border-color: var(--accent); + text-decoration: none; +} +.dl-file small { + color: var(--muted); + white-space: nowrap; +} +.tag { + display: inline-block; + padding: 2px 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 600; + background: var(--accent-soft); + color: var(--accent); + white-space: nowrap; +} +.tag.pre { + background: color-mix(in srgb, var(--warn) 16%, transparent); + color: var(--warn); +} +.docker { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-top: 16px; +} +.copy { + display: flex; + align-items: center; + gap: 8px; + min-width: 0; + max-width: 100%; +} +.copy code { + overflow-x: auto; + white-space: nowrap; + padding: 8px 12px; + max-width: 640px; +} +.more { + margin-top: 16px; + color: var(--muted); +} +.more summary { + cursor: pointer; +} +.extras { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +/* ── News ───────────────────────────────────────────────────────────────── */ +.news { + display: grid; + gap: 16px; + margin-top: 28px; +} +.post-head { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 10px; +} +.post-head h3 { + font-size: 22px; +} +.post-head time { + color: var(--muted); + font-size: 14px; +} +.post-body { + margin-top: 10px; + color: var(--text); + font-size: 15px; +} +.post-body p { + color: var(--text); +} +.post-body ul { + margin: 10px 0 0; + padding-inline-start: 20px; +} +.post-body li { + margin: 4px 0; + color: var(--muted); +} +.post-body li strong { + color: var(--text); +} +.post-more { + display: inline-block; + margin-top: 10px; + font-size: 15px; +} +.older { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +/* ── Community, footer ──────────────────────────────────────────────────── */ +.community { + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); +} +.link-card { + color: var(--text); +} +.link-card:hover { + text-decoration: none; + border-color: var(--accent); +} +.foot { + margin-top: 72px; + padding: 28px 0 40px; + border-top: 1px solid var(--line); + font-size: 14px; +} +.foot-row { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 8px; +} + +@media (max-width: 720px) { + .nav { + display: none; + } + .top-actions { + margin-inline-start: auto; + } + .hero { + padding-top: 40px; + } + .docker { + flex-direction: column; + align-items: stretch; + } + .copy code { + flex: 1; + } +}