From 876f8ef82b3535f7281083569da2bd035a870eaf Mon Sep 17 00:00:00 2001 From: fstat13 Date: Thu, 15 Oct 2026 15:27:41 +0200 Subject: [PATCH] docs: redesign the guide site, fix inaccurate docs - new modern layout for index.html / index.it.html with shared style.css + main.js: app-window mock, pipeline diagram, searchable troubleshooting, copy buttons on build commands, live star count - stream port is 5599 (not 9xxx); real log line is "ERRORE caricamento dll"; button label is STOP - troubleshooting covers more real log lines (UAC refused, pldmgr missing, elfldr unreachable, stream dropped) - links to .md guides point to GitHub, download goes to /releases (v0.1 is a pre-release, /latest would miss it) --- README.md | 2 +- docs/GUIDE.it.md | 8 +- docs/GUIDE.md | 8 +- docs/index.html | 700 +++++++++++++++++++++++++------------------- docs/index.it.html | 711 +++++++++++++++++++++++++-------------------- docs/main.js | 107 +++++++ docs/style.css | 395 +++++++++++++++++++++++++ 7 files changed, 1304 insertions(+), 627 deletions(-) create mode 100644 docs/main.js create mode 100644 docs/style.css diff --git a/README.md b/README.md index 74dab14..acc2173 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ payload/ PS5 side: display-engine reader + NV12 streamer (pscapture.elf) pc/ PSCapture.exe — GUI + installer + payload deployer + feeder pc/ps5cam.c the virtual capture-card driver (DirectShow source filter) pc/shm.h shared-memory contract between feeder and driver -docs/ guides: HTML, fool-proof step-by-step, build, installer, RE, log +docs/ guides: HTML, step-by-step, build, installer, RE, log ``` ## 🔧 Build diff --git a/docs/GUIDE.it.md b/docs/GUIDE.it.md index 5c9fa09..949d7d3 100644 --- a/docs/GUIDE.it.md +++ b/docs/GUIDE.it.md @@ -1,4 +1,4 @@ -# PSCapture — la guida a prova di scemo +# PSCapture — la guida passo-passo completa Da zero alla tua PS5 dentro Discord. Ogni passo dice esattamente cosa devi vedere sullo schermo. Se qualcosa non torna, salta alla tabella dei problemi @@ -47,7 +47,7 @@ per Windows sono dentro di lui. | `driver gia' installato` | la camera è già registrata — ok | | `driver estratto dall'eseguibile (… byte)` + `driver registrato - la webcam 'PS5 Capture' e' pronta` | primo avvio: driver installato | | `payload dall'eseguibile (… byte)` + `payload avviato - la PS5 deve mostrare la notifica PSCapture` | il payload sta girando sulla console | - | `porta stream: 9xxx` poi `collegato a 192.168.0.36:9xxx` | stream connesso | + | `porta stream: 5599` poi `collegato a 192.168.0.36:5599` | stream connesso | | la pillola diventa **verde**: `STREAMING - scegli 'PS5 Capture' in Discord` | sei live | 5. Sulla PS5 compare la notifica di sistema: **PSCapture is streaming on:PORT**. @@ -74,7 +74,7 @@ Qui va alla piena risoluzione **1920x1080**. payload è già sulla console (autoloader) lo stream parte subito; se la console è spenta la pillola dice *"IN ATTESA DELLA PS5"* e si connette nel momento in cui la console è pronta. -- Premi **Stop** (o chiudi l'app) per fermare lo stream. La camera si congela +- Premi **STOP** (o chiudi l'app) per fermare lo stream. La camera si congela sull'ultimo frame; gli altri programmi continuano a vedere il dispositivo. - **Deploy payload** rimanda il payload a mano (utile dopo un riavvio della console senza autoloader). **Install driver** riregistra la camera a mano @@ -98,7 +98,7 @@ Entrambe si applicano in diretta (circa un secondo) e sono salvate in | Il log ripete `PS5 non raggiungibile (...), riprovo` | come sopra | come sopra | | La camera `PS5 Capture` non appare in Discord/OBS | driver mai registrato (install fallito) | premi **Install driver**; leggi la riga di log che segue — ora riporta l'errore *vero* | | Log: `ERRORE: driver non scrivibile in C:\Program Files\PSCapture (serve admin?)` | app non elevata | chiudi e riavvia `PSCapture.exe` accettando il prompt UAC | -| Log: `ERRORE caricando la dll (err=126)` | l'antivirus ha messo in quarantena la dll estratta | controlla la quarantena dell'antivirus per `pscapture.dll`, sbloccala, premi di nuovo **Install driver** | +| Log: `ERRORE caricamento dll (err=126)` | l'antivirus ha messo in quarantena la dll estratta | controlla la quarantena dell'antivirus per `pscapture.dll`, sbloccala, premi di nuovo **Install driver** | | La camera appare ma l'immagine è nera | stream non partito | controlla la pillola; premi **Deploy payload** e/o **START STREAMING** | | I colori sembrano sbagliati (pelle rossastra, cielo arancione) | qualcuno ha toccato `gain` | rimetti `gain` a `1.0` → Apply | | Immagine decentrata / barra nera | allineamento | regola `shift px` con numeri pari finché non è centrata | diff --git a/docs/GUIDE.md b/docs/GUIDE.md index 0e7fe59..b710e5f 100644 --- a/docs/GUIDE.md +++ b/docs/GUIDE.md @@ -1,4 +1,4 @@ -# PSCapture — the fool-proof guide +# PSCapture — the complete step-by-step guide 🇮🇹 Versione italiana: [GUIDE.it.md](GUIDE.it.md) @@ -46,7 +46,7 @@ the Windows capture-card driver are inside it. | `driver gia' installato` | camera already registered — fine | | `driver estratto dall'eseguibile (… byte)` + `driver registrato - la webcam 'PS5 Capture' e' pronta` | first run: driver installed | | `payload dall'eseguibile (… byte)` + `payload avviato - la PS5 deve mostrare la notifica PSCapture` | the payload is now running on the console | - | `porta stream: 9xxx` then `collegato a 192.168.0.36:9xxx` | stream connected | + | `porta stream: 5599` then `collegato a 192.168.0.36:5599` | stream connected | | status pill turns **green**: `STREAMING - scegli 'PS5 Capture' in Discord` | you're live | 5. The PS5 shows a system notification: **PSCapture is streaming on:PORT**. @@ -72,7 +72,7 @@ This runs at the full **1920x1080**. itself: if the payload is already on the console (autoloader) the stream starts by itself; if the console is off the pill says *"IN ATTESA DELLA PS5"* and connects the moment the console is ready. -- Press **Stop** (or close the app) to stop streaming. The camera goes black / +- Press **STOP** (or close the app) to stop streaming. The camera goes black / freezes on the last frame; consumers keep the device listed. - **Deploy payload** re-sends the payload by hand (useful after a console reboot without autoloader). **Install driver** re-registers the camera by @@ -96,7 +96,7 @@ exe, so they survive restarts. | Log repeats `PS5 non raggiungibile (...)`, riprova | same as above | same | | No `PS5 Capture` camera appears in Discord/OBS | driver never registered (install failed) | press **Install driver**; read the log line after it — it now reports the *real* error | | Log: `ERRORE: driver non scrivibile in C:\Program Files\PSCapture (serve admin?)` | app not elevated | close it, restart `PSCapture.exe` and accept the UAC prompt | -| Log: `ERRORE caricando la dll (err=126)` | antivirus quarantined the extracted dll | check the antivirus quarantine for `pscapture.dll`, allow it, press **Install driver** again | +| Log: `ERRORE caricamento dll (err=126)` | antivirus quarantined the extracted dll | check the antivirus quarantine for `pscapture.dll`, allow it, press **Install driver** again | | Camera listed but the image is black | stream not running | check the pill; press **Deploy payload** and/or **START STREAMING** | | Colors look wrong (skin reddish, sky orange) | `gain` was changed | set `gain` back to `1.0` → Apply | | Image has a black bar / is off-center | alignment | tune `shift px` (even values) until centered | diff --git a/docs/index.html b/docs/index.html index 13d9329..32f8e95 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,274 +1,350 @@ - + -PSCapture by fstat13 — PS5 screen as a capture card on PC - +PSCapture — your PS5 screen as a capture card on PC + + + + + + + + + + + + + + + -
-
🇮🇹 Italiano
+ + + + +
+
+
+ v0.1Tested on PS5 firmware 13.60 +

Your PS5 screen,
live on your PC.

+

PSCapture turns a jailbroken PlayStation 5 into a capture card. + The console streams its own screen over your LAN, and Windows sees it as a + camera called PS5 Capture, ready for Discord, OBS and ffmpeg.

+ +
+ No capture card + No Remote Play + No cloud + One .exe
-
- PS5 jailbroken - Windows 10 / 11 - No capture card - No Remote Play - 1080p · ~30 fps + + - + +
+
+
1920×1080
full HD in OBS
+
~30 fps
over a plain LAN
+
0
re-encodes on the console
+
1 file
driver and payload inside
-
+
-

What it is

-
-
-

🎥 Virtual capture card

-

PSCapture registers a DirectShow device named PS5 Capture. - Discord, OBS and ffmpeg see it like an Elgato — pick it and go live.

+
+
+
Why PSCapture
+

A capture card, without the capture card.

+

Everything runs on hardware you already own: the console, your network and your PC.

-
-

⚡ Straight from the GPU

-

The console payload reads the display engine's scan-out buffer directly - and streams NV12 frames over your LAN. No re-encode delay, no cloud.

+
+
+

A real camera device

+

A DirectShow source filter named PS5 Capture. Any app that can open a webcam can open your console.

+
+

Straight from the display engine

+

The payload reads the console's scan-out buffer and sends raw NV12 frames. Nothing is re-encoded, so nothing waits for an encoder.

+
+

One file, one window

+

PSCapture.exe installs the driver, sends the payload, registers it in the autoloader and connects, all on its own.

+
+

Recovers by itself

+

Console still off? It retries every 2 seconds. Stream dropped? It reconnects. You don't have to babysit it.

+
+

Live tuning

+

Colour gain and horizontal shift apply in about a second and are saved in pscapture.ini.

+
+

Stays on your network

+

No accounts, no cloud relay, no Remote Play. Frames go from the console to your PC and nowhere else.

-
-

🖱️ One executable

-

PSCapture.exe carries the console payload inside itself: - install the driver, push the payload, start streaming — one window, - one click.

+
+ +
+
+
How it works
+

Three small pieces, one camera.

+

A payload on the console, a feeder and a driver on the PC. The apps you already use just see a webcam.

-
+
+
PS5

Payload

+

Reads the display engine's scan-out ring, builds NV12 frames and serves them on TCP 5599. Pops the toast “PSCapture is streaming on:5599”.

+ +
PC · PSCapture.exe

Feeder

+

Receives the frames and publishes them into a shared-memory ring.

+ +
PC · pscapture.dll

Driver

+

A DirectShow source filter that exposes the ring as the camera PS5 Capture.

+ +
Your apps

Any camera app

+

Pick PS5 Capture like any webcam.

+
DiscordOBSffmpeg
+
+ -

How it works

-
-
PS5 · payload -
reads the DCE scan-out ring, builds NV12 frames, serves them on a TCP - port, pops a toast: “PSCapture is streaming on:PORT”.
-
→
-
PC · feeder -
receives frames and publishes them into a shared-memory ring.
-
→
-
PC · driver -
DirectShow filter exposes the ring as a camera every app can use.
-
+
+
+
Before you start
+

What you need.

+
+
+
+

On the PS5

+
    +
  • A jailbroken consoleBuilt and tuned on firmware 13.60. See the FAQ for other versions.
  • +
  • Payload loader on TCP 9021elfldr-style, as in every current jailbreak setup.
  • +
  • Anonymous FTP on TCP 2121The app reads and writes a few files on the console.
  • +
  • pldmgr autoloader optionalStarts the payload on every boot, so you never deploy by hand.
  • +
+
+
+

On the PC

+
    +
  • Windows 10 or 11, 64-bitThe camera is a DirectShow device, so the PC side is Windows-only.
  • +
  • Same network as the consoleWired recommended. Gigabit is plenty for 1080p at 30 fps.
  • +
  • Admin rights, onceTo register the camera for every program on the machine.
  • +
  • PSCapture.exe from ReleasesOne single file: the payload and the driver are inside it.
  • +
+
+
+
-

Quick start — step by step

+
+
+
Setup
+

From zero to live in five steps.

+

After step 2 you mostly watch: the app does the rest and tells you what it's doing.

+
+
    +
  1. Jailbreak the console

    +

    Run your usual jailbreak so the payload loader (9021) and FTP (2121) are up.

  2. +
  3. Double-click PSCapture.exe

    +

    Windows asks “Do you want to allow this app to make changes to your device?”. Click Yes. The app elevates itself, no right-click needed.

  4. +
  5. Check the IP

    +

    The default is 192.168.0.36. If your PS5 has a different address, type it in PS5 IP and press Apply. It's remembered. You can find it on the console under Settings → Network → Connection Status → View Connection Status.

  6. +
  7. Hands off

    +

    On the first run the app installs the driver, then sends the payload and connects. The console shows “PSCapture is streaming on:5599” and the status pill turns green: STREAMING.

  8. +
  9. Pick PS5 Capture in your app

    +

    Discord, OBS or ffmpeg. See where to find it below.

  10. +
-
- What you need first. A jailbroken PS5 with the standard setup: - a payload loader on TCP 9021 (elfldr-style), - anonymous FTP on TCP 2121, and optionally the - pldmgr autoloader so the payload starts on every boot. - PC and console on the same LAN. Download PSCapture.exe from the - Releases page — it's one single file: the console payload and the - Windows driver are inside it. -
+

Reading the log

+

The app's log is in Italian. Here's what each line means, in the order you'll see them.

+
+
pscapture-app.log
+
driver gia' installatoThe camera is already registered. Nothing to do.
+
driver non installato: lo installo ora (primo avvio)
driver estratto dall'eseguibile (… byte)
driver registrato - la webcam 'PS5 Capture' e' pronta
First run: the driver is unpacked from the exe and registered.
+
payload dall'eseguibile (… byte)
payload … byte, invio a 192.168.0.36
The payload is on its way to the console.
+
autoloader aggiornato (pldmgr)The payload was copied to the autoloader, so it'll start on every boot.
+
payload avviato - la PS5 deve mostrare la notifica PSCaptureThe payload is running. Look for the toast on the TV.
+
porta stream: 5599
collegato a 192.168.0.36:5599
Connected. The pill reads STREAMING with the live fps.
+
-
    -
  1. Jailbreak the console
    - Any kernel-capable jailbreak that gives you the payload loader - (:9021), anonymous FTP (:2121) and — optionally — the - pldmgr autoloader.
  2. -
  3. Double-click PSCapture.exe
    - Windows asks “Do you want to allow this app to make changes?” - → Yes. The app elevates itself; admin is needed once, to register - the virtual camera for every program on the machine.
  4. -
  5. Check the IP
    - If your PS5 is not at 192.168.0.36, type its address - in the PS5 IP field and press Apply.
  6. -
  7. Watch it work — press nothing
    - The app does everything alone, and narrates it in the dark log pane - (see the table below). On the console you will also see the system - notification “PSCapture is streaming on:PORT”.
  8. -
  9. Use it in any app
    - Discord (call): Settings → Voice & Video → Camera → - PS5 Capture (720p — Discord asks every camera for 720p, capture - cards included). OBS: add a Video Capture Device → full - 1920x1080. ffmpeg: - -f dshow -i video="PS5 Capture".
  10. -
+
+ +

Pill stuck on “IN ATTESA DELLA PS5” (“waiting for the PS5”)? The console is off, not jailbroken yet, or the IP is wrong. You don't need to restart anything: the app retries every 2 seconds and connects the moment ports 9021 and 2121 answer.

+
+
-

What you should see in the app log

- - - - - - - - - - - - -
LineMeaning
driver gia' installatocamera already registered — nothing to do
driver estratto dall'eseguibile (… byte)
- driver registrato - la webcam 'PS5 Capture' e' pronta
first run: the driver was unpacked from the exe and registered
payload dall'eseguibile (… byte)the console payload is on its way to the PS5
payload avviato - la PS5 deve mostrare la notifica PSCapturethe payload is running on the console
porta stream: 9xxx → collegato a …:9xxxstream connected — the pill turns green: STREAMING
+
+
+
Use it
+

Works wherever a webcam works.

+
+
+

Discord

+
Settings → Voice & Video → Camera → PS5 Capture
+

Discord asks every camera for 720p, capture cards included. For 1080p60 use screen-share (Nitro).

+
in calls 1280×720
+

OBS Studio

+
Sources → + → Video Capture Device → PS5 Capture
+

Full resolution, ready for recording or streaming.

+
native 1920×1080
+

ffmpeg

+
ffmpeg -f dshow -i video="PS5 Capture" capture.mkv
+

Scripted captures and quick tests.

+
native 1920×1080
+
+
-
- Pill stuck on “IN ATTESA DELLA PS5 — accesa e col jailbreak avviato?”
- The console is off, not jailbroken yet, or the IP is wrong. The app keeps - retrying every 2 seconds: the moment the console is ready it connects by - itself. Ports to check on the console: 9021 and - 2121 must be open. -
+
+
+
Daily use
+

Open it and play.

+
+
+
every day +

Open PSCapture.exe and accept the UAC prompt. With the autoloader the stream starts by itself.

+
    +
  • Deploy payload: re-sends the payload by hand, after a reboot without autoloader.
  • +
  • Install driver: re-registers the camera if the log shows a driver error.
  • +
  • STOP or closing the app: the camera freezes on the last frame and stays listed.
  • +
+
gain +

Colour (chroma) strength.

+
  • 1.0 is raw and correct.
  • Only touch it if colours look off.
+
shift px +

Moves the picture left or right.

+
  • Even numbers only: an odd value swaps the colours.
  • The console's title text makes a good reference.
+
+
-

Daily use & tuning

-
    -
  • Open PSCapture.exe (UAC → Yes). If the payload is already on the - console (autoloader), the stream starts by itself; otherwise press - Deploy payload once.
  • -
  • Stop / closing the app stops the stream — the camera freezes on - the last frame and consumers keep the device listed.
  • -
  • gain — chroma strength. Leave it at 1.0 (raw) unless - colors look off.
  • -
  • shift px — horizontal alignment. Even numbers only (an - odd value inverts the colors). Applies live, saved in - pscapture.ini next to the exe.
  • -
+
+
+
Troubleshooting
+

Symptom → fix.

+

Type what you see, or paste a line from the log.

+
+ +
+
Pill stays on AVVIO… or IN ATTESA DELLA PS5
+
console off, not jailbroken, or wrong IPTurn the console on, run the jailbreak (ports 9021 and 2121 must be up), check the PS5 IP field. The app keeps retrying.
+
Log repeats PS5 non raggiungibile (…), riprovo
+
console not reachableSame as above. It connects by itself as soon as the console answers.
+
Log: elfldr :9021 non raggiungibile
+
payload loader not runningRun the jailbreak again, then press Deploy payload.
+
No PS5 Capture camera in Discord or OBS
+
driver not registeredPress Install driver and read the next log line: it reports the real error.
+
Log: ERRORE: driver non scrivibile in C:\Program Files\PSCapture (serve admin?)
+
app not elevatedClose it, start PSCapture.exe again and answer Yes to the UAC prompt.
+
Log: elevazione rifiutata: continuo senza privilegi
+
UAC prompt answered “No”Streaming can still work, but the driver can't be installed. Restart the app and click Yes.
+
Log: ERRORE caricamento dll (err=126)
+
antivirus quarantined the driverRestore and allow pscapture.dll in your antivirus, then press Install driver again.
+
Log: autoloader: copia FALLITA (pldmgr c'e'?)
+
pldmgr not installedHarmless: streaming works now. Without the autoloader, press Deploy payload after every console reboot.
+
Camera is listed but the image is black
+
stream not runningCheck the pill. Press Deploy payload and/or START STREAMING.
+
Log: stream caduto, riconnetto
+
network hiccup or console went to rest modeThe app reconnects by itself. If it happens often, use a cable instead of Wi-Fi.
+
Colours look wrong (reddish skin, orange sky)
+
gain was changedSet gain back to 1.0 and press Apply.
+
Colours inverted, black bar, picture off-centre
+
alignmentTune shift px using even values only. An odd value swaps the colours.
+
Discord shows only 720p
+
Discord's limit, not PSCapture'sDiscord caps every camera at 720p in calls. Use OBS for 1080p, or Discord screen-share (1080p60 with Nitro).
+
OBS sees the camera, Discord doesn't
+
Discord was open during the driver installQuit Discord completely (tray icon too) and reopen it.
+
Anything else
+
read the logspscapture-app.log (next to the exe, or in %TEMP%) and the console log /data/pscapture.log over FTP. Then open an issue with both.
+ +
+
-

Troubleshooting — symptom → fix

- - - - - - - - - - - - - - - - - - - - - - - - -
SymptomCause → fix
Pill stays AVVIO… / IN ATTESA DELLA PS5Console off or not jailbroken, or wrong IP → turn it on, run the - jailbreak, check the IP field
Log repeats PS5 non raggiungibileSame as above — the app retries by itself
No PS5 Capture camera in Discord/OBSDriver never registered → press Install driver; the log now - reports the real error
ERRORE: driver non scrivibile in C:\Program Files\PSCapture (serve admin?)App not elevated → restart PSCapture.exe and accept the UAC prompt
ERRORE caricando la dll (err=126)Antivirus quarantined the extracted dll → allow - pscapture.dll in the antivirus, then press - Install driver again
Camera listed but image is blackStream not started → check the pill, press Deploy payload - and/or START STREAMING
Colors look wronggain was moved → set it back to 1.0 and Apply
Image off-center / black barAlignment → tune shift px with even numbers
Discord shows 720pDiscord's engine caps every camera at 720p → use OBS for 1080p
OBS sees the camera, Discord doesn'tDiscord was open before the driver install → fully quit Discord - (tray included) and reopen
Anything elseRead pscapture-app.log (next to the exe or in - %TEMP%) and the console log - /data/pscapture.log over FTP
+
+
+
Build from source
+

Two halves, two toolchains.

+

The repository holds sources only; ready-made binaries are on Releases. The full walkthrough (toolchain install, checks, pitfalls) is in BUILD.md.

+
-

Build from source

+
+
Step 1 · console
+

Payload → pscapture.elf

+

Needs Docker and the PS5 payload SDK image (prospero-clang; any tag works, here ps5sdk:18).

+
$ docker run --rm -v "$PWD/payload:/payload" -w /payload ps5sdk:18 make
+
-

Sources only — the repo contains no binaries. - Two halves, two toolchains. The full walk-through (toolchain install, - verification, gotchas) is in docs/BUILD.md.

- -

1 · Console payload → pscapture.elf

-
# needs Docker + the PS5 payload SDK image (prospero-clang; here tagged ps5sdk:18)
-docker run --rm -v "<repo>/payload:/payload" -w /payload ps5sdk:18 make
- -

2 · PC side → pscapture.exe + pscapture.dll

-

Needs MinGW-w64 (gcc + - windres). The order is mandatory: the - .res embeds the driver and the payload as they are on disk.

-
# from the repo root
-cp payload/pscapture.elf pc/        # it gets embedded as-is
+    
+
Step 2 · PC
+

App and driver → pscapture.exe + pscapture.dll

+

Needs MinGW-w64 (gcc + windres). The order matters: the .res embeds the driver and the payload exactly as they are on disk.

+
# from the repo root
+cp payload/pscapture.elf pc/
 cd pc
 
 # 1) the capture-card driver (DirectShow source filter)
@@ -280,73 +356,87 @@ windres pscapture.rc -O coff -o pscapture.res
 
 # 3) the single-file app
 gcc -O2 -mwindows -o pscapture.exe pscapture.c pscapture.res \
-    -lws2_32 -lshell32 -ladvapi32 -luxtheme
+ -lws2_32 -lshell32 -ladvapi32 -luxtheme
+
-
- Why the order? (and the two classic build mistakes) -

windres embeds files as they are on disk: if the DLL or the - payload is rebuilt after step 2, the exe still carries the old ones. - Rebuild = DLL → windres → exe, every time.
- -static -static-libgcc on the DLL is mandatory: - without it Windows can fail to load the driver with the cryptic - “the specified module could not be found” (missing mingw runtime).

-
+
+ +

The two classic mistakes. Rebuilding the DLL or the payload after windres leaves the old ones inside the exe, so always go DLL → windres → exe. And -static -static-libgcc on the DLL is mandatory: without it Windows may refuse to load the driver with “the specified module could not be found” (missing MinGW runtime).

+
+ -

Requirements

- - - - - - -
WhereWhat
PS5Jailbroken (payload loader + FTP + pldmgr autoloader)
PS5Latest tested firmware: 13.60 — see the FAQ for other versions
PCWindows 10/11 64-bit, wired network recommended
NetworkBoth on the same LAN (gigabit is plenty for 1080p30)
+
+
+
FAQ
+

Questions.

+
+
+
Does it work on firmwares other than 13.60? +

The PC side works with any firmware: the app and the driver only use TCP, FTP and shared memory. The console payload is the version-specific part. It was built and tuned on 13.60 using display-engine anchors found on that firmware. Other versions may need a small porting pass to find the same anchors. Open an issue with your firmware version.

+
Why is the camera 720p in Discord calls? +

That's Discord's voice engine: it requests 1280×720 from every camera. In OBS, PS5 Capture runs at the full 1920×1080. Discord's screen-share goes up to 1080p60 with Nitro.

+
Do I need a capture card or Remote Play? +

No. PSCapture never touches Remote Play. The payload reads the display engine on the console itself and sends raw frames over your LAN.

+
Does it capture game audio? +

Not yet. PSCapture is video-only for now.

+
Does it work on macOS or Linux? +

The PC side is Windows-only, because the camera is a DirectShow device.

+
How do I uninstall it? +
    +
  1. Close the app.
  2. +
  3. Run rundll32 "%ProgramFiles%\PSCapture\pscapture.dll",DllUnregisterServer to remove the camera.
  4. +
  5. Delete C:\Program Files\PSCapture.
  6. +
  7. Optional, on the console: delete /data/pldmgr/payloads/pscapture/ so the autoloader stops starting it.
  8. +
+
+
-

FAQ

+
+
+

Useful? Leave a star.

+

PSCapture is free. A star on GitHub helps other PS5 homebrew users find it.

+
+ +
+ -
- Does it work on firmware versions older than 13.60? -

The PC side works on every firmware: the app and the driver only speak - TCP/FTP and shared memory. The console payload is the version-specific - part — it was built and tuned on 13.60, using display-engine - anchors found on that firmware. On other firmwares it may need a small - porting pass (the fix is finding the same anchors on that system). - If you have another firmware, open an issue with your version and we - can add a profile.

-
- -
- Why is the call camera 720p and not 1080p? -

That cap is Discord's voice engine, not PSCapture: it requests 1280x720 - from every camera. For full-quality capture use OBS (where PS5 Capture - runs at 1920x1080) or Discord's screen-share, which goes up to - 1080p60 with Nitro.

-
- -
- Is a capture card or Remote Play needed? -

No. PSCapture never touches Remote Play: the payload reads the display - engine on the console itself and streams raw frames over your LAN.

-
- -
- How do I uninstall it? -

Close the app, then rundll32 "%ProgramFiles%\PSCapture\pscapture.dll",DllUnregisterServer, - delete C:\Program Files\PSCapture, and optionally delete - /data/pldmgr/payloads/pscapture/ on the console so the - autoloader stops starting the payload.

-
- - - + + diff --git a/docs/index.it.html b/docs/index.it.html index b87b5b5..d8260d7 100644 --- a/docs/index.it.html +++ b/docs/index.it.html @@ -1,358 +1,443 @@ - + -PSCapture di fstat13 — la PS5 come scheda di acquisizione sul PC - +PSCapture — la PS5 come scheda di acquisizione sul PC + + + + + + + + + + + + + + + + -
-
🇬🇧 English
+ + + + +
+
+
+ v0.1Testato sul firmware PS5 13.60 +

Lo schermo della PS5,
live sul tuo PC.

+

PSCapture trasforma una PlayStation 5 jailbroken in una scheda di acquisizione. + La console manda il proprio schermo sulla tua rete locale e Windows lo vede come una + webcam chiamata PS5 Capture, pronta per Discord, OBS e ffmpeg.

+ +
+ Niente capture card + Niente Remote Play + Niente cloud + Un solo .exe
-
- PS5 jailbroken - Windows 10 / 11 - Niente capture card - Niente Remote Play - 1080p · ~30 fps + + - + +
+
+
1920×1080
full HD in OBS
+
~30 fps
su una normale LAN
+
0
ricodifiche sulla console
+
1 file
driver e payload inclusi
-
+
-

Cos'è

-
-
-

🎥 Scheda di acquisizione virtuale

-

PSCapture registra un dispositivo DirectShow chiamato PS5 Capture. - Discord, OBS e ffmpeg lo vedono come un'Elgato — scegli la camera e vai - live.

+
+
+
Perché PSCapture
+

Una capture card, senza la capture card.

+

Funziona tutto con quello che hai già: la console, la tua rete e il tuo PC.

-
-

⚡ Direttamente dalla GPU

-

Il payload sulla console legge direttamente il buffer di scan-out del - display engine e manda i frame NV12 sulla tua LAN. Nessuna - ricodifica, nessun cloud.

+
+
+

Una vera webcam

+

Un filtro sorgente DirectShow chiamato PS5 Capture. Qualsiasi programma che apre una webcam può aprire la tua console.

+
+

Direttamente dal display engine

+

Il payload legge il buffer di scan-out della console e manda frame NV12 grezzi. Niente ricodifica, quindi niente attese per un encoder.

+
+

Un file, una finestra

+

PSCapture.exe installa il driver, manda il payload, lo registra nell'autoloader e si collega. Tutto da solo.

+
+

Si riprende da solo

+

Console ancora spenta? Riprova ogni 2 secondi. Stream caduto? Si ricollega. Non devi stargli dietro.

+
+

Regolazioni in diretta

+

gain del colore e shift orizzontale si applicano in circa un secondo e restano salvati in pscapture.ini.

+
+

Resta nella tua rete

+

Niente account, niente server esterni, niente Remote Play. I frame vanno dalla console al PC e basta.

-
-

🖱️ Un solo eseguibile

-

PSCapture.exe contiene già il payload per la console: - installa il driver, manda il payload, avvia lo stream — una finestra, - un click.

+
+ +
+
+
Come funziona
+

Tre pezzi piccoli, una webcam.

+

Un payload sulla console, un feeder e un driver sul PC. I programmi che usi già vedono semplicemente una webcam.

-
+
+
PS5

Payload

+

Legge il ring di scan-out del display engine, costruisce i frame NV12 e li serve sulla porta TCP 5599. Mostra la notifica “PSCapture is streaming on:5599”.

+ +
PC · PSCapture.exe

Feeder

+

Riceve i frame e li pubblica in un ring di memoria condivisa.

+ +
PC · pscapture.dll

Driver

+

Un filtro sorgente DirectShow che espone il ring come la webcam PS5 Capture.

+ +
I tuoi programmi

Qualsiasi app video

+

Scegli PS5 Capture come una webcam qualunque.

+
DiscordOBSffmpeg
+
+ -

Come funziona

-
-
PS5 · payload -
legge il ring di scan-out del display engine, costruisce i frame - NV12, li serve su una porta TCP e mostra il toast: - “PSCapture is streaming on:PORT”.
-
→
-
PC · feeder -
riceve i frame e li pubblica in un ring di memoria condivisa.
-
→
-
PC · driver -
il filtro DirectShow espone il ring come una camera per tutti i - programmi.
-
+
+
+
Prima di iniziare
+

Cosa ti serve.

+
+
+
+

Sulla PS5

+
    +
  • Una console jailbrokenSviluppato e tarato sul firmware 13.60. Per le altre versioni vedi la FAQ.
  • +
  • Payload loader sulla porta TCP 9021Tipo elfldr, come in tutti i setup di jailbreak attuali.
  • +
  • FTP anonimo sulla porta TCP 2121L'app legge e scrive alcuni file sulla console.
  • +
  • Autoloader pldmgr opzionaleAvvia il payload a ogni accensione, così non devi mai mandarlo a mano.
  • +
+
+
+

Sul PC

+
    +
  • Windows 10 o 11, 64 bitLa webcam è un dispositivo DirectShow, quindi il lato PC è solo per Windows.
  • +
  • Stessa rete della consoleMeglio via cavo. Il gigabit basta e avanza per 1080p a 30 fps.
  • +
  • Permessi di amministratore, una voltaPer registrare la webcam per tutti i programmi del PC.
  • +
  • PSCapture.exe dalle ReleasesUn unico file: payload e driver sono già dentro.
  • +
+
+
+
-

Avvio rapido — passo per passo

+
+
+
Installazione
+

Da zero a live in cinque passi.

+

Dal passo 2 in poi ti basta guardare: l'app fa il resto e ti dice cosa sta facendo.

+
+
    +
  1. Fai il jailbreak della console

    +

    Avvia il tuo solito jailbreak, così il payload loader (9021) e l'FTP (2121) sono attivi.

  2. +
  3. Doppio clic su PSCapture.exe

    +

    Windows chiede “Consentire a questa app di apportare modifiche al dispositivo?”. Clicca Sì. L'app chiede da sola i permessi, non serve il tasto destro.

  4. +
  5. Controlla l'IP

    +

    Quello predefinito è 192.168.0.36. Se la tua PS5 ha un altro indirizzo, scrivilo in PS5 IP e premi Apply: viene ricordato. Lo trovi sulla console in Impostazioni → Rete → Stato della connessione → Visualizza stato della connessione.

  6. +
  7. Non toccare niente

    +

    Al primo avvio l'app installa il driver, poi manda il payload e si collega. Sulla console compare “PSCapture is streaming on:5599” e la pillola di stato diventa verde: STREAMING.

  8. +
  9. Scegli PS5 Capture nel tuo programma

    +

    Discord, OBS o ffmpeg. Più sotto trovi dove trovarla.

  10. +
-
- Cosa serve prima. Una PS5 jailbroken con il setup standard: - un payload loader sulla porta TCP 9021 (tipo - elfldr), FTP anonimo sulla 2121, e opzionalmente - l'autoloader pldmgr così il payload parte a ogni boot. - PC e console sulla stessa LAN. Scarica PSCapture.exe dalla pagina - Releases — è un unico file: il payload per la console e il driver - per Windows sono dentro di lui. -
+

Come leggere il log

+

Queste sono le righe che vedrai, nell'ordine in cui compaiono.

+
+
pscapture-app.log
+
driver gia' installatoLa webcam è già registrata. Niente da fare.
+
driver non installato: lo installo ora (primo avvio)
driver estratto dall'eseguibile (… byte)
driver registrato - la webcam 'PS5 Capture' e' pronta
Primo avvio: il driver viene estratto dall'exe e registrato.
+
payload dall'eseguibile (… byte)
payload … byte, invio a 192.168.0.36
Il payload sta andando verso la console.
+
autoloader aggiornato (pldmgr)Il payload è stato copiato nell'autoloader: partirà a ogni accensione.
+
payload avviato - la PS5 deve mostrare la notifica PSCaptureIl payload gira. Cerca la notifica sulla TV.
+
porta stream: 5599
collegato a 192.168.0.36:5599
Collegato. La pillola dice STREAMING con gli fps in tempo reale.
+
-
    -
  1. Fai il jailbreak della console
    - Qualsiasi jailbreak kernel-capable che ti dia il payload loader - (:9021), l'FTP anonimo (:2121) e — opzionale — l'autoloader - pldmgr.
  2. -
  3. Doppio click su PSCapture.exe
    - Windows chiede “Consenti a questa app di apportare modifiche?” - → Sì. L'app si eleva da sola; i privilegi servono una volta, per - registrare la webcam virtuale per tutti i programmi.
  4. -
  5. Controlla l'IP
    - Se la tua PS5 non è a 192.168.0.36, scrivi il suo - indirizzo nel campo PS5 IP e premi Apply.
  6. -
  7. Guarda e non premere niente
    - L'app fa tutto da sola, e te lo racconta nel pannello log scuro - (tabella qui sotto). Sulla console vedrai anche la notifica di sistema - “PSCapture is streaming on:PORT”.
  8. -
  9. Usalo in qualsiasi programma
    - Discord (in chiamata): Impostazioni → Voce e video → - Telecamera → PS5 Capture (720p — Discord chiede 720p a tutte - le camere, capture card incluse). OBS: aggiungi un Video Capture - Device → 1920x1080 pieno. ffmpeg: - -f dshow -i video="PS5 Capture".
  10. -
+
+ +

Pillola ferma su “IN ATTESA DELLA PS5”? La console è spenta, il jailbreak non è ancora partito o l'IP è sbagliato. Non serve riavviare niente: l'app riprova ogni 2 secondi e si collega appena le porte 9021 e 2121 rispondono.

+
+
-

Cosa devi vedere nel log dell'app

- - - - - - - - - - - - -
RigaSignificato
driver gia' installatocamera già registrata — niente da fare
driver estratto dall'eseguibile (… byte)
- driver registrato - la webcam 'PS5 Capture' e' pronta
primo avvio: il driver è stato estratto dall'exe e registrato
payload dall'eseguibile (… byte)il payload sta viaggiando verso la PS5
payload avviato - la PS5 deve mostrare la notifica PSCaptureil payload sta girando sulla console
porta stream: 9xxx → collegato a …:9xxxstream connesso — la pillola diventa verde: STREAMING
+
+
+
Usalo
+

Funziona ovunque funzioni una webcam.

+
+
+

Discord

+
Impostazioni → Voce e video → Videocamera → PS5 Capture
+

Discord chiede 720p a tutte le webcam, capture card comprese. Per il 1080p60 usa la condivisione schermo (Nitro).

+
in chiamata 1280×720
+

OBS Studio

+
Fonti → + → Dispositivo di acquisizione video → PS5 Capture
+

Risoluzione piena, pronta per registrare o andare in live.

+
nativo 1920×1080
+

ffmpeg

+
ffmpeg -f dshow -i video="PS5 Capture" capture.mkv
+

Per catture da script e test veloci.

+
nativo 1920×1080
+
+
-
- Pillola ferma su “IN ATTESA DELLA PS5 — accesa e col jailbreak avviato?”
- La console è spenta, non ancora jailbroken, o l'IP è sbagliato. L'app - riprova ogni 2 secondi: nel momento in cui la console è pronta si connette - da sola. Porte da controllare sulla console: 9021 e - 2121 devono essere aperte. -
+
+
+
Uso quotidiano
+

Aprilo e gioca.

+
+
+
ogni giorno +

Apri PSCapture.exe e accetta il prompt UAC. Con l'autoloader lo stream parte da solo.

+
    +
  • Deploy payload: rimanda il payload a mano, dopo un riavvio senza autoloader.
  • +
  • Install driver: registra di nuovo la webcam se il log mostra un errore del driver.
  • +
  • STOP o chiudere l'app: la webcam si ferma sull'ultimo frame e resta nell'elenco.
  • +
+
gain +

Intensità del colore (croma).

+
  • 1.0 è il valore grezzo e corretto.
  • Cambialo solo se i colori sembrano sbagliati.
+
shift px +

Sposta l'immagine a destra o a sinistra.

+
  • Solo numeri pari: un valore dispari scambia i colori.
  • Le scritte dei titoli della console sono un buon riferimento.
+
+
-

Uso quotidiano e regolazioni

-
    -
  • Apri PSCapture.exe (UAC → Sì). Se il payload è già sulla console - (autoloader) lo stream parte da solo; altrimenti premi - Deploy payload una volta.
  • -
  • Stop / chiudere l'app ferma lo stream — la camera si congela - sull'ultimo frame e gli altri programmi continuano a vedere il - dispositivo.
  • -
  • gain — forza del colore. Lascia 1.0 (grezzo) a meno che i - colori non sembrino sbagliati.
  • -
  • shift px — allineamento orizzontale. Solo numeri PARI - (un valore dispari inverte i colori). Si applica in diretta ed è - salvato in pscapture.ini accanto all'exe.
  • -
+
+
+
Problemi
+

Sintomo → rimedio.

+

Scrivi cosa vedi, oppure incolla una riga del log.

+
+ +
+
La pillola resta su AVVIO… o IN ATTESA DELLA PS5
+
console spenta, senza jailbreak o IP sbagliatoAccendi la console, avvia il jailbreak (le porte 9021 e 2121 devono essere attive), controlla il campo PS5 IP. L'app continua a riprovare.
+
Il log ripete PS5 non raggiungibile (…), riprovo
+
console non raggiungibileCome sopra. Si collega da sola appena la console risponde.
+
Log: elfldr :9021 non raggiungibile
+
payload loader non attivoRilancia il jailbreak, poi premi Deploy payload.
+
La webcam PS5 Capture non compare in Discord o OBS
+
driver non registratoPremi Install driver e leggi la riga successiva del log: riporta l'errore vero.
+
Log: ERRORE: driver non scrivibile in C:\Program Files\PSCapture (serve admin?)
+
app senza permessi di amministratoreChiudila, riapri PSCapture.exe e rispondi Sì al prompt UAC.
+
Log: elevazione rifiutata: continuo senza privilegi
+
al prompt UAC hai risposto “No”Lo stream può funzionare lo stesso, ma il driver non si installa. Riavvia l'app e clicca Sì.
+
Log: ERRORE caricamento dll (err=126)
+
l'antivirus ha messo in quarantena il driverRipristina e consenti pscapture.dll nell'antivirus, poi premi di nuovo Install driver.
+
Log: autoloader: copia FALLITA (pldmgr c'e'?)
+
pldmgr non installatoNessun danno: lo stream funziona. Senza autoloader, però, dopo ogni riavvio della console devi premere Deploy payload.
+
La webcam compare ma l'immagine è nera
+
stream non partitoGuarda la pillola. Premi Deploy payload e/o START STREAMING.
+
Log: stream caduto, riconnetto
+
problema di rete o console in modalità riposoL'app si ricollega da sola. Se succede spesso, passa dal Wi-Fi al cavo.
+
I colori sembrano sbagliati (pelle rossastra, cielo arancione)
+
hai cambiato gainRimetti gain a 1.0 e premi Apply.
+
Colori invertiti, barra nera, immagine decentrata
+
allineamentoRegola shift px usando solo valori pari. Un valore dispari scambia i colori.
+
Discord mostra solo 720p
+
limite di Discord, non di PSCaptureIn chiamata Discord limita ogni webcam a 720p. Usa OBS per il 1080p, o la condivisione schermo di Discord (1080p60 con Nitro).
+
OBS vede la webcam, Discord no
+
Discord era aperto durante l'installazione del driverChiudi Discord del tutto (anche dall'icona nella tray) e riaprilo.
+
Tutto il resto
+
leggi i logpscapture-app.log (accanto all'exe o in %TEMP%) e il log della console /data/pscapture.log via FTP. Poi apri una issue allegandoli.
+ +
+
-

Problemi — sintomo → rimedio

- - - - - - - - - - - - - - - - - - - - - - - - -
SintomoCausa → rimedio
La pillola resta su AVVIO… / IN ATTESA DELLA PS5Console spenta o non jailbroken, o IP sbagliato → accendila, avvia - il jailbreak, controlla il campo IP
Il log ripete PS5 non raggiungibileCome sopra — l'app riprova da sola
La camera PS5 Capture non appare in Discord/OBSDriver mai registrato → premi Install driver; il log ora - riporta l'errore vero
ERRORE: driver non scrivibile in C:\Program Files\PSCapture (serve admin?)App non elevata → riavvia PSCapture.exe e accetta il prompt UAC
ERRORE caricando la dll (err=126)L'antivirus ha messo in quarantena la dll estratta → sblocca - pscapture.dll nell'antivirus, poi premi di nuovo - Install driver
La camera appare ma l'immagine è neraStream non partito → controlla la pillola, premi Deploy - payload e/o START STREAMING
I colori sembrano sbagliatiHai toccato gain → rimettilo a 1.0 e Apply
Immagine decentrata / barra neraAllineamento → regola shift px con numeri pari
Discord mostra 720pIl motore di Discord limita ogni camera a 720p → usa OBS per il - 1080p
OBS vede la camera, Discord noDiscord era aperto prima dell'installazione del driver → chiudilo - COMPLETAMENTE (anche dalla tray) e riaprilo
Tutto il restoLeggi pscapture-app.log (accanto all'exe o in - %TEMP%) e il log della console - /data/pscapture.log via FTP
+
+
+
Build dai sorgenti
+

Due metà, due toolchain.

+

La repo contiene solo i sorgenti; i binari pronti sono nelle Releases. La guida completa (installazione toolchain, verifiche, trappole) è in BUILD.it.md.

+
-

Build dai sorgenti

+
+
Passo 1 · console
+

Payload → pscapture.elf

+

Servono Docker e l'immagine del PS5 payload SDK (prospero-clang; va bene qualsiasi tag, qui ps5sdk:18).

+
$ docker run --rm -v "$PWD/payload:/payload" -w /payload ps5sdk:18 make
+
-

Solo sorgenti — nella repo non ci sono binari. - Due metà, due toolchain. Il walk-through completo (installazione toolchain, - verifiche, trappole) è in docs/BUILD.it.md.

- -

1 · Payload console → pscapture.elf

-
# servono Docker + l'immagine del PS5 payload SDK (prospero-clang; qui tag ps5sdk:18)
-docker run --rm -v "<repo>/payload:/payload" -w /payload ps5sdk:18 make
- -

2 · Lato PC → pscapture.exe + pscapture.dll

-

Serve MinGW-w64 (gcc + - windres). L'ordine è obbligatorio: il - .res incastra driver e payload così come sono su disco.

-
# dalla radice della repo
-cp payload/pscapture.elf pc/        # viene incastrato così com'è
+    
+
Passo 2 · PC
+

App e driver → pscapture.exe + pscapture.dll

+

Serve MinGW-w64 (gcc + windres). L'ordine conta: il .res incorpora driver e payload esattamente come sono su disco.

+
# dalla radice della repo
+cp payload/pscapture.elf pc/
 cd pc
 
 # 1) il driver della capture card (filtro sorgente DirectShow)
 gcc -O2 -shared -static -static-libgcc -o pscapture.dll ps5cam.c \
     -lole32 -loleaut32 -luser32 -ladvapi32 -lws2_32
 
-# 2) bundle: icona + payload + driver nell'oggetto risorse
+# 2) icona + payload + driver nell'oggetto risorse
 windres pscapture.rc -O coff -o pscapture.res
 
-# 3) l'app a file unico
+# 3) l'app in un unico file
 gcc -O2 -mwindows -o pscapture.exe pscapture.c pscapture.res \
-    -lws2_32 -lshell32 -ladvapi32 -luxtheme
+ -lws2_32 -lshell32 -ladvapi32 -luxtheme
+
-
- Perché quest'ordine? (e i due errori classici di build) -

windres incastra i file come sono su disco: se la DLL o il - payload vengono ricompilati dopo il passo 2, l'exe continua a portarsi - dentro quelli vecchi. Rebuild = DLL → windres → exe, ogni volta.
- -static -static-libgcc sulla DLL è obbligatorio: - senza, Windows può rifiutarsi di caricare il driver con il cryptico - “impossibile trovare il modulo specificato” (runtime mingw mancante).

-
+
+ +

I due errori classici. Se ricompili la DLL o il payload dopo windres, l'exe si porta dentro quelli vecchi: l'ordine è sempre DLL → windres → exe. E -static -static-libgcc sulla DLL è obbligatorio: senza, Windows può rifiutarsi di caricare il driver con “impossibile trovare il modulo specificato” (manca il runtime MinGW).

+
+ -

Requisiti

- - - - - - -
DoveCosa
PS5Jailbroken (payload loader + FTP + autoloader pldmgr)
PS5Firmware testato: 13.60 — vedi la FAQ per le altre versioni
PCWindows 10/11 64-bit, rete cablata consigliata
ReteEntrambi sulla stessa LAN (il gigabit basta per 1080p30)
+
+
+
FAQ
+

Domande.

+
+
+
Funziona su firmware diversi dal 13.60? +

Il lato PC funziona con qualsiasi firmware: app e driver usano solo TCP, FTP e memoria condivisa. La parte legata alla versione è il payload della console, sviluppato e tarato sul 13.60 usando gli ancoraggi del display engine di quel firmware. Su altre versioni può servire un piccolo porting per ritrovare gli stessi ancoraggi. Apri una issue indicando il tuo firmware.

+
Perché in chiamata su Discord la webcam è a 720p? +

È il motore vocale di Discord: chiede 1280×720 a ogni webcam. In OBS, PS5 Capture va a 1920×1080 pieni. La condivisione schermo di Discord arriva a 1080p60 con Nitro.

+
Servono una capture card o il Remote Play? +

No. PSCapture non usa mai il Remote Play: il payload legge il display engine direttamente sulla console e manda i frame grezzi sulla tua rete locale.

+
Cattura anche l'audio del gioco? +

Non ancora. Per ora PSCapture trasmette solo il video.

+
Funziona su macOS o Linux? +

Il lato PC è solo per Windows, perché la webcam è un dispositivo DirectShow.

+
Come si disinstalla? +
    +
  1. Chiudi l'app.
  2. +
  3. Esegui rundll32 "%ProgramFiles%\PSCapture\pscapture.dll",DllUnregisterServer per rimuovere la webcam.
  4. +
  5. Cancella C:\Program Files\PSCapture.
  6. +
  7. Facoltativo, sulla console: cancella /data/pldmgr/payloads/pscapture/ così l'autoloader smette di avviarlo.
  8. +
+
+
-

FAQ

+
+
+

Ti è utile? Lascia una stella.

+

PSCapture è gratuito. Una stella su GitHub aiuta altri appassionati di homebrew PS5 a trovarlo.

+
+ +
+ -
- Funziona su firmware precedenti al 13.60? -

Il lato PC funziona su qualsiasi firmware: app e driver parlano solo - TCP/FTP e memoria condivisa. La parte version-specifica è il payload - della console — è stato compilato e tarato sul 13.60, usando gli - ancoraggi del display engine trovati su quel firmware. Su altri - firmware può servire un piccolo lavoro di porting (cioè ritrovare gli - stessi ancoraggi su quel sistema). Se hai un'altra versione, apri una - issue con il tuo firmware e possiamo aggiungere un profilo.

-
- -
- Perché la camera in chiamata è 720p e non 1080p? -

Quel limite è del motore vocale di Discord, non di PSCapture: chiede - 1280x720 a ogni camera. Per la qualità piena usa OBS (dove PS5 Capture - va a 1920x1080) o la condivisione schermo di Discord, che arriva a - 1080p60 con Nitro.

-
- -
- Servono una capture card o il Remote Play? -

No. PSCapture non tocca mai il Remote Play: il payload legge il display - engine sulla console stessa e manda i frame grezzi sulla tua LAN.

-
- -
- Come si disinstalla? -

Chiudi l'app, poi rundll32 "%ProgramFiles%\PSCapture\pscapture.dll",DllUnregisterServer, - cancella C:\Program Files\PSCapture, e opzionalmente - cancella /data/pldmgr/payloads/pscapture/ sulla console - così l'autoloader smette di avviare il payload.

-
- - - + + diff --git a/docs/main.js b/docs/main.js new file mode 100644 index 0000000..d4d9e13 --- /dev/null +++ b/docs/main.js @@ -0,0 +1,107 @@ +/* PSCapture — page behaviour shared by index.html / index.it.html */ +(function () { + var doc = document.documentElement; + doc.classList.remove('no-js'); + var it = doc.lang === 'it'; + var reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; + + /* nav border once the page scrolls */ + var nav = document.querySelector('.nav'); + function onScroll() { nav.classList.toggle('scrolled', window.scrollY > 8); } + window.addEventListener('scroll', onScroll, { passive: true }); + onScroll(); + + /* app mock: replay the real start-up log, then flip the pill to STREAMING */ + var log = document.querySelector('.app-log'); + var pill = document.querySelector('.pill'); + if (log && pill) { + var lines = Array.prototype.slice.call(log.children); + var live = function () { + pill.classList.add('live'); + pill.lastChild.textContent = ' STREAMING 29.8 fps'; + }; + /* the HTML ships in the final state, so no-JS and reduced-motion visitors see it as-is */ + if (!reduce) { + pill.classList.remove('live'); + pill.lastChild.textContent = ' AVVIO...'; + lines.forEach(function (l) { l.style.display = 'none'; }); + var i = 0; + (function next() { + if (i < lines.length) { + lines[i].style.display = ''; + i++; + setTimeout(next, i === 1 ? 500 : 420 + Math.random() * 380); + } else { + live(); + } + })(); + } + } + + /* copy buttons on code blocks (prompts and comments are not copied) */ + document.querySelectorAll('.codeblock').forEach(function (block) { + var btn = document.createElement('button'); + btn.className = 'copy'; + btn.type = 'button'; + btn.textContent = it ? 'Copia' : 'Copy'; + btn.addEventListener('click', function () { + var pre = block.querySelector('pre').cloneNode(true); + pre.querySelectorAll('.p, .c').forEach(function (n) { n.remove(); }); + var text = pre.textContent.split('\n') + .map(function (s) { return s.replace(/\s+$/, ''); }) + .filter(function (s) { return s.length; }) + .join('\n'); + navigator.clipboard.writeText(text).then(function () { + btn.textContent = it ? 'Copiato ✓' : 'Copied ✓'; + btn.classList.add('done'); + setTimeout(function () { + btn.textContent = it ? 'Copia' : 'Copy'; + btn.classList.remove('done'); + }, 1600); + }); + }); + block.appendChild(btn); + }); + + /* troubleshooting filter */ + var q = document.getElementById('q'); + if (q) { + var issues = document.querySelectorAll('.issue'); + var none = document.querySelector('.noresult'); + q.addEventListener('input', function () { + var words = q.value.toLowerCase().trim().split(/\s+/).filter(Boolean); + var shown = 0; + issues.forEach(function (el) { + var txt = el.textContent.toLowerCase(); + var ok = words.every(function (w) { return txt.indexOf(w) !== -1; }); + el.hidden = !ok; + if (ok) shown++; + }); + none.hidden = shown !== 0; + }); + } + + /* live star count on the GitHub buttons */ + fetch('https://api.github.com/repos/fstat13/PSCapture') + .then(function (r) { return r.ok ? r.json() : null; }) + .then(function (d) { + if (!d || typeof d.stargazers_count !== 'number') return; + document.querySelectorAll('[data-stars]').forEach(function (el) { + el.textContent = d.stargazers_count.toLocaleString(doc.lang); + el.hidden = false; + }); + }) + .catch(function () {}); + + /* fade sections in as they scroll into view */ + if ('IntersectionObserver' in window && !reduce) { + var io = new IntersectionObserver(function (entries) { + entries.forEach(function (e) { + if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } + }); + }, { rootMargin: '0px 0px -8% 0px' }); + document.querySelectorAll('.reveal').forEach(function (el) { io.observe(el); }); + } else { + document.querySelectorAll('.reveal').forEach(function (el) { el.classList.add('in'); }); + } +})(); diff --git a/docs/style.css b/docs/style.css new file mode 100644 index 0000000..6104ae0 --- /dev/null +++ b/docs/style.css @@ -0,0 +1,395 @@ +/* PSCapture — shared stylesheet for index.html / index.it.html */ + +:root{ + color-scheme: dark; + --bg:#07090d; + --bg-2:#0b0e14; + --surface:#10141c; + --surface-2:#151b25; + --surface-3:#1b2230; + --line:#1f2733; + --line-2:#2a3445; + --fg:#eef2f8; + --fg-2:#c3cbd8; + --dim:#8a95a8; + --dim-2:#5f6b7f; + --accent:#2986eb; /* same blue as the app's START button */ + --accent-2:#5aa8ff; + --accent-glow:rgba(41,134,235,.35); + --violet:#7c5cff; + --green:#22c55e; + --amber:#f59e0b; + --red:#ef4444; + --radius:16px; + --radius-sm:10px; + --maxw:1120px; + --font:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif; + --mono:"JetBrains Mono",ui-monospace,Consolas,"Cascadia Mono",monospace; +} + +*,*::before,*::after{box-sizing:border-box} +html{scroll-behavior:smooth;scroll-padding-top:84px;-webkit-text-size-adjust:100%} +body{ + margin:0;background:var(--bg);color:var(--fg); + font:16px/1.65 var(--font); + -webkit-font-smoothing:antialiased; + overflow-x:hidden; +} +img{max-width:100%;display:block} +a{color:var(--accent-2);text-decoration:none} +a:hover{text-decoration:underline;text-underline-offset:3px} +b,strong{color:var(--fg);font-weight:600} +::selection{background:var(--accent);color:#fff} + +.wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px} +@media (max-width:600px){.wrap{padding:0 16px}} + +/* ───────── nav ───────── */ +.nav{ + position:sticky;top:0;z-index:50; + background:rgba(7,9,13,.72); + backdrop-filter:saturate(160%) blur(14px); + -webkit-backdrop-filter:saturate(160%) blur(14px); + border-bottom:1px solid transparent; + transition:border-color .2s; +} +.nav.scrolled{border-bottom-color:var(--line)} +.nav .wrap{display:flex;align-items:center;gap:20px;height:64px} +.logo{display:flex;align-items:center;gap:10px;color:var(--fg);font-weight:700;letter-spacing:-.01em} +.logo:hover{text-decoration:none} +.logo img{width:30px;height:30px;border-radius:8px} +.nav-links{display:flex;gap:4px;margin-left:auto} +.nav-links a{color:var(--dim);font-size:14px;padding:6px 10px;border-radius:8px} +.nav-links a:hover{color:var(--fg);background:var(--surface);text-decoration:none} +.nav-right{display:flex;align-items:center;gap:8px} +.lang{font-size:13px;color:var(--dim);border:1px solid var(--line-2);border-radius:999px;padding:4px 11px} +.lang:hover{color:var(--fg);text-decoration:none;border-color:var(--dim-2)} +@media (max-width:860px){.nav-links{display:none}.nav-right{margin-left:auto}} + +/* ───────── buttons ───────── */ +.btn{ + display:inline-flex;align-items:center;gap:9px; + font:600 15px/1 var(--font); + padding:13px 20px;border-radius:12px;border:1px solid transparent; + cursor:pointer;transition:transform .15s,background .15s,border-color .15s,box-shadow .15s; + white-space:nowrap; +} +.btn:hover{text-decoration:none;transform:translateY(-1px)} +.btn svg{width:18px;height:18px;flex:none} +.btn-primary{background:var(--accent);color:#fff;box-shadow:0 8px 30px -8px var(--accent-glow),inset 0 1px 0 rgba(255,255,255,.18)} +.btn-primary:hover{background:#3592f5} +.btn-ghost{background:var(--surface);color:var(--fg);border-color:var(--line-2)} +.btn-ghost:hover{border-color:var(--dim-2)} +.btn-sm{padding:8px 13px;font-size:13.5px;border-radius:9px} + +/* ───────── hero ───────── */ +.hero{position:relative;padding:72px 0 56px;isolation:isolate} +.hero::before{ + content:"";position:absolute;inset:-64px 0 0;z-index:-1; + background: + radial-gradient(600px 380px at 12% 8%, rgba(41,134,235,.22), transparent 70%), + radial-gradient(520px 360px at 88% 18%, rgba(124,92,255,.16), transparent 70%); +} +.hero::after{ + content:"";position:absolute;inset:-64px 0 0;z-index:-1; + background-image:linear-gradient(var(--line) 1px,transparent 1px),linear-gradient(90deg,var(--line) 1px,transparent 1px); + background-size:56px 56px;opacity:.28; + -webkit-mask-image:radial-gradient(ellipse 70% 60% at 50% 20%,#000 30%,transparent 75%); + mask-image:radial-gradient(ellipse 70% 60% at 50% 20%,#000 30%,transparent 75%); +} +.hero-grid{display:grid;grid-template-columns:1fr 1.08fr;gap:56px;align-items:center} +@media (max-width:960px){.hero-grid{grid-template-columns:1fr;gap:44px}} +.eyebrow{ + display:inline-flex;align-items:center;gap:8px; + font-size:13px;color:var(--fg-2); + border:1px solid var(--line-2);background:rgba(16,20,28,.7); + padding:5px 12px 5px 8px;border-radius:999px; +} +.eyebrow .tagv{background:var(--accent);color:#fff;font-weight:700;font-size:11.5px;padding:2px 8px;border-radius:999px} +.hero h1{ + font-size:clamp(38px,5.6vw,62px);line-height:1.04;letter-spacing:-.035em; + margin:20px 0 18px;font-weight:800; +} +.grad{background:linear-gradient(100deg,#fff 10%,var(--accent-2) 55%,var(--violet));-webkit-background-clip:text;background-clip:text;color:transparent} +.lead{font-size:18.5px;color:var(--fg-2);margin:0 0 30px;max-width:540px} +.cta{display:flex;gap:12px;flex-wrap:wrap} +.hero-meta{display:flex;flex-wrap:wrap;gap:8px 18px;margin-top:26px;color:var(--dim);font-size:14px} +.hero-meta span{display:inline-flex;align-items:center;gap:7px} +.hero-meta svg{width:16px;height:16px;color:var(--green)} + +/* ───────── app mock ───────── */ +.app{ + position:relative; + background:#10141b;border:1px solid var(--line-2);border-radius:14px; + box-shadow:0 40px 80px -30px rgba(0,0,0,.8),0 0 0 1px rgba(255,255,255,.02),0 0 120px -40px var(--accent-glow); + overflow:hidden;font-size:13px; +} +.app-bar{display:flex;align-items:center;gap:10px;background:#0b0e13;border-bottom:1px solid #202733;padding:10px 14px} +.app-bar img{width:18px;height:18px;border-radius:4px} +.app-bar .t{color:var(--fg-2);font-size:12.5px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} +.app-bar .w{display:flex;gap:14px;color:var(--dim-2);font-size:12px} +.app-body{padding:18px 18px 16px} +.app-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px} +.app-title{font-weight:700;font-size:17px;letter-spacing:-.01em} +.app-title small{display:block;color:var(--dim);font-weight:400;font-size:12px} +.pill{ + display:inline-flex;align-items:center;gap:8px;white-space:nowrap; + background:#1a2130;border:1px solid #273042;border-radius:999px; + padding:6px 12px;font:600 11.5px/1 var(--mono);letter-spacing:.02em;color:var(--amber); + transition:color .3s; +} +.pill i{width:8px;height:8px;border-radius:50%;background:currentColor;box-shadow:0 0 0 0 currentColor;animation:pulse 1.6s infinite} +.pill.live{color:var(--green)} +@keyframes pulse{0%{box-shadow:0 0 0 0 color-mix(in srgb,currentColor 60%,transparent)}70%{box-shadow:0 0 0 7px transparent}100%{box-shadow:0 0 0 0 transparent}} +.app-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px} +.app-lbl{color:var(--dim);font-size:12px} +.app-in{background:#0c0f15;border:1px solid #202733;border-radius:7px;padding:6px 10px;color:#cbd3e0;font:12px var(--mono)} +.app-btn{background:#1a2029;border:1px solid #2c3646;border-radius:7px;padding:6px 11px;color:var(--fg-2);font-size:12px} +.app-btn.big{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:700;padding:12px 22px;font-size:13px;letter-spacing:.02em} +.app-btn.stop{padding:12px 18px;font-weight:600} +.app-log{ + margin-top:14px;background:#0c0f15;border:1px solid #202733;border-radius:9px; + padding:12px 14px;height:196px;overflow:hidden; + font:11.5px/1.75 var(--mono);color:#aeb8c8; + display:flex;flex-direction:column;justify-content:flex-end; +} +.app-log div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;animation:logIn .35s ease-out both} +.app-log .ok{color:#7ee2a5} +.app-log .hl{color:#8fc3ff} +@keyframes logIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}} +@media (max-width:520px){ + .app-bar .w{display:none} + .app-knobs{display:none} +} + +/* ───────── sections ───────── */ +section{padding:84px 0 0} +.sec-head{max-width:720px;margin-bottom:34px} +.kicker{font:600 12.5px/1 var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--accent-2);margin-bottom:14px} +h2{font-size:clamp(28px,3.6vw,40px);line-height:1.12;letter-spacing:-.028em;margin:0 0 14px;font-weight:750} +h3{font-size:18px;letter-spacing:-.01em;margin:0 0 8px;font-weight:650} +.sub{color:var(--dim);font-size:17px;margin:0} +p{margin:0 0 14px} + +/* stats */ +.stats{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--line);border-radius:var(--radius);background:var(--bg-2);overflow:hidden;margin-top:12px} +.stat{padding:22px 24px;border-left:1px solid var(--line)} +.stat:first-child{border-left:0} +.stat .n{font-size:28px;font-weight:750;letter-spacing:-.03em} +.stat .l{color:var(--dim);font-size:13.5px} +@media (max-width:760px){.stats{grid-template-columns:repeat(2,1fr)}.stat:nth-child(3){border-left:0}.stat:nth-child(n+3){border-top:1px solid var(--line)}} + +/* feature cards */ +.grid{display:grid;gap:16px} +.g3{grid-template-columns:repeat(3,1fr)} +.g2{grid-template-columns:repeat(2,1fr)} +@media (max-width:900px){.g3{grid-template-columns:1fr 1fr}} +@media (max-width:640px){.g3,.g2{grid-template-columns:1fr}} +.card{ + position:relative;background:linear-gradient(180deg,var(--surface),var(--bg-2)); + border:1px solid var(--line);border-radius:var(--radius);padding:24px; + transition:border-color .2s,transform .2s; +} +.card:hover{border-color:var(--line-2)} +.card p{color:var(--dim);font-size:15px;margin:0} +.ico{ + width:42px;height:42px;border-radius:11px;display:grid;place-items:center;margin-bottom:16px; + background:rgba(41,134,235,.12);color:var(--accent-2);border:1px solid rgba(41,134,235,.25); +} +.ico svg{width:21px;height:21px} +.ico.v{background:rgba(124,92,255,.12);color:#a996ff;border-color:rgba(124,92,255,.28)} +.ico.g{background:rgba(34,197,94,.1);color:#5fdc8f;border-color:rgba(34,197,94,.25)} +.ico.a{background:rgba(245,158,11,.1);color:#fbbf4a;border-color:rgba(245,158,11,.25)} + +/* pipeline */ +.pipe{display:grid;grid-template-columns:1fr auto 1fr auto 1fr auto 1fr;align-items:stretch;gap:0} +.node{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:20px} +.node .where{font:600 11px/1 var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--dim-2);margin-bottom:10px} +.node h3{font-size:16px} +.node p{color:var(--dim);font-size:14px;margin:0} +.node.end{background:linear-gradient(160deg,rgba(41,134,235,.14),var(--surface) 60%);border-color:rgba(41,134,235,.35)} +.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px} +.chip{font-size:12px;color:var(--fg-2);background:var(--surface-3);border:1px solid var(--line-2);border-radius:999px;padding:3px 10px} +.link{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:0 10px;color:var(--dim-2);min-width:64px} +.link span{font:500 10.5px/1.2 var(--mono);text-align:center;margin-bottom:6px;color:var(--dim)} +.link .line{position:relative;width:100%;height:2px;background:linear-gradient(90deg,var(--line-2),var(--accent),var(--line-2));background-size:200% 100%;animation:flow 2.2s linear infinite;border-radius:2px} +.link .line::after{content:"";position:absolute;right:-1px;top:-4px;border:5px solid transparent;border-left-color:var(--accent);border-right:0} +@keyframes flow{from{background-position:100% 0}to{background-position:-100% 0}} +@media (max-width:960px){ + .pipe{grid-template-columns:1fr} + .link{flex-direction:row;gap:10px;padding:10px 0;min-height:44px} + .link span{margin:0;order:2} + .link .line{width:2px;height:28px;background:linear-gradient(180deg,var(--line-2),var(--accent),var(--line-2));background-size:100% 200%} + .link .line::after{right:-4px;top:auto;bottom:-1px;border:5px solid transparent;border-top-color:var(--accent);border-bottom:0} +} + +/* requirements */ +.req{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:24px} +.req-h{display:flex;align-items:center;gap:12px;margin-bottom:16px} +.req-h .ico{margin:0} +.req-h h3{margin:0} +.req ul{list-style:none;margin:0;padding:0} +.req li{display:flex;gap:12px;padding:11px 0;border-top:1px solid var(--line);font-size:15px;color:var(--fg-2)} +.req li:first-child{border-top:0;padding-top:0} +.req li svg{width:18px;height:18px;flex:none;margin-top:3px;color:var(--green)} +.req li.opt svg{color:var(--dim-2)} +.req li small{color:var(--dim);display:block;font-size:13.5px} +.tagopt{font:600 10.5px/1 var(--mono);color:var(--dim);border:1px solid var(--line-2);border-radius:5px;padding:2px 6px;margin-left:6px;vertical-align:2px;text-transform:uppercase;letter-spacing:.06em} + +/* steps */ +.steps{list-style:none;margin:0;padding:0;counter-reset:s;position:relative} +.steps>li{counter-increment:s;position:relative;padding:0 0 30px 68px} +.steps>li::before{ + content:counter(s);position:absolute;left:0;top:-2px; + width:44px;height:44px;border-radius:13px;display:grid;place-items:center; + font:700 17px/1 var(--font);color:#fff; + background:linear-gradient(160deg,var(--accent),#1a5fb4); + box-shadow:0 8px 24px -8px var(--accent-glow),inset 0 1px 0 rgba(255,255,255,.2); +} +.steps>li::after{content:"";position:absolute;left:21px;top:50px;bottom:6px;width:2px;background:linear-gradient(var(--line-2),transparent)} +.steps>li:last-child::after{display:none} +.steps h3{margin:6px 0 6px;font-size:18.5px} +.steps p{color:var(--dim);margin:0} + +/* callouts */ +.callout{display:flex;gap:14px;border-radius:var(--radius);padding:18px 20px;border:1px solid;font-size:15px} +.callout svg{width:20px;height:20px;flex:none;margin-top:2px} +.callout p{margin:0;color:inherit} +.callout.info{background:rgba(41,134,235,.07);border-color:rgba(41,134,235,.3);color:#cfe3ff} +.callout.info svg{color:var(--accent-2)} +.callout.warn{background:rgba(245,158,11,.06);border-color:rgba(245,158,11,.3);color:#f6e2bd} +.callout.warn svg{color:var(--amber)} + +/* terminal-style log legend */ +.term{background:#0a0d12;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden} +.term-bar{display:flex;align-items:center;gap:8px;padding:11px 16px;border-bottom:1px solid var(--line);background:var(--bg-2);font:12px var(--mono);color:var(--dim)} +.term-bar i{width:10px;height:10px;border-radius:50%;background:var(--line-2)} +.term-bar b{margin-left:8px;font-weight:500;color:var(--dim)} +.term-row{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:20px;padding:14px 18px;border-top:1px solid var(--line)} +.term-row:first-of-type{border-top:0} +.term-row code{background:none;border:0;padding:0;color:#9fd0ff;font-size:13px;display:block;word-break:break-word} +.term-row .m{color:var(--fg-2);font-size:14.5px} +.term-row.ok code{color:#7ee2a5} +@media (max-width:700px){.term-row{grid-template-columns:1fr;gap:6px}} + +/* app targets */ +.target{display:flex;flex-direction:column} +.target .res{margin-top:auto;padding-top:16px;display:flex;align-items:center;justify-content:space-between;gap:10px;border-top:1px dashed var(--line-2);margin-top:18px;font-size:13.5px;color:var(--dim)} +.target .res b{font:700 15px var(--mono);color:var(--fg)} +.target .path{font-size:14px;color:var(--fg-2);margin-top:6px} + +/* knobs */ +.knob .k{display:inline-block;font:600 14px var(--mono);color:var(--fg);background:var(--surface-3);border:1px solid var(--line-2);border-radius:7px;padding:3px 9px;margin-bottom:12px} +.knob ul{margin:12px 0 0;padding-left:18px;color:var(--dim);font-size:14.5px} +.knob li{margin:4px 0} + +/* troubleshooting */ +.search{position:relative;margin-bottom:16px} +.search svg{position:absolute;left:16px;top:50%;transform:translateY(-50%);width:18px;height:18px;color:var(--dim-2)} +.search input{ + width:100%;font:15px var(--font);color:var(--fg); + background:var(--surface);border:1px solid var(--line-2);border-radius:12px; + padding:14px 16px 14px 46px;outline:none;transition:border-color .15s,box-shadow .15s; +} +.search input::placeholder{color:var(--dim-2)} +.search input:focus{border-color:var(--accent);box-shadow:0 0 0 4px rgba(41,134,235,.15)} +.issues{display:grid;gap:10px} +.issue{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.15fr);gap:24px;background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:18px 20px} +.issue .sym{font-weight:600;color:var(--fg)} +.issue .sym code{font-weight:400} +.issue .fix{color:var(--dim);font-size:15px} +.issue .fix b{color:var(--fg-2)} +.issue .cause{display:block;font-size:12px;font-family:var(--mono);color:var(--dim-2);text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px} +.issue[hidden]{display:none} +.noresult{color:var(--dim);padding:18px;text-align:center;border:1px dashed var(--line-2);border-radius:14px} +@media (max-width:700px){.issue{grid-template-columns:1fr;gap:10px}} + +/* code */ +code,kbd{ + font:.86em/1.5 var(--mono);color:#cfe3ff; + background:var(--surface-3);border:1px solid var(--line-2);border-radius:6px;padding:1px 6px; + overflow-wrap:anywhere; +} +.codeblock{position:relative;margin:12px 0 0} +.codeblock pre{ + margin:0;background:#0a0d12;border:1px solid var(--line);border-radius:14px; + padding:18px 20px;overflow-x:auto;font:13.5px/1.7 var(--mono);color:#d6e4f5; +} +.codeblock pre .c{color:#5d6b80} +.codeblock pre .p{color:var(--accent-2);user-select:none} +.copy{ + position:absolute;top:10px;right:10px; + font:500 12px var(--font);color:var(--dim); + background:var(--surface-2);border:1px solid var(--line-2);border-radius:8px; + padding:5px 10px;cursor:pointer;opacity:.85;transition:all .15s; +} +.copy:hover{color:var(--fg);opacity:1} +.copy.done{color:var(--green);border-color:rgba(34,197,94,.4)} +.build-step{margin-top:34px} +.build-step:first-child{margin-top:0} +.build-step .num{font:600 12px var(--mono);color:var(--accent-2);letter-spacing:.08em;text-transform:uppercase} +.build-step h3{margin:6px 0 6px;font-size:20px} +.build-step>p{color:var(--dim);margin:0} + +/* faq */ +.faq{display:grid;gap:10px} +details{background:var(--surface);border:1px solid var(--line);border-radius:14px;transition:border-color .2s} +details[open]{border-color:var(--line-2)} +summary{ + list-style:none;cursor:pointer;padding:18px 54px 18px 20px;position:relative; + font-weight:600;font-size:16px; +} +summary::-webkit-details-marker{display:none} +summary::after{ + content:"";position:absolute;right:22px;top:50%;width:9px;height:9px; + border-right:2px solid var(--dim);border-bottom:2px solid var(--dim); + transform:translateY(-70%) rotate(45deg);transition:transform .2s; +} +details[open] summary::after{transform:translateY(-30%) rotate(-135deg)} +details .body{padding:0 20px 18px;color:var(--dim);font-size:15px} +details .body p:last-child{margin:0} +details .body ol{margin:0;padding-left:20px} +details .body li{margin:6px 0} + +/* cta band */ +.band{ + margin-top:96px;position:relative;overflow:hidden; + border:1px solid rgba(41,134,235,.3);border-radius:22px;padding:48px 40px; + background: + radial-gradient(500px 260px at 0% 0%,rgba(41,134,235,.25),transparent 70%), + radial-gradient(500px 260px at 100% 100%,rgba(124,92,255,.18),transparent 70%), + var(--bg-2); + display:flex;align-items:center;justify-content:space-between;gap:28px;flex-wrap:wrap; +} +.band h2{margin:0 0 6px;font-size:clamp(24px,3vw,32px)} +.band p{margin:0;color:var(--fg-2)} +@media (max-width:600px){.band{padding:32px 22px}} + +/* footer */ +footer{margin-top:80px;border-top:1px solid var(--line);padding:44px 0 56px;color:var(--dim);font-size:14px} +.foot{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:32px} +@media (max-width:760px){.foot{grid-template-columns:1fr}} +.foot h4{margin:0 0 12px;font-size:12px;font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--dim-2);font-weight:600} +.foot ul{list-style:none;margin:0;padding:0} +.foot li{margin:7px 0} +.foot a{color:var(--fg-2)} +.foot .logo{margin-bottom:12px} +.legal{margin-top:36px;padding-top:22px;border-top:1px solid var(--line);font-size:12.5px;color:var(--dim-2);display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap} + +/* reveal on scroll */ +.reveal{opacity:0;transform:translateY(14px);transition:opacity .6s ease,transform .6s ease} +.reveal.in{opacity:1;transform:none} +.no-js .reveal{opacity:1;transform:none} + +@media (prefers-reduced-motion:reduce){ + html{scroll-behavior:auto} + *,*::before,*::after{animation:none!important;transition:none!important} + .reveal{opacity:1;transform:none} +} + +/* star counter inside GitHub buttons */ +.stars{font:600 12.5px/1 var(--mono);color:var(--fg-2);background:var(--surface-3);border:1px solid var(--line-2);border-radius:6px;padding:3px 7px;margin-left:2px} +.btn-primary .stars{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.22);color:#fff} + +/* inline svg icons (sprite in each page) */ +.i{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}