Skip to content

Bannerlator 3.1.6

Latest

Choose a tag to compare

@github-actions github-actions released this 11 Oct 06:35
· 87 commits to main since this release

Bannerlator

3.1.6  app-side update  Headless Steam and Steam Input  Force SSBS  layers v14  small updates from the next release

Bannerlator 3.1.6

Run Windows apps and games on Android — no PC and no root required.

3.1.6 brings Steam closer to native, a CPU speed fix for Wine on ARM, and a new way to update. Headless Steam lets a game use the app's own Steam sign-in with no Steam window, and the in-game server browser finally works. SteamLite gains Steam Input. The new v14 layers carry Wine's fix for SSBS, a CPU setting Wine on ARM kept switching off, and the Force SSBS toggle is on by default. Windows components install without opening the container, adding games is much smarter, and the app's update notice is redesigned. From the next release on, updates download only what changed — a few MB instead of the whole 525 MB app.

  • Headless Steam + server browser: launch Steam games on the app's own Steam session; Find Servers lists and joins servers.
  • Force SSBS + v14 layers: a CPU speed fix for Wine on ARM, on by default; all ten Proton layers rebuilt.
  • Win Components (VC++ runtimes, .NET, DirectX, codecs…) install offline in seconds, without starting the container.
  • Adding games: better names, Steam art and details found automatically, an art picker, components suggested per game.
  • Updates: a slide-in update notice with highlights and a download card; small updates start with the next release.

✅ Nothing to set up. Update the app, then take the v14 layer updates from the catalog (containers offer Update layer → v14, with a revert snapshot). Force SSBS is already on; turn it off per game if one misbehaves.

📘 Guides: OpenGL games now run 4 to 5 times faster · LSFG Native Made Simple

What's New — everything since 3.1.5

⬇️ Small updates, starting with the next release

Until now every update downloaded the whole app again, about 525 MB, even though most of it — the built-in Windows files, drivers and components — rarely changes. The updater now downloads only what changed:

  • Each release publishes a small patch for each of the last eight versions. The app finds the one for the version you have, downloads it (usually 5–25 MB), rebuilds the new app from the one already installed, checks the result is an exact copy of the release, and then shows Android's usual update this app? prompt. Your games and settings are kept, as always.
  • If there is no patch for your version (more than eight releases behind, a test build or a modified copy) or anything goes wrong, it downloads the full app like before.
  • The update notice shows the real download size, e.g. 5.2 MB (small update, full app 525.6 MB).
  • 3.1.6 itself still downloads in full — the version you have now doesn't know about patches yet. The first small update is the release after this one.
  • First installs and downloads from this page are unchanged: always the full APK.

✅ Device-tested on the Pocket FIT: a 5.2 MB patch rebuilt a byte-identical app, and Android installed it as a normal update.

🔔 A new update notice

The amber Update available strip is replaced by a small pill that slides in at the top right — Dismiss hides it until the next launch, View opens a short What's new pop-up with up to five highlights and the download size. Update now shows a download card with progress, speed and time left (and Cancel); if a download fails, the card offers Retry or the release page. Settings › Updates lists the same highlights.

  • The app checks for updates at most every six hours on its own (the Settings button still checks right away), and reads the update information from a plain file instead of counting as a download on GitHub every time.

✅ Device-tested on the Pocket FIT: pill, pop-up, download card and Android's install prompt.

🧩 Windows components install without opening the container

Win Components (Visual C++ runtimes, .NET, DirectX, XNA, codecs, fonts and the rest of the catalog) used to start the container and run each installer inside Wine. Most now install offline: Bannerlator reads the installer packages itself and lays out their files and registry entries the way Windows Installer would, straight into the container — 113 of the 123 catalog components, typically in seconds. The few installers that are their own setup program still run in the container as before.

✅ Device-tested on the Pocket FIT: K-Lite codecs, .NET 4.0 + 4.8, Visual C++ 2022 and XACT installed offline; Wine's Add/Remove Programs lists them and the container starts normally.

🎮 Adding games, smarter

  • Names: taken from the game's own files (Steam manifest, GOG info, the exe's version details) before the folder name, with underscores and odd spellings cleaned up and Unreal Engine codenames replaced by the real title.
  • Steam match by title for games added from a folder: Steam's name, art and store details, even when the game isn't from Steam (same title only — editions are ignored, Remastered is kept separate).
  • Game Details are filled in from the store when you add a game and when you open it.
  • Art picker in Edit Game: every image the app can find, by source — your files, Steam's own art for the app, SteamGridDB, Steam screenshots. A picked image is kept.
  • Confirm game searches Steam by itself and puts the best match first.
  • Folder import shows art for unidentified games and, inside each game's card, the Windows components it needs (Steam's own list where the game has one).
  • Game and container menus are capped at six and a half items, scroll, and show a scrollbar.

✅ Device-tested on the Pocket FIT.

🧱 VKD3D shader model 6.6 by default

Some Unreal Engine 5 games refuse to start on Turnip with DirectX 12 is not supported on your system, because VKD3D-Proton reports shader model 6.5 there and those games need 6.6. Every container — new ones and the ones you already have — now sets VKD3D_SHADER_MODEL=6_6 (games asking for less still get what they ask for, and DirectX 9–11 games never read it). If you delete it from a container, it stays deleted.

✅ Device-tested: Gothic 1 Remake starts with it.

🎮 Headless Steam: the app's own Steam session hosts the game

SteamLite runs Valve's Windows Steam client inside the container — the real thing, VAC and all, at the cost of a Steam client under translation. Headless Steam takes the other road: the app already holds a signed-in Steam session for your library, so a small native host (Valve's own Android Steam library, driven by the app) signs in on the account, and the game talks to it through the Steam bridge the Proton 11 layers have carried since v9. No Steam window, nothing to install in the prefix, and every Steam call the game makes runs natively instead of through translation.

  • Launch popup: Steam shortcuts offer Headless Steam next to SteamLite, Goldberg and Raw; the choice is remembered per game like the others.
  • What works, device-proven: sign-in in about a second, the game attached to the session (Steam sees you in-game), cloud saves, stats and achievements, multiplayer servers — Counter-Strike: Source was the test case, including a live match on a community server.
  • What it is not: a VAC session. Valve's Android library contains only VAC status plumbing, no scanner — that only exists in the Windows and x86 Linux clients. Secure servers may still let you in, but you are not being VAC-scanned; for that, keep using SteamLite.
  • Relaunches: a quick relaunch no longer trips over the previous session's lingering port; when the port really is busy (another app's Steam client — DroidDeck's Linux Steam uses the same one), the launch now stops with a clear card instead of starting the game without Steam.
  • Log Manager: a Headless Steam toggle (same place and ? button as SteamLite) writes a per-game headless_steam.txt with a PASS/FAIL checklist — sign-in, bridge, session, server browser — plus the host, bridge and engine logs, redacted like the SteamLite one.

🔎 Find Servers works — the server browser

Valve's Android Steam library has no working in-game server browser: the moment a Source game asks for the server list it trips over an object that was never created and hangs. Inside our host it accepts the request and returns nothing. So the v13 layers carry their own:

  • the game asks the bridge; the bridge asks the app, which fetches the master list through Steam's Web API with a token from your session (five thousand servers in about a second);
  • the bridge pings every server itself (the same query protocol the PC client uses) and feeds the game its callbacks on the game's own thread;
  • a small x86-64 front inside the layer answers the game's hottest lookups without leaving the emulator — the Source server browser re-reads server details tens of thousands of times a frame while sorting, and each read used to be a crossing into native code. With the front, the list refreshes at 316 to 376 fps; before it, 0.

✅ Tested on the Pocket FIT with Counter-Strike: Source on Proton 11.0-2, 11.0-1 and GE 11.0-3 (v13): full lists, the three filter boxes, latency / location / anti-cheat filters, and joining a game.

🎮 SteamLite: Steam Input

SteamLite runs Valve's Windows Steam client inside the container, and now it can hand your controller to the game the way Steam on PC does — through Steam Input, Valve's controller layer, with a layout applied.

  • Where: the SteamLite launch options of a Steam game have a Steam Input toggle and a layout pick. Off by default.
  • When to use it: games that only read controllers through Steam Input, or when you want Steam's remapping. Keep it off for games that already read a controller themselves — with it on, such a game can see two pads at once.
  • Default layout: a plain gamepad layout, so the pad stays a pad. The gamepad + mouse layout (right stick moves the mouse, buttons press keys) is there for mouse-only games.
  • Needs SteamLite v8 — the package now carries Valve's SDL3.dll and four controller layouts next to the client, and the agent switches Steam Input on for the game before it starts. Without the toggle the agent behaves exactly like v7, so older app builds are unaffected by the update.

✅ Device-tested on the Pocket FIT with Left 4 Dead 2 online through SteamLite: the layout is applied, Steam confirms it, a full match played and exited cleanly.

⚡ Force SSBS — a CPU speed fix for Wine on ARM

ARM processors have a feature called SSBS. With it on, the CPU may run memory reads ahead of earlier writes — its normal fast path. With it off, it takes a slower, extra-safe route. Every time Wine on ARM handled certain internal events (exceptions, thread suspends, its own wake-up signal) it rebuilt the thread's CPU state from a Windows structure that knows nothing about SSBS, and switched it off. Game threads ended up running the slow way almost all the time.

  • The fix lives in the v14 layers: a backport of Wine's own fix (MR 12262, Jacek Caban). Wine now keeps the SSBS bit exactly as Android set it instead of clearing it — it does not force anything.
  • Force SSBS toggle — container settings and game shortcut settings, Advanced tab, next to the FEXCore settings. On by default. A game can say Container default, On or Off. Off gives Wine's old behaviour back exactly.
  • Older or third-party Protons (Proton 9, StevenMXZ builds, layers before v14) don't carry the fix; with the toggle on the app loads a small add-on (libssbs.so) that switches SSBS back on after Wine clears it.
  • How much faster: it depends on the chip and the game. The report that started this was Fallout: New Vegas going from about 100 to 500 fps on a Snapdragon 8 Elite (Oryon). On a Snapdragon 8 Gen 3 the difference in our tests was within noise.

✅ Device-tested on the Pocket FIT with DiRT Showdown on the v14 Proton 11.0-2: with the toggle on, Wine left SSBS clear 0 times across all 14 Wine processes; with it off, the old clearing came straight back. No speed measurement on an 8 Elite yet.

📦 New compatibility layers — versionCode 14

All ten layers — Proton 11.0-2, 11.0-1, GE-Proton 11.0-3 / 5 / 6 / 7 / 7.1, Proton-CachyOS 20260703 / 20261005 and, back in the set, Proton 10.0-4 and GE-Proton 10.0-34 — are rebuilt at versionCode 14 with the SSBS fix and its WINE_FORCE_SSBS switch. The five x86_64 flavours are in the same release but unchanged apart from the version number (an x86_64 Wine runs through box64 and never uses this ARM code). They install into a new coexisting -14 slot; a container on an older build of the same layer is offered Update layer → v14 with a revert snapshot. Release notes: bionic layers v14.

📦 New compatibility layers — versionCode 13

All eight Proton 11 layers (Proton 11.0-2, 11.0-1, GE-Proton 11.0-3 / 5 / 6 / 7 / 7.1, Proton-CachyOS) are rebuilt at versionCode 13 with the server browser and its x86-64 front; the four x86_64 flavours are in the same release so the set stays together, but they have no Steam bridge (Headless Steam and the server browser do not apply to them) and are unchanged apart from the version number. The two Proton 10 layers stay at v12 — no Steam bridge there either. They install into a new coexisting -13 slot; a container on an older build of the same layer is offered Update layer → v13 with a revert snapshot. Release notes: bionic layers v13.

📦 New compatibility layer — Proton-CachyOS 11.0-20261005

A new, separate Proton-CachyOS layer next to the 20260703 one (both stay): the Wine of CachyOS's release cachyos-11.0-20261005-slr, which is now rebased on Proton-EM, with our full Android stack ported onto it. arm64ec and x86_64, versionCode 13, in the in-app catalog now. Release notes: bionic layers v13.

  • Wayland needs this build (3.1.6-pre2 or newer) — on older app builds use X11 with this layer.
  • Controller fix — the new upstream base made XInput skip the pads Bannerlator's Exclusive XInput hides from DirectInput, so the controller vanished entirely; that change is reverted in the layer.
  • x86_64 start-up fix — the new base looks for the 64-bit Wine launcher in a folder the Android layers don't have, so nothing could start (failed to start wineboot); the layer keeps the working location.

✅ Device-tested on the Pocket FIT: arm64ec on X11 and Wayland, x86_64 (box64) on X11 — Insane 2 with the controller each time.

🪟 Wayland: xdg-shell version 3

Every window on Wayland is created through the xdg-shell protocol. Bannerlator's compositor offered version 1 and only pretended to support pop-ups and their positioning; the Wayland driver in the newest Wine (the CachyOS 11.0-20261005 layer) refuses anything below version 3, so it could not create a single window — the desktop died and the game reported exited before rendering.

  • The compositor now implements positioners (size, anchor, gravity, offset, the version-3 extras), real pop-up windows (placed against their parent, kept on screen, drawn above it, touchable) and reposition, and advertises version 3.
  • Layers that ask for version 1 or 2 still get exactly that, so every existing layer behaves as before.

✅ Device-tested on the Pocket FIT: Insane 2 on Wayland with the new CachyOS layer (≈1,400 fps on the menu, controller working) and, as a regression check, on the v13 Proton 11.0-2 layer.

🟣 Mali phones: PanVK settings for Wayland, and "System" as a driver

On an Arm Mali GPU only, the Wayland driver settings (container, game shortcut and the XMB menu) gain a Mali (PanVK) section for FristOneRR's PanVK driver:

  • Mali (PanVK) mode — on by default when the driver's name contains "panvk". Turns on three adapter switches, each with its own toggle under Advanced: hide the extensions PanVK can't do, skip submit waits, skip the acquire signal (the two skips are for DXVK games).
  • Advanced PanVK tuning: heap sizes (PANVK_HEAP_MB, PANVK_TILER_HEAP_MB, PANVK_POLY_HEAP_MB), atom stride and trace — sent only when set and in range.
  • "System" as the Wayland driver (experimental) — no bundled Turnip runs on Mali, so the Wayland driver list now offers System (your phone's own Mali Vulkan driver) on Mali. With the new adapter switches some vendor drivers may be able to show the game; if it stays black, pick a PanVK driver or use X11. Picked on purpose, it is kept: the app no longer swaps in a bundled Turnip for it at launch.

Nothing changes on Adreno or any other GPU.

🧪 Mali (PanVK) on Wayland is EXPERIMENTAL. One tester so far:

Device GPU Driver Works Doesn't work yet
Redmi 25028RN03A (Unisoc UMS9230E) Mali-G57 MC1 FristOneRR PanVK beta 1.2.0 (Mesa 26.3-devel) D3D7 / 8 / 9 / 11 on DXVK-Sarek 1.13 and DXVK 2.3.1 / 2.3-gplasync, D3D10 with the fixed Sarek, Rabbit and Steel at about 12–15 fps OpenGL (Zink on that driver only reaches GL 2.1), D3D12
  • Mali settings appear only on Mali GPUs. Don't copy FristOneRR's wrapper into the container: Bannerlator's own Wayland adapter is used. Set BCn to none.
  • D3D10 on DXVK-Sarek 1.13 needs the fixed dxvk-sarek-v1.13.0-d3d10fix from the catalog (Sarek 1.13 crashed creating a D3D10 device on every GPU).
  • The AIO Graphics Test's Vulkan cube says Present mode unsupported on Wayland on every GPU; that's a bug in the test app (it asks for a mode the compositor doesn't offer), not a Mali problem.

🎛️ Menu button for handhelds without a Back key

Input Controls › Device › Menu button — pick a controller button that opens the in-game side menu. Set button takes the next key press, None turns it off. Off by default on every device; B can't be picked, so B never opens the menu. A controller-profile binding for the same button still wins, and in a Linux Steam session Guide stays the Steam button.

🧬 Box64EC — an experimental second x86-64 translator (unofficial)

arm64ec containers gain an Emulator (64-bit) picker (container settings, and per game under Advanced → Box64EC) that switches the x86-64 translator between FEXCore (unchanged default) and Box64EC. The old picker is now labelled Emulator (32-bit).

⚠️ Box64EC components are experimental and unofficial. They are built by The412Banner from the box64 project's work-in-progress ARM64EC target and airidosas252's pull request #4480, with our own hookup of the fast engine; they are not releases of the box64 project. Nothing installs by itself: the picker only appears once you install a Box64EC component from the catalog. Expect games that run slower or not at all; FEXCore remains the supported path.

📦 A fourth APK: AnTuTu

Every release now ships four builds of the same app under different package names — standard (com.winlator.banner), PuBG (com.tencent.ig), Ludashi (com.ludashi.benchmark) and, new, AnTuTu (com.antutu.ABenchMark). Take standard unless your device gives a specific package a performance mode; the in-app updater follows whichever one you installed.

🛠️ Fixes

  • Toy Story 2 (and anything that maximizes a 0×0 window): the app's window-helper (winhandler.exe) un-maximized windows when bringing them to the front, which left Toy Story 2's Screen Mode Select window invisible (black screen on X11). It now brings windows forward without restoring a maximized one; existing containers get the fixed helper on their next launch.
  • A malformed container folder (for example a leftover xuser- directory) crashed the app on every launch; it is skipped with a log line instead.
  • Wayland HUD: a Vulkan game is no longer labelled "OpenGL"; the adapter's icd.json is written without escaped slashes.
  • Headless Steam host: a dlopen failure path crashed instead of reporting the error.

⚠️ Carried over — still open

  • Small updates: the full-APK fallback has not been triggered on a device yet, and the release workflow's patch step runs for the first time with this release.
  • Force SSBS: gain not yet measured on a Snapdragon 8 Elite (Oryon), where the biggest difference is expected. The v14 fix was ported by hand to each layer's Wine; device-tested on Proton 11.0-2 only.
  • Mali "System" driver on Wayland: experimental and not yet tested on a Mali phone — it may show a black screen.
  • Menu button: the Pocket FIT's Guide button was proven as a menu button during development; the final build has not been re-tested on a handheld.
  • SteamLite Steam Input: tested on Left 4 Dead 2; games that only speak Steam Input have not been run through it yet.
  • xdg-shell v3: pop-ups take no input grab and never take keyboard focus; the "resize to fit" placement rule is not implemented (pop-ups slide or flip back on screen instead).
  • Headless Steam: not VAC-protected (by construction); Proton 10 layers have no Steam bridge; voice chat untested; only Counter-Strike: Source has been run through a full online session so far.
  • Server browser: LAN tab scans the common Source ports by broadcast only; the Friends tab is empty on this path.
  • Box64EC: experimental — no performance work yet beyond the fast-engine hookup.
  • Everything listed as open in 3.1.5 is unchanged: Cutscenes / Codecs (FFmpeg arm64ec only), X11 cursor items, save-sync device checks, Fast OpenGL's 32-bit-only setups, the Wayland items, and the Linux Steam client items from 3.1.3.
📦 Where to get Proton 9 (tap to expand)

The APK does not bundle Proton 9 — Wine installs from the in-app catalog on first run. The Linux Steam client does not use these layers at all: its games run through Valve's own ARM64 Proton.

Proton 9.0 arm64ec — not bundled, download it if you want it:

https://github.com/The412Banner/Nightlies/releases/download/Proton/wine/proton-9.0-arm64ec.wcp

66.7 MB · sha256 f8a99fed387f1b097009129dc49368c8f500927640a9d4c7a192d850b1b2068c
Install it via Containers → download icon → install the .wcp. It also appears in the in-app catalog. (Compiled as a wcp by Xnick417x.)

📜 Every change since 3.1.5 — 70 merged, oldest first
  • Wayland HUD: a Vulkan game is not "OpenGL"; adapter icd.json without escaped slashes · 5b168c19
  • Box64EC as a selectable x86-64 translator on arm64ec containers · 3dce9e13
  • Emulator pickers: label the 32-bit one, add a per-game Emulator (64-bit) override · 0ab26f98
  • Shortcut editor: Box64EC section on the Advanced tab · d4e0bed5
  • App Steam P1: bl-steam-host — the app's genuine Steam session host (standalone arm64 ELF) · 30e4f84b
  • App Steam P2: SteamHostComponent (Valve client set from Valve's CDN) + SteamHost supervisor · f11b5ace
  • App Steam P3: launchMode=AppSteam — launcher, activity wiring, launch popup card, pre-flight + log bundle · 49ede7b4
  • App Steam: manifest parser reads the root block's children · 16167631
  • App Steam: opt into the v9+ lsteamclient gate (WINE_LSTEAMCLIENT=1) · e83ea526
  • Headless Steam: user-facing name for the AppSteam launch mode · 19dde278
  • Headless Steam: approve Valve Android client build 1788652215 · 582e4770
  • Headless Steam host: keep the app's native lib dir off LD_LIBRARY_PATH · a814cd22
  • Headless Steam logging: own toggle, help copy and headless_steam.txt bundle · 66797bb9
  • Headless Steam host: reap any lingering host before starting, wait for the port · 6b8fcf65
  • Headless Steam host: start Valve's client service on its ip:port, not a bare name · af3fd850
  • Headless Steam log: own title, uid-wide bridge logcat, client-service + in-game checks · ca0a2f80
  • Headless Steam host: register the client service as SteamClientService_ · bd5a2ace
  • Headless Steam log: service check passes on the per-process name; unfiltered uid logcat read · c9f25197
  • Headless Steam host: opt-in server-browser probe (ISteamMatchmakingServers in-host) · 298408b3
  • Headless Steam: server-list service in the host + bridge env for the Bannerlator server browser · e5d1b7be
  • Headless Steam: app-side server-list service + real failure card when the host port is busy · 16ffdd82
  • Headless Steam: bind the server-list service to 127.0.0.1 (getLoopbackAddress() was ::1), checklist tolerant of logcat truncation · 2c2b9b2f
  • Headless Steam logs: live tag-filtered logcat capture for the session; stale-host port wait 12 s · 0a912bba
  • Bl-steam-host: port pre-check ignores TIME_WAIT (SO_REUSEADDR) — a quick relaunch after a force-stop no longer exits port_busy · d842d6c6
  • Bl-steam-host: read dlerror() once on dlopen failure (second call returns NULL → strlen crash, tombstone_21) · 1ef8a886
  • Headless Steam: stage the browser's x86-64 front (blsteambrowser.dll) into the prefix's system32 at launch · 22ff9bb8
  • ContainerManager: skip malformed or config-less xuser-* directories instead of crashing at launch · 8ff41a61
  • Release prep 3.1.6-pre1: notes, README section (Headless Steam & Server Browser), versionCode 95 / versionName 3.1.6-pre1 · a04d6596
  • 3.1.6-pre1 notes/README: x86_64 layers ship in v13 unchanged and without the Steam bridge · 587c5bd7
  • Add the antutu flavour (com.antutu.ABenchMark): gradle, CI matrix, release assets + update.json, README · 7497ea9b
  • Build.gradle: antutu flavour belongs in productFlavors · 5d1fafec
  • 3.1.6-pre1 notes: the AnTuTu build · a4ccc0bb
  • SteamLite Steam Input (per-game toggle, layout pick, pad-only template default) — feat/steamlite-steam-input · e0f73a32
  • Wayland compositor xdg-shell v3 (positioner, popup, reposition) for winewayland that requires xdg_wm_base v3 — feat/wayland-xdg-shell-v3 · ea6fb28b
  • 3.1.6-pre2: versionCode 96 / versionName 3.1.6-pre2; release notes (SteamLite Steam Input, Wayland xdg-shell v3, Proton-CachyOS 11.0-20261005); README section + version row · b57c4e80
  • Winhandler.exe brings windows to front without un-maximizing (staged into every container) — fix/winhandler-no-unmaximize · 6f3e29fe
  • Input Controls › Device › Menu button (pick a device button that opens the in-game side menu; off by default, B can't be picked) — feat/menu-button · bf64e948
  • Force SSBS toggle: container switch + per-game override (arm64ec) · ea4f58a3
  • Force SSBS: name the container's value in the game dropdown, add ? help in both editors · 8519ee68
  • Mali-report 2026-10-07T20-27-48-4edce9: data · 796a3f95
  • Mali-report 2026-10-07T20-27-48-4edce9: page · e2064196
  • Mali-report 2026-10-07T20-27-48-4edce9: index · f7fecf66
  • Force SSBS: on by default (Wine MR 12262 layers keep the host bit); store off explicitly · 1023628f
  • Wayland driver gear: Mali (PanVK) section · 615086a7
  • Wayland on Mali: offer "System" as the compositor driver (experimental, kept as picked) · bb37d057
  • 3.1.6-pre3: versionCode 97 / versionName 3.1.6-pre3; release notes (Force SSBS + v14 layers, Mali PanVK + System driver on Wayland, Menu button, Toy Story 2 fix); README section + version row · 608b6c1d
  • Mali-report 2026-10-08T16-38-15-c8aadb: data · 2505cbcd
  • Mali-report 2026-10-08T16-38-15-c8aadb: page · c666d65c
  • Mali-report 2026-10-08T16-38-15-c8aadb: index · 1561658d
  • VKD3D_SHADER_MODEL=6_6 as a container default, migrated onto existing containers · 927dca70
  • Strings: fold the VKD3D_SHADER_MODEL default into the existing help text (duplicate resource broke the build) · 8f599388
  • ContainerManager: import EnvVars (migration did not compile) · d6cd4557
  • Components: an offline engine that lays out Windows Installer packages and installer wrappers without running them · 8167966a
  • Win Components install without opening the container, as DroidDeck does · e550fbd6
  • Adding games: what DroidDeck learned about matching, naming, exes and components · 2995f7ec
  • Games folder import: look up unidentified games on Steam by title for the list's art · c25276cf
  • Adding one game with +: a Steam app found by title also gives the game Steam's name, as a folder import does · 7981a9c0
  • Game details come filled in, and games can use art the user picks · 24a0f2c4
  • Games folder import: each found game's components, installable from the list · c50e3640
  • Games folder import: art for more games, faster, components inside each card · 95598acc
  • Confirm game searches Steam by itself; Edit Game is compact · 8830baff
  • Confirm game: the linked result first and highlighted; Save commits it · 5e7e16c9
  • Edit Game: a game-art picker with every image the app finds, by source · af4eb9e3
  • Edit Game: open the art picker from inside the dialog's window, where it shows · 4604dbde
  • Steam art by the files Steam lists for the app · b3b23511
  • Game and container menus: six and a half items tall, scrolling, with a visible scrollbar · 80b40117
  • Update notice as slide-in pill, highlights pop-up and download card; updater polling fix — feat/update-card-ui · 943894fa
  • Small in-app updates (APK patches rebuilt from the installed app) — feat/apk-delta-updates · 8913bd5d
  • Small-update patches hosted in Bannerlator-updates — feat/apk-patches-repo · e8bcae4e
  • Release 3.1.6: versionCode 98, notes and README · 6bd20841

🙏 Credits (tap to expand)

Win Components offline is a Java port of DroidDeck's offline installer engine (droiddeck-msi-install), and the add-game improvements carry over what DroidDeck learned about matching, naming, executables and components. Game art comes from Steam and SteamGridDB. The Menu button came from a Discord report that the AYN Odin 2 Portal's Back button did nothing in-game, and the Toy Story 2 fix from Espectro's report and testing in the Discord thread Fast OpenGL freezes TS2 cutscenes (pointing at Pipetto-crypto/winlator 912d1af, which removed the same bring-to-front path; we kept the raise and only stopped the un-maximize) — thank you both.

The SSBS fix in the v14 layers is a backport of Wine MR 12262 by Jacek Caban (Wine-Bug 60405); the problem was found by Sonicadvance1 (FEX-Emu), whose force_ssbs.diff the earlier test builds used. The Mali (PanVK) section drives FristOneRR's PanVK driver and Wrapper v1 changes (MIT) in the Wayland adapter. winhandler.exe is from Winlator by brunodev85; the pre3 fix is a two-byte patch of it.

The cutscene fixes in the v12 layers: the Media Foundation series by NelloKudo; the media-converter gate by GloriousEggroll; the original shared-texture driver (sharedgpures.sys) by Valve (Derek Lesho), rewritten here for Wine 11; the bionic prefix packs and build sysroot by GameNative; winedmo from Wine (Rémi Bernon), with Proton's PCM filter (© 2025 Conor McCarthy for CodeWeavers) replaced by our own. Full per-layer credits are in the v12 layer release.

The Codecs setting is modelled on Pipetto-crypto's winedmo backport for Proton 9 (winlator a81fae78): the pseudo-components in the Win Components list and the WINE_USE_DMO name. No code was copied; the Compose UI and plumbing are new.

Proton-CachyOS 11.0-20261005 is the CachyOS team's (wine-cachyos, rebased on Proton-EM) on Valve's Proton; our Android stack is ported on top. SteamLite Steam Input drives Valve's own controller layer; SDL3.dll and the four controller layouts in the package are Valve's, unmodified. The xdg-shell v3 compositor work is ours, following the wayland-protocols xdg-shell specification.

box64 is ptitSeb's; the GStreamer-wrapper fix is ours and submitted upstream as #4528. FEXCore is the FEX-Emu team's; the 2609-unix package is the catalog build with its unixlib pair.

XInput 2 raw mouse follows what GameNative and WinNative already do in their X servers, extended with touch and stylus raw motion. Colour cursors came from a Discord #bugs report of black-and-white cursors in Kingdom Come and the Gothic Remake — thank you to the reporter.

Everything credited in 3.1.4 still applies: Fast OpenGL (Mesa, Banners-Turnip, Wine's EGL route), the Wayland adapter (Pipetto-crypto's bionic Vulkan wrapper), winhandler.exe (Winlator by brunodev85), the Turnip fix (Mesa / Turnip by the Freedreno and Mesa teams), the Linux Steam client (Valve, DroidDeck, WinNative, Armada, Termux proot, Arch Linux ARM, FEX-Emu), ntsync (Joshua Tam / joshuatam, GameNative), the bundled Wayland drivers (Vauzi-17, the WinNative development team, StevenMXZ, whitebelyash), DXVK, VKD3D-Proton, Wine, Proton / GE-Proton, box64, SteamKit2 and Wayland.


Entirely app-side — no ImageFS reinstall. Install over 3.1.6-pre3 or any earlier 3.1.x; everything carries over. Then take the v14 layer updates from the catalog.