Skip to content

Releases: CoderDayton/nightcap

Nightcap continuous

Nightcap continuous Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 16 Sep 08:04

Automated build of main at 83ebb9c6 (2026-10-18 05:09 UTC).

Untested and unreleased. Use a tagged release for normal play.

Packages are versioned 0.3.4+r31.g83ebb9c.

Commits since the previous nightly

  • update(packaging): drop the unreleased changelog from nightly notes (83ebb9c)

Nightcap v0.3.4

Choose a tag to compare

@github-actions github-actions released this 11 Oct 02:34

Added

  • The AppImage build now makes a .zsync file, so tools like appimageupdatetool can update the AppImage.
  • The desktop side panel menu now shows by default on PC profiles. Set FIntFlyoutTestVariantRollout12 in
    fflags.json to change it.

Changed

  • The Flatpak build asks for the X11 socket only when there is no Wayland session, as before 0.3.3.
  • Nightcap now uses Wayland on a Wayland session with NVIDIA drivers too, however it is started. It used to
    fall back to X11 there when started from a terminal.
  • Building Nightcap no longer needs libexecinfo.

Fixed

  • Fixed Roblox 2.742 being rejected as an update, which left the game on the older version. Nightcap now
    accepts Roblox versions that change the order of their start-up steps.
  • Fixed Nightcap reporting Mocktail's version number, 1.0.4, in session logs and support bundles. It now
    reports its own version.
  • Fixed the old Roblox home screen showing instead of the new one with the Me tab and the "For you" and
    "Charts" tabs. Nightcap now runs the Roblox start-up step that loads the new interface for your account.
  • Fixed anti-aliasing being forced off at every graphics quality level. Roblox now picks it, and a
    FIntDebugForceMSAASamples value in fflags.json still applies. Thanks to @qutad.
  • Fixed the voice chat microphone only working on Roblox 2.738. It no longer depends on one Roblox version.
  • Fixed other players not hearing you in voice chat after a Roblox update. The updater now rebuilds the
    audio device data when the previous version's profile has none.
  • Fixed frame hitches while textures load on graphics cards that need ETC2 textures decoded on the CPU.
  • Fixed problems on Chimera Linux and other musl systems, including error messages that differed from the
    ones Roblox expects.
  • Fixed the nightly AppImage build failing when a bundled GTK 4 was older than the one libadwaita needs.
  • Fixed a random crash on Wayland with NVIDIA drivers, where the game window closed after you let go of the
    camera or left mouse lock. The log showed wp_linux_drm_syncobj_surface_v1 error 3.
  • Fixed some menu actions being ignored. The Chat button on a profile now opens the Party tab with that
    player, and clicking a search suggestion now runs the search instead of closing the search menu.
  • Fixed possible crashes when the game calls an Android function Nightcap did not provide, or releases the
    same reference twice.
  • Fixed a possible hang on close when a web view process stayed open. Nightcap now stops waiting for the log
    writer after 2 seconds.
  • Fixed a possible missing picture on graphics drivers that reject the low-latency present mode. Nightcap now
    retries with the game's own mode.
  • Fixed a possible Wayland crash when the window first appears on the OpenGL graphics path.
  • Fixed a missing picture on machines where the graphics card runs a different driver than the one Nightcap
    picked, such as an NVIDIA card on nouveau or a laptop with an Intel chip and an older second card. Nightcap
    now picks the Vulkan driver that matches the running kernel driver, and says so when no card can run Vulkan.

Nightcap v0.3.3

Choose a tag to compare

@github-actions github-actions released this 05 Oct 01:51

Flatpak on NVIDIA with a Wayland desktop: this release's Flatpak can
start on X11 (XWayland) instead of Wayland. To keep Wayland, run this once:

flatpak override --user --env=SDL_VIDEODRIVER=wayland,x11 io.github.CoderDayton.nightcap

To undo it: flatpak override --user --reset io.github.CoderDayton.nightcap.
The next release goes back to Wayland by default.

Added

  • Joining a friend from a Roblox "follow user" link now works. Nightcap looks
    up which game they are in and joins it.
  • Nix users get a desktop entry for the app.

Changed

  • Roblox textures now decode about 3 times faster, which shortens the stalls
    when a place loads and when new parts of the map stream in. Thanks to
    @glook9001.

Fixed

  • make update-roblox no longer deletes your previous Roblox install when an
    import fails partway through. If a step fails, the old files are put back,
    or kept in a folder whose path is printed. Thanks to @kimlherme.
  • A failed Roblox update now restores your previous version's records instead
    of leaving them half switched. A damaged version file is rejected instead of
    being half read, and a temporary failure to start the startup check no longer
    marks a working Roblox build as broken for good. Thanks to @kimlherme.
  • Fixed a possible crash when Roblox clears its audio queue while sound is
    still playing, and a memory leak in lists of objects passed to Roblox's Java
    code. Thanks to @kimlherme.
  • Fixed a possible crash when the text overlay shuts down, a freeze when Roblox
    releases the mouse lock while another release is already in progress, and
    network lookups that misread Roblox's options. Thanks to @kimlherme.
  • Fixed the sky sometimes rendering with the wrong textures in the Vulkan
    renderer.
  • Clicking while a Roblox text box has focus no longer closes it. Only Roblox
    decides when a click ends typing.
  • Going to another page in the web view, such as Friends from a profile, no
    longer closes the web view. It crashed on every page change on Wayland
    systems whose GL setup GTK could not use.
  • Fixed a crash when Roblox's saved dark or light theme setting was missing or
    damaged.

Nightcap v0.3.2

Choose a tag to compare

@github-actions github-actions released this 30 Sep 04:41

Added

  • Performance recordings made with --profile now show how busy the CPU was
    during each frame, which makes it easier to tell what caused a stutter.
  • Experimental support for ARM64 (aarch64) Linux, running Roblox's Android
    arm64-v8a client.

Fixed

  • When Roblox asks for a Google Play device check during login, Nightcap now
    answers right away that it isn't supported. Before, the "Verifying you're
    not a bot" screen waited about a minute for an answer and then sent you
    back to the login screen.
  • Solving a login challenge now closes its window. Before, Roblox's
    "challenge completed" signal was ignored and the window stayed open.
    Thanks to @glook9001.
  • Login no longer stalls after you pass a verification check. Before, Roblox
    only saw the page's "challenge completed" signal after a one-minute
    timeout, so it gave up and the login failed. On a Roblox build Nightcap
    can't handle this way, the log says "WebViewProtocol getter not
    recognized" and web pages behave as before.
  • Login check windows and other web pages get 5 seconds to start instead of
    3, so a slow start no longer closes them. The log says how long each one
    took to open.
  • Less stutter while joining a game and while textures load in. In Blade
    Ball, loading hitches dropped by about half, and the worst one went from
    0.8 seconds to 0.55 seconds.
  • Clicking Play on a private server now joins right away. Before, nothing
    happened until you clicked a sidebar tab like Home.
  • Middle click now reaches Roblox as the middle mouse button.
  • Scrolling follows your system's natural scrolling setting.
  • Fixed a crash on some x86_64 hosts when Roblox asked about a thread other
    than the one making the call.
  • Roblox updates no longer mix up the ARM64 and x86_64 compatibility profiles
    for the same version.
  • A partial or out-of-range user id in MOCKTAIL_ROBLOX_USER_ID or
    MOCKTAIL_LOCAL_STORAGE_CURRENT_USER_ID is now ignored instead of being
    partly read.

Changed

  • make flatpak and scripts/build_flatpak.sh now build with 2 jobs by
    default instead of 4, so a local Flatpak build is less likely to run out
    of memory. Set FLATPAK_JOBS or MOCKTAIL_FLATPAK_JOBS to use more.
    Thanks to @glook9001.

Nightcap v0.3.1

Choose a tag to compare

@github-actions github-actions released this 20 Sep 18:02
d982cd9

Added

  • Each release carries a DEB, an RPM, and a pacman package beside the
    AppImage, with a .sha256 for every file. They install /usr/bin/mocktail
    and conflict with each other and with upstream's mocktail package.
    Nightcap is in no distribution repository or the AUR; the recipes under
    packaging/aur/nightcap{,-bin,-git} build from this repository locally.
  • The AppStream metadata lists the Nightcap releases, so software centres
    show the release history instead of upstream's.

Fixed

  • ETC2 texture decoding no longer blocks the thread that submits the frame.
    Uploads decode on a background dispatcher and the submit carries a timeline
    semaphore wait, so the GPU waits for the texture instead of the render
    thread. Reading the application's compressed bytes moves to that dispatcher
    too whenever they are already mapped. In Blade Ball the worst
    vkQueueSubmit fell from 140ms to 1ms, its p99 from 4.9ms to 0.05ms, and
    the total time spent in submits from 2534ms to 309ms. Frame interval is
    unchanged: the remaining tail is the engine's own main-thread step. A device
    without the timelineSemaphore feature decodes inline as before, as does a
    submit whose pNext already sizes arrays by its semaphore counts.
  • The mouse pointer jumped when a right-click camera drag ended, and drifted
    to the viewport edge during one. The input router inferred pointer capture
    from SDL reporting zero absolute coordinates, which holds on X11 but not on
    Wayland, where the reported position accumulates the relative deltas and
    leaves the window. Motion, button, and wheel events now carry the window's
    relative mouse mode. The right-click camera fallback also only captures
    inside an experience, so the cursor stays free over the app surface.
  • Shutting the window down while an experience was starting or leaving could
    free the pointer capture owner underneath the thread using it. Callers off
    the SDL thread now hold a reference for the length of their call.
  • The TextBox caret did not move when a trailing space was typed in a
    single-line field. The final cluster rect SDL_ttf reports stops at the last
    inked glyph, so the laid-out width is used there instead. Wrapped layouts
    keep the clamp, because their width is the widest line rather than the last.
  • Every TextBox keystroke re-ran TTF_Init, a fontconfig sort, six
    TTF_OpenFont calls, and TTF_Quit on the render thread. The overlay holds
    its opened fonts and reopens them only when the Roblox font or the point
    size changes, keeping the current set when a reopen fails. Measured over 100
    rasters, 1.59ms to 0.12ms per keystroke.
  • Staged ETC2 copies now carry an explicit host-write barrier. A queue
    submission only makes host writes from before it visible to the device, and
    an asynchronous decode writes after the submit, so without the barrier those
    texels were not guaranteed to reach the copy that reads them.

Changed

  • docs/PERFORMANCE.md documents the GameMode settings to run with. A
    desiredgov=powersave in ~/.config/gamemode.ini overrides the packaged
    performance default and clocks the CPU down for the whole session while
    still reporting an active performance request.

Nightcap v0.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Sep 00:25
8bde1a1

Added

  • Custom Discord presence. integrations.discord_rpc.text.title replaces the
    name in "Playing Nightcap", and integrations.discord_rpc.images sets the
    large and small icons and their hover text. Text and image fields accept
    {place_name}, {place_icon}, and {creator_name}. A field that expands
    an empty placeholder is left out, and text.state: "" hides the state line.
  • The default Discord card now matches Sober: the title is "Roblox", the
    details line is "Playing ", the state is "by ", and
    the Roblox badge sits inside the experience icon. The creator comes from the
    same Roblox games request that already fetches the experience name. With
    show_place_name: false the creator is hidden too, so the card shows only
    the title and timer.
  • --profile <file> writes a Chrome-format trace of the Vulkan adapter's
    work: presents, GPU waits, submits, ETC2 texture decode, and pipeline and
    shader creation. Open it in ui.perfetto.dev. docs/BENCHMARKING.md
    describes the benchmark runs, and scripts/summarize_profile_trace.py
    turns traces into a before and after table.

Fixed

  • Texture uploads stalled the frame they were submitted on. ETC2 batches
    decoded on worker threads but were then resampled one upload at a time on
    the submitting thread, which at the default 4x upscale is sixteen times the
    decoded texels. Resampling now runs on the same worker pool, in two passes so
    mip level 0 still resolves before the mips built from it. In a 70k-part
    place the worst vkQueueSubmit fell from 167ms to 92ms.
  • Most ETC2 batches decoded on a single thread. Workers were created and
    joined per batch, so the parallel floor had to cover that cost and sat at a
    1024x1024 image; batches under it ran on the caller, which was 54% of all
    decode time in a 70k-part place. Decode workers are now a persistent pool,
    and the floor drops to a 128x128 image. Mean decode time in that place fell
    from 8.2ms to 4.7ms, and 11.8ms before both texture fixes.
  • On CPUs with a wide core-speed spread, Feral GameMode pinned the process to
    the few fastest cores, concentrating Roblox's worker pool onto them instead
    of spreading it. With performance.gamemode: auto, a request that narrows
    the CPU affinity is now released again, which releases the pin. Set
    pin_cores=no in ~/.config/gamemode.ini to keep GameMode without the
    pinning, or performance.gamemode: on to accept it. See
    docs/PERFORMANCE.md.
  • With show_place_name: false, Discord no longer shows the experience
    thumbnail or its name on hover.
  • The host main thread no longer spins on the engine's message pump, which
    cost about half a core and 146,000 empty calls a second. It now rests 100 µs
    between polls: sleeping when the governor is performance, parking the
    core with TPAUSE on CPUs that have it, spinning otherwise. With GameMode
    setting the governor, process CPU in a 60k-part place fell from 216% to
    107% at the same 120 fps. MOCKTAIL_ENGINE_PUMP_REST forces a mode; see
    docs/PERFORMANCE.md.
  • ETC2 uploads with a bufferRowLength or bufferImageHeight larger than
    the image read the padded rows as packed data and decoded garbage.
  • ETC2 resampling created and joined worker threads on every batch. It now
    runs on the persistent decode pool.
  • A failed trace write left the profile writer thread waking every 250 ms
    for the rest of the session. It now exits.
  • The --profile trace gains a pump slice for the engine's main-thread
    step.

Nightcap v0.2.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 08:31

Added

  • FAQ covering Discord RPC, log locations, and VR, adapted from upstream.
  • input.raw_mouse in config.yaml sends mouse look deltas in the host's
    own units. Turn it on when first-person aiming feels too slow or too fast
    under fractional display scaling. Off by default.
  • Nightly AppImage builds, published as the continuous prerelease. They are
    untested; use a tagged release for normal play.

Changed

  • Values in fflags.json now win over the performance preset instead of
    stopping the launch. Startup prints each key it kept.
  • Discord Rich Presence uses Nightcap's own Discord application, so it shows
    as "Playing Nightcap". Terms and privacy pages for it live on the
    project site.
  • Discord Rich Presence is on by default. Set
    integrations.discord_rpc.enabled: false to turn it off.
  • The AppImage build verifies its reduced dependency packages against digests
    taken at build time, rather than a digest list kept in the repository.

Fixed

  • Mouse look keeps responding after a long turn. The tracked pointer position
    could drift past the edge of the view, which swallowed every reversal until
    the mouse travelled all the way back.
  • Nightcap no longer refuses to start with cannot lock appStorage. It
    created its own credential directory using the process umask, then rejected
    that directory for being group writable. Systems with a permissive umask,
    such as 002, failed on first run.

Nightcap v0.1.0

Choose a tag to compare

@github-actions github-actions released this 15 Sep 13:19

First Nightcap release, forked from komaruworld/mocktail.

Added

  • ETC2 and EAC texture emulation on Vulkan, so games that use compressed
    mobile textures render correctly on desktop GPUs. Decoding runs on worker
    threads to avoid stutter.
  • PNG texture overrides in ~/.config/mocktail/textures, keyed by upload
    hash, with a dump mode to find the texture you want to replace.
  • Small textures are upscaled 4x by default. Set
    MOCKTAIL_SMALL_TEXTURE_UPSCALE=1 to turn it off.
  • AppImage and signed Flatpak builds on every release tag. The Flatpak repo
    is published at https://coderdayton.github.io/nightcap/.
  • Roadmap in docs/ROADMAP.md.

Changed

  • Frames are presented as soon as they are ready instead of waiting in a
    queue, which lowers input latency.
  • Roblox now sees the real host RAM and display size instead of a low-end
    phone profile.
  • App ID is io.github.CoderDayton.nightcap, so Nightcap installs next to
    upstream Mocktail. The binary and config paths keep the mocktail name.
  • New name, icon, and colors.
  • The desktop entry launches on Wayland and points at the installed binary.

Fixed

  • Servers no longer kick with error 319 shortly after joining.
  • The FMOD output-device bridge is optional, so the updater no longer fails
    without it.
  • The AppImage build no longer fails on stale checksums for the slimmed
    Arch packages.