Flash

Flash games in pal, played by Ruffle

palupdated 2026-10-27FunIn pal's registry

Open in pal

In pal's registry: the button shows it in pal, which asks before installing; the command does the same from a terminal. This page can't see what your pal has installed.

Flash: Until the Flash games collection is added, the palette offers to add it; it asks for a password, then its games show here as in Games
Until the Flash games collection is added, the palette offers to add it; it asks for a password, then its games show here as in Games
Flash: One thing to do until then: add the collection
One thing to do until then: add the collection
1 of 2

What it does

Plays Flash games in pal with Ruffle, the Flash Player emulator: the games of the Flash games collection, each one a package of its own that runs on this. Saves and scores follow you like any pal game's.

  • Ruffle, the open source Flash Player emulator, in every Flash game's page; no plugin
  • ActionScript 1, 2 and 3 games, scaled to fill the panel with their shape kept
  • A game's saves are kept in pal and follow you to your other machines when you sign in
  • Scores go to the game's leaderboards when it keeps one
  • Games pause when the panel hides and save what they had
  • Its palette is the Flash games as a showcase, like Games; until the collection is added it offers to, and asks for its password

Palettes 1

  • Flash gamesflashview

    The Flash games as a showcase, like Games: Enter plays one, or installs it first. Until the Flash games collection is added, it offers to add it.

Settings

No settings. It works out of the box.

The README

Everything Flash does, key by key, from the extension's own README.md

Flash

Ruffle, the Flash Player emulator (ruffle.rs, MIT or Apache-2.0), for the Flash games. Each game is a package of its own that requires this one; pal serves this extension's files on the game's origin at /__ext/flash/ (protocol 8), so the game's page loads the runtime and Ruffle under its own CSP.

A game package

<game>/
  pal.json              "requires": ["flash"], "sync": { "saves": { "each": "latest" } },
                        "leaderboards" when it has a score, a view palette
  index.ts              the palette: a surface at surface/index.html
  surface/index.html    /__pal/surface.js, then ../__ext/flash/surface/runtime.ts
  surface/game.json     { "swf": "game.swf", "score": { "from": "so:<SharedObject>/<field>", "board": "best", "order": "desc" } }
  surface/game.swf

test/flash-game/ is one, on Ruffle's own SharedObject test SWF.

swf may carry a query (hw_preloader.swf?file=game.swf), which the SWF reads as its parameters. content ("content/") names the folder that keeps the game's other files under the URLs they had on the web (content/<host>/<path>): a request for http://<host>/<path> is answered from there, so a game that loads its levels or sounds by their old address finds them. Relative URLs resolve against the SWF's own folder. renderer (canvas, webgl, wgpu-webgl) picks Ruffle's renderer for a game that needs one.

score.from is so:<name>/<path>, a number in one of the game's SharedObjects (TopScore, stats.best), or ei:<function>, a function the game calls through ExternalInterface (a patched SWF). A better value than the last goes to board. A boolean sound setting, when the game declares one, mutes it. The view's mute action ("Sound on or off", cmd+m: the game owns the bare letters) flips sound for that game and is remembered in its storage as muted.

What the runtime does

  • Plays the SWF filling the view with its shape kept, sponsor links refused.
  • Stands an in-memory localStorage in for the frame's (an opaque origin has none): Ruffle's SharedObjects land there and in the game's storage as saves, keyed relative to the extension's root so macOS, Windows and the web agree. Saves synced in from another machine restart the game on them.
  • On hide, flushes the SharedObjects (a pagehide, which is when Ruffle writes them) and suspends; resumes on show.
  • Answers ExternalInterface.call without eval, which the CSP refuses.

Ruffle

make ruffle vendors it into surface/ruffle/ from npm at the version pinned in ruffle.sh, checked against its integrity. Both of its builds are kept: the WebAssembly-extensions one (what WebKit on macOS loads) and the plain one Ruffle falls back to where those are missing, which WebKitGTK on an older Linux may be.