@punktfunk/plugin-rtss (0.1.1)
Installation
@punktfunk:registry=https://git.unom.io/api/packages/unom/npm/npm install @punktfunk/plugin-rtss@0.1.1"@punktfunk/plugin-rtss": "0.1.1"About this package
punktfunk-plugin-rtss
Caps the game at the refresh the client actually negotiated, through RivaTuner Statistics Server, for the length of a stream — and puts your own limit back when it ends. 60 Hz on the phone, 120 on the TV, from one install and no per-title setup.
RTSS is by Unwinder / Guru3D and is not bundled here. Install it yourself; this plugin only edits its Global profile.
What it does
- On
stream.startedit reads the mode the host negotiated (3840x2160@120), journals what RTSS's Global profile says now, and writesLimit/LimitDenominatorunder[Framerate]. - On
stream.stoppedit writes your previous limit back. With two streams up, the last one out restores; the survivor keeps its cap. - It never leaves a cap behind. The journal is written before the cap, the previous limit is restored on startup if a prior run died mid-stream, and again on clean shutdown.
doctortells you what is wrong, with the command that fixes it.
Windows only. On any other host it starts, says so once, and idles.
Install
punktfunk-host plugins add rtss
punktfunk-host plugins enable # once, if the runner isn't on yet
Then, from an elevated PowerShell, let the runner's account write the profiles:
icacls "C:\Program Files (x86)\RivaTuner Statistics Server\Profiles" /grant "NT AUTHORITY\LocalService:(OI)(CI)M"
The plugin runner runs as LocalService, and RTSS's install directory is admin-owned. A fresh
RTSS has no Profiles\Global yet — RTSS creates it from ProfileTemplates\Global on its first
edit, and so does the first stream. RTSS itself must be running for the cap to bite: it is the
RTSS hook inside the game that enforces it. Check with:
punktfunk-plugin-rtss doctor
Configure
%ProgramData%\punktfunk\plugin-state\rtss\config.json — every key optional:
{
"enabled": true,
"offset": 0,
"installDir": "C:\\Program Files (x86)\\RivaTuner Statistics Server"
}
offset is added to the negotiated refresh: -1 caps a 60 Hz stream at 59, -0.01 at 59.99.
A saved change applies to the next stream; no restart.
CLI
| Command | What it does |
|---|---|
doctor |
The precondition ladder, the current limit, and any restore still pending. |
cap <hz> |
Cap now, as a stream at that refresh would. |
restore |
Put the journaled limit back now. |
Limits
- RTSS's hook reads the profile when a game starts. A title already running before the stream keeps the cap it started with; the host launches the title after this event fires, so a session-launched game gets the new cap.
- The Global profile is one value for every title. A per-game
.cfgin RTSS still overrides it. - No OSD and no frame-time readout: RTSS's shared memory is session-local, and the runner lives in session 0. Those need a helper in the user's session, which this plugin does not ship.
Dependencies
Dependencies
| ID | Version |
|---|---|
| @punktfunk/host | ^0.1.6 |
| @punktfunk/plugin-kit | ^0.4.4 |
| effect | 4.0.0-beta.102 |
Development Dependencies
| ID | Version |
|---|---|
| @biomejs/biome | ^2.5.2 |
| @types/bun | ^1.3.0 |
| typescript | ^5.9.3 |