luthebao

Personal site of luthebao

View project on GitHub

Llflash is an Adobe Flash Player emulator written in Rust, targeting both desktop and the web via WebAssembly. It’s a fork of Ruffle with one headline addition: RTMP support, delivered through a small native messaging host that pairs with the browser extension. The rest of the runtime tracks upstream — ActionScript 1, 2, and 3 are all supported, enough to bring most legacy .swf content back to life: games, animations, learning tools, and the multiplayer-streaming SWFs that vanilla Ruffle can’t reach because browsers don’t expose raw TCP.

Desktop builds and the RTMP native messaging host are published on the llflash release. Questions, bug reports, and feature requests go through the luthebao discussions tab — there’s no public issue tracker.

Setup in three steps

  1. Install the browser extension. Coming soon — the Chrome Web Store / Firefox Add-ons listing isn’t published yet. Until then, you can side-load the unpacked extension from the release page.
  2. Install the RTMP native messaging host with the one-liner for your OS (see below). This is the small out-of-process helper that lets SWFs reach rtmp:// servers.
  3. Visit any page that uses Flash. The extension picks up .swf embeds automatically and routes RTMP traffic through the host you just installed — no per-site configuration.

Install the RTMP native messaging host

Llflash plays static SWFs entirely in the browser, but RTMP-based content (legacy live-streaming SWFs, multiplayer games that talk to rtmp:// servers) needs an out-of-process helper — browsers can’t open raw TCP sockets. The RTMP native messaging host is a small Rust binary the browser extension launches over Chrome / Firefox’s native-messaging protocol. Once registered, RTMP traffic inside any SWF is routed through it transparently.

Pick the line that matches your OS.

macOS / Linux

curl -fsSL https://github.com/luthebao/luthebao/releases/download/llflash/rtmp-host-install.sh | bash

Supports macOS (Apple Silicon) and Linux x86_64. The script downloads the latest release tarball, drops the binary under ~/.llflash/rtmp-host/, and writes the native-messaging manifest (com.longliveflash.rtmp_host) into the right per-browser directory. Default target is Chrome — pass a browser name to install for a different one:

# chrome | chromium | edge | brave | firefox | all
curl -fsSL https://github.com/luthebao/luthebao/releases/download/llflash/rtmp-host-install.sh | bash -s -- firefox

Windows

In PowerShell:

irm https://github.com/luthebao/luthebao/releases/download/llflash/rtmp-host-install.ps1 | iex

Same behaviour as the bash version: pulls the latest zip, extracts to %LOCALAPPDATA%\LongLiveFlash\rtmp-host\, and registers the native-messaging manifest. To pass a browser argument, save the script first and run it locally:

$u = 'https://github.com/luthebao/luthebao/releases/download/llflash/rtmp-host-install.ps1'
iwr $u -OutFile rtmp-host-install.ps1
PowerShell -ExecutionPolicy Bypass -File .\rtmp-host-install.ps1 all

After install, restart your browser and reload the extension — the host appears under chrome://extensions/ (or the Firefox equivalent) and RTMP-backed SWFs should connect straight away.

Environment overrides

Both scripts honour the same overrides if you need to pin a specific release or change the install location:

Variable Default
LLFLASH_REPO luthebao/luthebao
LLFLASH_TAG llflash
LLFLASH_INSTALL_DIR ~/.llflash/rtmp-host (Unix) / %LOCALAPPDATA%\LongLiveFlash\rtmp-host (Windows)

Desktop builds

Standalone desktop builds are listed on the release page alongside the install scripts:

  • llflash-rtmp-host-1.1.0-macOS-arm64.tar.gz
  • llflash-rtmp-host-1.1.0-Linux-x64.tar.gz
  • llflash-rtmp-host-1.1.0-Windows-x64.zip

Each archive contains the host binary plus the install script for that platform — useful if you’d rather audit the script and run it offline instead of piping from curl.

Relationship to Ruffle

Llflash is a fork of Ruffle, not a rewrite. The AVM1/AVM2 interpreters, the renderer, and the SWF parser are Ruffle’s work — credit and thanks go to that project and its contributors. What this fork adds is the rtmp:// path: the llflash-rtmp-host binary you just installed terminates the RTMP/RTMPE/RTMPT protocols outside the browser sandbox, and a thin bridge inside the wasm module forwards NetConnection / NetStream traffic to it. With that in place, SWFs that depend on Flash Media Server, Wowza, or any RTMP origin keep working — which is the gap that kept a noticeable slice of legacy Flash content from running under stock Ruffle.

Everything else — including most ActionScript edge cases, codec coverage, and the desktop player — behaves like upstream Ruffle. Questions, bug reports, and feature requests live on the luthebao discussions tab (the source repo is private, so there’s no public issue tracker)