Skip to content

Releases: RamazanKara/nightjar

Nightjar 3.2.1

Choose a tag to compare

@github-actions github-actions released this 25 Oct 22:44

What's new

Full chroma with HDR

  • Experimental full chroma with HDR no longer ends in a connection error. If your PC can't send full chroma in 10-bit, Nightjar streams it in 8-bit SDR and the overlay says why; if the PC refuses full chroma entirely, Nightjar reconnects once without it. Resuming a running game gets the same retry.
  • Nightjar reads which full-chroma modes a Rubylight PC offers before it launches, and forgets them when the PC refuses, so the next start picks a mode that works.

Tested. Lint, the full unit test suite (6,193 tests, all passing) and the desktop checks pass. On a Retroid Pocket 6 against a Rubylight 3.0 test build: 1080p120 full chroma in 8-bit SDR and in 10-bit HDR (AV1, overlay "10-bit HDR10", 116 fps received, 0 display drops), two minutes each without a stop, and resuming the running HDR stream. The fallbacks to 8-bit SDR and to a stream without full chroma are covered by unit tests.

The APKs are signed by CI with the Nightjar release key; the desktop packages (Windows zip, Linux tar.gz) are not signed. SHA-256 hashes of everything are in SHA256SUMS-3.2.1.txt.

Nightjar 3.2.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 19:06

What's new

Nightjar 3.2, for PCs running Rubylight 3.0 and other Moonlight-compatible hosts (Sunshine, Apollo, Vibepollo).

  • Host Metrics from Vibepollo. Vibepollo now supports Host Metrics and these are exposed here.
    Android TV
  • Posters. Game covers are now posters with an amber focus ring, glow and lift, the focused game shows its title, and holding a direction scrolls without animation lag.
  • Home is now built from shelves (Continue playing, Favourites, Library, PCs), with a large hero for the focused game. Home also groups games by store (Steam, Epic, GOG and more) with a store badge on each poster, and greys out games that aren't installed.
  • All games is a new screen that shows the whole library in a poster grid with one filter per store.
  • The library has an ambient backdrop from the focused game's cover, with smoother row scrolling and screen transitions.
  • A game's page keeps the backdrop from Home, shows chips for the store, its state and whether it's installed, and says why Play is off for a game that isn't installed. PCs are tiles that show the running game. Settings has a rail with icons.
  • Button hints follow your input, A/X on a gamepad and OK/Menu on a remote, and Menu opens a game's options.
  • Smoother remote navigation. The focused tile or setting always scrolls fully into view, Right from a settings category goes to its first option (Back and Left return), "Smaller tiles" really makes tiles smaller, tiles are more compact with even heights, artwork no longer shifts when scrolling back up, and focus outlines are no longer cut off at the screen edges.
  • New Interface layout setting: use the TV layout on a handheld or tablet, or the handheld layout on a TV. On a handheld the TV layout runs full screen. Phones keep their current Home.

Home

  • A gamepad or remote can now move Up from the top row to the PCs and Settings tabs (#30).
  • Experimental: Home keeps showing a sleeping PC's games, dimmed and marked "PC asleep". Starting one wakes the PC (Wake-on-LAN), waits for it, then starts the game; the game page offers "Wake PC and play", and a game on several PCs asks which one to use (#31).

Wi-Fi

  • Over Wi-Fi or mobile data, Nightjar now tells a Rubylight host so the host paces the stream for a wireless link from the first frame, not only after it sees loss (Android and desktop). This needs the next Rubylight release; older hosts ignore it.
  • Two new settings, Tell the PC when on Wi-Fi and Tell the PC the link speed, tell a Rubylight PC when you are on Wi-Fi and let the PC limit its sending rate to your wired port speed; both are on by default.

Picture and overlay

  • 10-bit color (SDR) is a new Stream setting that streams SDR in 10-bit HEVC or AV1 to reduce banding on screens without HDR. It needs a Main10 decoder on this device; if the PC does not offer 10-bit, the stream is 8-bit and Nightjar says so.
  • Experimental: Render through Vulkan (Decoder settings, off by default) shows the video through a Vulkan renderer so frame-generation overlays such as lybxlpsv's Frame Generation can hook it. Needs Android 10+, not used with PyroWave; adds about 0.5–1 ms on a Retroid Pocket 6. It replaces Render through OpenGL. Contributed by umbertomarotta (#17, #27).
  • Experimental full chroma no longer stops the stream after a few minutes on handhelds: short load spikes are ignored, and if the device really can't keep up, Nightjar reconnects once without full chroma instead of ending the stream. With HDR on, Nightjar now checks before the stream starts whether the device can show 10-bit full chroma, and the overlay says why HDR or full chroma was turned off.
  • Performance overlay: the stream menu now has Off (#33), and the overlay can sit in any corner, set in Settings or live from the stream menu; on the right the text is right-aligned (#34).
  • The overlay's frame rate is now Rendered FPS: it counts frames sent to the screen, so it no longer reads low or unavailable on devices whose display callbacks are late or missing. Decode time now ends when the decoder returns the frame, so pacing waits no longer count as decoding.

PIN lock

  • New PIN lock (Settings → App → PIN lock): a 4–8 digit PIN that locks opening Nightjar, every stream, or only streams from PCs you pick. The PIN pad works with a TV remote (Google TV style: Up/Down picks a row, Left/OK/Right types a digit), a gamepad, number keys or touch. Wrong tries are throttled. A forgotten PIN can only be reset by clearing Nightjar's app data (#35).

Fixes

  • Input Only no longer disconnects after about 10 seconds on Vibepollo, Apollo and other Sunshine-family hosts (Experimental: tested against Rubylight, Vibepollo covered by tests only). When the host shuts down or the connection drops, Nightjar now returns to the app list and shows the reason as a short message instead of a dialog you have to dismiss.
  • Experimental: on tablets and TV boxes such as the Xiaomi Pad 7 and Fire TV, a built-in device no longer takes player 1, so games no longer ignore your controller as player 2 (#29, #30).
  • Experimental: fixed audio crackling with 5.1/7.1 surround, and on devices without low-latency audio (#15).
  • Experimental: on Android TV with HDR, a stream now ends in steps (Shield and similar), and a TV that drops the signal no longer triggers a false decoder-crash dialog.

Desktop

  • The Wi-Fi hint above also comes from the desktop client, which judges the network by the adapter that actually reaches the PC and ignores VPN adapters. The two new Wi-Fi settings are on the desktop settings screen too.
  • Experimental: on Windows, HDR streams show a picture again instead of "Cannot show d3d11 pictures" and a black screen.
  • On Windows, a game you quit, or whose stream ended, no longer stays marked "Running" until Nightjar restarts.
  • The Linux desktop build now brings its own FFmpeg, so it starts on the Steam Deck and other distributions with a different FFmpeg version or none (Rubylight #52).
  • The desktop client now writes a log file (logs/nightjar.log in its config folder, rotated at each start), and Settings > App has Open logs folder.

Tested. Lint, the full unit test suite (6,163 tests, all passing) and the debug build pass. The Wi-Fi hint was measured on a laptop on 2.4 GHz Wi-Fi (HEVC 1080p60 at 47 Mbps, three 90 s runs per arm, against 3.1.0): unrecoverable frames 15.7 vs 61, keyframe requests 28 vs 100, median end-to-end latency 13.7 vs 64 ms; on 5 GHz there was no change. On a Retroid Pocket 6, 75 s of 5.1 audio went from 161 underruns to 0, and 7.1 from 156 to 0. The new TV screens were checked on a TV emulator and on a Retroid Pocket 6 in TV mode, where Home, All games, the library and Settings scroll with 0.35–1.89% janky frames and a 90th percentile frame time of 7–15 ms; we have no Shield. The Linux tarball was started in clean Arch Linux (no FFmpeg) and Ubuntu 24.04 containers, with every FFmpeg and dav1d library loaded from the archive.

The APKs are signed by CI with the Nightjar release key; the desktop packages (Windows zip, Linux tar.gz) are not signed. SHA-256 hashes of everything are in SHA256SUMS-3.2.0.txt.

Nightjar 3.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 20:40

Nightjar 3.1, for PCs running Rubylight 3.0 and other Moonlight-compatible hosts (Sunshine, Apollo, Vibepollo). Nightjar 3.0.0 offers this update in the app.

What's new

Simpler settings

  • One Automatic bitrate switch under the bitrate slider replaces the separate minimum and maximum. Moving the slider by hand during a stream stops automatic bitrate for that stream only, not for good. A per-PC choice is stored only where it differs from the main switch.
  • Clearer pages. Frame pacing options grey out when VRR or Host frame times already decide them. The frame rate picker shows common rates, with Show all frame rates inside it. Low-latency decoding keeps one master switch, with a Customize section for the individual keys. Render scale is now PC render resolution, and the upscaling options sit together on the Image page.
  • Pickers for the theme (System, Dark, OLED black) and the performance overlay (Off, Compact, Statistics, Debug) replace several switches. Saved settings keep their meaning after the update.
  • "Optimal game settings" is now Game optimization hint under Advanced > Compatibility, and says that what happens depends on the host.

Exynos and Pixel decoders (Experimental)

  • Exynos decoders get the low-latency keys Moonlight X uses (rtc-ext-dec-low-latency, output queue depth 2, output delay 0), and Google (c2.google) decoders get its operating rate and priority, capped at what the decoder declares. Thanks to Moonlight X. On Android 12 and newer, a Codec2 decoder ignores keys it does not list, so the gain depends on the device; the stream log shows which keys were confirmed. A decoder that rejects the keys gets the next try without them. We have no Exynos or Pixel device, so this is Experimental. (#26)

Fixes

  • Reset all settings now also resets the theme, the overlay mode and Show all frame rates.
  • "Match the screen to the game's frame rate" has no effect while Allow lower refresh rate is off, as the greyed row says.

Tested. Lint, the full unit test suite (2,566 tests before the review fixes, all passing again after them) and the debug build pass; the settings pages were checked on an emulator. The decoder changes are covered by unit tests only.

The APKs are signed by CI with the Nightjar release key; the desktop packages (Windows zip, Linux tar.gz) are not signed. SHA-256 hashes of everything are in SHA256SUMS-3.1.0.txt.

Nightjar 3.0.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 14:35

Nightjar 3.0, for PCs running Rubylight 3.0.
It also works with Sunshine, Apollo and Vibepollo, and with other Moonlight-compatible hosts.

What you need. Home, a game's page, the Session and graphics menu and the Radeon panel use Rubylight's native API, so they need a Rubylight 3.0 host (the Radeon panel needs 3.0.0-alpha.2 or newer). Beam racing needs a Rubylight 3.0 host too, because it asks the host for PyroWave row order. Everything else works with the hosts you already use, and Sunshine, Apollo and Vibepollo keep the classic PC and game grid. Nightjar 0.8.0 offers this update in the app.

What's new

The console UI

  • Home. Favourites, Continue playing, a Library across your PCs and your PCs, with a shell bar (Home, PCs, Settings) under the top bar. A newly paired Rubylight 3.0 PC lands on Home.
  • PCs. The Hosts list is now PCs. Each PC has one options list: Open library or Pair, Resume, Quit, Wake, PC settings, Rename (a name kept on this device), Unpair and Remove PC. A failed pairing, unpair or wake says why.
  • Settings shell. Two panes on a TV and on wide screens, a Search settings row, and one focus rule on every sub-page. New under App: interface size, high contrast and reduce motion.
  • Game page. Pick a game to see the PC, the stream settings it will use and where they come from, then Play or Resume. Per-game presets (Competitive, Smoothness, Quality) set only the values they name.

On-screen PC keyboard

  • A full PC keyboard over the stream for keys a phone lacks (F-keys, Ctrl combinations, Win). Open it from the stream menu, with Ctrl+Alt+Shift+K, or with a three or four finger tap. It works with touch, controller and remote, and has US and German layouts, a size and an opacity.

Rust engine as default

  • The new streaming engine is on by default, PyroWave and remote monitor sessions included. Turn it off in Settings > Advanced > Diagnostics to use the classic engine. If you had it off, it is switched on once; turning it off again is kept. It now reports the same round trip time as the classic engine and fills the clock columns of the latency CSV.

Decoder flags

  • Decoder tuning keys from Artemis and moonlight-noir: Tegra and MediaTek keys, low-latency on every Android version, Snapdragon frame-drop.enable, and more reference frame invalidation entries. A decoder that rejects configure() gets the next try with fewer keys, and the applied and dropped keys are in the log and the problem report. Comparison.
  • MediaTek, NVIDIA Tegra and Amlogic changes are Experimental: they follow the forks and are covered by unit tests, but we have no such device.

Link, timing and PyroWave

  • Link-rate notices. Android sends the wired link speed for every codec, and with the Rust engine the overlay says when the host lowered the bitrate for the network.
  • Timing record. The latency CSV carries the host's timing record (nine columns) and the present scheduler's columns, so a run joins to the host's record. Automatic bitrate has a minimum and a maximum and cuts for loss and a growing queue, not for jitter bitrate does not cause.
  • Stream presets. Competitive, Smoothness and Quality per game, as above.
  • PyroWave. Runs on the Rust engine on Android, carries HDR through the window dataspace on Android 13 and 14, and decodes on the GPU on the desktop client (default on Windows and Linux). Early decode (off by default) decodes PyroWave blocks while a frame is still arriving.

Desktop client for Windows and Linux (Experimental)

  • The same engine on the desktop with hardware decoding, VRR pacing, audio, keyboard, mouse and controllers, Home, PCs and Settings, the Session and graphics page and Radeon panel, German and a UI zoom. Downloads: nightjar-desktop-3.0.0-windows-x86_64.zip and nightjar-desktop-3.0.0-linux-x86_64.tar.gz. The desktop client is Experimental and its packages are not signed.

Beam racing (opt-in, desktop)

  • Decodes a PyroWave picture in slices while the rest of it is still arriving, and draws the top before the bottom has left the network. Off by default (beam_race), labelled Experimental, and it needs a Rubylight 3.0 host. It missed its default-on gate on loopback, so nothing recommends it yet. Beam racing.

Fixes

  • #21: when this device's decoder rejects the stream, the message now says so instead of blaming the host.
  • #20: automatic bitrate minimum and maximum, and fixes to when it cuts and how fast it steps back.
  • #15: the audio report shows the output route, the native rate and dropped buffers.
  • #17 and #19: OpenGL rendering for frame-generation overlays, and negative stick deadzone values.
  • Input: a pad's D-pad moves menu focus and the PC keyboard once; a lone modifier tap is broken when a Ctrl+Alt+Shift shortcut fires.
  • A 3.0 alpha, beta or rc host version parses in the host capabilities, so its PyroWave records and timing are used.
  • Host processing counts on every path and keeps its own label (the frame header's value, as in Artemis).

Tested. Our own runs, on our hardware:

  • Rust engine against the classic engine, Retroid Pocket 6, Wi-Fi (about -41 dBm), isolated Rubylight host on an RX 7900 XT. HEVC 1080p60 at 40 Mbps, four 75 s runs per engine: median picture age 7.04 ms (classic) and 6.92 ms (Rust), decode 0.92 ms on both. PyroWave 1080p60 at 400 Mbps, one run each: 36.19 and 34.99 ms. At 1% and 5% injected loss neither showed corruption. A 30 minute Rust soak held about 59.3 fps with flat memory and no errors.
  • Decoder keys, Retroid Pocket 6 (Snapdragon 8 Gen 2). HEVC 1080p60 through c2.qti.hevc.decoder.low_latency, about 88 s per run: median decode 1.49 ms before and 1.43 ms with every key ported. We do not claim a gain. picture-order.enable = 0 was left out because that decoder accepted it and then produced no output.
  • GPU PyroWave decode, desktop client, loopback on the RX 7900 XT. Median receive to present at 1080p60, 133 Mbps: 20.53 ms on the CPU decoder, 8.80 ms on the GPU decoder. At 4K60, 167 Mbps the CPU decoder showed 32.6 fps and the GPU decoder 60.1. On the Linux NUC (Core i5-8259U, 1 GbE, offscreen window with no real display) at 1080p60, 133 Mbps: 23.73 ms and 13.45 ms.
  • Beam racing, loopback on the RX 7900 XT, 5120x1440 at 240 Hz, 1080p60 PyroWave at 399 Mbps. The first of four slices is decoded 1.65 ms after the frame's first packet; a whole frame takes 6.5 ms on the wire. The picture's middle row is 5.32 ms old without racing and 3.93 ms with it. The 95th percentile gains little, and at a higher pace receive to present got worse. The wired NUC runs have not been done.
  • The PCs and Settings screens were checked by D-pad on an Android 14 TV emulator, normal and high contrast, and the update check has unit tests for 3.0.0 against 0.8.0.

The standard and root APKs and the Android App Bundle are signed with the Nightjar release key. The desktop packages (Windows zip, Linux tar.gz) are not signed. SHA-256 hashes of everything are in SHA256SUMS-3.0.0.txt.

All 329 commits since v0.8.0 are included in v3.0.0:

  • f4395b68 feat(protocol): extended host timing report with absolute capture and convert stamps
  • 9dee5f2b feat(timing): cap extended 0x5536 reports at 17 records (616 bytes)
  • 45d8890c feat(timing): keep the host timing extension in the Rust engine listener
  • cb6e0f25 feat(timing): MoonBridge.presentClockOffset for both engines
  • a8a99653 feat(timing): read the host timing extension in HostTimingReport
  • ef0b3580 feat(timing): host timing record columns in the latency CSV
  • 384b0fa4 feat(timing): nightjar-cli writes the host timing record columns
  • 1bcd80b2 build(protocol): rebuild the prebuilt archives with rp_present_clock_offset
  • 10c9d455 docs(timing): the latency CSV carries the host timing record columns
  • 99401e4d fix(timing): one record without an extension keeps the others in the Rust engine
  • e6c74b5d fix(timing): probe the clock only for hosts that announced clock sync
  • d38268fb feat(desktop): read the native library and session, keep libraries on disk
  • 8ac4bd0e feat(desktop): Home and game screens with controller-first navigation
  • a0c04db7 feat(desktop): Session and graphics page in the stream menu
  • 865e55b0 feat(desktop): Recently played on Home
  • [8b6ce66](8b6ce6665d1854ab1b42f69...
Read more

Nightjar 0.8.0

Choose a tag to compare

@RamazanKara RamazanKara released this 22 Oct 18:31

A new Home screen and a "Session and graphics" menu while you stream, for PCs running Rubylight 3.0 (alpha.1 or newer).

What you need. The new screens use Rubylight's native API, so they appear only for a Rubylight 3.0 host, alpha.1 or newer. The Radeon panel needs the next Rubylight 3.0 alpha: on alpha.1 it stays hidden. Older Rubylight hosts and stock Sunshine, Apollo and Vibepollo do not change: they keep the classic PC and app grid, and every existing setting and shortcut stays where it was.

  • Home. Nightjar opens on Home when a paired PC supports it: Continue playing (games that are running or suspended), your Library across all paired PCs with covers, and your Hosts. A game that lives on several PCs shows one card ("On 2 hosts"). Offline PCs keep their last saved games, marked as offline. Turn it off with Open on Home in settings to start on the list of PCs as before.
  • Game detail. Pick a card to see which PC it runs on and the stream settings it will use, then Play or Resume. If another game is running, the screen says that playing this one closes it. Close game shows only when the PC has granted this device Host control; otherwise you get the usual Quit.
  • Session and graphics, in the stream menu. Resume, Disconnect and End session, plus Close game with Host control. Below them: the host, codec, resolution and frame rate, bitrate, and your link (Wi-Fi generation, band and speed, or Ethernet, with the round trip). The menu reads the host only while it is open and only about once a second; Back closes it.
  • Radeon graphics panel. On a PC with an AMD Radeon GPU, the same page lists the driver features the host exposes, such as Anti-Lag and Radeon Chill, and lets you change them when the host allows it: the device needs Host control, and a setting must be one the host can write right now. Settings the host marks read-only, unsupported or waiting for a one-time setup in AMD Software are shown with the reason and cannot be changed. A setting Nightjar does not know yet is still listed, drawn from its type. After a change the panel shows what the host reports back. The host puts changed settings back at End session or Close game, and the panel says so ("Goes back to Off when you end the session"). Errors from the driver appear next to the setting.
  • Strings for all of this are translated into the 14 other languages Nightjar ships.

Tested. Lint and the unit tests of both flavours pass in the release build, and Nightjar CI passes on main. End to end on the Android emulator against an isolated Rubylight host built from main after 3.0.0-alpha.1 (with the Radeon endpoints) on an RX 7900 XT: pairing with the PIN, granting Host control, Home and Play of Desktop, opening Session and graphics, switching Anti-Lag on from the Radeon panel (a second paired client read it back as on, with the restore entry), and End session, after which the host had put Anti-Lag back to Off. The same loop then passed on a Retroid Pocket 6 over Wi-Fi, with the isolated host bound to the PC's LAN address: pairing with the PIN shown on the device, Home, Play of Desktop, Session and graphics, Anti-Lag on (restore entry present) and, after End session, back to Off. Not yet run on a phone.

The standard and root APKs and the Android App Bundle are signed with the existing Nightjar release key. SHA-256 hashes are provided in SHA256SUMS-0.8.0.txt.

All 48 commits since v0.7.18 are included in v0.8.0:

  • 97b0a124 fix(audio): decouple jitter reserve from AAudio hardware capacity
  • 9562862f fix(input): prepare connected gamepads before launching games
  • 7d116da6 feat(updates): notify host and direct-launch users about releases
  • a1585959 fix(input): reserve button-only pads and post startup notices on UI thread
  • 5959d0e9 fix(ui): preserve TV dialog sizing, outlines, language and cover proportions
  • 9d4267e7 fix(updates): keep PC rows aligned when showing host releases
  • 9184e4cb feat(tv): improve remote focus, readability and menu motion
  • 6152685f fix(desktop): preserve VRR during immediate packed presentation
  • 6152ffe3 perf(desktop): render packed SDR directly to the swap chain
  • 8bc6c8e6 refactor(desktop): replace C media and D3D11 shims with Rust
  • a0ae524b feat(protocol): add pinned clipboard transfer and runtime bitrate requests
  • db2aec7a feat(desktop): add Android session controls and bounded stream recovery
  • 7476b34d feat(desktop): add PyroWave, GPU upscaling and adaptive quality
  • 2ed653ca feat(desktop): add layered profiles and per-game settings
  • 841b0948 feat(desktop): add controller mappings and live input testing
  • e4af4340 feat(desktop): add portable keyboard shortcuts
  • ca31f3a8 fix(desktop): route F2 to per-game settings
  • bc7ae3f1 fix(desktop): integrate direct packed presentation with Rust parity
  • afcc0418 fix(desktop): keep direct presentation state Windows-only
  • c42d7dde feat(desktop): select profiles by network and cap metered bitrate
  • caaf1469 feat(protocol): add authenticated PyroWave network probes
  • 53e75924 feat(desktop): calibrate and persist PyroWave frame pacing
  • f662cf44 feat(desktop): route DualSense microphone and headset audio
  • 9bd9b9bd feat(video): add predictive chroma layers and fused HDR rendering
  • 91332c76 feat(desktop): add video scaling and alignment with matching input
  • 0659cd2e feat(desktop): add controller mouse mode and input preferences
  • 5ce266d7 build(protocol): depend on the Rubylight native API types
  • a26b6205 feat(protocol): detect the native API from serverinfo
  • 8f98bc17 feat(protocol): add the native API calls to HostClient
  • d5f955f9 test(protocol): interop tests for the native API client
  • 406e6b73 build(protocol): pin the host crates to a full commit SHA
  • 9146e694 test(protocol): locate the pinned fixtures with cargo metadata and refuse another host certificate
  • 4e46d36d docs(protocol): say what Reason::UpdateHost may not tell the user
  • d5720197 fix(protocol): let the fixture drift test fetch what cargo metadata needs
  • 7a3e0c61 feat(android): learn NativeApiVersion in HostCapabilities
  • cb44b179 feat(protocol): expose the native API calls over JNI
  • 75c9790a feat(console): add the native API data layer and the console repository
  • 72fd2474 feat(stream): map Disconnect, End session and Close game to the native API
  • 1242d918 fix(stream): close the game natively only with host control, else q...
Read more

Nightjar 0.7.18

Choose a tag to compare

@RamazanKara RamazanKara released this 21 Oct 01:56

Experimental full-chroma HEVC/AV1 streaming with Rubylight 2.5.12.

  • The new packed 4:4:4 option is off by default on both endpoints. Requires Android 10 or newer. Enable New streaming engine (beta) and Experimental full chroma under Advanced settings. A compatible hardware decoder must pass the raw YUV sampling check; unsupported requests stop with a concrete reason.
  • Adds 8-bit SDR and 10-bit HDR reconstruction while keeping display dimensions separate from the coded picture. HDR requires a compatible 10-bit HDR output.
  • Odd-dimension packing fix: the shared packing layout preserves odd source dimensions and extends edge samples into the padding. Hardware encoder and decoder size limits still apply.
  • Desktop HDR and full chroma: the Windows/Linux client source adds GPU reconstruction and HDR output for both ordinary and packed streams when the display and compositor support it. HDR presentation stops if output support is lost. Windows retains D3D11VA decoding; Linux retains VAAPI decoding and readback. Restart Nightjar after changing the full-chroma setting on Linux. This release attaches Android packages; desktop changes are available in the tagged source.
  • Reserves bandwidth for encryption, packet headers and FEC: a 200 Mbps packed-stream budget requests at most 140 Mbps of encoded video.
  • Fixes Android API compatibility when clearing decoder HDR metadata, translates the new settings in 14 locale variants, adds the full-chroma option to the generated settings guide, and repairs the native patch preparation step. Packed streaming still requires Android 10 or newer.

Validation limits: All four packed modes reached approximately 1440p120 in bounded host tests on an AMD Radeon 780M, with at most 192.8 Mbps calculated peak transport bandwidth including FEC/headers and 3.58 ms added host p95 latency. Each mode had 10 measured seconds. These figures exclude network and client presentation latency. Physical HDR output remains unverified, and an earlier workstation crash remains unexplained; keep this feature experimental.

The standard and root APKs and the Android App Bundle are signed with the existing Nightjar release key. SHA-256 hashes are provided in SHA256SUMS-0.7.18.txt.

Build, unit tests, Linux desktop checks and native sanitizer tests passed. The local signed release build passed both Android lint checks and 3,821 unit tests, with four skipped.

Included commits

All 10 commits since v0.7.17 are included in v0.7.18:

  • a182c3e6 feat(protocol): define reversible packed 4:4:4 v1 layout
  • d25c4d4d fix(protocol): preserve odd dimensions in packed chroma geometry
  • 53c35659 feat(video): reconstruct packed full chroma with HDR output
  • 56fa2d80 fix(desktop): isolate D3D11 reconstruction state on Windows
  • 254b47d4 fix(protocol): reserve transport overhead for packed video
  • 4f8c1abd fix(android): repair native network grace patch header
  • 288d02e1 fix(settings): include experimental full chroma in generated guide
  • 9f41d1b5 chore(release): prepare Nightjar 0.7.18
  • 094e039b fix(android): clear packed HDR metadata before API 29
  • 6f575909 fix(android): localize experimental full chroma preferences

Full changelog: v0.7.17...v0.7.18

Nightjar 0.7.17

Choose a tag to compare

@RamazanKara RamazanKara released this 20 Oct 10:01

Nightjar

This release adds Nightjar's new streaming engine, written in Rust, as a beta.

  • New streaming engine (beta) (Settings → Advanced → Diagnostics, off by default). The engine replaces the C streaming core Nightjar inherited from Moonlight (moonlight-common-c) with one Rust implementation that the upcoming Windows and Linux clients share. It covers H.264, HEVC and AV1 including 10-bit, 4:4:4 and HDR; Opus audio; every input type; rumble, trigger rumble, lights, motion and controller haptics; the microphone; and Rubylight's extras (host timing, clock sync, phase lock, display caps, mid-stream resize, cursor shapes). Streams it does not handle yet keep using the current engine automatically: PyroWave, remote monitor sessions and hosts older than GameStream 3.22. With the engine on, "Prioritize stream traffic" has no effect yet.
  • How it was checked. The engine's video, audio and error-correction code is compared packet by packet against the C it replaces, including loss, reordering, duplicates and wraparound. Its control, input, pairing and stream setup are tested against the Rubylight host's own code. A headless client built on it streamed H.264, HEVC and AV1 from a real Rubylight host with every frame decoded.

The release APKs support arm64-v8a, armeabi-v7a, x86 and x86_64. Install nightjar-0.7.17.apk over your current installation to keep settings and paired PCs. nightjar-0.7.17-root.apk is the legacy rooted build for Android 5.0–7.1. The AAB and SHA-256 checksums are also included.

Changes since 0.7.16

Validation passed:

  • Android unit tests for both variants, release lint, the release build, and the native test suite with sanitizers.
  • The engine's Rust tests: differential tests against the C, interop tests against the Rubylight host's code, and end-to-end streams against a real Rubylight host.
  • In an Android 15 emulator, a debug build with the new engine streamed H.264 and HEVC desktops from an isolated Rubylight host at 59.5–60 FPS with no loss, and the current engine streamed the same at 60 FPS. The signed 0.7.17 APK updated 0.7.16, kept the signing identity, and launched without runtime errors.

Not tested: the new engine on a physical device, over a lossy network, with HDR or with the microphone. Whether input reached the host from the emulator could not be confirmed with either engine.

Nightjar 0.7.16

Choose a tag to compare

@RamazanKara RamazanKara released this 20 Oct 06:46

Nightjar

TV fixes from #7.

  • Always dark (Settings → App). TVs usually run a light system theme, so the library and settings came up bright in a dark room. With this on, every app screen, menu and dialog uses the dark grey night palette. OLED black is still there as the pure black version.
  • Outlines on OLED black. Dialogs and action sheets used to blend into the black screen behind them. They now have a thin outline, and their backgrounds stay black.
  • One press per library card. D-pad Right used to stop on each card's options button before moving on, so crossing a row took two presses per card. Now it goes straight to the next card. It only steps onto the options button at the end of a row or on the last card. A long press of select, Menu or Shift+F10 still opens any card's options.
  • Setting explanations open once. On TV, the explanation dialog (D-pad Right on a setting) had its safe-area margin applied after it appeared, so it resized partway through opening and looked like it opened twice. The margin is now in place before the dialog opens.

The release APKs support arm64-v8a, armeabi-v7a, x86 and x86_64. Install nightjar-0.7.16.apk over your current installation to keep settings and paired PCs. nightjar-0.7.16-root.apk is the legacy rooted build for Android 5.0–7.1. The AAB and SHA-256 checksums are also included.

Nightjar 0.7.15

Choose a tag to compare

@RamazanKara RamazanKara released this 20 Oct 00:00

Nightjar

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.

Changes since 0.7.14

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.

Nightjar 0.7.14

Choose a tag to compare

@RamazanKara RamazanKara released this 19 Oct 23:07

Nightjar

This release updates the bundled PyroWave decoder.

  • PyroWave picture edges. The decoder now includes upstream PyroWave's fix for edge handling in its fragment-shader path (a0d2e71e). PyroWave uses that path on Snapdragon/Adreno and other mobile GPUs, where the left and top edges of the picture could be decoded slightly wrong. The bitstream, host compatibility and settings are unchanged.

The release APKs support arm64-v8a, armeabi-v7a, x86 and x86_64. Install nightjar-0.7.14.apk over your current installation to retain settings and paired PCs. nightjar-0.7.14-root.apk is the legacy rooted build for Android 5.0–7.1. The AAB and SHA-256 checksums are also included.

Changes since 0.7.13

Validation passed: Android unit tests for both variants, release lint, and the release build. The rebuilt decoder libraries keep all 48 exported PyroWave functions and 16 KiB alignment. The signed 0.7.14 APK updated 0.7.13 in an Android emulator, kept the signing identity, and launched without runtime errors. A live PyroWave stream on a physical Adreno device was not tested.