From 538fb60df85ef8ace7feeddc4ffe38f3dc898db0 Mon Sep 17 00:00:00 2001 From: phantomptr Date: Fri, 16 Oct 2026 14:55:54 -0700 Subject: [PATCH] Home tiles say rest mode; CHANGELOG 7.0.31 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RxCGb8Asp1A1AQYiv1kbgS --- CHANGELOG.md | 17 +++++++++++++++++ client/src/lib/operationReadiness.ts | 6 +++++- client/src/screens/Home/index.tsx | 10 ++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdf9b4ef..54bc4f9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ What's new in ps5upload, written for humans. --- +## 7.0.31 + +- **Rest mode is shown as rest mode, not as a problem.** A PS5 in rest mode used to look the + same as one that was off or broken: a red "Not connected", "Helper isn't running" on every + console screen, and Connection's Check blaming the jailbreak or a VPN. The app now asks the + console the way Remote Play does (it answers "standby" while it sleeps), and shows a calm, + blue "In rest mode" in the status bar, the console tabs, Home and the game page. Console screens + say "Your PS5 is in rest mode" with a Wake button when wake is set up. A console that answers + nothing at all reads "Not answering", with the setting it needs to stay reachable in rest mode + (Settings › System › Power Saving › Features Available in Rest Mode). +- **Nothing fights a sleeping console.** The automatic reconnect no longer pokes a console in rest + mode every 30 seconds all night; it waits, and sends the helper again once the console is + awake. Uploads that meet rest mode wait ("Waiting for the PS5 to wake") and carry on after the + wake, without using up their retries; in the browser version they used to fail. Keep-awake skips + a sleeping console. Measured on both consoles on FW 13.60, including a full rest → wake → + helper back → rest cycle on the Pro. + ## 7.0.30 - **Files fits on a phone (#470).** On a narrow screen every file and folder row carried up to diff --git a/client/src/lib/operationReadiness.ts b/client/src/lib/operationReadiness.ts index 6a07ac51..27d25b8c 100644 --- a/client/src/lib/operationReadiness.ts +++ b/client/src/lib/operationReadiness.ts @@ -22,6 +22,10 @@ export interface OperationReadiness { * Connectivity is not a single boolean: local work only needs the engine, * console reads/writes need the helper, and privileged system changes also * need verified kernel R/W. */ +/** The blocker for a console whose helper does not answer; callers that know why (rest mode) + * swap it for a better reason. */ +export const HELPER_NOT_CONNECTED = "The PS5 helper is not connected."; + export function evaluateOperationReadiness( operation: Operation, context: ReadinessContext, @@ -32,7 +36,7 @@ export function evaluateOperationReadiness( if (!context.engineUp) blockers.push("The ps5upload engine is offline."); if (operation !== "local-only") { if (!context.host.trim()) blockers.push("No PS5 is selected."); - if (!context.helperUp) blockers.push("The PS5 helper is not connected."); + if (!context.helperUp) blockers.push(HELPER_NOT_CONNECTED); } if (operation === "manage-system") { if (context.kernelRw === false) { diff --git a/client/src/screens/Home/index.tsx b/client/src/screens/Home/index.tsx index b30a48d1..ef738fc4 100644 --- a/client/src/screens/Home/index.tsx +++ b/client/src/screens/Home/index.tsx @@ -36,6 +36,7 @@ import { RecentGames } from "./RecentGames"; import { greetingPart } from "./greeting"; import { evaluateOperationReadiness, + HELPER_NOT_CONNECTED, type Operation, } from "../../lib/operationReadiness"; @@ -99,8 +100,13 @@ export default function HomeScreen() { helperUp: payloadStatus === "up", kernelRw: ucredElevated, }; - const readinessFor = (operation: Operation) => - evaluateOperationReadiness(operation, readinessContext); + // An asleep console's helper is gone because of the rest, not a fault: say so on the tiles. + const readinessFor = (operation: Operation) => { + const r = evaluateOperationReadiness(operation, readinessContext); + if (!resting) return r; + const rest = tr("status_ps5_rest_mode", "In rest mode"); + return { ...r, blockers: r.blockers.map((b) => (b === HELPER_NOT_CONNECTED ? rest : b)) }; + }; const part = greetingPart(new Date().getHours()); const greeting =