2608 lines
212 KiB
HTML
2608 lines
212 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' https://cdn.prosperopatches.com https://prosperopatches.com https://cdn.orbispatches.com https://orbispatches.com data: blob:; media-src 'self' pork-cache: blob:; frame-src http: https:; connect-src 'self' ws: wss: http: https:;"/>
|
||
<title>Chimera</title>
|
||
<link rel="icon" type="image/svg+xml" href="assets/chimera-crest.svg"/>
|
||
<link rel="apple-touch-icon" href="__CHIMERA_ICON_SRC__"/>
|
||
<link rel="manifest" href="/manifest.webmanifest"/>
|
||
<meta name="theme-color" content="#15111b"/>
|
||
<link rel="stylesheet" href="styles/base.css"/>
|
||
<link rel="stylesheet" href="styles/components.css"/>
|
||
<link rel="stylesheet" href="styles/features.css"/>
|
||
<link rel="stylesheet" href="styles/pages.css"/>
|
||
<link rel="stylesheet" href="styles/navigation.css"/>
|
||
<link rel="stylesheet" href="styles/stitch.css"/>
|
||
<link rel="stylesheet" href="styles/game-covers.css"/>
|
||
<link rel="stylesheet" href="styles/mobile-companion.css"/>
|
||
<link rel="stylesheet" href="styles/title-workspace.css"/>
|
||
<link rel="stylesheet" href="styles/protection-copies.css"/>
|
||
<link rel="stylesheet" href="styles/install-destination.css"/>
|
||
<link rel="stylesheet" href="styles/premium.css"/>
|
||
<link rel="stylesheet" href="styles/ps5-profiles.css"/>
|
||
<link rel="stylesheet" href="styles/etahen-link.css"/>
|
||
<link rel="stylesheet" href="styles/chimera-system.css"/>
|
||
</head>
|
||
<body>
|
||
<div id="titlebar">
|
||
<div id="titlebar-drag">
|
||
<button id="mobile-nav-toggle" title="Open navigation" aria-label="Open navigation" aria-controls="sidebar" aria-expanded="false">☰</button>
|
||
<img src="assets/chimera-crest.svg" class="titlebar-icon" alt=""/>
|
||
<span>Chimera</span>
|
||
<span class="titlebar-by">personal edition</span>
|
||
</div>
|
||
<a id="titlebar-x-link" href="#" title="Over Chimera">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="11" height="11" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.747l7.73-8.835L2.012 2.25H8.08l4.253 5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
|
||
Private PS platform
|
||
</a>
|
||
<div id="titlebar-controls">
|
||
<button id="btn-min" title="Minimize">–</button>
|
||
<button id="btn-max" title="Maximize">□</button>
|
||
<button id="btn-cls" title="Close">✕</button>
|
||
</div>
|
||
</div>
|
||
<div id="app">
|
||
<nav id="sidebar">
|
||
<div class="sidebar-brand">
|
||
<img src="assets/chimera-crest.svg" class="brand-icon" alt=""/>
|
||
<span class="sidebar-brand-copy">
|
||
<strong>Chimera</strong>
|
||
<small data-i18n="brand.subtitle">PS operations hub</small>
|
||
</span>
|
||
</div>
|
||
<ul class="nav-list">
|
||
<li class="nav-section-label">Overview</li>
|
||
<li><a class="nav-link active" data-page="dashboard">
|
||
<svg viewBox="0 0 20 20"><rect x="2" y="2" width="7" height="7" rx="1" fill="currentColor"/><rect x="11" y="2" width="7" height="7" rx="1" fill="currentColor"/><rect x="2" y="11" width="7" height="7" rx="1" fill="currentColor"/><rect x="11" y="11" width="7" height="7" rx="1" fill="currentColor"/></svg>
|
||
<span data-i18n="nav.dashboard">Dashboard</span>
|
||
</a></li>
|
||
<li class="nav-section-label">Library</li>
|
||
<li><a class="nav-link" data-page="games">
|
||
<svg viewBox="0 0 20 20"><circle cx="10" cy="10" r="8" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M7 10h6M10 7v6" stroke="currentColor" stroke-width="1.5"/></svg>
|
||
<span data-i18n="nav.games">Games</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="backporks">
|
||
<svg viewBox="0 0 20 20"><path d="M4 4h5v5H4zM11 4h5v5h-5zM4 11h5v5H4zM11 11h5v5h-5z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
|
||
<span data-i18n="nav.backporks">Backporks</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="backups">
|
||
<svg viewBox="0 0 20 20"><path d="M5 4h10a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2V6a2 2 0 012-2z" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M10 8v6M7 11l3 3 3-3" stroke="currentColor" stroke-width="1.5"/></svg>
|
||
<span data-i18n="nav.backups">Backups</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="database">
|
||
<svg viewBox="0 0 20 20"><ellipse cx="10" cy="6" rx="7" ry="3" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M3 6v4c0 1.657 3.134 3 7 3s7-1.343 7-3V6" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M3 10v4c0 1.657 3.134 3 7 3s7-1.343 7-3v-4" stroke="currentColor" stroke-width="1.5" fill="none"/></svg>
|
||
<span data-i18n="nav.database">Database</span>
|
||
</a></li>
|
||
<li class="nav-section-label">Console</li>
|
||
<li><a class="nav-link" data-page="jailbreak">
|
||
<svg viewBox="0 0 20 20"><path d="M10 2a4 4 0 014 4v1h1a2 2 0 012 2v7a2 2 0 01-2 2H5a2 2 0 01-2-2V9a2 2 0 012-2h1V6a4 4 0 014-4z" stroke="currentColor" stroke-width="1.5" fill="none"/><circle cx="10" cy="12" r="1.5" fill="currentColor"/></svg>
|
||
<span data-i18n="nav.jailbreak">Payload Workspace</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="psnotify">
|
||
<svg viewBox="0 0 20 20"><path d="M10 2a6 6 0 016 6c0 3.5 1.5 5 2 6H2c.5-1 2-2.5 2-6a6 6 0 016-6z" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linejoin="round"/><path d="M8 14a2 2 0 004 0" stroke="currentColor" stroke-width="1.5" fill="none"/></svg>
|
||
<span data-i18n="nav.psnotify">Notifications</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="xavatar">
|
||
<svg viewBox="0 0 20 20"><circle cx="10" cy="8" r="4" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M2 17c0-3.3 3.6-6 8-6s8 2.7 8 6" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round"/></svg>
|
||
<span data-i18n="nav.xavatar">XAvatar Management</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="system-view">
|
||
<svg viewBox="0 0 20 20">
|
||
<rect x="2" y="3" width="16" height="11" rx="2" stroke="currentColor" stroke-width="1.5" fill="none"/>
|
||
<path d="M7 17h6M10 14v3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
||
</svg>
|
||
<span data-i18n="nav.systemView">System View</span>
|
||
</a></li>
|
||
<li class="nav-section-label">Werkstromen</li>
|
||
<li><a class="nav-link" data-page="transfers">
|
||
<svg viewBox="0 0 20 20"><path d="M5 4v12M5 4L2 7M5 4l3 3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M15 16V4M15 16l-3-3M15 16l3-3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg>
|
||
<span data-i18n="nav.transfers">Transfers</span>
|
||
<span id="nav-transfer-badge" class="nav-badge" hidden></span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="media">
|
||
<svg viewBox="0 0 20 20">
|
||
<rect x="1" y="5" width="14" height="10" rx="2" stroke="currentColor" stroke-width="1.4" fill="none"/>
|
||
<path d="M15 8l4-2v8l-4-2V8z" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round" fill="none"/>
|
||
</svg>
|
||
<span data-i18n="nav.media">Media</span>
|
||
<span id="nav-media-badge" class="nav-badge" hidden></span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="cheats">
|
||
<svg viewBox="0 0 20 20"><path d="M10 2l2.4 4.8 5.3.8-3.85 3.75.91 5.3L10 14.1l-4.76 2.55.91-5.3L2.3 7.6l5.3-.8z" stroke="currentColor" stroke-width="1.4" fill="none" stroke-linejoin="round"/></svg>
|
||
<span data-i18n="nav.cheats">Cheats</span>
|
||
<span id="nav-cheats-badge" class="nav-badge" hidden></span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="garlic">
|
||
<svg viewBox="0 0 20 20">
|
||
<path d="M10 17V7" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
||
<path d="M10 10C10 10 6.5 9 5.5 5c3.5 0 5.5 2 4.5 5z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
|
||
<path d="M10 13C10 13 13.5 12 14.5 8c-3.5.5-5.5 2-4.5 5z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/>
|
||
</svg>
|
||
<span data-i18n="nav.garlic">GarlicSaves</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="elf-arsenal">
|
||
<svg viewBox="0 0 20 20"><path d="M4 3h9l3 3v11H4z" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M12 3v4h4M7 11l2 2-2 2M11 15h3" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>
|
||
<span data-i18n="nav.elfArsenal">ELF Arsenal</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="pfs-ripper">
|
||
<svg viewBox="0 0 20 20"><rect x="3" y="4" width="14" height="12" rx="1.5" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M3 8h14M7 12h6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||
<span data-i18n="nav.pfsRipper">PFS Ripper</span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="savemgr">
|
||
<svg viewBox="0 0 20 20"><rect x="3" y="4" width="14" height="9" rx="1" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M7 17h6M10 13v4" stroke="currentColor" stroke-width="1.5"/><path d="M6 8h5M6 11h3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
|
||
<span data-i18n="nav.saveManager">Local Save Manager</span>
|
||
</a></li>
|
||
<li class="nav-section-label">Systeem</li>
|
||
<li><a class="nav-link" data-page="ecosystem">
|
||
<svg viewBox="0 0 20 20"><path d="M10 2l7 4v8l-7 4-7-4V6z" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M3 6l7 4 7-4M10 10v8" stroke="currentColor" stroke-width="1.5" fill="none"/><circle cx="10" cy="6" r="1.5" fill="currentColor"/></svg>
|
||
<span>Console Status</span>
|
||
<span id="nav-ecosystem-badge" class="nav-badge" hidden></span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="operations">
|
||
<svg viewBox="0 0 20 20"><path d="M3 4h14v12H3z" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M6 13l2-3 2 2 3-5 2 3" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/><circle cx="6" cy="7" r="1" fill="currentColor"/></svg>
|
||
<span>Operations Center</span>
|
||
<span id="nav-operations-badge" class="nav-badge" hidden></span>
|
||
</a></li>
|
||
<li><a class="nav-link" data-page="settings">
|
||
<svg viewBox="0 0 20 20"><circle cx="10" cy="10" r="3" stroke="currentColor" stroke-width="1.5" fill="none"/><path d="M10 2v2M10 16v2M2 10h2M16 10h2M4.2 4.2l1.4 1.4M14.4 14.4l1.4 1.4M4.2 15.8l1.4-1.4M14.4 5.6l1.4-1.4" stroke="currentColor" stroke-width="1.5"/></svg>
|
||
<span data-i18n="nav.settings">Settings</span>
|
||
</a></li>
|
||
</ul>
|
||
<button id="sidebar-donate" title="Over Chimera">
|
||
<img src="assets/chimera-crest.svg" class="donate-icon" alt=""/>
|
||
<span class="donate-label" data-i18n="nav.donate">Donate</span>
|
||
</button>
|
||
<div id="sidebar-conn">
|
||
<div id="conn-dot" class="dot red"></div>
|
||
<span id="conn-label">Disconnected</span>
|
||
</div>
|
||
</nav>
|
||
<div id="sidebar-scrim" hidden></div>
|
||
<main id="content">
|
||
<div id="page-dashboard" class="page active">
|
||
<div class="page-header">
|
||
<div>
|
||
<h1 data-i18n="page.dashboard">Dashboard</h1>
|
||
<p class="page-subtitle" data-i18n="dashboard.subtitle">Current status of your console, library and protection.</p>
|
||
</div>
|
||
</div>
|
||
<div class="stats-row">
|
||
<div class="stat-card"><div class="stat-num" id="s-total">—</div><div class="stat-lbl">Games</div></div>
|
||
<div class="stat-card"><div class="stat-num" id="s-installed">—</div><div class="stat-lbl" data-i18n="dashboard.installed">Installed</div></div>
|
||
<div class="stat-card"><div class="stat-num" id="s-backedup">—</div><div class="stat-lbl" data-i18n="dashboard.protected">Protected</div></div>
|
||
<div class="stat-card"><div class="stat-num" id="s-backups">—</div><div class="stat-lbl" data-i18n="dashboard.backupFiles">Backup files</div></div>
|
||
</div>
|
||
<div class="dash-pinned-section">
|
||
<div class="dash-pinned-header">
|
||
<span class="dash-pinned-label" data-i18n="dashboard.pinnedTools">Pinned tools</span>
|
||
</div>
|
||
<div id="dash-pinned-grid" class="dash-pinned-grid"></div>
|
||
<p id="dash-pinned-empty" class="dash-pinned-empty" data-i18n="dashboard.noPinnedTools">No tools pinned yet. Use the pin on a tool to show it here.</p>
|
||
</div>
|
||
<div class="card dashboard-connection-card">
|
||
<div class="card-header"><h3 data-i18n="dashboard.ps5Connection">PS5 connection</h3><span id="dash-conn-badge" class="badge badge-red">Offline</span></div>
|
||
<div class="form-row">
|
||
<label>Host<input id="d-host" type="text" placeholder="192.168.1.x"/></label>
|
||
<label><span data-i18n="dashboard.ports">Ports</span><input id="d-ports" type="text" placeholder="1337, 2121, 21" style="width:160px" title="Comma-separated; tried in this order"/></label>
|
||
<label><span data-i18n="dashboard.user">User</span><input id="d-user" type="text" placeholder="optional" data-i18n-placeholder="common.optional"/></label>
|
||
<label><span data-i18n="dashboard.password">Password</span><input id="d-pass" type="password" placeholder="optional" data-i18n-placeholder="common.optional"/></label>
|
||
</div>
|
||
<div class="btn-row">
|
||
<button id="btn-connect" class="btn btn-accent" data-i18n="btn.connect">Connect</button>
|
||
<button id="btn-disconnect" class="btn" disabled data-i18n="btn.disconnect">Disconnect</button>
|
||
<button id="btn-scan" class="btn btn-teal" disabled data-i18n="games.scanPs5">↻ Scan PS5</button>
|
||
</div>
|
||
<div id="scan-progress" class="progress-area" hidden></div>
|
||
</div>
|
||
</div>
|
||
<div id="page-packages" class="page">
|
||
<div class="page-header"><div><h2 data-i18n="packageLibrary.title">Package Library</h2><p data-i18n="packageLibrary.description">Read-only package sets, components, hashes and versioned recipes.</p></div></div>
|
||
<section class="card package-library-toolbar" aria-label="Package inventory filters" data-i18n-aria-label="packageLibrary.filters">
|
||
<label><span data-i18n="packageLibrary.search">Search packages</span><input id="package-library-search" type="search" autocomplete="off" placeholder="Title, component, version or hash" data-i18n-placeholder="packageLibrary.searchPlaceholder"></label>
|
||
<div id="package-library-stats" class="package-library-stats" role="status" aria-live="polite"></div>
|
||
</section>
|
||
<div id="package-library-content"><p class="hint" data-i18n="common.loading">Loading...</p></div>
|
||
</div>
|
||
<div id="page-games" class="page">
|
||
<div class="page-header game-library-header">
|
||
<div class="game-library-title">
|
||
<span class="game-library-eyebrow" data-i18n="games.assetEyebrow">Library / Games</span>
|
||
<h1 data-i18n="games.assetTitle">Games</h1>
|
||
<p data-i18n="games.assetSubtitle">Browse, enrich and protect every PS4 and PS5 title from one operational view.</p>
|
||
</div>
|
||
<div class="game-platform-switch" role="group" aria-label="Game platform" data-i18n-aria-label="games.platform.label">
|
||
<button class="game-platform-btn active" type="button" data-game-platform="all" aria-pressed="true">
|
||
<span data-i18n="games.platform.all">All games</span>
|
||
<strong id="games-platform-count-all">0</strong>
|
||
</button>
|
||
<button class="game-platform-btn game-platform-btn-ps5" type="button" data-game-platform="ps5" aria-pressed="false">
|
||
<span data-i18n="games.platform.ps5Fleet">PS5</span>
|
||
<strong id="games-platform-count-ps5">0</strong>
|
||
</button>
|
||
<button class="game-platform-btn game-platform-btn-ps4" type="button" data-game-platform="ps4" aria-pressed="false">
|
||
<span data-i18n="games.platform.ps4Fleet">PS4</span>
|
||
<strong id="games-platform-count-ps4">0</strong>
|
||
</button>
|
||
<button class="game-platform-btn game-platform-btn-unknown" type="button" data-game-platform="unknown" aria-pressed="false" hidden>
|
||
<span data-i18n="games.platform.unknown">Unknown</span>
|
||
<strong id="games-platform-count-unknown">0</strong>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<section class="game-library-command-deck" aria-label="Game library controls" data-i18n-aria-label="games.controls">
|
||
<label class="game-library-search" for="games-search">
|
||
<span aria-hidden="true">⌕</span>
|
||
<input id="games-search" type="search" autocomplete="off" spellcheck="false" aria-label="Search games" placeholder="Search title, ID or metadata…" data-i18n-placeholder="games.assetSearchPlaceholder"/>
|
||
</label>
|
||
<div class="filter-btns" aria-label="Game status" data-i18n-aria-label="games.statusFilter">
|
||
<button class="fbtn active" data-filter="all" data-i18n="games.filter.all">All</button>
|
||
<button class="fbtn" data-filter="installed" data-i18n="games.filter.installed">Installed</button>
|
||
<button class="fbtn" data-filter="backed_up" data-i18n="games.filter.backedUp">Backed up</button>
|
||
<button class="fbtn" data-filter="not_backed" data-i18n="games.filter.notBackedUp">Not backed up</button>
|
||
</div>
|
||
<div class="view-switch" role="group" aria-label="Game library view" data-i18n-aria-label="games.view.label">
|
||
<button class="view-switch-btn active" data-game-view="grid" title="Cover grid" data-i18n-title="games.view.gridTitle" aria-pressed="true">▦</button>
|
||
<button class="view-switch-btn" data-game-view="table" title="Details table" data-i18n-title="games.view.tableTitle" aria-pressed="false">☰</button>
|
||
</div>
|
||
<button class="btn-pin" data-pin-id="games" title="Pin to Dashboard">📌</button>
|
||
</section>
|
||
<div class="game-library-operations">
|
||
<div>
|
||
<span class="game-library-section-label" data-i18n="games.libraryOperations">Library operations</span>
|
||
<small data-i18n="games.libraryOperationsDetail">Explicit actions only. Nothing is sent to the console automatically.</small>
|
||
</div>
|
||
<div class="game-library-operation-buttons">
|
||
<button id="btn-rescan-game-sources" class="btn btn-teal" data-i18n="games.scanSources">↻ Scan source folders</button>
|
||
<button id="btn-hash-all-games" class="btn btn-accent" title="Calculate SHA-256 for all local game backups" data-i18n="games.hashAll">▤ Hash all games</button>
|
||
<div id="bulk-hash-progress" style="display:none;flex-direction:column;gap:3px;min-width:200px;max-width:340px">
|
||
<div style="display:flex;align-items:center;gap:8px">
|
||
<div class="hash-progress-bar u-flex-1"><div id="bulk-hash-bar" class="hash-progress-fill" style="width:0%"></div></div>
|
||
<span id="bulk-hash-pct" style="font-size:11px;color:var(--teal);font-weight:600;min-width:32px;text-align:right">0%</span>
|
||
</div>
|
||
<div id="hash-all-games-status" style="font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis"></div>
|
||
<div id="bulk-hash-file-status" style="font-size:11px;color:var(--text-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:.75"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="game-catalog-health" class="catalog-health-strip" aria-live="polite">
|
||
<div><strong id="catalog-health-complete">—</strong><span data-i18n="games.health.complete">fully enriched</span></div>
|
||
<div><strong id="catalog-health-missing">—</strong><span data-i18n="games.health.queued">metadata queued</span></div>
|
||
<div><strong id="catalog-health-artwork">—</strong><span data-i18n="games.health.missingCovers">covers missing</span></div>
|
||
<div><strong id="catalog-health-scan" data-i18n="games.health.automatic">Automatic</strong><span id="catalog-health-scan-detail" data-i18n="games.health.interval">source check every 15 min</span></div>
|
||
</div>
|
||
<div id="firmware-filter-row" class="firmware-filter-row" hidden>
|
||
<span class="fw-filter-label">Firmware:</span>
|
||
<div id="firmware-filter-btns" class="filter-btns">
|
||
<button class="fwbtn active" data-fw="all">All</button>
|
||
</div>
|
||
</div>
|
||
<div id="conv-queue-panel" class="conv-queue-panel" hidden>
|
||
<div class="conv-queue-header">
|
||
<span class="conv-queue-title">⚙ Conversion Queue</span>
|
||
<span id="conv-queue-mode-badge" class="conv-mode-badge">Raw Dumps</span>
|
||
<div class="conv-queue-spacer" aria-hidden="true"></div>
|
||
<button id="btn-conv-start" class="btn btn-sm btn-accent">▶ Start Queue</button>
|
||
<button id="btn-conv-clear-done" class="btn btn-sm" >✕ Clear Done</button>
|
||
<button id="btn-conv-cleanup-temp" class="btn btn-sm" title="Delete leftover temp folders and partial output files from failed conversions">🧹 Clean Temp</button>
|
||
<button id="btn-conv-queue-toggle" class="btn btn-sm" title="Collapse / expand the queue list">↓</button>
|
||
</div>
|
||
<div class="conv-mode-switcher">
|
||
<span class="conv-mode-switcher-label">Mode:</span>
|
||
<button class="conv-mode-btn" data-conv-mode="pfs" title="Raw Dumps — direct FTP folder upload (no conversion)">Raw Dumps</button>
|
||
<button class="conv-mode-btn" data-conv-mode="ffpkg" title="FFPKG — convert via UFS2Tool (Windows only)">FFPKG <span class="badge-os">win</span></button>
|
||
<button class="conv-mode-btn" data-conv-mode="exfat" title="ExFAT — create mountable image (Windows only)">ExFAT <span class="badge-os">win</span></button>
|
||
<button class="conv-mode-btn" data-conv-mode="ffpfsc" title="FFPFSC — native compressed PFS image (all platforms, no admin)">FFPFSC</button>
|
||
</div>
|
||
<div id="conv-mode-warn" class="conv-mode-warn" hidden>
|
||
<span id="conv-mode-warn-text"></span>
|
||
<button id="btn-conv-goto-settings" class="btn btn-sm">⚙ Open Settings</button>
|
||
</div>
|
||
<div id="conv-admin-warn" class="conv-mode-warn conv-admin-warn" hidden>
|
||
<span>⚠ Not running as Administrator — FFPKG / ExFAT conversions will fail. Close the app, and → <strong>Run as administrator</strong>.</span>
|
||
</div>
|
||
<div id="conv-queue-body">
|
||
<div id="conv-queue-list" class="conv-queue-list"></div>
|
||
<div id="conv-queue-empty" class="conv-queue-empty" hidden>No jobs in queue.</div>
|
||
</div>
|
||
</div>
|
||
<div id="games-grid" class="games-grid" aria-live="polite"></div>
|
||
<div id="games-table-wrap" class="table-wrap" hidden>
|
||
<table id="games-table">
|
||
<thead>
|
||
<tr>
|
||
<th data-col="title">Title <span class="sort-icon">⇅</span></th>
|
||
<th data-col="game_id">ID <span class="sort-icon">⇅</span></th>
|
||
<th data-col="version">Ver <span class="sort-icon">⇅</span></th>
|
||
<th data-col="backup_size">Size <span class="sort-icon">⇅</span></th>
|
||
<th>Backporks</th>
|
||
<th title="● PS5 installed ■ Backed up 🔢 Backup count">Status</th>
|
||
<th>Actions</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="games-tbody"></tbody>
|
||
</table>
|
||
</div>
|
||
<div id="games-empty" class="library-empty" hidden>
|
||
<span class="library-empty-icon" aria-hidden="true">▦</span>
|
||
<strong data-i18n="games.empty.title">No games found</strong>
|
||
<span id="games-empty-detail" data-i18n="games.empty.detail">Connect the PS5 or scan the configured source folders.</span>
|
||
<button class="btn btn-teal" id="btn-games-empty-scan" data-i18n="games.scanSources">Scan source folders</button>
|
||
<button class="btn" id="btn-games-empty-reset" data-i18n="games.empty.clearFilters" hidden>Clear filters</button>
|
||
</div>
|
||
<div class="library-load-more">
|
||
<button id="btn-games-load-more" class="btn" hidden data-i18n="games.loadMore">Show more games</button>
|
||
<span id="games-result-count" class="hint"></span>
|
||
</div>
|
||
</div>
|
||
<div id="page-backporks" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.backporks">Backporks</h1>
|
||
<div class="header-tools">
|
||
<button id="btn-rescan-all-backporks" class="btn btn-teal">↻ Rescan All</button>
|
||
<button id="btn-hash-all-backporks" class="btn btn-accent" title="SHA-256 hash all backpork backup files">▤ Hash All Backporks</button>
|
||
<span id="hash-all-backporks-status" class="hint u-fs-micro"></span>
|
||
<button id="btn-create-fw-folder" class="btn">+ New Firmware Folder</button>
|
||
<button id="btn-add-backpork" class="btn btn-accent">Select Backpork Folder</button>
|
||
</div>
|
||
</div>
|
||
<p class="hint" style="color:var(--text-dim)">
|
||
Select your root backpork folder. Chimera will automatically scan all
|
||
firmware sub-folders inside it (e.g. <code>4.xx</code>, <code>7.xx</code>),
|
||
tag each game with its firmware label, and fetch metadata automatically.
|
||
</p>
|
||
<div id="pork-all-progress-panel" class="card" style="margin-bottom:18px;display:none">
|
||
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:10px">
|
||
<strong id="pork-all-queue-label" style="font-size:12px">Applying backporks to PS5…</strong>
|
||
<span id="pork-all-queue-count" style="font-size:11px;color:var(--text-dim)"></span>
|
||
</div>
|
||
<div class="hash-progress-bar u-mb-8"><div class="hash-progress-fill" id="pork-all-queue-fill" style="width:0%"></div></div>
|
||
<div id="pork-all-current-game" style="font-size:12px;color:var(--text-dim);margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis"></div>
|
||
<div class="hash-progress-bar u-mb-4"><div class="hash-progress-fill" id="pork-all-file-fill" style="width:0%;background:var(--accent)"></div></div>
|
||
<div id="pork-all-file-label" style="font-size:11px;color:var(--text-dim);margin-bottom:10px"></div>
|
||
<div id="pork-all-log" style="
|
||
background:rgba(0,0,0,0.35);
|
||
border:1px solid rgba(255,255,255,0.07);
|
||
border-radius:8px;
|
||
padding:8px 10px;
|
||
font-family:monospace;
|
||
font-size:11px;
|
||
line-height:1.6;
|
||
max-height:180px;
|
||
overflow-y:auto;
|
||
color:var(--text-dim);
|
||
white-space:pre-wrap;
|
||
word-break:break-all;
|
||
"></div>
|
||
</div>
|
||
<div id="bpgen-panel" class="card bpgen-panel u-mb-16">
|
||
<div class="bpgen-summary">
|
||
<span class="bpgen-summary-icon">⚙</span>
|
||
<strong>Auto-Generate Backporks</strong>
|
||
</div>
|
||
<div class="bpgen-body">
|
||
<div class="form-row bpgen-row">
|
||
<label class="bpgen-label">SDK Target</label>
|
||
<select id="bpgen-sdk-pair" class="filter-select u-flex-1"></select>
|
||
<span class="hint" style="font-size:11px;white-space:nowrap">Pair 1-6 apply libc patch; 7-10 revert it</span>
|
||
</div>
|
||
<div class="form-row bpgen-row">
|
||
<label class="bpgen-label">Games to Process</label>
|
||
<select id="bpgen-mode" class="filter-select">
|
||
<option value="all-missing">All games missing a backpork</option>
|
||
<option value="fw-missing">Games missing a specific firmware backpork</option>
|
||
<option value="specific">Select specific games…</option>
|
||
</select>
|
||
</div>
|
||
<div id="bpgen-fw-filter-row" class="form-row bpgen-row" hidden>
|
||
<label class="bpgen-label">Existing Firmware Label</label>
|
||
<input class="u-field-sm" id="bpgen-fw-filter" type="text" placeholder="e.g. 4.xx"/>
|
||
<span class="hint u-fs-micro">Games missing a backpork for this label will be processed</span>
|
||
</div>
|
||
<div id="bpgen-game-picker" class="bpgen-game-picker" hidden>
|
||
<div class="bpgen-picker-header">
|
||
<span class="hint">Select games to process</span>
|
||
<button id="bpgen-select-all" class="btn btn-sm">All</button>
|
||
<button id="bpgen-select-none" class="btn btn-sm">None</button>
|
||
</div>
|
||
<div id="bpgen-game-list" class="bpgen-game-list"></div>
|
||
</div>
|
||
<div class="form-row bpgen-row">
|
||
<label class="bpgen-label">Output Folder</label>
|
||
<input class="u-flex-1" id="bpgen-output-dir" type="text" placeholder="Root folder for backpork output…" readonly/>
|
||
<button id="bpgen-btn-output" type="button" class="btn btn-sm">Browse…</button>
|
||
</div>
|
||
<div class="form-row bpgen-row">
|
||
<label class="bpgen-label">Firmware Label</label>
|
||
<input class="u-field-sm" id="bpgen-fw-label" type="text" placeholder="e.g. 4.xx" readonly/>
|
||
</div>
|
||
<div class="form-row bpgen-row">
|
||
<label class="bpgen-label">Fakelib Folder <span class="hint">(optional, or use manager below)</span></label>
|
||
<input class="u-flex-1" id="bpgen-fakelib-dir" type="text" placeholder="Path to fakelib/ SPRX folder… (auto-set if Manager is configured)" readonly/>
|
||
<button id="bpgen-btn-fakelib" type="button" class="btn btn-sm">Browse…</button>
|
||
</div>
|
||
<div id="bpgen-fl-panel" class="bpgen-fl-panel">
|
||
<div class="bpgen-fl-summary">
|
||
Fakelib Manager
|
||
<span class="hint" style="font-size:11px;font-weight:normal"> — extract .sprx/.prx from decrypted PS5 firmware</span>
|
||
<span id="bpgen-fl-summary-status" class="bpgen-fl-badge"></span>
|
||
</div>
|
||
<div class="bpgen-fl-body">
|
||
<div class="form-row bpgen-row u-mt-8">
|
||
<label class="bpgen-label">Fakelib Base Dir</label>
|
||
<input class="u-flex-1" id="bpgen-fl-basedir" type="text" placeholder="Folder that will contain numbered subfolders 1–10…" readonly/>
|
||
<button id="bpgen-fl-btn-base" type="button" class="btn btn-sm">Browse…</button>
|
||
</div>
|
||
<div id="bpgen-fl-grid" class="bpgen-fl-grid" hidden></div>
|
||
<div id="bpgen-fl-import-row" class="form-row bpgen-row u-mt-8" hidden>
|
||
<label class="bpgen-label">Import for Pair <span id="bpgen-fl-import-pair-label"></span></label>
|
||
<input class="u-flex-1" id="bpgen-fl-pup-path" type="text" placeholder="Select decrypted .PUP.dec file…" readonly/>
|
||
<button id="bpgen-fl-btn-pick-pup" type="button" class="btn btn-sm">Browse…</button>
|
||
<button id="bpgen-fl-btn-extract" type="button" class="btn btn-accent btn-sm">Extract</button>
|
||
</div>
|
||
<div class="u-mt-8" id="bpgen-fl-progress-wrap" hidden>
|
||
<div class="bpgen-progress-bar-wrap">
|
||
<div id="bpgen-fl-progress-bar" class="bpgen-progress-bar" style="width:0%"></div>
|
||
</div>
|
||
<div id="bpgen-fl-progress-label" class="hint" style="font-size:11px;margin-top:3px"></div>
|
||
</div>
|
||
<p class="hint" style="font-size:11px;margin-top:8px;line-height:1.5">
|
||
Fakelibs are .sprx/.prx system libraries from official PS5 firmware and cannot be distributed.
|
||
Decrypt a firmware PUP on a jailbroken PS5 using
|
||
<a href="https://github.com/zecoxao/ps5-pup-decrypt" class="external-link" data-url="https://github.com/zecoxao/ps5-pup-decrypt">ps5_pup_decrypt</a>
|
||
to get a <code>.PUP.dec</code> file, then import it here.
|
||
The tool <strong>ps5-pup-unpacker</strong> (by zecoxao) will be auto-downloaded to extract the libraries.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="form-row bpgen-row" style="gap:16px">
|
||
<label class="bpgen-label">Options</label>
|
||
<label style="display:flex;align-items:center;gap:6px;cursor:pointer">
|
||
<input id="bpgen-overwrite" type="checkbox"/>
|
||
Re-process games that already have output
|
||
</label>
|
||
</div>
|
||
<div class="form-row bpgen-row" style="gap:8px;margin-top:4px">
|
||
<button id="bpgen-btn-run" type="button" class="btn btn-accent">▶ Generate Backporks</button>
|
||
<button id="bpgen-btn-cancel" type="button" class="btn" disabled>■ Cancel</button>
|
||
<span id="bpgen-status" class="hint bpgen-status"></span>
|
||
</div>
|
||
<div class="u-mt-8" id="bpgen-progress-wrap" hidden>
|
||
<div class="bpgen-progress-bar-wrap">
|
||
<div id="bpgen-progress-bar" class="bpgen-progress-bar" style="width:0%"></div>
|
||
</div>
|
||
<div id="bpgen-progress-label" class="hint" style="font-size:11px;margin-top:3px"></div>
|
||
<div id="bpgen-log" class="bpgen-log"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="new-fw-form" hidden class="card u-mb-16">
|
||
<div class="card-header"><h3>Create New Firmware Folder</h3></div>
|
||
<p class="hint u-mb-8">Creates a new subfolder in a location you choose and registers it. Version must follow <code>x.x.x</code> format (e.g. <code>11.50.0</code>).</p>
|
||
<div class="form-row" style="gap:8px;align-items:center">
|
||
<input id="new-fw-name" type="text" placeholder="x.x.x" style="width:100px"/>
|
||
<input class="u-flex-1" id="new-fw-parent" type="text" placeholder="Parent folder…" readonly/>
|
||
<button id="btn-new-fw-browse" class="btn">Browse…</button>
|
||
<button id="btn-new-fw-create" class="btn btn-accent">Create</button>
|
||
<button id="btn-new-fw-cancel" class="btn">Cancel</button>
|
||
</div>
|
||
</div>
|
||
<div id="backpork-list" class="backpork-list"></div>
|
||
<div id="backpork-empty" class="empty-msg" hidden>
|
||
No firmware folders added yet. Click <strong>Select Backpork Folder</strong> to get started.
|
||
</div>
|
||
</div>
|
||
<div id="page-trophies" class=page></div>
|
||
<div id="page-backups" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.backups">Backups</h1>
|
||
<div class="header-tools">
|
||
<input id="backups-search" type="search" autocomplete="off" spellcheck="false" aria-label="Search backups" placeholder="Search games…" data-i18n-placeholder="backups.searchPlaceholder" class="search-input"/>
|
||
<select id="backups-region-filter" class="filter-select">
|
||
<option value="">All Regions</option>
|
||
</select>
|
||
<button id="btn-scan-local" class="btn btn-teal">↻ Scan Local Folder</button>
|
||
<button class="btn-pin" data-pin-id="backups" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
</div>
|
||
<div id="backups-list"></div>
|
||
<div id="backups-empty" class="empty-msg" hidden>No backups found. Add a folder in Settings → Game Source Folders and scan.</div>
|
||
</div>
|
||
<div id="page-media" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.media">Media</h1>
|
||
<div class="header-tools">
|
||
<input id="media-search" type="search" autocomplete="off" spellcheck="false" aria-label="Search media" placeholder="Search by game ID or filename…" data-i18n-placeholder="media.searchPlaceholder" class="search-input"/>
|
||
<button id="btn-media-scan" class="btn btn-accent">↻ Scan via FTP</button>
|
||
<button id="btn-media-force-scan" class="btn btn-sm" title="Negeer de incrementele catalogus en controleer alle PS5-mappen">Volledige scan</button>
|
||
<button id="btn-media-cancel-scan" class="btn btn-sm btn-danger" hidden>Cancel</button>
|
||
<button id="btn-clip-thumbs" class="btn btn-sm" hidden title="Generate thumbnails for all video clips that don't have one yet">🎬 Fetch Clip Thumbnails</button>
|
||
<button class="btn-pin" data-pin-id="media" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
</div>
|
||
<div class="media-save-bar">
|
||
<span class="media-save-label">Save to</span>
|
||
<input id="media-save-path" type="text" readonly placeholder="Select a folder for downloads…" class="path-input u-flex-1"/>
|
||
<button id="btn-media-save-browse" class="btn btn-sm">Browse…</button>
|
||
<button id="btn-media-open-folder" class="btn btn-sm" title="Open folder in Explorer">📂 Open</button>
|
||
</div>
|
||
<div id="media-scan-status" class="media-scan-status" hidden></div>
|
||
<div id="media-thumb-status" class="media-thumb-status" hidden></div>
|
||
<section class="media-cache-panel" aria-labelledby="media-cache-title">
|
||
<div>
|
||
<strong id="media-cache-title" data-i18n="media.cache.title">Media cache</strong>
|
||
<span id="media-cache-metrics" data-i18n="media.cache.empty">No managed cache assets.</span>
|
||
</div>
|
||
<div class="media-cache-actions">
|
||
<button id="btn-media-cache-expired" class="btn btn-sm" type="button" data-i18n="media.cache.clearExpired">Clear expired</button>
|
||
<button id="btn-media-cache-unpinned" class="btn btn-sm" type="button" data-i18n="media.cache.clearUnpinned">Clear unpinned</button>
|
||
</div>
|
||
</section>
|
||
<section class="media-import-panel" aria-labelledby="media-import-title">
|
||
<div><strong id="media-import-title" data-i18n="media.import.title">Import title media</strong><span data-i18n="media.import.help">Streaming upload with validated type, quota and provenance.</span></div>
|
||
<input id="media-import-title-id" maxlength="9" placeholder="CUSA00000 / PPSA00000" aria-label="Title ID" data-i18n-aria-label="media.import.titleId">
|
||
<select id="media-import-kind" aria-label="Media kind" data-i18n-aria-label="media.import.kind"><option value="cover" data-i18n="media.import.cover">Cover</option><option value="background" data-i18n="media.import.background">Background</option><option value="screenshot" data-i18n="media.import.screenshot">Screenshot</option><option value="video" data-i18n="media.import.video">Video</option></select>
|
||
<select id="media-import-crop" aria-label="Cover crop" data-i18n-aria-label="media.import.crop"><option value="full" data-i18n="media.import.cropFull">Full image</option><option value="center" data-i18n="media.import.cropCenter">Centered portrait crop</option></select>
|
||
<label><input id="media-import-preferred" type="checkbox" checked> <span data-i18n="media.import.preferred">Use as preferred cover</span></label>
|
||
<input id="media-import-file" type="file" accept="image/png,image/jpeg,image/webp,video/mp4,video/webm" aria-label="Choose an image or video to import" data-i18n-aria-label="media.import.choose">
|
||
<button id="btn-media-import" class="btn btn-sm btn-accent" type="button" data-i18n="media.import.action">Import</button>
|
||
<span id="media-import-status" role="status" aria-live="polite"></span>
|
||
</section>
|
||
<div id="media-imported-list" class="media-imported-list"></div>
|
||
<div class="filter-bar u-mb-12">
|
||
<button class="fbtn active" data-mfilter="all">All <span id="media-count-all" class="tab-badge"></span></button>
|
||
<button class="fbtn" data-mfilter="screenshot">Screenshots <span id="media-count-screenshots" class="tab-badge"></span></button>
|
||
<button class="fbtn" data-mfilter="clip">Video Clips <span id="media-count-clips" class="tab-badge"></span></button>
|
||
<select id="media-sort" class="media-sort-select" title="Sort order">
|
||
<option value="date-desc" selected>Newest first</option>
|
||
<option value="date-asc">Oldest first</option>
|
||
<option value="size-desc">Largest first</option>
|
||
<option value="name-asc">Name A–Z</option>
|
||
</select>
|
||
</div>
|
||
<div id="media-grid" class="media-grid"></div>
|
||
<div id="media-empty" class="empty-msg" hidden>No media found. Connect to your PS5 and click Scan via FTP.</div>
|
||
</div>
|
||
<div id="page-cheats" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.cheats">Cheats</h1>
|
||
<div class="header-tools">
|
||
<input id="cheats-search" type="search" autocomplete="off" spellcheck="false" aria-label="Search cheats and patches" placeholder="Search by title or title ID…" data-i18n-placeholder="cheats.searchPlaceholder" class="search-input"/>
|
||
<button id="btn-cheats-download-all" class="btn btn-accent">⇓ Cache All Cheats</button>
|
||
<button id="btn-cheats-ftp-install" class="btn btn-teal">⇧ Install via FTP</button>
|
||
<button class="btn-pin" data-pin-id="cheats" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
</div>
|
||
<div id="cheats-ftp-panel" hidden class="card u-mb-16">
|
||
<div class="card-header" style="justify-content:space-between">
|
||
<h3 id="cheats-ftp-title">Install Cheats via FTP</h3>
|
||
<button id="btn-cheats-ftp-close" class="btn btn-sm">✕ Close</button>
|
||
</div>
|
||
<div class="cheats-ftp-instructions">
|
||
<div id="cheats-ftp-no-path-warn" hidden style="background:rgba(255,160,0,.12);border:1px solid rgba(255,160,0,.4);border-radius:8px;padding:10px 12px;margin-bottom:12px;font-size:12px;color:#ffa040">
|
||
⚠️ No cheats FTP path configured. Set one below or in <strong>Settings → Cheats Manager</strong>.
|
||
</div>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:12px">
|
||
<label class="setting-label">PS5 Cheats Path</label>
|
||
<input class="u-flex-1" id="cheats-ftp-path" type="text" placeholder="/data/etaHEN/cheats/"/>
|
||
<button id="btn-cheats-ftp-browse" class="btn btn-sm">Browse…</button>
|
||
</div>
|
||
<p class="hint u-mb-8">Chimera will upload all cached cheat JSON files directly into this folder on your PS5.</p>
|
||
<button id="btn-cheats-ftp-go" class="btn btn-teal">⇧ Install Now</button>
|
||
</div>
|
||
<div id="cheats-ftp-progress-wrap" hidden>
|
||
<div class="cheats-progress-bar-wrap">
|
||
<div id="cheats-ftp-bar" class="cheats-progress-bar" style="width:0%"></div>
|
||
</div>
|
||
<div class="cheats-dl-stats">
|
||
<span id="cheats-ftp-phase">Preparing…</span>
|
||
<span id="cheats-ftp-count"></span>
|
||
<span id="cheats-ftp-pct">0%</span>
|
||
</div>
|
||
<div class="cheats-dl-current" id="cheats-ftp-current"></div>
|
||
</div>
|
||
</div>
|
||
<div id="cheats-dl-panel" hidden class="card u-mb-16">
|
||
<div class="card-header" style="justify-content:space-between">
|
||
<h3 id="cheats-dl-title">Downloading cheat database…</h3>
|
||
<button id="btn-cheats-dl-cancel" class="btn btn-sm btn-danger">Cancel</button>
|
||
</div>
|
||
<div class="cheats-progress-bar-wrap">
|
||
<div id="cheats-dl-bar" class="cheats-progress-bar" style="width:0%"></div>
|
||
</div>
|
||
<div class="cheats-dl-stats">
|
||
<span id="cheats-dl-count">0 / 0</span>
|
||
<span id="cheats-dl-pct">0%</span>
|
||
<span id="cheats-dl-saved">Saved: 0</span>
|
||
<span id="cheats-dl-failed">Failed: 0</span>
|
||
<span id="cheats-dl-speed"></span>
|
||
<span id="cheats-dl-eta">ETA: —</span>
|
||
</div>
|
||
<div class="cheats-dl-current" id="cheats-dl-current"></div>
|
||
</div>
|
||
<div id="cheats-stats-bar" class="cheats-stats-bar">
|
||
<span id="cheats-stat-files">0 files cached</span>
|
||
<span id="cheats-stat-games">covering 0 games</span>
|
||
</div>
|
||
<div id="cheats-list" class="cheats-list"></div>
|
||
<div id="cheats-empty" class="empty-msg" hidden>No cheats found. Try a different search or cache the database above.</div>
|
||
<details class="u-mt-16" id="cheats-unmatched-section" hidden>
|
||
<summary class="cheats-unmatched-summary">
|
||
Unmatched Cheats <span id="cheats-unmatched-count" class="tab-badge"></span>
|
||
<span style="opacity:.55;font-size:.8em;margin-left:8px">Files with no recognized game ID — assign one manually</span>
|
||
</summary>
|
||
<div id="cheats-unmatched-list" class="cheats-unmatched-list"></div>
|
||
</details>
|
||
</div>
|
||
<div id="page-database" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.database">Database</h1>
|
||
<div class="header-tools">
|
||
<button class="btn btn-teal" id="btn-export-sql">Export SQL</button>
|
||
<button class="btn" id="btn-export-games-csv">Export Games CSV</button>
|
||
<button class="btn" id="btn-export-backups-csv">Export Backups CSV</button>
|
||
<button class="btn" id="btn-export-hashes" title="Export verified hashes to share with the community">Export Hash DB</button>
|
||
<button class="btn btn-danger" id="btn-clear-db">Clear Database</button>
|
||
</div>
|
||
</div>
|
||
<div class="db-tabs">
|
||
<button class="db-tab active" data-dbtab="games">Games Table</button>
|
||
<button class="db-tab" data-dbtab="backups">Backups Table</button>
|
||
<button class="db-tab" data-dbtab="hash-rows">Hashes Table</button>
|
||
<button class="db-tab" data-dbtab="query">SQL Query</button>
|
||
<button class="db-tab" data-dbtab="hashes">Hash Database</button>
|
||
</div>
|
||
<div id="dbtab-games" class="db-panel active">
|
||
<div class="db-pagebar"><span id="db-games-page-info" class="hint">Loading games…</span><div><button class="btn btn-sm db-page-btn" data-table="games" data-direction="previous">Previous</button><button class="btn btn-sm db-page-btn" data-table="games" data-direction="next">Next</button></div></div>
|
||
<div class="db-row-toolbar" id="toolbar-games" hidden>
|
||
<span class="db-row-toolbar-count" id="toolbar-games-count">0 selected</span>
|
||
<button class="btn btn-danger btn-sm" id="btn-delete-games">🗑 Delete Selected</button>
|
||
<button class="btn btn-sm" id="btn-select-all-games">Select All</button>
|
||
<button class="btn btn-sm" id="btn-deselect-all-games">Deselect All</button>
|
||
</div>
|
||
<div class="table-wrap"><table id="db-games-table"><thead></thead><tbody></tbody></table></div>
|
||
</div>
|
||
<div id="dbtab-backups" class="db-panel">
|
||
<div class="db-pagebar"><span id="db-backups-page-info" class="hint">Loading backups…</span><div><button class="btn btn-sm db-page-btn" data-table="backups" data-direction="previous">Previous</button><button class="btn btn-sm db-page-btn" data-table="backups" data-direction="next">Next</button></div></div>
|
||
<div class="db-row-toolbar" id="toolbar-backups" hidden>
|
||
<span class="db-row-toolbar-count" id="toolbar-backups-count">0 selected</span>
|
||
<button class="btn btn-danger btn-sm" id="btn-delete-backups">🗑 Delete Selected</button>
|
||
<button class="btn btn-sm" id="btn-select-all-backups">Select All</button>
|
||
<button class="btn btn-sm" id="btn-deselect-all-backups">Deselect All</button>
|
||
</div>
|
||
<div class="table-wrap"><table id="db-backups-table"><thead></thead><tbody></tbody></table></div>
|
||
</div>
|
||
<div id="dbtab-hash-rows" class="db-panel">
|
||
<div style="display:flex;align-items:center;gap:10px;padding:10px 0 8px">
|
||
<span class="hint" id="hash-rows-count" style="font-size:12px"></span>
|
||
<div style="display:flex;gap:6px"><button class="btn btn-sm db-page-btn" data-table="hashes" data-direction="previous">Previous</button><button class="btn btn-sm db-page-btn" data-table="hashes" data-direction="next">Next</button></div>
|
||
<button id="btn-clear-hashes" class="btn btn-danger btn-sm u-push">🗑 Clear All Hashes</button>
|
||
</div>
|
||
<div class="db-row-toolbar" id="toolbar-hashes" hidden>
|
||
<span class="db-row-toolbar-count" id="toolbar-hashes-count">0 selected</span>
|
||
<button class="btn btn-danger btn-sm" id="btn-delete-hashes">🗑 Delete Selected</button>
|
||
<button class="btn btn-sm" id="btn-select-all-hashes">Select All</button>
|
||
<button class="btn btn-sm" id="btn-deselect-all-hashes">Deselect All</button>
|
||
</div>
|
||
<div class="table-wrap"><table id="db-hash-rows-table"><thead></thead><tbody></tbody></table></div>
|
||
</div>
|
||
<div id="dbtab-query" class="db-panel">
|
||
<div class="query-area">
|
||
<textarea id="query-input" placeholder="SELECT * FROM games LIMIT 50;"></textarea>
|
||
<button id="btn-run-query" class="btn btn-accent">Run Query</button>
|
||
</div>
|
||
<div id="query-results"></div>
|
||
</div>
|
||
<div id="dbtab-hashes" class="db-panel">
|
||
<div class="hash-db-card">
|
||
<div class="hash-db-info-row">
|
||
<div>
|
||
<div class="hash-db-label">Community Hash List</div>
|
||
<div style="margin-top:5px;display:flex;align-items:center;gap:8px;flex-wrap:wrap">
|
||
<span id="hdb-community-count" class="hash-badge hash-none">0 hashes</span>
|
||
<span id="hdb-community-ver" class="hint u-fs-micro"></span>
|
||
<span id="hdb-community-source" class="hint u-fs-micro"></span>
|
||
</div>
|
||
<p class="hint" style="margin-top:8px;font-size:11px">The community hash list contains SHA-256 hashes of known-good game files.<br>If your files match — verified clean. If the list has your game but hashes differ — <strong style="color:var(--red)">possible modification or brick code</strong>.</p>
|
||
</div>
|
||
<div>
|
||
<div class="hash-db-label">Your Verified Hashes</div>
|
||
<div class="u-mt-4"><span id="hdb-local-count" class="hash-badge hash-none">—</span></div>
|
||
</div>
|
||
</div>
|
||
<div class="hash-db-actions">
|
||
<button id="btn-import-community-hashes" class="btn btn-teal" title="Load a community-maintained hash JSON file to enable verification">⇓ Import Community Hash List</button>
|
||
<button id="btn-hdb-export" class="btn" title="Export your verified hashes to share with the community">⇑ Export My Hashes</button>
|
||
<button id="btn-hdb-clear-hashes" class="btn btn-danger" title="Delete all stored hashes from the database">🗑 Clear Hashes</button>
|
||
</div>
|
||
</div>
|
||
<div id="hdb-game-list"></div>
|
||
</div>
|
||
</div>
|
||
<div id="page-jailbreak" class="page">
|
||
<div class="page-header"><div><h1 data-i18n="page.jailbreak">Payload workspace</h1><p class="page-subtitle">Connect, discover, install, send and configure boot payloads in a clear task flow.</p></div></div>
|
||
<nav class="payload-workspace-nav" aria-label="Payload workspace sections" data-route-persistent>
|
||
<button type="button" data-route="payloads/installed" data-payload-stage="discover" data-payload-target="ps5-payload-manager-card"><span>1</span><strong data-i18n="payload.workflow.discover">Discover</strong><small data-i18n="payload.workflow.discoverDetail">Console and source readiness</small></button>
|
||
<button type="button" data-route="payloads/updates" data-payload-stage="review"><span>2</span><strong data-i18n="payload.workflow.review">Review</strong><small data-i18n="payload.workflow.reviewDetail">Trust, compatibility and changes</small></button>
|
||
<button type="button" data-route="payloads/installed" data-payload-stage="stage" data-payload-target="payload-manager-card"><span>3</span><strong data-i18n="payload.workflow.stage">Stage</strong><small data-i18n="payload.workflow.stageDetail">Local library and sender</small></button>
|
||
<button type="button" data-route="payloads/boot" data-payload-stage="boot" data-payload-target="y2jb-generator-card"><span>4</span><strong data-i18n="payload.workflow.boot">Boot</strong><small data-i18n="payload.workflow.bootDetail">Explicit boot tools</small></button>
|
||
</nav>
|
||
<div class="card jb-card" id="ps5-payload-manager-card">
|
||
<div class="card-header">
|
||
<h3>Console Payload Manager</h3>
|
||
<span id="pldmgr-version" class="payload-tag-chip">offline</span>
|
||
<button class="btn btn-sm" id="btn-pldmgr-refresh" data-i18n="payload.connect">↻ Connect</button>
|
||
<button class="btn btn-sm" id="btn-pldmgr-open" data-i18n="common.open">↗ Open</button>
|
||
</div>
|
||
<p class="hint" data-i18n="payload.manager.description">Manage repositories, updates and the autoload sequence through the Payload Manager running on the PS5.</p>
|
||
<div class="payload-manager-connect-row">
|
||
<label><span data-i18n="payload.ps5Port">PS5 port</span> <input id="pldmgr-port" type="number" min="1" max="65535" value="8084"/></label>
|
||
<span id="pldmgr-status" class="hint" data-i18n="payload.notConnected">Not connected.</span>
|
||
</div>
|
||
<div id="pldmgr-observability" class="payload-observability" hidden>
|
||
<div class="payload-observability-metrics" aria-label="Payload Manager live status">
|
||
<div class="operations-metric"><strong id="pldmgr-autoload-metric">—</strong><span>Autoload</span></div>
|
||
<div class="operations-metric"><strong id="pldmgr-process-metric">—</strong><span data-i18n="payload.processes">Processes</span></div>
|
||
<div class="operations-metric"><strong id="pldmgr-memory-metric">—</strong><span data-i18n="payload.memory">Memory</span></div>
|
||
<div class="operations-metric"><strong id="pldmgr-log-metric">—</strong><span data-i18n="payload.logLines">Log lines</span></div>
|
||
</div>
|
||
<div class="payload-observability-columns">
|
||
<section class="payload-observability-panel" aria-labelledby="pldmgr-autoload-heading">
|
||
<div class="card-header compact">
|
||
<h4 id="pldmgr-autoload-heading" data-i18n="payload.bootActive">Boot & active payloads</h4>
|
||
<span id="pldmgr-autoload-state" class="badge" data-i18n="common.unknown">unknown</span>
|
||
</div>
|
||
<div id="pldmgr-autoload-detail" class="hint" data-i18n="payload.noAutoloadStatus">No autoload status received.</div>
|
||
<div id="pldmgr-process-list" class="payload-process-list"></div>
|
||
<h4 class="payload-native-launch-heading" data-i18n="payload.safeLaunch">Safe launch</h4>
|
||
<div id="pldmgr-installed-list" class="payload-process-list"><p class="hint" data-i18n="payload.loadingInstalled">Loading installed payloads…</p></div>
|
||
</section>
|
||
<section class="payload-observability-panel" aria-labelledby="pldmgr-log-heading">
|
||
<div class="card-header compact">
|
||
<h4 id="pldmgr-log-heading" data-i18n="payload.liveLog">Live manager log</h4>
|
||
<button class="btn btn-sm" id="btn-pldmgr-logs-refresh" data-i18n="common.refresh">Refresh</button>
|
||
</div>
|
||
<pre id="pldmgr-log-output" class="payload-log-output" tabindex="0" data-i18n="payload.noLogs">No log lines yet.</pre>
|
||
</section>
|
||
</div>
|
||
<p id="pldmgr-observability-note" class="hint" data-i18n="payload.readOnlyNote">Read-only view. Chimera never terminates a process automatically.</p>
|
||
</div>
|
||
<iframe id="pldmgr-frame" class="payload-manager-frame" title="PS5 Payload Manager" sandbox="allow-scripts allow-forms allow-downloads allow-modals" referrerpolicy="no-referrer" hidden></iframe>
|
||
</div>
|
||
<div class="card jb-card" id="console-services-card">
|
||
<div class="card-header">
|
||
<h3>PS5 Service Center</h3>
|
||
<span id="service-matrix-summary" class="payload-tag-chip" data-i18n="services.notChecked">not checked</span>
|
||
<button class="btn btn-sm" id="btn-service-matrix-refresh" data-i18n="services.test">↻ Test services</button>
|
||
</div>
|
||
<p class="hint" data-i18n="services.description">Shows which console capabilities are currently reachable. An offline component usually means that its payload is not running on the PS5.</p>
|
||
<div id="service-matrix-grid" class="service-matrix-grid">
|
||
<p class="hint" data-i18n="services.autoCheck">Services are checked when this page opens.</p>
|
||
</div>
|
||
</div>
|
||
<div class="card jb-card" id="payload-update-card">
|
||
<div class="card-header">
|
||
<h3>Online Payload Catalog</h3>
|
||
<button class="btn-pin" data-pin-id="payload-update" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
<p class="hint" data-i18n="payload.catalog.description">Chimera indexes reviewed PS5 projects. Community and custom sources remain clearly labelled. Downloads are bounded, use HTTPS and verify published SHA-256 checksums when available.</p>
|
||
<div id="payload-catalog-stats" class="payload-catalog-stats">
|
||
<div><strong id="payload-stat-assets">0</strong><span>payloads</span></div>
|
||
<div><strong id="payload-stat-sources">0</strong><span data-i18n="payload.sources">sources</span></div>
|
||
<div><strong id="payload-stat-downloaded">0</strong><span data-i18n="payload.local">local</span></div>
|
||
<div><strong id="payload-stat-updates">0</strong><span>updates</span></div>
|
||
<div><strong id="payload-stat-verified">0</strong><span>checksums</span></div>
|
||
</div>
|
||
<div class="payload-catalog-toolbar">
|
||
<input id="payload-catalog-search" class="search-input" type="search" placeholder="Search payload or source…" data-i18n-placeholder="payload.searchPlaceholder"/>
|
||
<select id="payload-catalog-category">
|
||
<option value="all" data-i18n="payload.allCategories">All categories</option>
|
||
</select>
|
||
<label class="payload-expert-filter"><input id="payload-show-expert" type="checkbox"><span data-i18n="payload.showExpert">Show expert payloads</span></label>
|
||
<button class="btn btn-teal" id="btn-payload-check-all" data-i18n="payload.syncSources">↻ Sync sources</button>
|
||
<button class="btn" id="btn-payload-update-downloaded" data-i18n="payload.updateDownloaded">↓ Update downloaded payloads</button>
|
||
<span id="payload-check-status" class="hint" style="margin-left:8px"></span>
|
||
</div>
|
||
<div id="payload-sources-check-list" class="payload-source-check-list"></div>
|
||
</div>
|
||
<div class="card jb-card" id="payload-manager-card">
|
||
<div class="card-header">
|
||
<h3>Chimera Payload Library & Sender</h3>
|
||
<button class="btn-icon-sm u-push" id="btn-payload-settings" title="Payload Manager Settings">⚙</button>
|
||
<button class="btn-pin" data-pin-id="payload-mgr" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
<div class="jb-section" id="payload-local-section">
|
||
<div class="jb-section-title">Local Payloads</div>
|
||
<p class="hint">Files saved to your configured local payloads folder. Click ↑ FTP to push to PS5 via transfer queue.</p>
|
||
<div id="payload-local-list" class="payload-card-list"></div>
|
||
<div id="payload-local-empty" class="jb-list-placeholder" hidden>
|
||
No local payloads. Download from a source above or set a payloads folder in Settings.
|
||
</div>
|
||
</div>
|
||
<div class="jb-section" id="payload-sender-section">
|
||
<div class="jb-section-title">PS5 Payload Sender</div>
|
||
<p class="hint">Send a payload directly to your PS5 over a raw TCP connection — no FTP needed. Uses the PS5 IP from your FTP settings. Match the port to whatever exploit host (e.g. bin-loader) is listening on the PS5.</p>
|
||
<div class="payload-sender-bar">
|
||
<label class="payload-sender-port-label">Port
|
||
<input type="number" id="payload-sender-port" value="9021" min="1" max="65535" class="payload-sender-port-input">
|
||
</label>
|
||
<span id="payload-sender-status" class="payload-sender-status hint"></span>
|
||
</div>
|
||
<div id="payload-sender-list" class="payload-card-list"></div>
|
||
<div id="payload-sender-empty" class="jb-list-placeholder" hidden>
|
||
No local payloads. Add some via the Local Payloads section above.
|
||
</div>
|
||
</div>
|
||
<div class="jb-section" id="payload-autoloader-section">
|
||
<div class="jb-section-title">
|
||
PS5 Autoloader
|
||
<span class="autoloader-path-hint">/data/ps5_autoloader</span>
|
||
</div>
|
||
<p class="hint">Build and upload the autoload sequence. Payloads run top-to-bottom on jailbreak; delay rows (<code>!ms</code>) pause between them for stability.</p>
|
||
<div class="autoloader-toolbar">
|
||
<button class="btn" id="btn-autoloader-refresh">↻ Refresh</button>
|
||
<button class="btn btn-teal" id="btn-autoloader-save" disabled>⇧ Save to PS5</button>
|
||
<span id="autoloader-status" class="hint autoloader-status-text"></span>
|
||
</div>
|
||
<div id="pldmgr-persistence-panel" class="payload-observability-panel" hidden>
|
||
<div class="card-header compact">
|
||
<h4 data-i18n="payload.persistence.title">Payload Manager reboot persistence</h4>
|
||
<button class="btn btn-sm btn-teal" id="btn-pldmgr-persist-repair" data-i18n="payload.persistence.action">Make v0.5.1 persistent</button>
|
||
<button class="btn btn-sm btn-teal" id="btn-pldmgr-verified-start" data-i18n="payload.persistence.startAction">Start verified v0.5.1</button>
|
||
<button class="btn btn-sm" id="btn-pldmgr-persist-rollback" data-i18n="payload.persistence.rollbackAction">Restore original boot chain</button>
|
||
<button class="btn btn-sm btn-teal" id="btn-etahen-persist" data-i18n="payload.etahenPersistence.action">Persist etaHEN 2.6B</button>
|
||
<button class="btn btn-sm btn-teal" id="btn-etahen-direct-start" data-i18n="payload.etahenPersistence.startAction">Start direct etaHEN 2.6B</button>
|
||
<button class="btn btn-sm" id="btn-etahen-persist-rollback" data-i18n="payload.etahenPersistence.rollbackAction">Restore state before etaHEN 2.6B</button>
|
||
</div>
|
||
<p class="hint" data-i18n="payload.persistence.description">Creates a recovery snapshot, verifies the official payload, and atomically sets it as the only boot entry.</p>
|
||
<p id="pldmgr-persistence-status" class="hint" aria-live="polite"></p>
|
||
<p id="etahen-persistence-status" class="hint" aria-live="polite"></p>
|
||
</div>
|
||
<div class="autoloader-layout">
|
||
<div class="autoloader-available">
|
||
<div class="autoloader-col-header">Files on PS5</div>
|
||
<div id="autoloader-file-list" class="autoloader-file-list">
|
||
<p class="hint autoloader-empty-hint">Click Refresh to load.</p>
|
||
</div>
|
||
</div>
|
||
<div class="autoloader-editor">
|
||
<div class="autoloader-col-header">autoload.txt sequence</div>
|
||
<div id="autoloader-sequence" class="autoloader-sequence">
|
||
<p class="hint autoloader-empty-hint">Click Refresh to load or build a sequence from the files on the left.</p>
|
||
</div>
|
||
<div class="autoloader-seq-footer">
|
||
<button class="btn" id="btn-autoloader-add-delay">+ Add Delay</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jb-section" id="autoloader-snapshots-section">
|
||
<div class="jb-section-title">
|
||
Autoloader Snapshots
|
||
<span class="autoloader-path-hint u-fs-micro">backup & restore</span>
|
||
</div>
|
||
<p class="hint">Save a snapshot of all payload files and <code>autoload.txt</code> from the PS5 to your PC. If the payload environment gets corrupted, restore any snapshot to recover your full setup instantly.</p>
|
||
<div class="snapshot-toolbar">
|
||
<input id="snapshot-label" type="text" placeholder="Label (optional)" style="flex:1;max-width:260px"/>
|
||
<button class="btn btn-teal" id="btn-snapshot-take">📷 Take Snapshot</button>
|
||
<button class="btn" id="btn-snapshot-import" title="Import a .porksnap file">↗ Import</button>
|
||
<span id="snapshot-take-status" class="hint" style="font-size:12px"></span>
|
||
</div>
|
||
<div id="snapshot-list" class="snapshot-list">
|
||
<p class="hint autoloader-empty-hint">No snapshots yet. Take one above.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="card jb-card" id="y2jb-generator-card">
|
||
<div class="card-header">
|
||
<h3>Y2JB Update Generator</h3>
|
||
<button class="btn-pin" data-pin-id="y2jb-generator" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
<p class="hint">Create a PS5-safe <code>y2jb_update.zip</code> from the bundled Y2JB template. Select payloads already managed by Chimera, arrange their autoload order, then build a ZIP for USB transfer. This creates the archive locally; it does not install anything to your PS5.</p>
|
||
<div class="ecosystem-plan-safety" id="y2jb-upstream-status"><strong data-i18n="y2jb.upstream.title">Official Y2JB release</strong><span data-i18n="y2jb.upstream.unchecked">Not checked yet. Discovery never uploads or applies an update.</span></div>
|
||
<div class="ecosystem-inline-actions">
|
||
<button class="btn btn-sm" id="btn-y2jb-discover" type="button" data-i18n="y2jb.upstream.check">Check upstream release</button>
|
||
<button class="btn btn-sm btn-accent" id="btn-y2jb-stage" type="button" data-i18n="y2jb.upstream.stage">Stage verified update to PS5</button>
|
||
</div>
|
||
<div class="y2jb-catalog-picker">
|
||
<div>
|
||
<strong>Chimera Payload Catalog</strong>
|
||
<span>Uses local payloads already downloaded and checksum-tracked by the platform.</span>
|
||
</div>
|
||
<select id="y2jbgen-catalog" multiple aria-label="Payloads from Chimera catalog"></select>
|
||
<div class="y2jb-catalog-actions">
|
||
<button class="btn btn-sm" id="btn-y2jbgen-refresh-catalog" type="button">↻ Refresh</button>
|
||
<button class="btn btn-sm btn-accent" id="btn-y2jbgen-add-catalog" type="button">Add selected</button>
|
||
</div>
|
||
</div>
|
||
<div class="form-row" style="margin-top:12px;gap:10px;align-items:center;flex-wrap:wrap">
|
||
<button class="btn" id="btn-y2jbgen-add-payloads">+ Import other files</button>
|
||
<button class="btn btn-teal" id="btn-y2jbgen-build">📦 Build Update ZIP</button>
|
||
<span id="y2jbgen-status" class="hint"></span>
|
||
</div>
|
||
<div id="y2jbgen-list" class="autoloader-sequence u-mt-12">
|
||
<p class="hint autoloader-empty-hint">No entries yet. Add payload files, then order payloads, delays, and messages.</p>
|
||
</div>
|
||
<div class="form-row" style="margin-top:8px;gap:8px;flex-wrap:wrap">
|
||
<button class="btn btn-sm" id="btn-y2jbgen-add-delay">+ Delay</button>
|
||
<button class="btn btn-sm" id="btn-y2jbgen-add-message">+ Message</button>
|
||
</div>
|
||
<p class="hint u-mt-8">Payload names are case-sensitive. Delays are milliseconds. The build validates the template, payload references, forward-slash ZIP paths, and archive structure before saving.</p>
|
||
</div>
|
||
<div class="card jb-card" id="bdjb-generator-card">
|
||
<div class="card-header"><h3>BDJB Genny</h3></div>
|
||
<p class="hint">Create a Cyberpunk-themed Blu-ray Disc Java autoloader ISO from the upstream Themed BD-UN-JB Poops Autoloader template. The build stages selected ELF/BIN payloads into <code>ps5_autoloader</code>, writes <code>autoload.txt</code>, compiles the BD-J payload, and validates the resulting ISO locally.</p>
|
||
<label style="display:block;margin-top:10px">Disc title <input id="bdjbgen-title" value="Chimera BDJB" maxlength="80"></label>
|
||
<div class="form-row" style="margin-top:12px;gap:10px;align-items:center;flex-wrap:wrap">
|
||
<button class="btn" id="btn-bdjbgen-add-payloads">Add ELF or BIN Payloads</button>
|
||
<button class="btn btn-teal" id="btn-bdjbgen-build">Build BDJB ISO</button>
|
||
</div>
|
||
<div id="bdjbgen-list" class="autoloader-sequence u-mt-12"><p class="hint autoloader-empty-hint">No entries yet. Add payload files, then adjust their autoload order and delays.</p></div>
|
||
<div class="form-row u-mt-8"><button class="btn btn-sm" id="btn-bdjbgen-add-delay">Add Delay</button></div>
|
||
<div class="u-mt-12"><progress id="bdjbgen-progress" value="0" max="100" style="width:100%"></progress><span id="bdjbgen-status" class="hint"></span><pre id="bdjbgen-log" style="max-height:180px;overflow:auto;white-space:pre-wrap;margin-top:8px"></pre></div>
|
||
</div>
|
||
<div class="card jb-card" id="system-state-card">
|
||
<div class="card-header"><h3>System State Controls</h3></div>
|
||
<p class="hint">Controls require the bundled SystemStateManager payload to be running on TCP port 9112. Each system action requires an explicit confirmation phrase; no action is sent from a single click.</p>
|
||
<div class="form-row" style="margin-top:12px;gap:8px;flex-wrap:wrap">
|
||
<button class="btn" id="btn-system-state-deploy">Deploy SystemStateManager</button>
|
||
<button class="btn" id="btn-system-state-status">Check Service</button>
|
||
<span id="system-state-status" class="hint"></span>
|
||
</div>
|
||
<div class="form-row" style="margin-top:10px;gap:8px;flex-wrap:wrap">
|
||
<button class="btn btn-red system-state-action" data-system-action="shutdown">Shutdown</button>
|
||
<button class="btn btn-red system-state-action" data-system-action="reboot">Reboot</button>
|
||
<button class="btn system-state-action" data-system-action="restmode">Enter Rest Mode</button>
|
||
<button class="btn system-state-action" data-system-action="eject">Eject Disc</button>
|
||
</div>
|
||
<div id="system-state-confirm" hidden style="margin-top:12px;padding:12px;border:1px solid var(--red);border-radius:8px">
|
||
<strong id="system-state-confirm-title">Confirm system action</strong>
|
||
<p id="system-state-confirm-copy" class="hint" style="margin:8px 0"></p>
|
||
<label>Type the required confirmation exactly
|
||
<input class="u-mt-4" id="system-state-confirm-input" type="text" autocomplete="off" spellcheck="false">
|
||
</label>
|
||
<div class="form-row" style="margin-top:10px;gap:8px">
|
||
<button class="btn btn-red" id="btn-system-state-confirm" disabled>Confirm Action</button>
|
||
<button class="btn" id="btn-system-state-cancel">Cancel</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sv-mini-card" id="sv-mini-jailbreak">
|
||
<div class="sv-mini-header" id="sv-mini-jailbreak-hdr">
|
||
<span class="sv-mini-title">📺 System View</span>
|
||
<span class="sv-mini-chevron">▼</span>
|
||
</div>
|
||
<div class="sv-mini-body">
|
||
<p class="hint" id="sv-mini-jailbreak-status">No capture device selected.</p>
|
||
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
||
<button class="btn" id="btn-sv-mini-jailbreak-nav">Go to System View</button>
|
||
<button class="btn btn-teal" id="btn-sv-mini-jailbreak-popout">↗ Pop Out</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="page-psnotify" class="page">
|
||
<div class="page-header"><h1 data-i18n="page.psnotify">Notifications</h1></div>
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h3>Send Notification</h3>
|
||
<button class="btn-pin" data-pin-id="psnotify" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
<p class="hint">Send a toast notification to your PS5. Uses the PS5's IP from your FTP settings.</p>
|
||
<div class="form-grid u-mt-8">
|
||
<label>Message
|
||
<input type="text" id="psn-message" placeholder="e.g. Build complete!" maxlength="120"/>
|
||
</label>
|
||
<label>Sub-message <span class="hint" style="display:inline">(optional)</span>
|
||
<input type="text" id="psn-submessage" placeholder="e.g. v2.1.0 is live" maxlength="120"/>
|
||
</label>
|
||
</div>
|
||
<div class="form-row" style="margin-top:12px;gap:10px">
|
||
<button class="btn btn-teal" id="btn-psn-send">🔔 Send</button>
|
||
<button class="btn" id="btn-psn-test">Test Connection</button>
|
||
<span id="psn-status" class="hint"></span>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3>Settings</h3></div>
|
||
<p class="hint">PS Notify connects to your PS5 on TCP port 6969 (customPSNotify.js). The PS5 IP is shared with FTP settings.</p>
|
||
<div class="form-row" style="margin-top:10px;gap:16px;align-items:center">
|
||
<label style="flex-direction:row;align-items:center;gap:8px;font-size:12px">
|
||
<input type="checkbox" id="psn-enabled"/>
|
||
Enable auto-notifications
|
||
</label>
|
||
<label style="flex-direction:row;align-items:center;gap:8px;font-size:12px">
|
||
Port
|
||
<input type="text" id="psn-port" placeholder="6969" style="width:80px"/>
|
||
</label>
|
||
<button class="btn" id="btn-psn-save-settings">Save</button>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3>Install Custom PS Notification Payload</h3></div>
|
||
<p class="hint">Installs the custom notification payload onto your PS5, enabling Chimera to send debug notifications directly to your console. Add customPSNotify.js to autoloader.txt and restart your PS5 to use.</p>
|
||
<div class="form-row" style="margin-top:12px;gap:10px;align-items:center">
|
||
<button class="btn btn-teal" id="btn-psn-push-payload">Install Payload to PS5</button>
|
||
<span id="psn-push-status" class="hint"></span>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3>Color & Encoding Experiments</h3></div>
|
||
<p class="hint">Tests for what the PS5 notification system can render. Emoji squares below require the patched payload (above). HTML / ANSI tests probe whether <code>send_notification</code> interprets markup — report back what you see.</p>
|
||
<div class="u-mt-16">
|
||
<p class="hint u-mb-8"><strong style="color:var(--text)">HTML markup</strong> — tests whether <code>send_notification</code> passes the string through a WebKit renderer</p>
|
||
<div class="form-row" style="gap:8px;flex-wrap:wrap">
|
||
<button class="btn btn-xs" id="btn-psn-exp-html-red"><font color> red</button>
|
||
<button class="btn btn-xs" id="btn-psn-exp-html-multi">multi-colour HTML</button>
|
||
<button class="btn btn-xs" id="btn-psn-exp-sony-tag">Sony $[color] tag</button>
|
||
</div>
|
||
</div>
|
||
<div class="u-mt-8">
|
||
<p class="hint u-mb-8"><strong style="color:var(--text)">Emoji colour squares</strong> — 4-byte UTF-8; garbled with stock payload, works after <code>TextDecoder</code> patch</p>
|
||
<div class="form-row" style="gap:8px;flex-wrap:wrap">
|
||
<button class="btn btn-xs" id="btn-psn-exp-sq-red">🧥 Red</button>
|
||
<button class="btn btn-xs" id="btn-psn-exp-sq-green">🧩 Green</button>
|
||
<button class="btn btn-xs" id="btn-psn-exp-sq-blue">🧦 Blue</button>
|
||
<button class="btn btn-xs" id="btn-psn-exp-sq-yellow">🧨 Yellow</button>
|
||
<button class="btn btn-xs" id="btn-psn-exp-sq-all">🧥🧧🧨🧩🧦🧪 All</button>
|
||
</div>
|
||
</div>
|
||
<div class="u-mt-8">
|
||
<p class="hint u-mb-8"><strong style="color:var(--text)">ANSI-opmaak</strong> — controleert expliciete escape-sequenties zonder HTML.</p>
|
||
<div class="form-row" style="gap:8px;flex-wrap:wrap">
|
||
<button class="btn btn-xs" id="btn-psn-exp-ansi-red">ANSI \x1b[31m red</button>
|
||
<button class="btn btn-xs" id="btn-psn-exp-ansi-bold">ANSI \x1b[1m bold</button>
|
||
</div>
|
||
</div>
|
||
<div class="u-mt-8">
|
||
<span id="psn-exp-status" class="hint"></span>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h3>Notification Log</h3>
|
||
<button class="btn-icon-sm u-push" id="btn-psn-refresh-history" title="Refresh">↻</button>
|
||
</div>
|
||
<div id="psn-history" class="psn-history"></div>
|
||
<div id="psn-history-empty" class="jb-list-placeholder">No notifications sent yet.</div>
|
||
</div>
|
||
</div>
|
||
<div id="page-xavatar" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.xavatar">XAvatar Management</h1>
|
||
</div>
|
||
<section id="ps5-profile-workspace" class="ps5-profile-workspace" aria-labelledby="ps5-profile-title">
|
||
<div class="ps5-profile-hero">
|
||
<div class="ps5-profile-orbit" aria-hidden="true"><i></i><i></i><i></i><span>◆</span></div>
|
||
<div class="ps5-profile-hero-copy">
|
||
<span class="ps5-profile-kicker" data-i18n="ps5Profile.kicker">Console identity studio</span>
|
||
<h2 id="ps5-profile-title" data-i18n="ps5Profile.title">Local PS5 profile</h2>
|
||
<p data-i18n="ps5Profile.detail">Safely update a local display name or avatar with a preflight snapshot, exact confirmation, post-read verification and one-click recovery.</p>
|
||
<div class="ps5-profile-boundary"><span aria-hidden="true">✓</span><span data-i18n="ps5Profile.boundary">Local appearance only. Sign-in identity, activation and saves are never changed.</span></div>
|
||
</div>
|
||
<div id="ps5-profile-provider-state" class="ps5-profile-provider-state" role="status" aria-live="polite" data-i18n="ps5Profile.checking">Checking the guarded profile bridge…</div>
|
||
</div>
|
||
<div class="ps5-profile-runtime" aria-labelledby="ps5-profile-runtime-title">
|
||
<div class="ps5-profile-runtime-mark" aria-hidden="true"><span></span></div>
|
||
<div><span class="ps5-profile-kicker" data-i18n="ps5Profile.runtimeKicker">Pinned runtime</span><h3 id="ps5-profile-runtime-title" data-i18n="ps5Profile.runtimeTitle">PS5Upload 5.4.19</h3><p id="ps5-profile-runtime-detail" data-i18n="ps5Profile.runtimeChecking">Verifying engine, payload and PS5 ELF loader…</p></div>
|
||
<div class="ps5-profile-runtime-actions"><span id="ps5-profile-runtime-state" role="status" aria-live="polite" data-i18n="ps5Profile.runtimeCheckingShort">Checking…</span><button id="btn-ps5-profile-start-payload" class="btn btn-accent" type="button" disabled data-i18n="ps5Profile.startPayload">Start guarded payload</button></div>
|
||
</div>
|
||
<div class="ps5-profile-grid">
|
||
<div class="ps5-profile-panel">
|
||
<div class="ps5-profile-panel-head"><div><span data-i18n="ps5Profile.step1">01 · Select</span><h3 data-i18n="ps5Profile.users">Local users</h3></div><button id="btn-ps5-profile-refresh" class="btn btn-sm" type="button" data-i18n="common.refresh">Refresh</button></div>
|
||
<div id="ps5-profile-users" class="ps5-profile-users" aria-live="polite"><div class="ps5-profile-empty" data-i18n="ps5Profile.loading">Reading local users…</div></div>
|
||
</div>
|
||
<div class="ps5-profile-panel ps5-profile-editor">
|
||
<div class="ps5-profile-panel-head"><div><span data-i18n="ps5Profile.step2">02 · Personalize</span><h3 id="ps5-profile-selected-title" data-i18n="ps5Profile.chooseUser">Choose a local user</h3></div><span id="ps5-profile-selected-uid" class="ps5-profile-uid"></span></div>
|
||
<div class="ps5-profile-avatar-stage">
|
||
<div class="ps5-profile-avatar-shell"><canvas id="ps5-profile-avatar-preview" width="160" height="160" aria-label="Selected avatar preview"></canvas><span id="ps5-profile-avatar-initial">?</span></div>
|
||
<div><strong data-i18n="ps5Profile.avatar">Profile image</strong><p data-i18n="ps5Profile.avatarDetail">Load an image in the converter below, review its crop, then apply it to the selected user.</p><button id="btn-ps5-profile-apply-avatar" class="btn btn-teal" type="button" disabled data-i18n="ps5Profile.applyAvatar">Review & apply image</button></div>
|
||
</div>
|
||
<label class="ps5-profile-name-field"><span data-i18n="ps5Profile.displayName">Local display name</span><div><input id="ps5-profile-name" type="text" maxlength="16" autocomplete="off" disabled aria-describedby="ps5-profile-name-help"><button id="btn-ps5-profile-rename" class="btn btn-accent" type="button" disabled data-i18n="ps5Profile.rename">Review rename</button></div><small id="ps5-profile-name-help" data-i18n="ps5Profile.nameHelp">1–16 visible characters. A PS5 restart is required after a verified change.</small></label>
|
||
<div id="ps5-profile-action-state" class="ps5-profile-action-state" role="status" aria-live="polite"></div>
|
||
</div>
|
||
</div>
|
||
<div class="ps5-profile-recovery">
|
||
<div><span data-i18n="ps5Profile.step3">03 · Recover</span><h3 data-i18n="ps5Profile.recovery">Verified activity & recovery</h3><p data-i18n="ps5Profile.recoveryDetail">Every prepared change preserves its previous state before the console is touched.</p></div>
|
||
<div id="ps5-profile-operations" class="ps5-profile-operations"><div class="ps5-profile-empty" data-i18n="ps5Profile.noActivity">No prepared profile changes yet.</div></div>
|
||
</div>
|
||
</section>
|
||
<div class="xavatar-lapy-notice">
|
||
<div>
|
||
<b>Lapy's Avatar Changer companion</b>
|
||
<span>Required to apply generated <code>.xavatar</code> files on the PS5. Chimera can now send the reviewed package directly through etaHEN DPI.</span>
|
||
<small id="xavatar-companion-status">Checking installer readiness…</small>
|
||
</div>
|
||
<div class="xavatar-companion-actions">
|
||
<button id="btn-xavatar-install-companion" class="btn btn-accent" type="button" disabled>Install on PS5</button>
|
||
<a class="external-link" data-url="https://pkg-zone.com/details/LAPY20016">Package details</a>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h3>Convert Image to .xavatar</h3>
|
||
<button class="btn-pin" data-pin-id="xavatar-convert" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
<div class="card-body">
|
||
<p style="color:var(--text-dim);margin-bottom:14px;font-size:12px">Drop or select any image to generate a PS4/PS5-compatible <code>.xavatar</code> archive containing DXT5/BC3 compressed textures at 440, 260, 128, and 64 px.</p>
|
||
<div id="xavatar-drop-zone" class="xavatar-drop-zone">
|
||
<input type="file" id="xavatar-file-input" accept="image/*" hidden>
|
||
<svg viewBox="0 0 48 48" width="40" height="40" class="xavatar-drop-icon"><rect x="4" y="12" width="40" height="28" rx="4" stroke="currentColor" stroke-width="2" fill="none"/><circle cx="24" cy="26" r="8" stroke="currentColor" stroke-width="2" fill="none"/><path d="M16 12l3-4h10l3 4" stroke="currentColor" stroke-width="2" fill="none" stroke-linejoin="round"/></svg>
|
||
<p class="xavatar-drop-label">Drop image here, paste from clipboard, or <button class="link-btn" id="btn-xavatar-browse">browse…</button></p>
|
||
</div>
|
||
<canvas id="xavatar-preview" class="xavatar-preview" hidden></canvas>
|
||
<div id="xavatar-conv-progress" class="xavatar-conv-progress" hidden>
|
||
<div id="xavatar-conv-bar" class="xavatar-conv-bar"></div>
|
||
</div>
|
||
<div class="xavatar-actions">
|
||
<button class="btn btn-teal" id="btn-xavatar-convert" disabled>Convert & Download</button>
|
||
<button class="btn" id="btn-xavatar-send-ps5" disabled>↗ Send to PS5</button>
|
||
<label class="toggle-label" title="Send a PS5 system notification when the upload is queued" style="display:flex;align-items:center;gap:5px;font-size:12px;color:var(--text-dim);cursor:pointer;">
|
||
<input type="checkbox" id="xavatar-notify-toggle" checked style="cursor:pointer;"> Notify PS5
|
||
</label>
|
||
<span id="xavatar-status" class="xavatar-status"></span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h3>PS5 Avatar Library <span style="font-size:11px;color:var(--text-dim);font-weight:400">/data/AVATARS</span></h3>
|
||
<button class="btn-icon-sm" id="btn-xavatar-refresh-lib" title="Refresh library">↻</button>
|
||
<button class="btn-pin" data-pin-id="xavatar-library" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
<div id="xavatar-library-list"></div>
|
||
<div id="xavatar-library-empty" class="jb-list-placeholder">Connect to your PS5 and click refresh to view saved avatars.</div>
|
||
</div>
|
||
</div>
|
||
<div id="page-system-view" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.systemView">System View</h1>
|
||
<div class="header-tools">
|
||
<button id="btn-sv-refresh-devices" class="btn" title="Refresh device list">↻</button>
|
||
<button id="btn-sv-mute" class="btn" disabled>🔊 Mute</button>
|
||
<button id="btn-sv-popout" class="btn" disabled>↗ Pop Out</button>
|
||
<span class="sv-tool-sep"></span>
|
||
<select id="sv-gif-fps" class="filter-select" style="width:74px">
|
||
<option value="5">5 fps</option>
|
||
<option value="8" selected>8 fps</option>
|
||
<option value="10">10 fps</option>
|
||
<option value="15">15 fps</option>
|
||
</select>
|
||
<button id="btn-sv-record" class="btn" disabled>⏺ GIF</button>
|
||
<span id="sv-rec-status" class="sv-rec-status" hidden>
|
||
<span class="sv-rec-dot"></span>GIF <span id="sv-rec-time">0:00</span>
|
||
</span>
|
||
<span class="sv-tool-sep"></span>
|
||
<select id="sv-vid-quality" class="filter-select" style="width:88px" title="Recording quality">
|
||
<option value="4000000">Low</option>
|
||
<option value="8000000" selected>Standard</option>
|
||
<option value="12000000">High</option>
|
||
<option value="20000000">Ultra</option>
|
||
</select>
|
||
<button id="btn-sv-vid-rec" class="btn btn-sv-vid-idle" disabled>⏺ Video</button>
|
||
<button id="btn-sv-vid-pause" class="btn btn-sv-vid-pause-btn" hidden>⏸ Pause</button>
|
||
<button id="btn-sv-vid-stop" class="btn btn-sv-vid-stop-btn" hidden>⏹ Stop & Save</button>
|
||
<span id="sv-vid-rec-status" class="sv-vid-rec-status" hidden>
|
||
<span class="sv-rec-dot"></span>
|
||
<span id="sv-vid-rec-label">REC</span> <span id="sv-vid-rec-time">0:00</span>
|
||
<span id="sv-vid-rec-size" class="sv-vid-rec-size"></span>
|
||
</span>
|
||
<button class="btn-pin" data-pin-id="system-view" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
</div>
|
||
<div class="sv-device-bar">
|
||
<div class="form-row" style="align-items:center;gap:12px">
|
||
<label class="sv-bar-label">Video</label>
|
||
<select id="sv-video-device" class="filter-select u-flex-1">
|
||
<option value="">— Select capture card —</option>
|
||
</select>
|
||
<label class="sv-bar-label">Audio</label>
|
||
<select id="sv-audio-device" class="filter-select u-flex-1">
|
||
<option value="">— No audio —</option>
|
||
</select>
|
||
<label class="sv-bar-label">Resolution</label>
|
||
<select id="sv-resolution" class="filter-select" style="width:110px">
|
||
<option value="">Auto</option>
|
||
<option value="1280x720">1280×720</option>
|
||
<option value="1920x1080">1920×1080</option>
|
||
<option value="2560x1440">2560×1440</option>
|
||
<option value="3840x2160">3840×2160</option>
|
||
</select>
|
||
<span class="sv-tool-sep"></span>
|
||
<label class="sv-bar-label" style="display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none">
|
||
<input type="checkbox" id="sv-auto-load" style="cursor:pointer;accent-color:var(--accent)">
|
||
Auto-load on launch
|
||
</label>
|
||
</div>
|
||
</div>
|
||
<div class="sv-viewer-wrap" id="sv-viewer-wrap">
|
||
<video id="sv-video" autoplay playsinline></video>
|
||
<div class="sv-overlay-controls">
|
||
<button id="btn-sv-fullscreen" class="sv-overlay-btn" title="Fullscreen (or double-click)">⛶</button>
|
||
</div>
|
||
<div class="sv-no-signal" id="sv-no-signal">
|
||
<div class="sv-onboarding">
|
||
<span class="sv-onboarding-kicker">HDMI capture workspace</span>
|
||
<h3>See and record your PS5 through a capture card</h3>
|
||
<div class="sv-onboarding-flow"><span>PS5 HDMI</span><b>→</b><span>Capture card</span><b>→</b><span>Chimera</span></div>
|
||
<p id="sv-no-signal-msg">Connect a capture card, select it under Video above, then allow camera access. This is separate from network Remote Play.</p>
|
||
<small>Useful for low-latency monitoring, screenshots, GIFs and local recordings.</small>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sv-status-bar">
|
||
<span id="sv-status-dot" class="sv-status-dot"></span>
|
||
<span id="sv-status-text">No device selected</span>
|
||
<span id="sv-status-res" style="color:var(--text-dim);font-size:11px"></span>
|
||
<span id="sv-status-codec" class="sv-status-codec"></span>
|
||
</div>
|
||
</div>
|
||
<div class="sv-ctx-menu" id="sv-ctx-menu" hidden>
|
||
<button class="sv-ctx-item" id="sv-ctx-fs">⛶ Fullscreen</button>
|
||
<div class="sv-ctx-sep"></div>
|
||
<button class="sv-ctx-item" id="sv-ctx-popout" disabled>↗ Pop Out</button>
|
||
</div>
|
||
<div id="page-transfers" class="page">
|
||
<div class="page-header">
|
||
<h1 data-i18n="page.transfers">Transfer Manager</h1>
|
||
<div class="header-tools">
|
||
<button id="btn-transfer-pause" class="btn">⏸ <span data-i18n="transfers.pauseAll">Pause All</span></button>
|
||
<button id="btn-transfer-clear" class="btn">✕ <span data-i18n="transfers.clearDone">Clear Done</span></button>
|
||
<button class="btn-pin" data-pin-id="transfers" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
</div>
|
||
<div class="transfer-stats-bar">
|
||
<div class="tstat-group">
|
||
<span class="tstat-label" data-i18n="transfers.active">Active</span>
|
||
<span class="tstat-value" id="tstat-active">0</span>
|
||
</div>
|
||
<div class="tstat-group">
|
||
<span class="tstat-label" data-i18n="transfers.queued">Queued</span>
|
||
<span class="tstat-value" id="tstat-queued">0</span>
|
||
</div>
|
||
<div class="tstat-group">
|
||
<span class="tstat-label" data-i18n="transfers.interrupted">Interrupted</span>
|
||
<span class="tstat-value" id="tstat-interrupted">0</span>
|
||
</div>
|
||
<div class="tstat-group">
|
||
<span class="tstat-label" data-i18n="transfers.speed">Speed</span>
|
||
<span class="tstat-value" id="tstat-speed">—</span>
|
||
</div>
|
||
<div class="tstat-group tstat-concurrent">
|
||
<span class="tstat-label" data-i18n="transfers.concurrent">Concurrent</span>
|
||
<input type="range" id="transfer-concurrent-slider" class="concurrent-slider" min="1" max="4" value="1"/>
|
||
<span class="tstat-value" id="tstat-concurrent">1</span>
|
||
</div>
|
||
</div>
|
||
<div class="card transfer-policy-card">
|
||
<div><strong data-i18n="transfers.policy.title">Start window</strong><span class="hint" data-i18n="transfers.policy.detail">Existing transfers continue; new jobs only start inside this optional window.</span></div>
|
||
<label><span data-i18n="transfers.policy.from">From</span> <input id="transfer-window-start" type="time"/></label>
|
||
<label><span data-i18n="transfers.policy.to">To</span> <input id="transfer-window-end" type="time"/></label>
|
||
<button id="btn-transfer-policy-save" class="btn btn-sm" data-i18n="common.save">Save</button>
|
||
<span id="transfer-policy-state" class="hint" data-i18n="transfers.policy.noWindow">No time window</span>
|
||
</div>
|
||
<div id="transfers-list"></div>
|
||
<div id="transfers-empty" class="empty-msg" hidden data-i18n="transfers.emptyDetail">No transfers yet. Use Upload or Pork to PS5 in game details.</div>
|
||
<div class="sv-mini-card" id="sv-mini-transfers">
|
||
<div class="sv-mini-header" id="sv-mini-transfers-hdr">
|
||
<span class="sv-mini-title">📺 System View</span>
|
||
<span class="sv-mini-chevron">▼</span>
|
||
</div>
|
||
<div class="sv-mini-body">
|
||
<p class="hint" id="sv-mini-transfers-status">No capture device selected.</p>
|
||
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
||
<button class="btn" id="btn-sv-mini-transfers-nav">Go to System View</button>
|
||
<button class="btn btn-teal" id="btn-sv-mini-transfers-popout">↗ Pop Out</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="page-elf-arsenal" class="page"></div>
|
||
<div id="page-pfs-ripper" class="page"></div>
|
||
<div id="page-savemgr" class="page">
|
||
<div class="embed-toolbar">
|
||
<div class="embed-controls">
|
||
<span class="embed-page-title">Local Save Manager</span>
|
||
<span style="font-size:11px;color:var(--text-dim)">PS5:</span>
|
||
<span id="sm-ip-display" style="font-size:11px;font-family:monospace;color:var(--text)">(not set)</span>
|
||
<label style="font-size:11px;color:var(--text-dim);margin-left:8px">Port</label>
|
||
<input id="sm-port" type="number" min="1" max="65535" value="8082" style="width:72px;font-family:monospace;font-size:12px"/>
|
||
<button id="btn-sm-save" class="btn btn-xs">Save</button>
|
||
</div>
|
||
<div class="embed-controls">
|
||
<button id="btn-sm-start-session" class="btn btn-accent btn-xs">Start session</button>
|
||
<button id="btn-sm-load" class="btn btn-xs">Reload</button>
|
||
<button id="btn-sm-refresh" class="btn btn-xs">↻</button>
|
||
<button id="btn-sm-open-ext" class="btn btn-xs">↗ Browser</button>
|
||
<button class="btn-pin" data-pin-id="dash-savemgr" title="Pin to Dashboard">📌</button>
|
||
</div>
|
||
</div>
|
||
<details class="install-accordion">
|
||
<summary>Install garlic-savemgr ELF to PS5</summary>
|
||
<div class="install-accordion-body">
|
||
<p>Uploads <code>garlic-savemgr.elf</code> to <code>/data/ps5_autoloader/</code> and appends it to <code>autoload.txt</code> (if not already present). Starts a web server on port 8082. Requires FTP connection — restart your PS5 after installing. See <a class="external-link" data-url="https://github.com/earthonion/garlic-savemgr">github.com/earthonion/garlic-savemgr</a>.</p>
|
||
<div style="display:flex;align-items:center;gap:10px">
|
||
<button class="btn btn-teal btn-sm" id="btn-sm-push-payload">⇧ Install to PS5</button>
|
||
<span id="sm-push-status" class="hint"></span>
|
||
</div>
|
||
</div>
|
||
</details>
|
||
<div class="sm-body">
|
||
<div class="sm-tabs">
|
||
<button class="sm-tab active" data-sm-tab="browse">Browse</button>
|
||
<button class="sm-tab" data-sm-tab="decrypt">Decrypt</button>
|
||
<button class="sm-tab" data-sm-tab="encrypt">Encrypt</button>
|
||
<button class="sm-tab" data-sm-tab="resign">Resign</button>
|
||
</div>
|
||
<div class="sm-pane" id="sm-pane-browse">
|
||
<div class="sm-layout">
|
||
<div class="sm-left">
|
||
<div class="sm-section-label">Saves</div>
|
||
<div class="sm-saves" id="sm-saves-list">
|
||
<div class="sm-empty-list">Configure PS5 IP in FTP Settings, then reload.</div>
|
||
</div>
|
||
</div>
|
||
<div class="sm-right" id="sm-right-pane">
|
||
<div id="sm-empty-state" class="sm-empty">
|
||
<p>Select a save to browse</p>
|
||
<p class="hint">Drag & drop files onto a mounted save to add or replace them</p>
|
||
</div>
|
||
<div id="sm-save-header" class="sm-save-header" hidden>
|
||
<img id="sm-game-icon" class="sm-game-icon" src="" alt="" hidden>
|
||
<div class="sm-save-meta-block">
|
||
<div class="sm-save-title-text" id="sm-save-title-text">Untitled</div>
|
||
<div class="sm-save-meta-row">
|
||
<span id="sm-save-title-id"></span>
|
||
<span id="sm-save-account-id"></span>
|
||
</div>
|
||
<div class="sm-save-ftp-row" id="sm-save-ftp-row"></div>
|
||
</div>
|
||
<div class="sm-save-btns">
|
||
<button class="btn btn-sm btn-accent" id="btn-sm-dl-zip">↓ Decrypted ZIP</button>
|
||
<button class="btn btn-sm" id="btn-sm-dl-enc">↓ Encrypted</button>
|
||
<button class="btn btn-sm" id="btn-sm-dump-usb">Dump to USB</button>
|
||
<button class="btn btn-sm" id="btn-sm-upload">↑ Upload File</button>
|
||
<button class="btn btn-sm btn-danger" id="btn-sm-unmount">Unmount</button>
|
||
</div>
|
||
</div>
|
||
<div id="sm-usb-progress" class="sm-progress" hidden>
|
||
<div class="sm-progress-bar"><div class="sm-progress-fill" id="sm-usb-fill" style="width:0%"></div></div>
|
||
</div>
|
||
<div id="sm-upload-progress" class="sm-progress" hidden>
|
||
<div class="sm-progress-bar"><div class="sm-progress-fill" id="sm-upload-fill" style="width:0%"></div></div>
|
||
<div class="sm-progress-text" id="sm-upload-text"></div>
|
||
</div>
|
||
<div id="sm-filetree" class="sm-filetree" hidden></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sm-pane" id="sm-pane-decrypt" hidden>
|
||
<div class="sm-single">
|
||
<div class="sm-drop" id="sm-decrypt-drop">
|
||
<div class="sm-drop-label">Drag & drop encrypted save file</div>
|
||
<button class="btn sm-browse-btn">Browse Files</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sm-pane" id="sm-pane-encrypt" hidden>
|
||
<div class="sm-single">
|
||
<div class="sm-field-row">
|
||
<label class="sm-field-label">Account ID</label>
|
||
<input id="sm-enc-aid" type="text" maxlength="16" placeholder="optional">
|
||
</div>
|
||
<div class="sm-drop" id="sm-encrypt-drop">
|
||
<div class="sm-drop-label">Drag & drop a <strong>folder</strong> to encrypt into a save</div>
|
||
<button class="btn sm-browse-btn">Browse Folder</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sm-pane" id="sm-pane-resign" hidden>
|
||
<div class="sm-single">
|
||
<div class="sm-field-row">
|
||
<label class="sm-field-label">New Account ID</label>
|
||
<input id="sm-resign-aid" type="text" maxlength="16" placeholder="0000000000000000">
|
||
</div>
|
||
<div class="sm-drop" id="sm-resign-drop">
|
||
<div class="sm-drop-label">Drag & drop encrypted save to resign</div>
|
||
<button class="btn sm-browse-btn">Browse Files</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sm-terminal">
|
||
<div class="sm-terminal-header">Terminal</div>
|
||
<div class="sm-log" id="sm-log"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="page-ecosystem" class="page"></div>
|
||
<div id="page-operations" class="page">
|
||
<div class="page-header operations-header">
|
||
<div>
|
||
<h1>Operations Center</h1>
|
||
<p class="page-subtitle">Automation, recovery, storage health and PS5 services in one safe workspace.</p>
|
||
</div>
|
||
<div class="operations-header-actions">
|
||
<span id="operations-health" class="operations-health" data-i18n="operations.status.loading">Loading status…</span>
|
||
<button id="operations-refresh" class="btn btn-sm" data-i18n="common.refresh">Refresh</button>
|
||
</div>
|
||
</div>
|
||
<div class="operations-tabs" role="tablist" aria-label="Operations Center sections">
|
||
<button class="operations-tab active" data-operations-tab="automation" role="tab" data-i18n="operations.tabs.automation">Automation</button>
|
||
<button class="operations-tab" data-operations-tab="audit" role="tab" data-i18n="operations.tabs.audit">Audit</button>
|
||
<button class="operations-tab" data-operations-tab="storage" role="tab" data-i18n="operations.tabs.storage">Storage</button>
|
||
<button class="operations-tab" data-operations-tab="recovery" role="tab" data-i18n="operations.tabs.recovery">Recovery</button>
|
||
<button class="operations-tab" data-operations-tab="reliability" role="tab" data-i18n="operations.tabs.reliability">Reliability</button>
|
||
<button class="operations-tab" data-operations-tab="compatibility" role="tab" data-i18n="operations.tabs.compatibility">Compatibility</button>
|
||
<button class="operations-tab" data-operations-tab="shadowmount" role="tab" data-i18n="operations.tabs.shadowmount">ShadowMount</button>
|
||
<button class="operations-tab" data-operations-tab="packages" role="tab" data-i18n="operations.tabs.packages">Packages</button>
|
||
<button class="operations-tab" data-operations-tab="diagnostics" role="tab" data-i18n="operations.tabs.diagnostics">Diagnostics</button>
|
||
</div>
|
||
<section class="operations-panel active" data-operations-panel="automation">
|
||
<div class="card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3 data-i18n="operations.automation.title">Task scheduler</h3><p class="hint" data-i18n="operations.automation.detail">Safe, predefined maintenance tasks with an auditable run history.</p></div>
|
||
<span id="operations-scheduler-state" class="badge">—</span>
|
||
</div>
|
||
<div id="operations-task-list" class="operations-task-list"><p class="hint" data-i18n="operations.automation.loading">Loading tasks…</p></div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="operations.automation.recent">Recent runs</h3></div>
|
||
<div id="operations-run-list" class="operations-run-list"><p class="hint">No runs yet.</p></div>
|
||
</div>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="audit" hidden>
|
||
<div class="card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3>Audit Center</h3><p class="hint">Searchable history of mutating, sensitive and destructive actions. Secrets are redacted before storage and logs use bounded rotation.</p></div>
|
||
<div class="operations-inline-actions"><button id="operations-audit-refresh" class="btn">Refresh</button><button id="operations-audit-export" class="btn btn-accent">Export JSON</button></div>
|
||
</div>
|
||
<form id="operations-audit-filter" class="ecosystem-filter-row">
|
||
<label>Level<select id="operations-audit-level"><option value="audit">Audit</option><option value="">All</option><option value="error">Error</option><option value="warn">Warning</option><option value="info">Info</option></select></label>
|
||
<label>Classification<select id="operations-audit-classification"><option value="">All</option><option value="mutating">Mutating</option><option value="sensitive">Sensitive</option><option value="destructive">Destructive</option><option value="read-only">Read-only</option></select></label>
|
||
<label>Result<select id="operations-audit-result"><option value="">All</option><option value="success">Succeeded</option><option value="failed">Failed</option><option value="unknown">Unknown</option></select></label>
|
||
<label>From<input id="operations-audit-since" type="datetime-local"/></label>
|
||
<label>Until<input id="operations-audit-until" type="datetime-local"/></label>
|
||
<label>Search<input id="operations-audit-search" type="search" maxlength="160" placeholder="command, error, IP…"/></label>
|
||
<button class="btn btn-sm" type="submit">Apply filters</button>
|
||
</form>
|
||
<div id="operations-audit-summary" class="operations-metrics"></div>
|
||
<p id="operations-audit-health" class="hint">Loading audit retention…</p>
|
||
<div id="operations-audit-list" class="operations-run-list"><p class="hint">Loading audit records…</p></div>
|
||
</div>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="reliability" hidden>
|
||
<div class="card operations-warning-card" id="operations-reliability-warning">
|
||
<strong>Safe backup model:</strong> replication never removes source data and does not replace a real external or off-site target. For 3-2-1, prefer a different physical disk plus an external target.
|
||
</div>
|
||
<div class="operations-two-column">
|
||
<div class="card" id="operations-replication-card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3>Secondary backup target</h3><p class="hint">Atomic snapshots with SHA-256 verification of source and copy. Game backups are included only after an explicit choice.</p></div>
|
||
<button id="operations-replication-refresh" class="btn btn-sm">Status</button>
|
||
</div>
|
||
<div id="operations-replication-status" class="operations-details"><p class="hint">Status not loaded yet.</p></div>
|
||
<label class="operations-switch"><input id="operations-replication-games" type="checkbox"/><span>Include full game backups (can be very large)</span></label>
|
||
<form id="operations-replication-retention" class="ecosystem-filter-row"><label class="ecosystem-check"><input id="operations-replication-retention-enabled" type="checkbox" checked/> Apply retention</label><label>Maximum snapshots<input id="operations-replication-retention-count" type="number" min="2" max="365" value="14"/></label><label>Maximum age (days)<input id="operations-replication-retention-days" type="number" min="7" max="3650" value="180"/></label><button class="btn btn-sm" type="submit">Save retention</button></form>
|
||
<div class="operations-inline-actions"><button id="operations-replication-run" class="btn btn-accent">Replicate safely</button></div>
|
||
<div id="operations-replication-list" class="operations-recovery-list"></div>
|
||
</div>
|
||
<div class="card" id="operations-monitoring-card">
|
||
<div class="card-header operations-card-header"><div><h3>Monitoring</h3><p class="hint" data-i18n="operations.monitoring.description">JSON status in Chimera and optional Prometheus metrics with a separate bearer token.</p></div><button id="operations-monitoring-refresh" class="btn btn-sm" data-i18n="common.refresh">Refresh</button></div>
|
||
<div id="operations-monitoring-summary" class="operations-metrics"></div>
|
||
<div class="operations-inline-actions"><button id="operations-monitoring-token" class="btn" data-i18n="operations.monitoring.newToken">New metrics token</button><span id="operations-monitoring-token-state" class="hint"></span></div>
|
||
<pre id="operations-monitoring-token-output" class="operations-log" hidden></pre>
|
||
</div>
|
||
</div>
|
||
<div class="operations-two-column">
|
||
<div class="card" id="operations-sessions-card">
|
||
<div class="card-header operations-card-header"><div><h3>Active sessions</h3><p class="hint">Review browsers and revoke unknown sessions immediately.</p></div><button id="operations-sessions-refresh" class="btn btn-sm">Refresh</button></div>
|
||
<div id="operations-session-list" class="operations-recovery-list"><p class="hint">Sessions not loaded yet.</p></div>
|
||
</div>
|
||
<div class="card" id="operations-password-card">
|
||
<div class="card-header"><h3>Change password</h3></div>
|
||
<form id="operations-password-form" class="form-grid operations-profile-grid">
|
||
<label>Current password<input id="operations-password-current" type="password" autocomplete="current-password" required/></label>
|
||
<label>New password<input id="operations-password-new" type="password" autocomplete="new-password" minlength="12" required/></label>
|
||
<label>Repeat new password<input id="operations-password-repeat" type="password" autocomplete="new-password" minlength="12" required/></label>
|
||
<button class="btn btn-accent" type="submit">Change and revoke other sessions</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="storage" hidden>
|
||
<div class="card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3 data-i18n="operations.storage.title">Storage and integrity audit</h3><p class="hint" data-i18n="operations.storage.detail">Checks mounts, missing backups, duplicate registrations, partial files and orphaned game folders. Nothing is deleted.</p></div>
|
||
<button id="operations-storage-run" class="btn btn-accent" data-i18n="operations.storage.run">Run audit</button>
|
||
</div>
|
||
<div id="operations-storage-summary" class="operations-metrics"></div>
|
||
<div id="operations-storage-details" class="operations-details"><p class="hint" data-i18n="operations.storage.empty">No storage report available yet.</p></div>
|
||
<div class="card-header operations-card-header u-mt-16"><div><h3 data-i18n="operations.storage.topologyTitle">PS5 and server storage overview</h3><p class="hint" data-i18n="operations.storage.topologyDetail">Values come only from server statfs or paired Sentinel telemetry. Unavailable PS5 values remain explicitly unknown.</p></div><button id="operations-storage-topology-refresh" class="btn btn-sm" data-i18n="operations.storage.refreshReadOnly">Refresh read-only</button></div>
|
||
<div id="operations-storage-topology" class="operations-details"><p class="hint" data-i18n="operations.storage.topologyEmpty">Storage topology not loaded yet.</p></div>
|
||
</div>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="recovery" hidden>
|
||
<div class="card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3>Recovery Vault</h3><p class="hint">Bundles the database, settings and reachable etaHEN/ShadowMount configuration. Every restore first creates a new recovery point.</p></div>
|
||
<div class="operations-inline-actions"><button id="operations-recovery-import" class="btn" data-i18n="operations.recovery.import">Import ZIP</button><button id="operations-recovery-create" class="btn btn-accent" data-i18n="operations.recovery.create">+ Restore point</button></div>
|
||
</div>
|
||
<div id="operations-recovery-list" class="operations-recovery-list"><p class="hint" data-i18n="operations.recovery.loading">Loading restore points…</p></div>
|
||
</div>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="compatibility" hidden>
|
||
<div class="operations-two-column">
|
||
<div class="card">
|
||
<div class="card-header"><h3>My PS5 profile</h3></div>
|
||
<div class="form-grid operations-profile-grid">
|
||
<label>Firmware<input id="operations-profile-firmware" type="text" placeholder="for example 7.61"/></label>
|
||
<label>HEN<input id="operations-profile-hen" type="text" placeholder="etaHEN"/></label>
|
||
<label>HEN version<input id="operations-profile-hen-version" type="text" placeholder="for example 2.4b"/></label>
|
||
<label>kstuff-lite version<input id="operations-profile-kstuff" type="text" placeholder="for example 1.07"/></label>
|
||
<label>Loader<input id="operations-profile-loader" type="text" placeholder="for example webkit/exploit host"/></label>
|
||
</div>
|
||
<label class="operations-field">Notes<textarea id="operations-profile-notes" rows="4" placeholder="Personal configuration notes"></textarea></label>
|
||
<button id="operations-profile-save" class="btn btn-accent">Save and validate profile</button>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="operations.compatibility.title">Compatibility check</h3></div>
|
||
<div id="operations-compatibility-checks"><p class="hint" data-i18n="operations.compatibility.loading">Loading profile…</p></div>
|
||
<p class="hint operations-source-note">Unknown remains explicitly unknown: Chimera makes no compatibility claims without authoritative source information.</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="shadowmount" hidden>
|
||
<div class="card operations-warning-card">
|
||
<strong>Warning:</strong> ShadowMountPlus can cause shutdowns or data corruption when configured incorrectly. Chimera therefore creates a restore point before every change.
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3>Games & images</h3><p class="hint">Read-only correlation of manual.lst, manual.status and the Chimera library.</p></div>
|
||
<span id="operations-shadow-status-state" class="badge">not loaded</span>
|
||
</div>
|
||
<div id="operations-shadow-summary" class="operations-metrics"></div>
|
||
<div id="operations-shadow-entries" class="operations-details"><p class="hint">Load ShadowMount status to correlate sources and games.</p></div>
|
||
</div>
|
||
<div class="operations-two-column">
|
||
<div class="card">
|
||
<div class="card-header operations-card-header"><h3>config.ini</h3><span id="operations-shadow-config-state" class="badge">—</span></div>
|
||
<textarea id="operations-shadow-config" class="operations-code-editor" rows="16" spellcheck="false" placeholder="ShadowMount configuration"></textarea>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header operations-card-header"><h3>manual.lst</h3><span id="operations-shadow-manual-state" class="badge">—</span></div>
|
||
<textarea id="operations-shadow-manual" class="operations-code-editor" rows="16" spellcheck="false" placeholder="One absolute PS5 path per line"></textarea>
|
||
</div>
|
||
</div>
|
||
<div id="operations-shadow-preflight" class="operations-warning"><strong>Configuration preflight</strong><p>The current configuration has not been checked yet.</p></div>
|
||
<div class="operations-inline-actions">
|
||
<button id="operations-shadow-reload" class="btn">Reload</button>
|
||
<button id="operations-shadow-propose" class="btn" data-i18n="operations.shadow.propose">Build from library</button>
|
||
<button id="operations-shadow-save" class="btn btn-accent">Save safely</button>
|
||
<button id="operations-shadow-logs" class="btn">Load debug.log</button>
|
||
</div>
|
||
<pre id="operations-shadow-output" class="operations-log" hidden></pre>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="packages" hidden>
|
||
<div class="operations-two-column">
|
||
<div class="card">
|
||
<div class="card-header operations-card-header"><div><h3>PS5 package services</h3><p class="hint">Detects etaHEN DPI, DPI V2 and VoidPKG on the configured PS5 target.</p></div><button id="operations-package-probe" class="btn btn-sm">Test services</button></div>
|
||
<div id="operations-package-services"><p class="hint">Services have not been tested.</p></div>
|
||
<div class="operations-inline-actions">
|
||
<button id="operations-package-list" class="btn">VoidPKG list</button>
|
||
<button id="operations-package-progress" class="btn">Progress</button>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3>Install through etaHEN DPI</h3></div>
|
||
<label class="operations-field">Public HTTPS package URL<input id="operations-package-url" type="url" placeholder="https://…/package.pkg"/></label>
|
||
<p class="hint">Only HTTPS URLs are forwarded. Chimera uploads no local files here and runs no shell commands.</p>
|
||
<button id="operations-package-install" class="btn btn-accent">Send to etaHEN DPI</button>
|
||
</div>
|
||
</div>
|
||
<pre id="operations-package-output" class="operations-log" hidden></pre>
|
||
</section>
|
||
<section class="operations-panel" data-operations-panel="diagnostics" hidden>
|
||
<div class="card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3>Diagnostics & support bundle</h3><p class="hint">Service probes, task status, storage report and sanitized log records. Passwords, tokens and webhooks are not exported.</p></div>
|
||
<div class="operations-inline-actions"><button id="operations-diagnostics-run" class="btn" data-i18n="operations.diagnostics.run">Run diagnostics</button><button id="operations-diagnostics-export" class="btn btn-accent" data-i18n="operations.diagnostics.bundle">Download support bundle</button></div>
|
||
</div>
|
||
<div id="operations-diagnostics-summary" class="operations-metrics"></div>
|
||
<pre id="operations-diagnostics-log" class="operations-log">No diagnostics run yet.</pre>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header operations-card-header">
|
||
<div><h3>Passive PS5 kernel logs</h3><p class="hint" data-i18n="operations.klog.description">Reads klogsrv on TCP 9081. Chimera writes nothing to PS5, starts no payload, and leaves autoload unchanged.</p></div>
|
||
<span id="operations-klog-state" class="badge" data-i18n="operations.klog.stopped">Stopped</span>
|
||
</div>
|
||
<div class="ecosystem-filter-row">
|
||
<label>Duration (seconds)<input id="operations-klog-duration" type="number" min="5" max="900" value="60"/></label>
|
||
<label>Severity<select id="operations-klog-severity"><option value="">All</option><option value="error">Error</option><option value="warn">Warning</option><option value="info">Info</option><option value="debug">Debug</option></select></label>
|
||
<label>Search<input id="operations-klog-search" type="search" maxlength="160" placeholder="panic, mount, kstuff…"/></label>
|
||
<button id="operations-klog-start" class="btn btn-accent" data-i18n="operations.klog.start">Start capture</button>
|
||
<button id="operations-klog-stop" class="btn" data-i18n="operations.klog.stop">Stop</button>
|
||
<button id="operations-klog-refresh" class="btn" data-i18n="operations.klog.load">Load logs</button>
|
||
<button id="operations-klog-export" class="btn" data-i18n="operations.klog.export">Export JSON</button>
|
||
</div>
|
||
<div id="operations-klog-summary" class="operations-metrics"></div>
|
||
<div id="operations-klog-list" class="operations-run-list"><p class="hint">No kernel logs loaded yet.</p></div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="page-settings" class="page">
|
||
<div class="page-header"><h1 data-i18n="page.settings">Settings</h1></div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.language">Language</h3></div>
|
||
<div class="form-row" style="align-items:center;gap:12px;flex-wrap:wrap">
|
||
<label style="display:flex;flex-direction:column;gap:4px;min-width:200px">
|
||
<span data-i18n="lang.displayLanguage" class="setting-label">Display Language</span>
|
||
<select id="s-language" class="select-input" style="width:220px"></select>
|
||
</label>
|
||
<button id="btn-import-lang" class="btn btn-sm btn-accent u-mt-16" data-i18n="lang.import">↑ Import Language File…</button>
|
||
<button id="btn-export-lang" class="btn btn-sm u-mt-16" data-i18n="lang.exportBase">↓ Export English Base File…</button>
|
||
</div>
|
||
<p class="hint u-mt-8" data-i18n="lang.hint">Export the English base file, translate it, then import the translated JSON. Imported language files are stored in your user data folder and override bundled languages with the same code.</p>
|
||
</div>
|
||
<div class="card" id="settings-console-profiles-card">
|
||
<div class="card-header"><div><h3 data-i18n="settings.consoleProfiles.title">Console profiles</h3><p class="hint" data-i18n="settings.consoleProfiles.description">Host, service ports, component versions and pairing are kept separate for each PS5. Switching only disconnects an existing FTP session and never connects automatically.</p></div><button id="console-profiles-compare" class="btn btn-sm" data-i18n="settings.consoleProfiles.compare">Compare</button></div>
|
||
<div class="form-row" style="align-items:end;gap:12px;flex-wrap:wrap">
|
||
<label><span data-i18n="settings.consoleProfiles.active">Active console</span><select id="console-profile-active" class="select-input"><option value="" data-i18n="common.loading">Loading…</option></select></label>
|
||
<button id="console-profile-activate" class="btn btn-accent" type="button" data-i18n="settings.consoleProfiles.activate">Activate</button>
|
||
<span id="console-profile-status" class="hint"></span>
|
||
</div>
|
||
<form id="console-profile-new" class="form-row" style="align-items:end;gap:12px;flex-wrap:wrap;margin-top:12px">
|
||
<label><span data-i18n="settings.consoleProfiles.new">New profile</span><input id="console-profile-new-label" maxlength="80" placeholder="Living room PS5" data-i18n-placeholder="settings.consoleProfiles.placeholder" required></label>
|
||
<label>Host<input id="console-profile-new-host" maxlength="253" placeholder="192.168.1.x" required></label>
|
||
<button class="btn" type="submit" data-i18n="settings.consoleProfiles.add">Add profile</button>
|
||
</form>
|
||
<div id="console-profiles-comparison" class="operations-details" hidden></div>
|
||
</div>
|
||
<div class="card" id="settings-companion-workers-card">
|
||
<div class="card-header"><div><h3>Windows Companion Workers</h3><p class="hint" data-i18n="settings.companion.description">Optional for FFPKG, UFS2, ExFAT and capture. HTTPS-only with HMAC pairing, registered artifact IDs and output slots; never a shell or arbitrary path.</p></div></div>
|
||
<form id="companion-worker-form" class="ecosystem-filter-row"><label>Worker ID<input id="companion-worker-id" required maxlength="64" placeholder="windows-main"></label><label><span data-i18n="settings.companion.name">Name</span><input id="companion-worker-label" required maxlength="80" placeholder="Windows workstation"></label><label>HTTPS origin<input id="companion-worker-endpoint" type="url" required placeholder="https://workstation.local:9443"></label><button class="btn" type="submit" data-i18n="btn.save">Save</button></form>
|
||
<div id="companion-workers-list" class="operations-details"><p class="hint" data-i18n="settings.companion.loading">Loading workers…</p></div>
|
||
<pre id="companion-worker-pairing-output" class="operations-log" hidden></pre>
|
||
</div>
|
||
<div class="card" id="settings-two-factor-card">
|
||
<div class="card-header"><div><h3 data-i18n="settings.twoFactor.title">Two-factor authentication</h3><p class="hint" data-i18n="settings.twoFactor.description">Optional TOTP for externally reachable installations, with one-time recovery codes. Existing LAN installations remain unchanged until you enable it.</p></div><span id="totp-settings-status" class="hint" data-i18n="settings.twoFactor.loading">Loading status…</span></div>
|
||
<div class="operations-inline-actions"><button id="totp-settings-begin" class="btn btn-accent" data-i18n="settings.twoFactor.pair">Pair authenticator</button><button id="totp-settings-disable" class="btn btn-danger" hidden data-i18n="settings.twoFactor.disable">Disable</button></div>
|
||
<pre id="totp-settings-output" class="operations-log" hidden></pre>
|
||
<div id="passkey-readiness" class="operations-warning"><strong data-i18n="settings.passkeys.preparation">Passkeys: preparation</strong><p data-i18n="settings.passkeys.loading">Loading readiness…</p></div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><div><h3 data-i18n="settings.ftpConnection">FTP Connection</h3><p class="hint" data-i18n="settings.ftpProfileHint">These fields belong to the active console profile.</p></div></div>
|
||
<div class="form-grid">
|
||
<label>PS5 FTP Host<input id="s-host" type="text" placeholder="192.168.1.x"/></label>
|
||
<label>Username<input id="s-user" type="text" placeholder="optional"/></label>
|
||
<label>Password<input id="s-pass" type="password" placeholder="Leave blank if none"/></label>
|
||
</div>
|
||
<div class="ftp-ports-section">
|
||
<div class="ftp-ports-label">FTP Ports <span class="hint" style="font-weight:400;font-size:11px">— tried in order until one connects</span></div>
|
||
<div class="ftp-ports-presets" id="settings-ftp-presets">
|
||
<button class="btn btn-sm" type="button" data-add-port="1337">etaHEN 1337</button>
|
||
<button class="btn btn-sm" type="button" data-add-port="2121">2121</button>
|
||
<button class="btn btn-sm" type="button" data-add-port="21">21</button>
|
||
<button class="btn btn-sm" type="button" data-add-port="2126">2126</button>
|
||
</div>
|
||
<input id="s-ports" type="text" placeholder="1337, 2121, 21"/>
|
||
</div>
|
||
<label class="toggle-row">
|
||
<input type="checkbox" id="s-auto-connect"/>
|
||
<span class="toggle-label">Auto-connect on startup</span>
|
||
<span class="hint toggle-hint">Automatically connect to your PS5 when Chimera launches, using the credentials above.</span>
|
||
</label>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h3 data-i18n="settings.gameSourceFolders">Game Source Folders</h3>
|
||
<span class="hint u-fs-micro">Local drives / folders where game backups are stored</span>
|
||
</div>
|
||
<div id="settings-backup-paths-list"></div>
|
||
<div class="form-row u-mt-8">
|
||
<button id="btn-add-backup-path" class="btn btn-teal">+ Add Folder…</button>
|
||
</div>
|
||
<p class="hint u-mt-8" data-i18n="settings.gameSourcesHint">Chimera scans every listed folder for .pkg files, game folders and ISOs. In Docker, the default folders are /games/ps4 and /games/ps5.</p>
|
||
</div>
|
||
<div class="card" id="settings-ps4-packages-card">
|
||
<div class="card-header"><div><h3 data-i18n="ps4Packages.settings.title">PS4 package preservation</h3><p class="hint" data-i18n="ps4Packages.settings.detail">Configure the pinned Fake PKG Tools 3.87 folder and a managed output vault. Chimera never accepts a custom executable or command line.</p></div><span id="s-ps4-package-status" class="badge"></span></div>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:9px"><label class="u-field-md" data-i18n="ps4Packages.settings.builder">Builder tool folder</label><input class="u-flex-1" id="s-ps4-package-builder" readonly><button id="btn-ps4-package-builder" class="btn" data-i18n="common.browse">Browse</button></div>
|
||
<div class="form-row u-row-8"><label class="u-field-md" data-i18n="ps4Packages.settings.output">Managed PKG vault</label><input class="u-flex-1" id="s-ps4-package-output" readonly><button id="btn-ps4-package-output" class="btn" data-i18n="common.browse">Browse</button></div>
|
||
</div>
|
||
<div class="card ps5-native-settings-card" id="settings-ps5-native-packages-card">
|
||
<div class="card-header"><div><h3 data-i18n="ps5NativePackages.settings.title">PS5 fPKG Backup & Restore</h3><p class="hint" data-i18n="ps5NativePackages.settings.detail">Bind the clean revision-pinned LibProsperoPkg bridge and a managed finalized FIH .pkg vault. Retail secrets are never generated or requested.</p></div><span id="s-ps5-native-package-status" class="badge"></span></div>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:9px"><label class="u-field-md" data-i18n="ps5NativePackages.settings.builder">Pinned bridge folder</label><input class="u-flex-1" id="s-ps5-native-package-builder" readonly><button id="btn-ps5-native-package-builder" class="btn" data-i18n="common.browse">Browse</button></div>
|
||
<div class="form-row u-row-8"><label class="u-field-md" data-i18n="ps5NativePackages.settings.output">Managed PS5 fPKG vault</label><input class="u-flex-1" id="s-ps5-native-package-output" readonly><button id="btn-ps5-native-package-output" class="btn" data-i18n="common.browse">Browse</button></div>
|
||
<p class="hint ps5-native-settings-truth" data-i18n="ps5NativePackages.settings.truth">Only finalized FIH .pkg files enter the fPKG restore workflow. .ffpkg mount images remain a separate feature.</p>
|
||
</div>
|
||
<div class="card" id="settings-conversion-card">
|
||
<div class="card-header">
|
||
<h3 data-i18n="settings.conversionMode">Game Conversion Mode</h3>
|
||
<span class="badge badge-blue" style="font-size:11px;margin-left:8px">FFPKG & ExFAT require Windows</span>
|
||
</div>
|
||
<p class="hint u-mb-12">
|
||
Choose how games are packaged when you click <strong>Convert/Install</strong> on the Games page.
|
||
<strong>Raw Dumps</strong> uploads the raw game folder directly to PS5 via FTP -
|
||
<strong>FFPKG</strong> and <strong>ExFAT</strong> mode first convert the game to an image file locally, then optionally upload and delete the image to preserve space these 2 modes are <em>Windows only</em>.
|
||
</p>
|
||
<div class="form-row" style="gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:12px">
|
||
<label class="radio-card" id="conv-mode-pfs-label">
|
||
<input type="radio" name="conv-mode" id="conv-mode-pfs" value="pfs"/>
|
||
<span class="radio-card-title">Raw Dumps</span>
|
||
<span class="radio-card-desc">Direct FTP folder upload (all platforms)</span>
|
||
</label>
|
||
<label class="radio-card" id="conv-mode-ffpkg-label">
|
||
<input type="radio" name="conv-mode" id="conv-mode-ffpkg" value="ffpkg"/>
|
||
<span class="radio-card-title">FFPKG Mode <span class="badge-os">Windows</span></span>
|
||
<span class="radio-card-desc">UFS2Tool → .ffpkg image</span>
|
||
</label>
|
||
<label class="radio-card" id="conv-mode-exfat-label">
|
||
<input type="radio" name="conv-mode" id="conv-mode-exfat" value="exfat"/>
|
||
<span class="radio-card-title">ExFAT Mode <span class="badge-os">Windows</span></span>
|
||
<span class="radio-card-desc">native OSFMount → .exfat image</span>
|
||
</label>
|
||
<label class="radio-card" id="conv-mode-ffpfsc-label">
|
||
<input type="radio" name="conv-mode" id="conv-mode-ffpfsc" value="ffpfsc"/>
|
||
<span class="radio-card-title">FFPFSC Mode</span>
|
||
<span class="radio-card-desc">native compressed PFS → .ffpfsc (all platforms, no admin)</span>
|
||
</label>
|
||
</div>
|
||
<div id="conv-ffpkg-fields" class="conv-mode-section" hidden>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:6px">
|
||
<label class="setting-label">UFS2Tool.exe</label>
|
||
<input class="u-flex-1" id="s-conv-ufs2-path" type="text" placeholder="Path to UFS2Tool.exe…" readonly/>
|
||
<button id="btn-conv-ufs2-pick" class="btn">Browse…</button>
|
||
</div>
|
||
<p id="s-conv-ufs2-status" class="hint" style="margin-bottom:8px;color:var(--text-dim)">Not configured</p>
|
||
<div class="form-row" style="align-items:center;gap:16px;flex-wrap:wrap">
|
||
<label class="setting-label">UFS2 Method:</label>
|
||
<label style="font-size:12px;display:flex;align-items:center;gap:6px">
|
||
<input type="radio" name="ufs2-method" id="ufs2-method-makefs" value="makefs"/>makefs (recommended)
|
||
</label>
|
||
<label style="font-size:12px;display:flex;align-items:center;gap:6px">
|
||
<input type="radio" name="ufs2-method" id="ufs2-method-newfs" value="newfs"/>newfs
|
||
</label>
|
||
</div>
|
||
</div>
|
||
<div id="conv-exfat-fields" class="conv-mode-section" hidden>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:6px">
|
||
<label class="setting-label">OSFMount (osfmount.com)</label>
|
||
<input class="u-flex-1" id="s-conv-exfat-path" type="text" placeholder="Auto-detected if OSFMount is installed…" readonly/>
|
||
<button id="btn-conv-exfat-pick" class="btn">Browse…</button>
|
||
</div>
|
||
<p id="s-conv-exfat-status" class="hint" style="margin-bottom:8px;color:var(--text-dim)">Not configured</p>
|
||
</div>
|
||
<div id="conv-shared-fields" hidden>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:8px">
|
||
<label class="setting-label">Output Directory</label>
|
||
<input class="u-flex-1" id="s-conv-output-dir" type="text" placeholder="Where .ffpkg / .exfat files are saved…" readonly/>
|
||
<button id="btn-conv-output-pick" class="btn">Browse…</button>
|
||
</div>
|
||
<p class="hint u-mb-8">Converted image files are placed here. Leave blank to use <Downloads>/pork-converted.</p>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:8px">
|
||
<label class="setting-label">Temp / Worker Dir</label>
|
||
<input class="u-flex-1" id="s-conv-temp-dir" type="text" placeholder="Scratch space — needs >= game size free (default: system temp)…" readonly/>
|
||
<button id="btn-conv-temp-pick" class="btn">Browse…</button>
|
||
</div>
|
||
<p class="hint u-mb-8">Used as staging while copying & patching. Ideally on a fast drive with ample space.</p>
|
||
<label class="toggle-row u-mb-8">
|
||
<input type="checkbox" id="s-conv-ftp-upload"/>
|
||
<span class="toggle-label">Upload converted file to PS5 via FTP when done</span>
|
||
<span class="hint toggle-hint">Queues an FTP upload (to the path configured in the Convert/Install modal) immediately after conversion completes.</span>
|
||
</label>
|
||
<label class="toggle-row" id="conv-delete-after-row">
|
||
<input type="checkbox" id="s-conv-delete-after" disabled style="opacity:0.45"/>
|
||
<span class="toggle-label">Delete converted file after successful upload</span>
|
||
<span class="hint toggle-hint">Frees disk space automatically once the PS5 upload is confirmed. Only triggers if upload succeeds. Enable <em>Upload to PS5</em> above first.</span>
|
||
</label>
|
||
</div>
|
||
<div id="conv-notify-fields" hidden>
|
||
<div class="card-header" style="padding:12px 0 6px;border-top:1px solid var(--border);margin-top:12px">
|
||
<h4 style="font-size:12px;font-weight:600;color:var(--text-dim)">PS5 Notifications (uses PSNotify settings above)</h4>
|
||
</div>
|
||
<label class="toggle-row u-mb-4">
|
||
<input type="checkbox" id="s-conv-psn-enabled"/>
|
||
<span class="toggle-label">Enable conversion notifications</span>
|
||
</label>
|
||
<div id="conv-psn-detail" class="conv-psn-checkboxes" hidden>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-conv-psn-queued"/> Game queued</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-conv-psn-batch"/> Batch queued</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-conv-psn-copy"/> Copy started</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-conv-psn-convert"/>Convert started</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-conv-psn-done"/> Job done / failed</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="card" id="settings-remote-paths-card">
|
||
<div class="card-header">
|
||
<h3 data-i18n="settings.remoteGameLocations">Remote Game Locations</h3>
|
||
<span class="hint u-fs-micro">FTP paths on PS5 where game folders live</span>
|
||
</div>
|
||
<div id="settings-remote-paths-list"></div>
|
||
<div class="form-row" style="margin-top:12px;gap:8px">
|
||
<input id="new-remote-label" type="text" placeholder="Label (e.g. GoldHEN)" style="width:150px"/>
|
||
<input class="u-flex-1" id="new-remote-path" type="text" placeholder="/mnt/sandbox/pfsmnt/"/>
|
||
<button id="btn-browse-ftp" class="btn">📁 Browse FTP…</button>
|
||
<button id="btn-add-remote-path" class="btn btn-teal">+ Add</button>
|
||
</div>
|
||
<p class="hint u-mt-8">Used during Scan PS5 and as upload targets. If none configured, defaults to standard PS5 paths. Connect to FTP before browsing.</p>
|
||
</div>
|
||
<div class="card" id="settings-sources-card">
|
||
<div class="card-header">
|
||
<h3 data-i18n="settings.payloadRemoteSources">Payload Remote Sources</h3>
|
||
<span class="hint u-fs-micro">GitHub repos <em>or</em> hosted pages with .bin/.js/.elf releases</span>
|
||
</div>
|
||
<div id="settings-payload-sources"></div>
|
||
<div class="form-row" style="margin-top:12px;gap:8px">
|
||
<input class="u-field-sm" id="new-source-name" type="text" placeholder="Name (e.g. GoldHEN)"/>
|
||
<input class="u-flex-1" id="new-source-url" type="text" placeholder="github.com/owner/repo or https://page.github.io/..."/>
|
||
<button id="btn-add-payload-source" class="btn btn-teal">+ Add</button>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.payloadManager">Payload Manager</h3></div>
|
||
<div class="form-row" style="align-items:center">
|
||
<input class="u-flex-1" id="s-payload-local" type="text" placeholder="Local payloads folder…" readonly/>
|
||
<button id="btn-browse-payload-local" class="btn">Browse…</button>
|
||
</div>
|
||
<p class="hint">Files downloaded from GitHub sources are saved here.</p>
|
||
<div class="form-row" style="margin-top:10px;align-items:center;gap:10px">
|
||
<label class="setting-label">PS5 Payloads Path</label>
|
||
<input class="u-flex-1" id="s-payload-remote" type="text" placeholder="/data/payloads/"/>
|
||
</div>
|
||
<p class="hint">FTP path on PS5 where payloads are pushed to and deleted from.</p>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.cheatsManager">Cheats Manager</h3></div>
|
||
<div class="form-row u-row-8">
|
||
<label class="setting-label">PS5 Cheats Path</label>
|
||
<input class="u-flex-1" id="s-cheats-remote" type="text" placeholder="/data/etaHEN/cheats/"/>
|
||
<button id="btn-browse-cheats-remote" class="btn">Browse…</button>
|
||
</div>
|
||
<p class="hint">FTP folder on PS5 where cheat JSON files are uploaded to. Must be connected to FTP before browsing.</p>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.saveManager">Local Save Manager</h3></div>
|
||
<p class="hint">Port that garlic-savemgr is served on from the PS5. Default is 8082.</p>
|
||
<div class="form-row u-row-8">
|
||
<label class="setting-label">Port</label>
|
||
<input id="s-savemgr-port" type="number" min="1" max="65535" placeholder="8082" style="width:100px;font-family:monospace"/>
|
||
<button id="btn-s-savemgr-save" class="btn btn-sm">Save</button>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.integrations">Integrations</h3></div>
|
||
<div class="integration-section">
|
||
<div class="integration-header">
|
||
<svg viewBox="0 0 24 24" width="18" height="18" fill="currentColor" style="color:#5865F2;flex-shrink:0">
|
||
<path d="M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.05 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03z"/>
|
||
</svg>
|
||
<span style="font-weight:600;font-size:12px">Discord Webhook</span>
|
||
</div>
|
||
<p class="hint u-mb-8">Paste a Discord channel webhook URL to share PS5 screenshots and video clips from the Media page. Screenshots are attached as images. Video clips are downloaded, converted to MP4 via ffmpeg, and uploaded to catbox.moe (free, no account needed) — a thumbnail is captured automatically during conversion.</p>
|
||
<div class="form-row u-row-8">
|
||
<label class="setting-label">Webhook URL</label>
|
||
<input id="s-discord-webhook" type="text" placeholder="https://discord.com/api/webhooks/..." style="flex:1;font-family:monospace;font-size:11px"/>
|
||
</div>
|
||
<label class="toggle-row" style="margin-top:8px;margin-bottom:4px">
|
||
<input type="checkbox" id="s-media-discord-notify" checked/>
|
||
<span class="toggle-label">Notify PS5 via <strong style="color:var(--text)">customPSNotify</strong> for media events</span>
|
||
</label>
|
||
<div id="media-discord-psn-detail" class="conv-psn-checkboxes">
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-media-psn-download" checked/> Clip downloaded from PS5</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-media-psn-convert" checked/> WebM → MP4 conversion started</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-media-psn-upload" checked/> Uploading to catbox</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-media-psn-done" checked/> Clip sent to Discord ✓</label>
|
||
<label class="toggle-row-sm"><input type="checkbox" id="s-media-psn-error" checked/> Error occurred</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="card" id="settings-generic-notifications-card">
|
||
<div class="card-header"><div><h3 data-i18n="settings.notifications.title">Generic notifications</h3><p class="hint" data-i18n="settings.notifications.description">Optional HTTPS JSON webhook for ntfy/Gotify bridges, automation or custom endpoints. Bearer tokens remain encrypted and are never returned.</p></div><button id="generic-notification-test" class="btn btn-sm">Test</button></div>
|
||
<form id="generic-notification-form" class="ecosystem-filter-row"><label class="ecosystem-check"><input id="generic-notification-enabled" type="checkbox"> <span data-i18n="settings.notifications.enabled">Enabled</span></label><label>HTTPS webhook<input id="generic-notification-endpoint" type="url" placeholder="https://notify.example/chimera"></label><label>Bearer token<input id="generic-notification-token" type="password" autocomplete="new-password" placeholder="Unchanged when blank" data-i18n-placeholder="settings.notifications.tokenPlaceholder"></label><label><span data-i18n="settings.notifications.cooldown">Cooldown (minutes)</span><input id="generic-notification-cooldown" type="number" min="5" max="1440" value="60"></label><button class="btn" type="submit" data-i18n="settings.notifications.saveEncrypted">Save encrypted</button></form>
|
||
<div id="generic-notification-rules" class="ecosystem-filter-row" aria-label="Automation notification rules"></div>
|
||
<p id="generic-notification-status" class="hint"></p>
|
||
</div>
|
||
<div class="card" id="settings-console-identity-card">
|
||
<div class="card-header"><div><h3 data-i18n="settings.identity.title">Console identity</h3><p class="hint" data-i18n="settings.identity.description">Observed local and linked PSN identity is displayed read-only. Chimera never edits the PS5 user database.</p></div><span class="badge" data-i18n="settings.identity.readOnly">Read-only</span></div>
|
||
<dl class="settings-identity-grid">
|
||
<div><dt data-i18n="settings.identity.profile">Console profile</dt><dd id="settings-identity-profile">-</dd></div>
|
||
<div><dt data-i18n="settings.identity.localUser">Local PS5 user</dt><dd id="settings-identity-local">-</dd></div>
|
||
<div><dt data-i18n="settings.identity.account">Account ID</dt><dd id="settings-identity-account">-</dd></div>
|
||
<div><dt data-i18n="settings.identity.psn">Linked PSN Online ID</dt><dd id="settings-identity-psn">-</dd></div>
|
||
<div><dt data-i18n="settings.identity.evidence">Evidence</dt><dd id="settings-identity-evidence">-</dd></div>
|
||
</dl>
|
||
<div class="settings-identity-guidance"><div><strong data-i18n="settings.identity.guidanceTitle">Change your official Online ID</strong><p data-i18n="settings.identity.guidance">Online ID changes happen only through PlayStation account settings, never through Chimera or the console user database.</p></div><a class="btn btn-sm" href="https://www.playstation.com/support/account/change-psn-online-id/" target="_blank" rel="noopener noreferrer" data-i18n="settings.identity.openGuidance">Open official guidance</a></div>
|
||
</div>
|
||
<div class="card" id="settings-automation-advisor-card">
|
||
<div class="card-header"><div><h3 data-i18n="settings.automation.title">Automation advisor</h3><p class="hint" data-i18n="settings.automation.description">Read-only classification of mounted roots plus Save Vault and replication eligibility. Suggestions never change paths or schedules automatically.</p></div><button id="settings-automation-analyze" class="btn btn-sm" data-i18n="settings.automation.analyze">Analyze</button></div>
|
||
<div id="settings-automation-analysis" class="operations-details"><p class="hint" data-i18n="settings.automation.empty">Run the advisor to inspect current mounts and protection prerequisites.</p></div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.appearance">Appearance</h3></div>
|
||
<div class="color-picker-row">
|
||
<label class="setting-label" for="s-accent-color">Accent Color</label>
|
||
<div class="color-picker-wrap">
|
||
<div class="color-swatch" id="accent-swatch">
|
||
<input type="color" class="color-picker-input" id="s-accent-color" value="#CBBAFF"/>
|
||
</div>
|
||
<input type="text" class="color-hex-label" id="s-accent-hex" value="#CBBAFF" maxlength="7" spellcheck="false" aria-label="Accent colour hex value" data-i18n-aria-label="settings.accent.hex"/>
|
||
</div>
|
||
<button id="btn-reset-accent" class="btn btn-sm">Reset</button>
|
||
<span class="hint">Applies instantly across the entire app.</span>
|
||
</div>
|
||
<div class="form-row" style="align-items:center;gap:12px;margin-top:10px">
|
||
<label class="setting-label">Time Format</label>
|
||
<select id="s-time-format" class="media-sort-select" style="margin-left:0">
|
||
<option value="12h" selected>12-hour (1:30 PM)</option>
|
||
<option value="24h">24-hour (13:30)</option>
|
||
</select>
|
||
<label class="setting-label" data-i18n="settings.density.label">Interface density</label>
|
||
<select id="s-interface-density" class="media-sort-select" style="margin-left:0">
|
||
<option value="comfortable" data-i18n="settings.density.comfortable">Comfortable</option>
|
||
<option value="compact" data-i18n="settings.density.compact">Compact</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3>Performance</h3></div>
|
||
<div class="form-row" style="align-items:center;gap:12px">
|
||
<label for="s-hash-concurrency" class="setting-label">Hash Concurrency</label>
|
||
<input id="s-hash-concurrency" type="number" min="1" max="32" placeholder="8" style="width:70px;font-family:monospace"/>
|
||
<span class="hint">Files hashed in parallel per job. Higher = faster on fast drives; lower = less CPU/IO pressure. Default: 8.</span>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h3>Web UI Server</h3>
|
||
<span id="webui-status-badge" class="badge badge-green" hidden>Running</span>
|
||
</div>
|
||
<p class="hint u-mb-12">
|
||
Serve Chimera as a web app on your local network so you can access it from any browser —
|
||
including the <strong>PS5 browser</strong> — or host it on a NAS or Windows Server.
|
||
The server runs on your machine and proxies all operations through the Chimera process.
|
||
</p>
|
||
<label class="toggle-row u-mb-8">
|
||
<input type="checkbox" id="s-webui-enabled"/>
|
||
<span class="toggle-label">Enable Web UI Server</span>
|
||
<span class="hint toggle-hint">Starts an HTTP server so the app is accessible at the URL below.</span>
|
||
</label>
|
||
<div class="form-row" style="align-items:center;gap:8px;margin-bottom:10px">
|
||
<label class="setting-label">Port</label>
|
||
<input id="s-webui-port" type="number" min="1024" max="65535" placeholder="6967" style="width:110px;font-family:monospace"/>
|
||
<button id="btn-webui-apply" class="btn btn-sm">Apply</button>
|
||
</div>
|
||
<div id="webui-url-row" style="display:flex;align-items:center;gap:10px;margin-bottom:8px" hidden>
|
||
<span class="setting-label">Access at:</span>
|
||
<code id="webui-url" style="font-size:12px;color:var(--accent)"></code>
|
||
<button id="btn-webui-open" class="btn btn-sm btn-accent">🌐 Open Web UI</button>
|
||
</div>
|
||
<p class="hint u-mt-4">
|
||
Browse buttons that open folder dialogs will open on the <strong>server machine</strong> when used from a remote browser.
|
||
Pre-configure all paths before enabling the server for best remote experience.
|
||
</p>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.metadata">Metadata</h3></div>
|
||
<p class="hint u-mb-12">Force re-fetch Prospero metadata for every game in the database. Clears all cached data and re-queues background fetches.</p>
|
||
<button id="btn-refresh-all-meta" class="btn btn-accent">↻ Refresh All Metadata</button>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3 data-i18n="settings.svHotkeys">System View Hotkeys</h3></div>
|
||
<p class="hint u-mb-12">Click a key field and press any key to rebind. Active when the System View page is open.</p>
|
||
<div class="hotkey-grid">
|
||
<span class="hotkey-label">Toggle Mute</span>
|
||
<input type="text" class="hotkey-input" id="hk-mute" readonly placeholder="—"/>
|
||
<span class="hotkey-label">Start / Stop GIF</span>
|
||
<input type="text" class="hotkey-input" id="hk-gif" readonly placeholder="—"/>
|
||
<span class="hotkey-label">Start / Stop Video</span>
|
||
<input type="text" class="hotkey-input" id="hk-video" readonly placeholder="—"/>
|
||
<span class="hotkey-label">Toggle Fullscreen</span>
|
||
<input type="text" class="hotkey-input" id="hk-fullscreen" readonly placeholder="—"/>
|
||
<span class="hotkey-label">Pop Out Window</span>
|
||
<input type="text" class="hotkey-input" id="hk-popout" readonly placeholder="—"/>
|
||
</div>
|
||
</div>
|
||
<p class="hint u-mt-4">✓ All changes are saved automatically.</p>
|
||
</div>
|
||
<div id="page-garlic" class="page">
|
||
<div class="page-header">
|
||
<div>
|
||
<h1 data-i18n="page.garlic">GarlicSaves</h1>
|
||
<p class="page-subtitle">Contribute worker time to the save community — completely optional.</p>
|
||
</div>
|
||
<button class="btn btn-sm" id="btn-garlic-site">🌏 garlicsaves.com</button>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3>What is GarlicSaves?</h3></div>
|
||
<p>GarlicSaves is a community-driven project that tracks gameplay statistics across jailbroken PS5 consoles. By enrolling, your console runs a background worker (<code>garlic-worker-ps5.elf</code>) that periodically polls for jobs</p>
|
||
<p class="u-mt-8">Enrollment is <strong>completely optional</strong>. You can enable or disable the worker at any time from this page. </p>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<h3>Start Contributing</h3>
|
||
<span id="garlic-status-badge" class="badge badge-green" hidden>Running</span>
|
||
</div>
|
||
<p class="hint">Make sure your PS5 is jailbroken and <strong>elfldr is loaded on port 9021</strong> before clicking Start. The worker will run until you restart your PS5.</p>
|
||
<div id="garlic-progress-area" class="garlic-progress-area" hidden>
|
||
<div class="garlic-progress-step" id="garlic-progress-text">Working…</div>
|
||
<div class="garlic-progress-bar-wrap"><div class="garlic-progress-bar" id="garlic-progress-bar" style="width:0%"></div></div>
|
||
</div>
|
||
<div class="btn-row u-mt-16">
|
||
<button class="btn btn-teal" id="btn-garlic-start">▶ Start Working</button>
|
||
</div>
|
||
</div>
|
||
<div id="garlic-confirm-overlay" class="garlic-confirm-overlay" hidden aria-hidden="true">
|
||
<div class="garlic-confirm-dialog" role="dialog" aria-modal="true" aria-labelledby="garlic-confirm-title" tabindex="-1">
|
||
<h3 id="garlic-confirm-title" class="garlic-confirm-title">Start GarlicSaves Worker?</h3>
|
||
<p>This will upload the config to your PS5 and send the worker payload immediately.</p>
|
||
<p class="u-mt-8">⚠ <strong>To stop the worker, restart your PS5.</strong> The worker runs in the background until then.</p>
|
||
<div class="garlic-confirm-btns">
|
||
<button class="btn" id="btn-garlic-confirm-cancel">Cancel</button>
|
||
<button class="btn btn-teal" id="btn-garlic-confirm-ok">Start Working</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="card">
|
||
<div class="card-header"><h3>Setup Tips</h3></div>
|
||
<ul class="garlic-tips">
|
||
<li>Your PS5 must be <strong>jailbroken</strong> and <strong>elfldr must be running on port 9021</strong> before clicking Start Working.</li>
|
||
<li>Unavailable pending secure per-install enrollment and encrypted transport.</li>
|
||
<li>The worker runs <strong>in the background until you restart your PS5</strong>. No reboot is required to start — only to stop.</li>
|
||
<li>Go to <strong>Settings → Power Save Settings</strong> on your PS5 and disable automatic rest mode so the worker stays running.</li>
|
||
<li>View your stats and manage your account at <a href="#" class="garlic-link" id="garlic-contribute-link">garlicsaves.com/contribute</a>.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div id="dest-picker-overlay" hidden aria-hidden="true">
|
||
<div id="dest-picker" role="dialog" aria-modal="true" aria-labelledby="dest-picker-title" tabindex="-1">
|
||
<div id="dest-picker-title" class="dest-picker-title">Select PS5 Install Location</div>
|
||
<p class="dest-picker-hint">Where should this game be installed on your PS5?<br>Your choice will be remembered for future uploads and porks.</p>
|
||
<div id="dest-picker-list"></div>
|
||
<div class="dest-picker-footer">
|
||
<button id="dest-picker-cancel" class="btn">Cancel</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="ftp-browser-overlay" hidden aria-hidden="true">
|
||
<div id="ftp-browser" role="dialog" aria-modal="true" aria-labelledby="ftp-browser-title" tabindex="-1">
|
||
<div class="ftp-browser-titlebar">
|
||
<span id="ftp-browser-title">Browse FTP — Select a Folder</span>
|
||
<button id="ftp-browser-close" class="btn-icon-sm" aria-label="Close FTP browser">✕</button>
|
||
</div>
|
||
<div class="ftp-browser-pathbar">
|
||
<button id="ftp-browser-up" class="btn btn-sm">↑ Up</button>
|
||
<span id="ftp-browser-cwd" class="ftp-browser-cwd">/</span>
|
||
</div>
|
||
<div id="ftp-browser-body" class="ftp-browser-body">
|
||
<div class="ftp-browser-loading">Loading…</div>
|
||
</div>
|
||
<div class="ftp-browser-footer">
|
||
<button id="ftp-browser-cancel" class="btn">Cancel</button>
|
||
<button id="ftp-browser-select" class="btn btn-accent">✓ Select This Folder</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
</div>
|
||
<div id="clear-select-overlay" hidden aria-hidden="true">
|
||
<div id="clear-select-dialog" role="dialog" aria-modal="true" aria-labelledby="clear-select-title" tabindex="-1">
|
||
<h3 id="clear-select-title" style="margin:0 0 6px;font-size:16px;color:var(--text)">Clear Database</h3>
|
||
<p style="margin:0 0 16px;font-size:12px;color:var(--text-dim)">Select which data to clear. This cannot be undone.</p>
|
||
<div id="clear-select-options" style="display:flex;flex-direction:column;gap:10px;margin-bottom:20px">
|
||
<label class="clear-opt"><input type="checkbox" value="games"><span class="clear-opt-label">Games</span><span class="clear-opt-hint">All scanned game entries</span></label>
|
||
<label class="clear-opt"><input type="checkbox" value="backups"><span class="clear-opt-label">Backups</span><span class="clear-opt-hint">Local backup records</span></label>
|
||
<label class="clear-opt"><input type="checkbox" value="backporks"><span class="clear-opt-label">Backporks</span><span class="clear-opt-hint">Backpork folders & firmware labels</span></label>
|
||
<label class="clear-opt"><input type="checkbox" value="hashes"><span class="clear-opt-label">Hashes</span><span class="clear-opt-hint">All stored file hashes</span></label>
|
||
<label class="clear-opt"><input type="checkbox" value="payloads"><span class="clear-opt-label">Payloads</span><span class="clear-opt-hint">Payload sources & downloaded files</span></label>
|
||
<label class="clear-opt"><input type="checkbox" value="cheats"><span class="clear-opt-label">Cheats</span><span class="clear-opt-hint">Cached cheat database</span></label>
|
||
</div>
|
||
<div class="confirm-buttons">
|
||
<button id="clear-select-cancel" class="btn">Cancel</button>
|
||
<button id="clear-select-all" class="btn btn-danger" style="margin-right:auto">Select All</button>
|
||
<button id="clear-select-ok" class="btn btn-danger" disabled>Clear Selected</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="confirm-overlay" hidden aria-hidden="true">
|
||
<div id="confirm-dialog" role="dialog" aria-modal="true" aria-labelledby="confirm-message" tabindex="-1">
|
||
<p id="confirm-message"></p>
|
||
<div class="confirm-buttons">
|
||
<button id="confirm-cancel" class="btn">Cancel</button>
|
||
<button id="confirm-ok" class="btn btn-accent">Confirm</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="prompt-overlay" hidden aria-hidden="true">
|
||
<div id="prompt-dialog" role="dialog" aria-modal="true" aria-labelledby="prompt-message" tabindex="-1">
|
||
<p id="prompt-message"></p>
|
||
<input id="prompt-input" class="text-input" type="text" aria-labelledby="prompt-message" />
|
||
<div class="confirm-buttons">
|
||
<button id="prompt-cancel" class="btn">Cancel</button>
|
||
<button id="prompt-ok" class="btn btn-accent">OK</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="admin-warn-overlay" hidden aria-hidden="true" style="position:fixed;inset:0;background:rgba(0,0,0,.65);display:flex;align-items:center;justify-content:center;z-index:9200;">
|
||
<div id="admin-warn-dialog" role="dialog" aria-modal="true" aria-labelledby="admin-warn-title" tabindex="-1">
|
||
<div class="admin-warn-icon">🛡</div>
|
||
<h3 id="admin-warn-title" class="admin-warn-title">Administrator Required</h3>
|
||
<p class="admin-warn-body">FFPKG and ExFAT conversions use low-level filesystem drivers (UFS2Tool / OSFMount) that require Windows Administrator privileges. The conversion will fail without elevation.</p>
|
||
<p class="admin-warn-hint">Close the app, right-click <strong>launch.bat</strong> → <strong>Run as administrator</strong>, then start the queue again.</p>
|
||
<button id="admin-warn-close" class="btn btn-accent" style="width:100%;margin-top:6px;">OK, Got It</button>
|
||
</div>
|
||
</div>
|
||
<div id="xavatar-thumb-modal" hidden aria-hidden="true" style="position:fixed;top:var(--titlebar-h);left:0;right:0;bottom:var(--statusbar-h);background:rgba(0,0,0,.75);display:flex;align-items:center;justify-content:center;z-index:8800;cursor:pointer;">
|
||
<div class="xavatar-modal-box" role="dialog" aria-modal="true" aria-labelledby="xavatar-modal-name" tabindex="-1">
|
||
<img id="xavatar-modal-img" src="" alt="" class="xavatar-modal-img">
|
||
<p id="xavatar-modal-name" class="xavatar-modal-name"></p>
|
||
<div class="xavatar-modal-actions">
|
||
<button class="btn btn-sm" id="btn-xavatar-modal-download">⇓ Download .xavatar</button>
|
||
<button class="btn btn-sm" id="btn-xavatar-modal-topng">⇓ Save PNG</button>
|
||
<button class="btn btn-sm btn-teal" id="btn-xavatar-modal-send">↗ Send to PS5</button>
|
||
<button class="btn btn-sm" id="btn-xavatar-modal-close">Close</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="toast-container"></div>
|
||
<div id="statusbar">
|
||
<span id="sb-sync">No connection check yet</span>
|
||
<span id="sb-msg"></span>
|
||
</div>
|
||
<div id="modal-overlay" hidden aria-hidden="true">
|
||
<div id="modal" role="dialog" aria-modal="true" aria-labelledby="modal-title" tabindex="-1">
|
||
<div id="modal-header">
|
||
<div id="modal-banner"></div>
|
||
<div id="modal-header-content">
|
||
<div style="display:flex;align-items:center;gap:14px">
|
||
<img id="modal-icon" src="" alt="" hidden
|
||
style="width:64px;height:64px;border-radius:8px;object-fit:cover;flex-shrink:0;box-shadow:0 2px 12px rgba(0,0,0,.7)"/>
|
||
<div>
|
||
<h2 id="modal-title">—</h2>
|
||
<div id="modal-subtitle"></div>
|
||
<div id="modal-workspace-links" class="modal-workspace-links" aria-label="Game workspace">
|
||
<button type="button" data-game-target="media" data-game-route="library/media">Media</button>
|
||
<button type="button" data-game-target="cheats" data-game-route="library/cheats">Cheats</button>
|
||
<button type="button" data-game-target="saves" data-game-route="protection/saves">Saves</button>
|
||
<button type="button" data-game-target="backups" data-game-route="protection/backups">Backups</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<button id="modal-close" type="button" aria-label="Close game details">✕</button>
|
||
</div>
|
||
</div>
|
||
<div class="modal-tabs" role="tablist" aria-orientation="vertical" aria-label="Game details">
|
||
<button id="modal-tab-info" class="modal-tab active" type="button" role="tab" aria-selected="true" aria-controls="mpanel-info" data-mtab="info">Overview</button>
|
||
<button id="modal-tab-copies" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-copies" tabindex="-1" data-mtab="copies" data-workspace-tab="copies"><span data-i18n="library.tabs.copies">Copies</span> <span id="mtab-copies-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-packages" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-packages" tabindex="-1" data-mtab="packages" data-workspace-tab="packages"><span data-i18n="library.tabs.packages">Packages</span> <span id="mtab-packages-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-patches" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-patches" tabindex="-1" data-mtab="patches">Updates <span id="mtab-patch-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-compatibility" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-compatibility" tabindex="-1" data-mtab="compatibility" data-workspace-tab="compatibility"><span data-i18n="library.tabs.compatibility">Compatibility</span></button>
|
||
<button id="modal-tab-saves" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-saves" tabindex="-1" data-mtab="saves" data-workspace-tab="saves"><span data-i18n="library.tabs.saves">Saves</span> <span id="mtab-saves-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-trophies" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-trophies" tabindex="-1" data-mtab="trophies" data-workspace-tab="trophies"><span data-i18n="library.tabs.trophies">Trophies</span> <span id="mtab-trophies-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-media" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-media" tabindex="-1" data-mtab="media" data-workspace-tab="media"><span data-i18n="library.tabs.media">Media</span> <span id="mtab-media-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-activity" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-activity" tabindex="-1" data-mtab="activity" data-workspace-tab="activity"><span data-i18n="library.tabs.activity">Activity</span> <span id="mtab-activity-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-dlc" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-dlc" tabindex="-1" data-mtab="dlc">DLC <span id="mtab-dlc-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-regions" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-regions" tabindex="-1" data-mtab="regions">Regions <span id="mtab-regions-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-manage" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-manage" tabindex="-1" data-mtab="manage">Files & backups <span id="mtab-manage-count" class="tab-badge"></span></button>
|
||
<button id="modal-tab-cheats" class="modal-tab" type="button" role="tab" aria-selected="false" aria-controls="mpanel-cheats" tabindex="-1" data-mtab="cheats">Cheats <span id="mtab-cheats-count" class="tab-badge"></span></button>
|
||
</div>
|
||
<div id="modal-body">
|
||
<div id="mpanel-info" class="modal-panel active" role="tabpanel" aria-labelledby="modal-tab-info">
|
||
<div id="modal-derived-badges" class="title-derived-badges" aria-label="Derived title status" data-i18n-aria-label="library.workspace.badges"></div>
|
||
<table class="detail-table" id="modal-info"></table>
|
||
<div id="modal-description" class="game-description" hidden></div>
|
||
<div id="modal-backup-section">
|
||
<h4 style="font-size:12px;color:var(--text-dim);font-weight:500;margin-bottom:10px">Backup files</h4>
|
||
<ul id="modal-backup-list"></ul>
|
||
</div>
|
||
<div id="modal-hash-section" hidden>
|
||
<div class="hash-section-header">
|
||
<h4>Integrity verification</h4>
|
||
<span id="modal-hash-community-badge" class="hash-badge hash-community" hidden>Community verified</span>
|
||
</div>
|
||
<p class="hint u-mb-8">
|
||
A hash verifies that a backup remains unchanged and stores the result locally.
|
||
Chimera compares it with known checksums when available.
|
||
</p>
|
||
<div id="modal-hash-list"></div>
|
||
<div id="modal-hash-progress" hidden>
|
||
<div class="hash-progress-bar"><div class="hash-progress-fill" id="hash-progress-fill"></div></div>
|
||
<div id="hash-progress-label" class="hash-progress-label">Hashing…</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="mpanel-copies" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-copies" hidden>
|
||
<div id="modal-copies-content" class="title-workspace-grid"></div>
|
||
</div>
|
||
<div id="mpanel-packages" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-packages" hidden>
|
||
<div id="modal-packages-content" class="title-evidence-list"></div>
|
||
</div>
|
||
<div id="mpanel-patches" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-patches" hidden>
|
||
<div id="modal-patches-content" class="prospero-placeholder">Loading update data…</div>
|
||
</div>
|
||
<div id="mpanel-compatibility" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-compatibility" hidden>
|
||
<div id="modal-compatibility-content"></div>
|
||
</div>
|
||
<div id="mpanel-saves" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-saves" hidden>
|
||
<div id="modal-saves-content" class="title-evidence-list"></div>
|
||
</div>
|
||
<div id="mpanel-trophies" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-trophies" hidden>
|
||
<div id="modal-trophies-content" class="title-evidence-list"></div>
|
||
</div>
|
||
<div id="mpanel-media" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-media" hidden>
|
||
<div id="modal-media-content" class="title-evidence-list"></div>
|
||
</div>
|
||
<div id="mpanel-activity" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-activity" hidden>
|
||
<div id="modal-activity-content" class="title-evidence-list"></div>
|
||
</div>
|
||
<div id="mpanel-dlc" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-dlc" hidden>
|
||
<div id="modal-dlc-content" class="prospero-placeholder">Loading DLC data…</div>
|
||
</div>
|
||
<div id="mpanel-regions" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-regions" hidden>
|
||
<div id="modal-regions-content" class="prospero-placeholder">Loading region data…</div>
|
||
</div>
|
||
<div id="mpanel-manage" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-manage" hidden>
|
||
<div class="manage-section">
|
||
<h4 class="manage-section-title">Backup files</h4>
|
||
<div id="manage-backup-list">
|
||
<div class="prospero-placeholder">No backup files registered.</div>
|
||
</div>
|
||
</div>
|
||
<div class="manage-section">
|
||
<h4 class="manage-section-title">PS5 transfer</h4>
|
||
<p class="hint u-mb-8">
|
||
Choose <strong>Upload to PS5</strong> on a backup file to fill the destination path
|
||
and then confirm the FTP transfer.
|
||
</p>
|
||
<div class="form-row" style="align-items:center">
|
||
<input class="u-flex-1" id="manage-remote-path" type="text" placeholder="Remote path on PS5…" readonly/>
|
||
<button id="btn-manage-upload" class="btn btn-teal" disabled>Upload via FTP</button>
|
||
</div>
|
||
<div id="manage-upload-log" class="progress-area" hidden></div>
|
||
</div>
|
||
<div class="manage-section">
|
||
<h4 class="manage-section-title">Backup from PS5</h4>
|
||
<p class="hint u-mb-8">
|
||
Mirror the full game folder from your PS5 to your local backup folder.
|
||
Requires an active FTP connection and a remembered install location.
|
||
</p>
|
||
<button id="btn-manage-backup-ps5" class="btn btn-teal" disabled>↓ Back up game from PS5</button>
|
||
</div>
|
||
<div class="manage-section" id="manage-backpork-section" hidden>
|
||
<h4 class="manage-section-title">Backpork versions</h4>
|
||
<div id="manage-porked-status"></div>
|
||
<div id="manage-backpork-list"></div>
|
||
<div id="manage-pork-progress" hidden>
|
||
<div class="hash-progress-bar"><div class="hash-progress-fill" id="pork-progress-fill"></div></div>
|
||
<div id="pork-progress-label" class="hash-progress-label">Uploading…</div>
|
||
</div>
|
||
</div>
|
||
<div class="manage-section">
|
||
<h4 class="manage-section-title">PS5 installation location</h4>
|
||
<div id="manage-install-location" class="manage-install-loc" hidden>
|
||
<span class="manage-loc-path-wrap">
|
||
<span class="manage-loc-label">Remembered:</span>
|
||
<code id="manage-loc-path" class="manage-loc-path"></code>
|
||
</span>
|
||
<button id="btn-manage-forget-loc" class="btn btn-sm">Forget</button>
|
||
</div>
|
||
<div id="manage-no-location" class="hint" style="margin:4px 0 8px">No remembered location yet; choose one during an upload or Backpork action.</div>
|
||
<button id="btn-manage-delete-ps5" class="btn btn-danger" disabled>Remove from PS5</button>
|
||
</div>
|
||
<div class="manage-section">
|
||
<h4 class="manage-section-title">Game</h4>
|
||
<div class="btn-row">
|
||
<button id="btn-manage-toggle-backed" class="btn">Mark as backed up</button>
|
||
<button id="btn-manage-toggle-installed" class="btn">Mark as installed</button>
|
||
<button id="btn-manage-refresh-meta" class="btn">↻ Refresh metadata</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="mpanel-cheats" class="modal-panel" role="tabpanel" aria-labelledby="modal-tab-cheats" hidden>
|
||
<div id="modal-cheats-body">
|
||
<div class="prospero-placeholder">Loading cheats…</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="modal-footer">
|
||
<button id="btn-modal-ps4-packages" class="btn btn-accent" hidden data-i18n="ps4Packages.open">PS4 PKG Backup & Restore</button>
|
||
<button id="btn-modal-ps5-native-packages" class="btn btn-accent" hidden data-i18n="ps5NativePackages.open">PS5 fPKG Backup & Restore</button>
|
||
<button id="btn-modal-backup" class="btn btn-teal" disabled title="Mirror the complete game folder from the PS5 to the local backup folder">↓ Backup from PS5</button>
|
||
<button id="btn-modal-install" class="btn btn-teal" disabled title="Upload a local backup to PS5">⇧ Install on PS5</button>
|
||
<button id="btn-modal-mark" class="btn">Mark as backed up</button>
|
||
<button id="btn-modal-refresh" class="btn">↻ Refresh metadata</button>
|
||
<button id="btn-modal-close2" class="btn">Close</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="payload-settings-overlay" class="jb-settings-overlay" hidden aria-hidden="true">
|
||
<div class="jb-settings-modal" role="dialog" aria-modal="true" aria-labelledby="payload-settings-title" tabindex="-1">
|
||
<div class="jb-settings-header">
|
||
<h3 id="payload-settings-title">Payload Manager Settings</h3>
|
||
<button class="btn-icon-sm" id="payload-settings-close" type="button" aria-label="Close payload settings">✕</button>
|
||
</div>
|
||
<div class="jb-settings-body">
|
||
<label>Local Payloads Folder
|
||
<div style="display:flex;gap:8px;margin-top:4px">
|
||
<input class="u-flex-1" type="text" id="pm-local-path" placeholder="C:\Payloads" readonly/>
|
||
<button class="btn" id="btn-pm-browse-local">Browse…</button>
|
||
</div>
|
||
</label>
|
||
<label>PS5 FTP Path
|
||
<input type="text" id="pm-remote-path" placeholder="/data/payloads/"/>
|
||
</label>
|
||
</div>
|
||
<div class="jb-settings-footer">
|
||
<button class="btn" id="btn-pm-settings-cancel">Cancel</button>
|
||
<button class="btn btn-teal" id="btn-pm-settings-save">Save</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="install-overlay" class="jb-settings-overlay" hidden aria-hidden="true">
|
||
<div class="jb-settings-modal install-dialog" role="dialog" aria-modal="true" aria-labelledby="install-dialog-title" tabindex="-1">
|
||
<div class="jb-settings-header">
|
||
<h3 id="install-dialog-title">Convert / Install to PS5</h3>
|
||
<span id="install-modal-game-label" class="hint" style="margin-left:8px;font-weight:400;font-size:12px"></span>
|
||
<button class="btn-icon-sm u-push" id="install-close" type="button" aria-label="Close install dialog">✕</button>
|
||
</div>
|
||
<div class="jb-settings-body">
|
||
<div class="install-mode-tabs" style="display:flex;gap:4px;margin-bottom:14px">
|
||
<button class="btn btn-sm install-mode-tab active" data-install-mode="pfs">Raw Dumps</button>
|
||
<button class="btn btn-sm install-mode-tab" data-install-mode="ffpkg">FFPKG Mode <span class="badge-os u-fs-micro">Win</span></button>
|
||
<button class="btn btn-sm install-mode-tab" data-install-mode="exfat">ExFAT Mode <span class="badge-os u-fs-micro">Win</span></button>
|
||
<button class="btn btn-sm install-mode-tab" data-install-mode="ffpfsc">FFPFSC Mode</button>
|
||
</div>
|
||
<div id="install-pfs-section" class="install-mode-section">
|
||
<div style="display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px">
|
||
<p id="install-backup-hint" class="hint" style="margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"></p>
|
||
<button class="btn btn-sm" id="btn-install-browse-local" title="Choose a local folder to install from">Browse folder…</button>
|
||
</div>
|
||
<p id="install-no-path-warn" class="hint" style="color:#f4a261;margin-bottom:6px" hidden>
|
||
No Remote Game Paths configured. Go to <strong>Settings → Remote Game Paths</strong> to set your PS5 game folder, or type the path below.
|
||
</p>
|
||
<div class="install-destination-picker">
|
||
<label><span data-i18n="install.destination.label">Destination volume</span>
|
||
<select id="install-destination-volume" aria-describedby="install-destination-status"></select>
|
||
</label>
|
||
<div id="install-destination-status" class="install-destination-status" role="status" aria-live="polite"></div>
|
||
</div>
|
||
<details id="install-expert-destination" class="install-expert-destination" data-expert-only="true">
|
||
<summary data-i18n="install.destination.expert">Expert: raw PS5 path override</summary>
|
||
<label><span data-i18n="install.destination.rawPath">Raw PS5 install path</span>
|
||
<div style="display:flex;gap:8px;margin-top:4px">
|
||
<input type="text" id="install-ftp-path" placeholder="/mnt/sandbox/pfsmnt/PPSA12345-app0" style="flex:1;background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 8px"/>
|
||
<button class="btn" id="btn-install-browse-ftp">Browse…</button>
|
||
</div>
|
||
</label>
|
||
</details>
|
||
<label style="margin-top:12px;display:block">Apply a Backpork after install? <span class="hint">(optional — patches game files on top)</span>
|
||
<select id="install-backpork-select" style="margin-top:4px;width:100%;background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 8px"></select>
|
||
</label>
|
||
</div>
|
||
<div id="install-conv-section" class="install-mode-section" hidden>
|
||
<div style="display:flex;align-items:center;gap:8px;margin-bottom:8px">
|
||
<p id="install-conv-backup-hint" class="hint" style="margin:0;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap"></p>
|
||
<button class="btn btn-sm" id="btn-install-conv-browse-local">Browse folder…</button>
|
||
</div>
|
||
<label style="display:block;margin-bottom:10px">Apply a Backpork Patch? <span class="hint">(optional)</span>
|
||
<select id="install-conv-backpork-select" style="margin-top:4px;width:100%;background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 8px"></select>
|
||
</label>
|
||
<label class="toggle-row u-mb-8">
|
||
<input type="checkbox" id="install-conv-ftp-upload"/>
|
||
<span class="toggle-label">Upload to PS5 via FTP when conversion finishes</span>
|
||
</label>
|
||
<div id="install-conv-ftp-fields" hidden>
|
||
<label style="display:block;margin-top:8px">PS5 Install Path
|
||
<div style="display:flex;gap:8px;margin-top:4px">
|
||
<input type="text" id="install-conv-ftp-path" placeholder="/data/ps4fs/" style="flex:1;background:var(--surface2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:6px 8px"/>
|
||
<button class="btn btn-sm" id="btn-install-conv-browse-ftp">Browse…</button>
|
||
</div>
|
||
</label>
|
||
<label class="toggle-row u-mt-8">
|
||
<input type="checkbox" id="install-conv-delete-after"/>
|
||
<span class="toggle-label">Delete converted file after successful upload</span>
|
||
<span class="hint toggle-hint">Saves disk space — file is removed once FTP upload confirms success.</span>
|
||
</label>
|
||
</div>
|
||
<p id="install-conv-tool-warn" class="hint" style="color:#f4a261;margin-top:8px" hidden>
|
||
⚠ Tool not configured. Go to <strong>Settings → Game Conversion</strong> to set up the required tool.
|
||
</p>
|
||
<p class="hint" style="color:var(--text-dim);margin-top:8px;font-size:11px">
|
||
ⓘ Conversion runs locally on your PC. Output is saved to the Output Directory in Settings. Large games may take several minutes.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="jb-settings-footer">
|
||
<button class="btn" id="btn-install-cancel">Cancel</button>
|
||
<button class="btn btn-teal" id="btn-install-confirm">⬆ Queue Install</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="media-lightbox" class="media-lightbox" hidden>
|
||
<div class="media-lightbox-backdrop"></div>
|
||
<div class="media-lightbox-frame">
|
||
<button class="media-lightbox-close" id="btn-lightbox-close">✕</button>
|
||
<div class="media-lightbox-meta" id="lightbox-meta"></div>
|
||
<img id="lightbox-img" class="media-lightbox-img" src="" alt=""/>
|
||
<div id="lightbox-spinner" class="media-lightbox-spinner" hidden>
|
||
<div class="lightbox-spin-ring"></div>
|
||
<span>Loading…</span>
|
||
</div>
|
||
<div class="media-lightbox-footer">
|
||
<button class="btn btn-sm" id="btn-lightbox-dl">⇓ Save to PC</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="chimera-about-overlay" class="chimera-overlay" hidden aria-hidden="true">
|
||
<section class="chimera-about-dialog" role="dialog" aria-modal="true" aria-labelledby="chimera-about-title">
|
||
<div class="chimera-about-visual" aria-hidden="true"><img src="assets/chimera-crest.svg" alt=""><span></span></div>
|
||
<div class="chimera-command-head">
|
||
<div><span class="chimera-command-kicker">PS operations hub</span><h2 id="chimera-about-title">Chimera 2.0</h2></div>
|
||
<button class="chimera-icon-button" data-about-close type="button" aria-label="Close">×</button>
|
||
</div>
|
||
<div class="chimera-about-body">
|
||
<p>A private PS4 and PS5 library, protection and console-management platform built for explicit, reviewable operations.</p>
|
||
<div class="chimera-about-facts">
|
||
<div><strong>Server</strong><span>Local-first · authenticated</span></div>
|
||
<div><strong>Console actions</strong><span>Manual and confirmed</span></div>
|
||
<div><strong>Interface</strong><span>Chimera Operational Dark</span></div>
|
||
</div>
|
||
<div class="chimera-about-actions"><button class="btn btn-accent" data-route="settings/general" type="button">Open settings</button><button class="btn" data-route="tools/diagnostics" type="button">Diagnostics</button></div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div id="ps4-packages-overlay" class="jb-settings-overlay" hidden aria-hidden="true">
|
||
<section class="jb-settings-modal ps4-package-dialog" role="dialog" aria-modal="true" aria-labelledby="ps4-packages-title" tabindex="-1">
|
||
<header class="jb-settings-header ps4-package-header">
|
||
<div class="ps4-package-emblem" aria-hidden="true"><span>4</span><i></i></div>
|
||
<div><span class="ps4-package-kicker" data-i18n="ps4Packages.kicker">Verified preservation workflow</span><h3 id="ps4-packages-title" data-i18n="ps4Packages.title">PS4 PKG Backup & Restore</h3><p id="ps4-packages-game" class="hint"></p></div>
|
||
<button class="btn-icon-sm" id="ps4-packages-close" type="button" aria-label="Close" data-i18n-aria-label="common.close">✕</button>
|
||
</header>
|
||
<div class="jb-settings-body ps4-package-body">
|
||
<div class="ps4-package-phasebar" aria-label="Workflow phases">
|
||
<span data-phase="inspect"><b>1</b><i data-i18n="ps4Packages.phase.inspect">Inspect</i></span>
|
||
<span data-phase="build"><b>2</b><i data-i18n="ps4Packages.phase.build">Build</i></span>
|
||
<span data-phase="verify"><b>3</b><i data-i18n="ps4Packages.phase.verify">Verify</i></span>
|
||
<span data-phase="restore"><b>4</b><i data-i18n="ps4Packages.phase.restore">Restore</i></span>
|
||
</div>
|
||
<div id="ps4-package-readiness" class="ps4-package-readiness" role="status" aria-live="polite"></div>
|
||
<div class="ps4-package-grid">
|
||
<section class="ps4-package-card">
|
||
<span class="ps4-package-card-index">01</span>
|
||
<h4 data-i18n="ps4Packages.create.title">Create verified PKG backup</h4>
|
||
<p data-i18n="ps4Packages.create.detail">Choose complete base and optional update dump folders. Chimera validates SFO evidence, layout and keystone before building.</p>
|
||
<label><span data-i18n="ps4Packages.baseDump">Base dump folder</span><div class="ps4-package-path"><input id="ps4-package-base" readonly><button id="ps4-package-base-browse" class="btn btn-sm" data-i18n="common.browse">Browse</button></div></label>
|
||
<label><span data-i18n="ps4Packages.updateDump">Update dump folder (optional)</span><div class="ps4-package-path"><input id="ps4-package-update" readonly><button id="ps4-package-update-browse" class="btn btn-sm" data-i18n="common.browse">Browse</button></div></label>
|
||
<button id="ps4-package-create" class="btn btn-accent" data-i18n="ps4Packages.create.action">Validate & create PKGs</button>
|
||
</section>
|
||
<section class="ps4-package-card">
|
||
<span class="ps4-package-card-index">02</span>
|
||
<h4 data-i18n="ps4Packages.restore.title">Restore verified PKG set</h4>
|
||
<p data-i18n="ps4Packages.restore.detail">Packages are handed off in base, update, DLC and unlocker order. Installed status is only confirmed by a later console scan.</p>
|
||
<label><span data-i18n="ps4Packages.packageSet">Verified package set</span><select id="ps4-package-set"></select></label>
|
||
<div class="ps4-package-actions"><button id="ps4-package-restore" class="btn btn-teal" data-i18n="ps4Packages.restore.action">Review & restore</button><button id="ps4-package-verify" class="btn" data-i18n="ps4Packages.verify.action">Run post-install scan</button></div>
|
||
</section>
|
||
</div>
|
||
<section class="ps4-package-jobs"><div class="ps4-package-jobs-head"><h4 data-i18n="ps4Packages.jobs.title">Package activity</h4><button id="ps4-package-refresh" class="btn btn-sm" data-i18n="common.refresh">Refresh</button></div><div id="ps4-package-jobs"></div></section>
|
||
</div>
|
||
<footer class="jb-settings-footer"><p class="hint" data-i18n="ps4Packages.semanticBoundary">Built, handed off and installed are separate evidence states.</p><button id="ps4-packages-done" class="btn" data-i18n="common.close">Close</button></footer>
|
||
</section>
|
||
</div>
|
||
<div id="ps5-native-packages-overlay" class="jb-settings-overlay" hidden aria-hidden="true">
|
||
<section class="jb-settings-modal ps4-package-dialog ps5-native-package-dialog" role="dialog" aria-modal="true" aria-labelledby="ps5-native-packages-title" tabindex="-1">
|
||
<header class="jb-settings-header ps4-package-header">
|
||
<div class="ps4-package-emblem ps5-native-package-emblem" aria-hidden="true"><span>5</span><i></i></div>
|
||
<div><span class="ps4-package-kicker" data-i18n="ps5NativePackages.kicker">Evidence-first backup workflow</span><h3 id="ps5-native-packages-title" data-i18n="ps5NativePackages.title">PS5 fPKG Backup & Restore</h3><p id="ps5-native-packages-game" class="hint"></p></div>
|
||
<button class="btn-icon-sm" id="ps5-native-packages-close" type="button" aria-label="Close" data-i18n-aria-label="common.close">✕</button>
|
||
</header>
|
||
<div class="jb-settings-body ps4-package-body">
|
||
<div class="ps5-native-truthbar"><strong data-i18n="ps5NativePackages.truth.title">Format truth</strong><span data-i18n="ps5NativePackages.truth.detail">PS5 fPKG means a finalized FIH .pkg. An .ffpkg remains a separate UFS mount image and is never a fallback.</span></div>
|
||
<div class="ps4-package-phasebar ps5-fpkg-phasebar" aria-label="Workflow phases" data-i18n-aria-label="ps5NativePackages.phase.aria">
|
||
<span><b>1</b><i data-i18n="ps5NativePackages.phase.capture">Capture</i></span><span><b>2</b><i data-i18n="ps5NativePackages.phase.analyze">Analyze</i></span><span><b>3</b><i data-i18n="ps5NativePackages.phase.build">Build fPKG</i></span><span><b>4</b><i data-i18n="ps5NativePackages.phase.verify">Verify</i></span><span><b>5</b><i data-i18n="ps5NativePackages.phase.restore">Restore</i></span><span><b>6</b><i data-i18n="ps5NativePackages.phase.launch">Launch verify</i></span>
|
||
</div>
|
||
<div id="ps5-native-package-readiness" class="ps4-package-readiness" role="status" aria-live="polite"></div>
|
||
<section class="ps5-fpkg-evidence-grid" aria-label="Backup and fPKG evidence" data-i18n-aria-label="ps5NativePackages.evidence.aria">
|
||
<article><small data-i18n="ps5NativePackages.evidence.backup">Backup safety</small><strong id="ps5-native-preservation-evidence" data-state="unknown" data-i18n="ps5NativePackages.evidence.notCaptured">Not captured</strong></article>
|
||
<article><small data-i18n="ps5NativePackages.evidence.readiness">fPKG readiness</small><strong id="ps5-native-fpkg-readiness-evidence" data-state="unknown" data-i18n="ps5NativePackages.evidence.notAnalyzed">Not analyzed</strong></article>
|
||
<article><small data-i18n="ps5NativePackages.evidence.restore">Restore qualification</small><strong id="ps5-native-restore-evidence" data-state="unproven" data-i18n="ps5NativePackages.evidence.notInstalled">Not installed</strong></article>
|
||
</section>
|
||
<section class="ps5-staging-workflow" aria-labelledby="ps5-staging-title">
|
||
<div class="ps5-staging-illustration" aria-hidden="true">
|
||
<span class="ps5-stage-node console"><i>PS5</i></span><span class="ps5-stage-track"><i></i></span><span class="ps5-stage-node vault"><i>SHA</i></span><span class="ps5-stage-track build"><i></i></span><span class="ps5-stage-node package"><i>PKG</i></span>
|
||
</div>
|
||
<div class="ps5-staging-copy"><span class="ps4-package-card-index">00</span><h4 id="ps5-staging-title" data-i18n="ps5NativePackages.stage.title">Capture from connected console</h4><p data-i18n="ps5NativePackages.stage.detail">Discover title-bound mounts, resume every file, then publish after size and SHA-256 verification.</p></div>
|
||
<div class="ps5-staging-controls"><button id="ps5-staging-discover" class="btn" data-i18n="ps5NativePackages.stage.discover">Discover console components</button><button id="ps5-staging-run" class="btn btn-accent" disabled data-i18n="ps5NativePackages.stage.action">Stage selected components</button></div>
|
||
<div id="ps5-staging-components" class="ps5-staging-components" aria-live="polite"><p class="hint" data-i18n="ps5NativePackages.stage.empty">No console components discovered yet.</p></div>
|
||
<p class="ps5-staging-limit" data-i18n="ps5NativePackages.stage.limit">Base and data-DLC can continue to native FIH builds. Update remains preserved until a patch-package contract is proven.</p>
|
||
</section>
|
||
<div class="ps4-package-grid">
|
||
<section class="ps4-package-card"><span class="ps4-package-card-index">01</span><h4 data-i18n="ps5NativePackages.create.title">Build PS5 fPKG (.pkg)</h4><p data-i18n="ps5NativePackages.create.detail">Build only readiness-approved base and data-DLC components as finalized FIH .pkg files. Updates remain preservation-only.</p><label><span data-i18n="ps5NativePackages.backupFolder">Verified prepared backup folder</span><div class="ps4-package-path"><input id="ps5-native-package-source" readonly><button id="ps5-native-package-source-browse" class="btn btn-sm" data-i18n="common.browse">Browse</button></div></label><button id="ps5-native-package-create" class="btn btn-accent" data-i18n="ps5NativePackages.create.action">Analyze & build fPKG</button></section>
|
||
<section class="ps4-package-card"><span class="ps4-package-card-index">02</span><h4 data-i18n="ps5NativePackages.restore.title">Restore and launch verify</h4><p data-i18n="ps5NativePackages.restore.detail">Installation and launch are separate gates. Only a stable exact-title process qualifies this artifact for restore.</p><label><span data-i18n="ps5NativePackages.packageSet">Verified FIH .pkg set</span><select id="ps5-native-package-set"></select></label><div class="ps4-package-actions"><button id="ps5-native-package-restore" class="btn btn-teal" data-i18n="ps5NativePackages.restore.action">Review & restore</button><button id="ps5-native-package-cancel" class="btn" data-i18n="ps5NativePackages.restore.cancel" disabled>Cancel install</button><button id="ps5-native-package-verify" class="btn" data-i18n="ps5NativePackages.verify.action">Run post-install scan</button><button id="ps5-native-package-launch" class="btn btn-accent" data-i18n="ps5NativePackages.launch.action" disabled>Review launch verification</button></div></section>
|
||
</div>
|
||
<section class="ps5-upstream-control ps5-launch-reference" aria-labelledby="ps5-launch-reference-title"><h4 id="ps5-launch-reference-title" data-i18n="ps5NativePackages.launchReference.title"></h4><div class="ps5-upstream-control-proof"><strong>FAKE00000</strong><strong id="ps5-launch-reference-trust" data-trust="unproven"></strong></div><div id="ps5-launch-reference-status" class="ps5-upstream-control-status" role="status" aria-live="polite"></div><div class="ps5-upstream-control-actions"><button id="ps5-launch-reference-import" class="btn btn-accent" data-i18n="ps5NativePackages.launchReference.import"></button><button id="ps5-launch-reference-restore" class="btn btn-teal" disabled data-i18n="ps5NativePackages.launchReference.restore"></button><button id="ps5-launch-reference-verify" class="btn" disabled data-i18n="ps5NativePackages.launchReference.verify"></button></div></section>
|
||
<section class="ps5-package-comparison" aria-labelledby="ps5-package-comparison-title"><div><span class="ps4-package-card-index">03</span><h4 id="ps5-package-comparison-title" data-i18n="ps5NativePackages.compare.title">Read-only trust comparison</h4><p data-i18n="ps5NativePackages.compare.detail">Compare managed FIH variants with durable AppInst and post-scan evidence. This never installs or modifies a package.</p></div><div class="ps5-package-comparison-controls"><label><span data-i18n="ps5NativePackages.compare.candidate">Candidate</span><select id="ps5-package-comparison-candidate"></select></label><label><span data-i18n="ps5NativePackages.compare.reference">Reference</span><select id="ps5-package-comparison-reference"></select></label><button id="ps5-package-comparison-run" class="btn btn-accent" data-i18n="ps5NativePackages.compare.action">Compare evidence</button></div><div id="ps5-package-comparison-result" class="ps5-package-comparison-result" role="status" aria-live="polite"><p class="hint" data-i18n="ps5NativePackages.compare.empty">Select two managed package variants to compare.</p></div></section>
|
||
<section class="ps5-upstream-control" aria-labelledby="ps5-upstream-control-title"><div class="ps5-upstream-control-copy"><span class="ps4-package-card-index">04</span><div><h4 id="ps5-upstream-control-title" data-i18n="ps5NativePackages.control.title">Upstream stock control</h4><p data-i18n="ps5NativePackages.control.detail">Use the exact hash-pinned open-source HomebrewTest to isolate stock AppInst trust from Chimera game conversion. Import never installs it.</p></div></div><div class="ps5-upstream-control-proof"><span><small>Title ID</small><strong>PPSA99099</strong></span><span><small>SHA-256</small><strong>00a1563abd7e…</strong></span><span><small data-i18n="ps5NativePackages.control.trust">Install trust</small><strong id="ps5-upstream-control-trust" data-trust="unproven" data-i18n="ps5NativePackages.control.unproven">Unproven</strong></span></div><div id="ps5-upstream-control-status" class="ps5-upstream-control-status" role="status" aria-live="polite" data-i18n="ps5NativePackages.control.notImported">Control package not imported.</div><div class="ps5-upstream-control-actions"><button id="ps5-upstream-control-import" class="btn btn-accent" data-i18n="ps5NativePackages.control.import">Import verified control</button><button id="ps5-upstream-control-restore" class="btn btn-teal" disabled data-i18n="ps5NativePackages.control.restore">Review control install</button><button id="ps5-upstream-control-verify" class="btn" disabled data-i18n="ps5NativePackages.control.verify">Run control post-scan</button></div></section>
|
||
<section id="ps5-p15-r2-card"><h4 id="ps5-p15-r2-title"></h4><div id="ps5-p15-r2-state" role="status" aria-live="polite"></div><table><tbody id="ps5-p15-r2-matrix"></tbody></table><button id="ps5-p15-r2-preflight"></button><button id="ps5-p15-r2-qualify" disabled></button></section>
|
||
<section class="ps5-upstream-control ps5-a8-distinct-control" aria-labelledby="ps5-a8-control-title"><div class="ps5-upstream-control-copy"><span class="ps4-package-card-index">05</span><div><h4 id="ps5-a8-control-title" data-i18n="ps5NativePackages.a8Control.title">Canonical A9 control</h4><p data-i18n="ps5NativePackages.a8Control.detail">Verify the frozen metadata-qualified CHIM00002 artifact, prove target absence with a complete fresh scan, then install, post-scan and qualify launch as separate guarded steps.</p></div></div><div class="ps5-upstream-control-proof"><span><small>Title ID</small><strong>CHIM00002</strong></span><span><small>SHA-256</small><strong>1e47f078e1dc…</strong></span><span><small data-i18n="ps5NativePackages.a8Control.trust">Control state</small><strong id="ps5-a8-control-trust" data-trust="unproven" data-i18n="ps5NativePackages.a8Control.unprepared">Not prepared</strong></span></div><div id="ps5-a8-control-status" class="ps5-upstream-control-status" role="status" aria-live="polite" data-i18n="ps5NativePackages.a8Control.notPrepared">Frozen artifact is included but not registered.</div><div class="ps5-upstream-control-actions"><button id="ps5-a8-control-prepare" class="btn btn-accent" data-i18n="ps5NativePackages.a8Control.prepare">Verify & register control</button><button id="ps5-a8-control-preflight" class="btn" disabled data-i18n="ps5NativePackages.a8Control.preflight">Prove target absence</button><button id="ps5-a8-control-install" class="btn btn-teal" disabled data-i18n="ps5NativePackages.a8Control.install">Install exact control</button><button id="ps5-a8-control-verify" class="btn" disabled data-i18n="ps5NativePackages.a8Control.verify">Run post-scan</button><button id="ps5-a8-control-launch" class="btn" disabled data-i18n="ps5NativePackages.a8Control.launch">Qualify launch</button></div></section>
|
||
<section id="ps5-a10-control-card" class="ps5-upstream-control ps5-a8-distinct-control" aria-labelledby="ps5-a10-control-title"><div class="ps5-upstream-control-copy"><span class="ps4-package-card-index">06</span><div><h4 id="ps5-a10-control-title" data-i18n="ps5NativePackages.a10Control.title">A10 transition control</h4><p data-i18n="ps5NativePackages.a10Control.detail">Install CHIM00003 through the production installer, then stage the exact diagnostic runtime, load its payload, qualify one launch and restore the production host runtime as separate guarded steps.</p></div></div><div class="ps5-upstream-control-proof"><span><small>Title ID</small><strong>CHIM00003</strong></span><span><small>SHA-256</small><strong>af66219c869b…</strong></span><span><small data-i18n="ps5NativePackages.a10Control.trust">Qualification state</small><strong id="ps5-a10-control-trust" data-trust="unproven" data-i18n="ps5NativePackages.a10Control.unprepared">Not prepared</strong></span></div><div id="ps5-a10-control-status" class="ps5-upstream-control-status" role="status" aria-live="polite" data-i18n="ps5NativePackages.a10Control.notPrepared">Frozen A10 artifacts are included but not registered or active.</div><div class="ps5-upstream-control-actions"><button id="ps5-a10-control-prepare" class="btn btn-accent" data-i18n="ps5NativePackages.a10Control.prepare">Verify & register control</button><button id="ps5-a10-control-preflight" class="btn" disabled data-i18n="ps5NativePackages.a10Control.preflight">Prove target absence</button><button id="ps5-a10-control-install" class="btn btn-teal" disabled data-i18n="ps5NativePackages.a10Control.install">Install exact control</button><button id="ps5-a10-control-verify" class="btn" disabled data-i18n="ps5NativePackages.a10Control.verify">Run post-scan</button><button id="ps5-a10-control-stage" class="btn" disabled data-i18n="ps5NativePackages.a10Control.stage">Stage diagnostic runtime</button><button id="ps5-a10-control-payload" class="btn" disabled data-i18n="ps5NativePackages.a10Control.payload">Load diagnostic payload</button><button id="ps5-a10-control-launch" class="btn" disabled data-i18n="ps5NativePackages.a10Control.launch">Qualify transition launch</button><button id="ps5-a10-control-restore" class="btn" disabled data-i18n="ps5NativePackages.a10Control.restore">Restore production runtime</button><button id="ps5-a10-control-evidence" class="btn" disabled data-i18n="ps5NativePackages.a10Control.evidence">Inspect & export retained evidence</button></div><p id="ps5-a10-control-evidence-summary" class="ps5-upstream-control-status" role="status" aria-live="polite" hidden></p></section>
|
||
<section class="ps4-package-jobs"><div class="ps4-package-jobs-head"><h4 data-i18n="ps5NativePackages.jobs.title">fPKG backup and restore activity</h4><button id="ps5-native-package-refresh" class="btn btn-sm" data-i18n="common.refresh">Refresh</button></div><div id="ps5-native-package-jobs"></div></section>
|
||
</div>
|
||
<footer class="jb-settings-footer"><p class="hint" data-i18n="ps5NativePackages.semanticBoundary">Backup safe, fPKG ready, structurally valid, installed and launch verified are separate evidence states.</p><button id="ps5-native-packages-done" class="btn" data-i18n="common.close">Close</button></footer>
|
||
</section>
|
||
</div>
|
||
<template id="chimera-home-command-center-template">
|
||
<div class="chimera-home-workbench">
|
||
<div class="chimera-home-topology">
|
||
<header class="chimera-home-topology-header">
|
||
<div>
|
||
<span class="chimera-home-kicker" data-i18n="home.topology.kicker">Topology overview</span>
|
||
<h2 data-i18n="home.topology.title">Living System Overview</h2>
|
||
<p data-i18n="home.topology.description">Chimera Server is the control plane. Local services and one explicitly configured PS5 Console branch from it.</p>
|
||
</div>
|
||
<span class="chimera-home-topology-mode" data-i18n="home.topology.mode">Evidence-led</span>
|
||
</header>
|
||
<div class="chimera-home-map" role="group" aria-label="Chimera system relationships" data-i18n-aria-label="home.topology.relationships">
|
||
<svg class="chimera-home-map-lines" viewBox="0 0 800 390" preserveAspectRatio="none" aria-hidden="true">
|
||
<path class="line-neutral" d="M400 195 400 52"/>
|
||
<path class="line-neutral" d="M400 195 656 90"/>
|
||
<path class="line-neutral" d="M400 195 656 300"/>
|
||
<path class="line-neutral" d="M400 195 144 300"/>
|
||
<path class="line-neutral" d="M400 195 144 90"/>
|
||
</svg>
|
||
<button class="chimera-home-node node-server" type="button" data-route="tools/diagnostics" aria-label="Chimera Server, online" data-i18n-aria-label="home.server.aria">
|
||
<span class="chimera-home-node-orbit"><span class="chimera-readiness-dot ok"></span></span>
|
||
<strong data-i18n="home.server.title">Chimera Server</strong><small data-i18n="home.server.status">Online · control plane</small>
|
||
</button>
|
||
<button class="chimera-home-node node-console" type="button" data-route="console/status">
|
||
<span class="chimera-home-node-orbit"><span id="home-console-indicator" class="chimera-readiness-dot unknown"></span></span>
|
||
<strong data-i18n="home.consoleTarget">PS5 Console</strong><small id="home-console-status" data-i18n="home.consoleUnknown">Status unknown</small>
|
||
</button>
|
||
<button class="chimera-home-node node-library" type="button" data-route="library/games">
|
||
<span class="chimera-home-node-orbit"><span id="home-library-indicator" class="chimera-readiness-dot unknown"></span></span>
|
||
<strong data-i18n="navigation.groups.library">Library</strong><small id="home-library-status" data-i18n="home.libraryLoading">Loading catalog…</small>
|
||
</button>
|
||
<button class="chimera-home-node node-protection" type="button" data-route="protection/backups">
|
||
<span class="chimera-home-node-orbit"><span id="home-backup-indicator" class="chimera-readiness-dot unknown"></span></span>
|
||
<strong data-i18n="navigation.groups.protection">Protection</strong><small id="home-backup-status" data-i18n="home.backupsLoading">Loading backups…</small>
|
||
</button>
|
||
<button class="chimera-home-node node-payloads" type="button" data-route="payloads/updates">
|
||
<span class="chimera-home-node-orbit"><span class="chimera-readiness-dot neutral"></span></span>
|
||
<strong data-i18n="home.payloads.title">Payloads</strong><small data-i18n="home.payloadReview">Offline reviewable</small>
|
||
</button>
|
||
<button class="chimera-home-node node-transfers" type="button" data-route="tools/transfers">
|
||
<span class="chimera-home-node-orbit"><span class="chimera-readiness-dot neutral"></span></span>
|
||
<strong data-i18n="home.transfers.title">Transfers</strong><small data-i18n="home.transfers.status">Explicitly queued</small>
|
||
</button>
|
||
</div>
|
||
<div class="chimera-home-recommendation" aria-live="polite">
|
||
<span class="chimera-home-recommendation-icon" aria-hidden="true">i</span>
|
||
<div><span data-i18n="home.next.kicker">Exact next safe action</span><h3 id="home-next-title" data-i18n="home.checkingTitle">Checking status…</h3><p id="home-next-detail" data-i18n="home.checkingDetail">Chimera is determining the safest next step.</p><button id="home-next-action" class="btn btn-accent" type="button" data-route="settings/general" data-focus-target="s-host">Configure PS5 target</button></div>
|
||
</div>
|
||
</div>
|
||
<aside class="chimera-home-inspector" aria-labelledby="home-inspector-title">
|
||
<span class="chimera-home-kicker" data-i18n="home.inspector.kicker">Console connection</span>
|
||
<div class="chimera-home-inspector-title">
|
||
<img src="assets/chimera-crest.svg" alt="">
|
||
<div><h3 id="home-inspector-title" data-i18n="home.consoleTarget">PS5 Console</h3><span id="home-inspector-state" class="chimera-node-state attention" role="status">Checking…</span></div>
|
||
</div>
|
||
<dl>
|
||
<div><dt data-i18n="home.inspector.reason">Reason</dt><dd id="home-inspector-reason">Reading local configuration.</dd></div>
|
||
<div><dt data-i18n="home.inspector.endpoint">Endpoint</dt><dd id="home-inspector-target">Not configured</dd></div>
|
||
<div><dt data-i18n="home.inspector.evidence">Evidence</dt><dd data-i18n="home.inspector.evidenceValue">Saved console profile and current FTP session</dd></div>
|
||
</dl>
|
||
<button class="btn" type="button" data-route="console/status" data-i18n="home.inspector.openConsole">Open console status</button>
|
||
<p class="chimera-home-inspector-note" data-i18n="home.inspector.note">The configured endpoint and live session describe the same PS5 Console; Chimera never invents a second device.</p>
|
||
</aside>
|
||
</div>
|
||
<div class="chimera-home-readiness" aria-label="System truth ledger" data-i18n-aria-label="home.ledger.label">
|
||
<button type="button" data-route="library/games"><span data-i18n="home.ledger.library">Library assets</span><strong id="home-truth-library">Loading…</strong><small data-i18n="home.ledger.libraryDetail">Titles and metadata</small></button>
|
||
<button type="button" data-route="protection/backups"><span data-i18n="home.ledger.protection">Protection coverage</span><strong id="home-truth-protection">Loading…</strong><small data-i18n="home.ledger.protectionDetail">Backed-up games</small></button>
|
||
<button type="button" data-route="payloads/updates"><span data-i18n="home.ledger.payloads">Payload policy</span><strong data-i18n="home.ledger.explicit">Explicit review</strong><small data-i18n="home.ledger.noExecution">No automatic execution</small></button>
|
||
<button type="button" data-route="tools/transfers"><span data-i18n="home.ledger.transfers">Transfer state</span><strong id="home-truth-transfers" data-i18n="home.ledger.noWork">No active work</strong><small data-i18n="home.ledger.actionCenter">Open Action Center for detail</small></button>
|
||
</div>
|
||
</template>
|
||
<script type="module" src="modules/import-wizard.js"></script>
|
||
<script src="bootstrap.js"></script>
|
||
</body>
|
||
</html>
|