unom

Software development

Baden-Württemberg

@punktfunk/plugin-rtss (0.1.1)

Published 2026-09-02 08:45:11 +00:00 by enricobuehler in unom/punktfunk-plugin-rtss

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: caps the game at the client's negotiated refresh through RivaTuner Statistics Server for the length of a stream, and puts the old limit back after.

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.started it reads the mode the host negotiated (3840x2160@120), journals what RTSS's Global profile says now, and writes Limit / LimitDenominator under [Framerate].
  • On stream.stopped it 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.
  • doctor tells 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 .cfg in 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

Keywords

punktfunk plugin rtss rivatuner framerate game-streaming
Details
npm
2026-09-02 08:45:11 +00:00
11
MIT OR Apache-2.0
latest
6.9 KiB
Assets (1)
Versions (2) View all
0.1.1 2026-09-02
0.1.0 2026-09-02