This release adds a way to show frames at the moment the game drew them.
- Show frames at the PC's frame times (Settings → Display & image, off by default). Each frame carries the time the host captured it. With this on, Nightjar holds every decoded frame just long enough to show it at that time plus a small delay, instead of the moment the network and decoder delivered it. The delay follows recent jitter: it covers about 97% of frames, rises at once when frames arrive later and falls slowly when they arrive earlier. A frame later than the delay is shown at once. On a screen with adaptive refresh (ARR), the display then refreshes at the game's own frame times. On a fixed-refresh screen, Android shows each frame at the refresh nearest its time. The setting replaces Frame pacing and does not apply to PyroWave streams.
- Clock sync with Rubylight. Rubylight hosts that announce clock sync (control message 0x5537) answer four probes a second. Nightjar then adds the time from the host's present to the present on this device to the performance overlay, next to the current delay and the share of late frames. Other hosts are unaffected and get no probes.
The scheduling lives in the shared Rust protocol library (protocol/core/src/present_clock.rs), so a desktop client can use the same code.
The release APKs support arm64-v8a, armeabi-v7a, x86 and x86_64. Install nightjar-0.7.15.apk over your current installation to keep settings and paired PCs. nightjar-0.7.15-root.apk is the legacy rooted build for Android 5.0–7.1. The AAB and SHA-256 checksums are also included.
Validation passed:
- Android unit tests for both variants, release lint and the release build.
- The native test suite with sanitizers, including the new clock sync probe test, and the protocol library's tests (scheduling under jitter, drift, RTP wraparound and clock sync).
- The signed 0.7.15 APK updated 0.7.14 in an Android 15 emulator, kept the signing identity, launched without runtime errors and showed the new setting.
Not tested: a live stream with the setting on, whether on a physical device, an ARR screen or against a Rubylight host.
