fix(settings): hide the Beta features switch while nothing is in beta; README drops Convert's beta note

Convert graduated; the switch revealed nothing and the README still told users
to enable Convert there. Stream install is Stream & install everywhere.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
phantomptrandClaude Opus 5.5 committed 2026-09-28 00:30:48 -07:00
1 parent 808780f2e3
commit 67335e2c50
6 files changed
+52 -29

No files matched your search

+8 -8
View File
@@ -23,16 +23,16 @@
- **One way to install any package.** PS4 `.pkg` and PS5 fake packages —
base games, updates and DLC — install through ps5upload's own on-console
installer, whether you **Stream install** straight from your PC (nothing
installer, whether you **Stream & install** straight from your PC (nothing
copied to the PS5), **Upload & install** (copied first, kept for
reinstalls), or install from a NAS, a USB drive or a download link. Every
route shows the same live progress, only says "installed" once the console
has the whole package, checks that an update really raised the game's
version, and never wipes your base game.
- **Turn a game into an installable PS5 package.** **Convert to FPKG** (beta)
- **Turn a game into an installable PS5 package.** **Convert to FPKG**
builds a fake package from a decrypted game folder or an `.exfat` / `.ffpkg`
image, on your computer, compressed the way Sony's own packages are — then
installs it with Stream install or Upload & install in one click.
installs it with Stream & install or Upload & install in one click.
- **Sleep, wake and power from your desk.** Put the PS5 in rest mode, reboot
or shut it down, and **wake it back up over the network** — even straight
into your signed-in user with Wake & sign in. The app keeps the console and
@@ -131,7 +131,7 @@
playlist step can pull straight from a repo at run time so you don't
keep a pile of `.elf` files on your PC.
- **Install packages** — install a PS4 `.pkg` or PS5 fake package two ways:
**Stream install** sends it straight from your PC (nothing is copied to
**Stream & install** sends it straight from your PC (nothing is copied to
the PS5 first — handy when console storage is tight), and **Upload &
install** copies it to the PS5's package library first, where it stays so
you can **Install**, **Reinstall** or **Delete** it later without
@@ -142,10 +142,10 @@
and the result checks out — an update that didn't raise the game's version
is reported, not called a success. Base, update and DLC installs verified
on FW 5.10.
- **Convert to FPKG (beta)** — turn a decrypted game folder or an `.exfat` /
- **Convert to FPKG** — turn a decrypted game folder or an `.exfat` /
`.ffpkg` image into an installable fake package on your computer, with the
same compression Sony's packages use, then install it with Stream install
or Upload & install. Enable it under Settings → Beta features.
same compression Sony's packages use, then install it with Stream & install
or Upload & install.
- **Web browser access** — run the engine (or the official Docker image)
and manage your PS5 from any browser on the LAN, the full app served
over HTTP. No desktop install needed on that machine. Unauthenticated —
@@ -430,7 +430,7 @@ port 9021 — a third-party component, not part of ps5upload.
ps5upload connects and then drops after a few seconds. Loading elfldr
once from PLDMGR and then sending ps5upload again also fixes it.
**Q: Stream install fails before the PS5 downloads anything?**
**Q: Stream & install fails before the PS5 downloads anything?**
* The PS5 pulls the package from your computer, so it has to be able to
reach it. Allow ps5upload through your computer's firewall (on Windows,
for both Private and Public networks), keep the computer and the PS5 on
+11
View File
@@ -322,3 +322,14 @@ describe("Convert to FPKG", () => {
expect(APP).not.toMatch(/BetaRoute/);
});
});
// A switch that reveals nothing is a dead control: Settings shows it only while
// something is actually in beta.
describe("hasBetaItems", () => {
it("is false when no screen is in beta", async () => {
const { hasBetaItems } = await import("./navItems");
expect(hasBetaItems([{ to: "/a", beta: false } as never])).toBe(false);
expect(hasBetaItems([{ to: "/a", beta: true } as never])).toBe(true);
expect(hasBetaItems()).toBe(NAV_ITEMS.some((i) => i.beta));
});
});
+5
View File
@@ -315,6 +315,11 @@ export const PERMANENT_NAV_ITEMS: readonly NavItem[] = [
/** Whether an item is currently visible. Beta items stay hidden until the
* user turns them on, which is what keeps a half-finished screen out of a
* sidebar that the user never asked to be a test bench. */
/** Whether any screen is in beta — Settings only offers the switch then. */
export function hasBetaItems(items: NavItem[] = NAV_ITEMS): boolean {
return items.some((i) => i.beta);
}
export function navItemVisible(item: NavItem, betaEnabled: boolean): boolean {
return !item.beta || betaEnabled;
}
+1 -1
View File
@@ -787,7 +787,7 @@ export default function InstallPackageScreen() {
}
}
// Stream-install (beta, #81): pick a single PC-side .pkg and install it
// Stream & install (#81): pick a single PC-side .pkg and install it
// WITHOUT staging it on the PS5 first — the engine serves the file over
// HTTP and the DPI daemon pulls it directly. Useful for a quick one-shot
// install when you don't want to wait out the staging upload (or don't
+26 -19
View File
@@ -68,6 +68,7 @@ import { useConnectionStore } from "../../state/connection";
import { useEngineStore, DEFAULT_ENGINE_URL } from "../../state/engine";
import { useSaveSettingsStore, DEFAULT_SAVE_PATH } from "../../state/saveSettings";
import { useBetaFeaturesStore } from "../../state/betaFeatures";
import { hasBetaItems } from "../../layout/navItems";
import { useRestAfterUploadStore } from "../../state/restAfterUpload";
import { userConfigPath, resetAllAppData } from "../../state/userConfig";
import { useUpdateStore, type UpdatePhase } from "../../state/update";
@@ -1001,26 +1002,32 @@ export default function SettingsScreen() {
<BugReportLink />
</Section>
<GroupHeading>
{tr("settings_group_beta", undefined, "Beta features")}
</GroupHeading>
{/* Only while something is in beta: a switch that reveals nothing
reads as broken. */}
{hasBetaItems() && (
<>
<GroupHeading>
{tr("settings_group_beta", undefined, "Beta features")}
</GroupHeading>
<Section title={tr("settings_card_beta", undefined, "Beta features")} full>
<Toggle
checked={betaFeatures}
onChange={(on) => setBetaFeatures(on)}
label={tr(
"beta_features_label",
undefined,
"Show features that are still being finished",
)}
hint={tr(
"beta_features_hint",
undefined,
"Adds work-in-progress screens to the sidebar when there are any. These are usable but not yet reliable, and may change or be removed.",
)}
/>
</Section>
<Section title={tr("settings_card_beta", undefined, "Beta features")} full>
<Toggle
checked={betaFeatures}
onChange={(on) => setBetaFeatures(on)}
label={tr(
"beta_features_label",
undefined,
"Show features that are still being finished",
)}
hint={tr(
"beta_features_hint",
undefined,
"Adds work-in-progress screens to the sidebar when there are any. These are usable but not yet reliable, and may change or be removed.",
)}
/>
</Section>
</>
)}
<GroupHeading>
{tr("settings_group_automation", undefined, "Automation")}
+1 -1
View File
@@ -992,7 +992,7 @@ interface PkgLibraryState {
host: string,
opts?: { onDest?: (destPath: string) => void },
) => Promise<{ ok: boolean; message?: string }>;
/** Stream-install (beta, #81) a local PC-side `.pkg` WITHOUT uploading it
/** Stream & install (#81) a local PC-side `.pkg` WITHOUT uploading it
* to PS5 staging first. The engine serves the file over HTTP at
* `/pkg-host/{session}/` and the DPI daemon pulls it directly. Saves the
* staging upload (and the disk space) for the quick-install case. The