93 Commits
Author SHA1 Message Date
branderson a84ba7f6de Merge pull request 'Retry image builds once after a GHCR 429' (#17) from ci-retry-ghcr into main
Images / app (push) Successful in 4m56s
Images / session-manager (push) Successful in 1m49s
Images / streamer (push) Successful in 3m40s
Reviewed-on: #17
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 21:29:32 -07:00
branderson d45aa8b603 ci: retry forge image builds once after a GHCR 429 too 2026-10-15 21:28:37 -07:00
branderson d54a44da1d ci: retry GitHub image builds once after a GHCR 429
The streamer's base image pull from ghcr.io intermittently gets 429 Too
Many Requests on GitHub's shared runners, failing the first attempt of
the last two runs; re-running minutes later succeeded both times.
2026-10-15 20:05:38 -07:00
branderson bf175b64a2 Merge pull request 'Retake screenshots on made-up demo data' (#16) from demo-screenshots into main
Images / app (push) Successful in 5m47s
Images / session-manager (push) Successful in 7m22s
Images / streamer (push) Failing after 1m14s
Reviewed-on: #16
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 19:47:24 -07:00
branderson 245f499f04 docs: note restarting the app between screenshot runs 2026-10-15 19:37:05 -07:00
branderson c1350387b1 docs: draw demo game art as genre scenes
Tiles and screenshots were abstract shapes. Each is now a small scene for
its genre, with several layouts per genre steered by the game's tags, so
no two games look alike. The screenshot script pins the browser's date so
the Game of the Day doesn't change between runs.
2026-10-15 19:36:42 -07:00
branderson 5357622c2d docs: retake screenshots on made-up demo data
The README's screenshots showed real games whose authors never agreed to
be featured. scripts/demo/build-demo-data.mjs builds a Flashpoint install
of invented games with generated art, plus Pixel Penguin Panic, a small
HTML5 game written for it. scripts/demo/take-screenshots.mjs retakes the
screenshots from an app running on it.
2026-10-15 19:13:11 -07:00
branderson 89194dd94a Merge pull request 'Publish only a latest image tag' (#15) from latest-tag-only into main
Images / app (push) Successful in 4m49s
Images / session-manager (push) Successful in 1m43s
Images / streamer (push) Successful in 3m32s
Reviewed-on: #15
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 17:35:04 -07:00
branderson 97168ea0e5 ci: publish only a latest image tag, built from main
Drops version tag builds and the main tag. Images report the short
commit SHA as their version.
2026-10-15 17:34:14 -07:00
branderson a2d899be6f Merge pull request 'Mirror main to GitHub and publish images to GHCR' (#14) from github-mirror into main
Images / app (push) Successful in 5m35s
Images / session-manager (push) Successful in 1m37s
Images / streamer (push) Successful in 3m32s
Reviewed-on: #14
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 17:00:58 -07:00
branderson 2d1d8cce46 feat: mirror main to GitHub and publish images to GHCR
mirror/github-mirror.sh publishes main and its tags to a read-only
GitHub mirror, adding a notice under the README title, with a systemd
timer to run it hourly. A GitHub Actions workflow builds the images on
the mirror and pushes them to ghcr.io. The docs point prebuilt images
there, and CONTRIBUTING no longer invites issues and pull requests.

upstream-status.sh now fetches without tags, so upstream's version tags
stay out of local clones.
2026-10-15 16:48:04 -07:00
branderson 3c3bb5dfbf Merge pull request 'Add upstream sync process and agent notes' (#13) from upstream-sync-process into main
Images / app (push) Successful in 4m55s
Images / session-manager (push) Successful in 1m46s
Images / streamer (push) Successful in 3m44s
Reviewed-on: #13
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 16:36:56 -07:00
branderson 13a7fd9d19 docs: don't pin our migration numbers in sync notes 2026-10-15 16:36:43 -07:00
branderson 4fd43cd17d docs: add upstream sync process and agent notes
Adds scripts/upstream-status.sh to report upstream flashpoint-web changes
since the last merge, docs/08-development/upstream-sync.md describing the
merge process, and .dejima.md for agents working in dejima.
2026-10-15 16:31:33 -07:00
branderson 110e7fcd78 Merge pull request 'Credit Texgriddy and Fredoka; rename the color scheme to Slate' (#12) from credit-texgriddy into main
Images / app (push) Successful in 5m7s
Images / session-manager (push) Successful in 1m44s
Images / streamer (push) Successful in 3m33s
Reviewed-on: #12
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 16:24:17 -07:00
branderson f3d85f5239 docs: credit Texgriddy and Fredoka; rename the color scheme to Slate
The portal's look is inspired by Texgriddy, an ES-DE theme by
Weestuarty, recreated in CSS without any of its files. The README and
the portal doc now say so, and credit the Fredoka font. The color
scheme was named after Texgriddy's "Chilled" scheme; it's now Slate.
2026-10-15 16:16:00 -07:00
branderson 9a9d7e3787 Merge pull request 'Streaming: measure Flash Player's menu bar from the movie's offset' (#11) from flash-menu-offset into main
Images / app (push) Successful in 4m53s
Images / session-manager (push) Successful in 1m41s
Images / streamer (push) Successful in 3m27s
Reviewed-on: #11
Reviewed-by: branderson <brad@branderson.io>
2026-10-14 18:18:01 -07:00
branderson e531228fa9 fix(streaming): keep Flash Player's window in place while it's open
Flash Player moves its window back to the top of the screen once the
movie has loaded, bringing the menu bar back. The streamer now checks
the window twice a second and puts it back, logging the first few
times.
2026-10-14 18:10:11 -07:00
branderson d1cebec142 fix(streaming): measure Flash Player's menu bar from the movie's offset
GTK draws the projector's menu bar in its window, not in a child window,
so the previous lookup found nothing and, under set -e and pipefail,
silently ended the block that moves the window. The movie is the
window's largest child, and its offset is the menu bar's height (56px
on flashbox). The block no longer stops on errors, logs what it measured
and where the window ended up, and GAME_WIDTH/GAME_HEIGHT, unused now,
are dropped.
2026-10-14 18:03:52 -07:00
branderson 3c4d3e7216 Merge pull request 'Streaming: hide Flash Player's menu bar without full screen' (#9) from flash-windowed into main
Images / app (push) Successful in 4m53s
Images / session-manager (push) Successful in 1m46s
Images / streamer (push) Successful in 3m31s
Reviewed-on: #9
Reviewed-by: branderson <brad@branderson.io>
2026-10-14 17:26:37 -07:00
branderson e697638827 Merge pull request 'Carry Flash saves between Ruffle and the original Flash Player' (#8) from flash-save-sync into main
Images / app (push) Successful in 4m55s
Images / session-manager (push) Successful in 1m41s
Images / streamer (push) Successful in 3m31s
Reviewed-on: #8
Reviewed-by: branderson <brad@branderson.io>
2026-10-14 17:26:19 -07:00
branderson 1306a88b0e fix(streaming): hide Flash Player's menu bar without full screen
Some games break in Flash Player's full-screen mode: in Bloons darts
make a sound but never fly. Instead of pressing Ctrl+F, the streamer
stretches the projector's window to the display and moves it up by the
menu bar's height, measured from the window's opening height and the
movie's. The session manager now passes the game's exact size as
GAME_WIDTH/GAME_HEIGHT and rounds only the display size to even.
2026-10-14 17:25:27 -07:00
branderson 28d590ddd2 fix(saves): treat a wrapper's [[DYNAMIC]] save path as the same save
A SWF a wrapper loads from memory saves under [[DYNAMIC]]/<n>, and
MochiAds does that in Ruffle but not in the standalone Flash Player, so
Bloons kept its progress at different paths in each. Saves differing
only by that step are now one save: the stream starts with Ruffle's
copy (the dynamic one when both exist) at every path it has for it, and
only saves the stream changed are copied back, to every Ruffle key for
them.
2026-10-14 17:04:50 -07:00
branderson a236d7a1b0 fix(saves): keep Ruffle's copy of a Flash save current in both directions
The stream starts with Ruffle's copy of each save, but Ruffle starts
first, and a game with progress only in the stream would write a fresh
save there that then replaced it. Before Ruffle starts a game it now
gets the stream's saves it doesn't have yet. This replaces the
first-switch rule, which kept a stale stream save over Ruffle progress.
Moving the Flash content type above GamePlayer's early return also
fixes a conditional hook.
2026-10-14 16:45:47 -07:00
branderson 3d93ef7304 feat(saves): carry Flash saves between Ruffle and the original Flash Player
Ruffle keeps SharedObjects in localStorage and the streamed Flash Player
as .sol files, in the same format under different names. Starting the
stream now adds the game's Ruffle saves, translated to Flash Player's
paths, and stream save updates are copied back into Ruffle's storage.
Root-path saves carry over only when this game made them. A game's
first switch keeps the stream's copy of a save both sides already had.
2026-10-14 16:14:59 -07:00
branderson c5b1f750bc Merge pull request 'Streaming: log session lifecycles and why streamers fail' (#7) from session-manager-logging into main
Images / app (push) Successful in 4m52s
Images / session-manager (push) Successful in 1m44s
Images / streamer (push) Successful in 3m37s
Reviewed-on: #7
Reviewed-by: branderson <brad@branderson.io>
2026-10-14 16:02:27 -07:00
branderson 26f920c0da Merge pull request 'Docs: drop the old /stream/ proxy route when upgrading' (#6) from docs-stream-route into main
Images / app (push) Successful in 4m48s
Images / session-manager (push) Successful in 1m46s
Images / streamer (push) Successful in 3m34s
Reviewed-on: #6
Reviewed-by: branderson <brad@branderson.io>
2026-10-14 16:02:05 -07:00
branderson 9144395201 feat(streaming): log session lifecycles and why streamers fail
The session manager logs each session's creation, readiness time and
removal with its reason. A streamer that exits during startup now fails
the start at once instead of after 60 seconds, and the log carries its
exit code and last output; containers are no longer auto-removed, so
that output survives until teardown. A failed start reaches the app as
a 502.
2026-10-14 00:52:36 -07:00
branderson b982e0a541 docs: tell upgraders to drop their /stream/ proxy route
The upgrade guide still said the /stream/ route was unchanged, but the
app now proxies streams itself and the session manager publishes no
port; an old route times out with a 504.
2026-10-14 00:47:25 -07:00
branderson 73d2f2405a Merge pull request 'CI: install the Docker CLI, allow a registry host override' (#5) from ci-docker-cli into main
Images / app (push) Successful in 5m26s
Images / session-manager (push) Successful in 1m51s
Images / streamer (push) Successful in 6m40s
Reviewed-on: #5
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 23:24:17 -07:00
branderson 651fe4e95e ci: install the Docker CLI and allow a registry host override
The privileged runner's job image has no Docker client, which the login
and build actions need. The registry host can be set with a REGISTRY_HOST
repository variable when the runner reaches Gitea at an internal address.
2026-10-13 23:23:06 -07:00
branderson 0d08cde3c1 Merge pull request 'CI: log in to the registry as the repository owner' (#4) from ci-registry-login into main
Images / app (push) Failing after 1m10s
Images / streamer (push) Failing after 1m14s
Images / session-manager (push) Failing after 1m13s
Reviewed-on: #4
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 23:19:12 -07:00
branderson e1cf8aff29 ci: log in to the registry as the repository owner
Only REGISTRY_TOKEN is configured; the REGISTRY_USERNAME secret the
login step read doesn't exist, so it logged in with an empty username.
2026-10-13 23:17:36 -07:00
branderson 9b46a25802 Merge pull request 'CI: dejima runner labels and short job names' (#3) from ci-runner-labels into main
Images / app (push) Failing after 6m49s
Images / streamer (push) Failing after 1m7s
Images / session-manager (push) Failing after 1m9s
Reviewed-on: #3
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 22:23:15 -07:00
branderson 71682ae2b7 ci: run image builds on dejima-privileged, with short job names 2026-10-13 22:22:39 -07:00
branderson bac27cbc05 Merge pull request 'Dotcom Arcade: rename, one compose file, Ultimate setup script and docs' (#1) from rebrand-and-docs into main
Images / build (., dotcom-arcade) (push) Canceled after 0s
Images / build (streaming/session-manager, dotcom-arcade-session-manager) (push) Canceled after 0s
Images / build (streaming/streamer, dotcom-arcade-streamer) (push) Canceled after 0s
Reviewed-on: #1
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 22:17:00 -07:00
branderson c49fd1e4e9 Merge pull request 'Release prep: legal-safe setup, hosting requirements, in-app stream proxy, Gitea CI, cleanup' (#2) from release-prep into rebrand-and-docs
Reviewed-on: #2
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 22:14:30 -07:00
branderson 33b99cafd5 feat(scripts): seed Flashpoint Ultimate before extracting
--seed-ratio and --seed-hours keep aria2c seeding after the download,
stopping at whichever limit comes first, before extraction starts; this
needs no extra disk. The README asks people to seed and explains
long-term seeding with --keep-archives. Re-running with --torrent once
extraction has begun no longer downloads the deleted archives again.
2026-10-13 21:49:27 -07:00
branderson 8d0504f6f2 docs: document prebuilt images, publishing and update checks 2026-10-13 21:20:08 -07:00
branderson cd1d7fbb35 chore: remove leftovers from upstream
Drops the /flash and /html5 sections (old URLs redirect to /browse),
the GitHub star count endpoint, the unused HOME_RECENT_HOURS setting,
upstream's design notes and code review docs, and the issue template's
link to upstream discussions.
2026-10-13 21:19:34 -07:00
branderson 5e7b2bc72e ci: publish images from Gitea Actions; make the update check opt-in
A Gitea workflow builds the app, session manager and streamer images
and pushes them to the instance's registry on pushes to main and on
version tags, reading the registry host at run time. Compose can pull
them with IMAGE_PREFIX. The update checker reads APP_UPDATE_URL instead
of upstream's GitHub releases and is off without it. Upstream's Docker
Hub workflow is removed.
2026-10-13 21:14:42 -07:00
branderson dd60c49dda docs: state hosting requirements and the legal position up front
The README opens with storage, CPU and HTTPS requirements, including the
per-player cost of streaming, and explains Flashpoint's legal standing.
Setup now uses the torrent and Infinity archive from Flashpoint's site,
and the streaming docs reflect the app proxying /stream/.
2026-10-13 21:12:03 -07:00
branderson 8875d4cc0a feat(scripts): check storage first; download only from a supplied torrent
The script no longer carries download links: --torrent takes the
.torrent file from Flashpoint's downloads page, and --infinity the
Infinity archive. Before doing anything it works out the space the
download and extraction need, refuses to start without it, and asks
for confirmation unless --yes is given. It notes Flashpoint's unsettled
legal standing and the user's responsibility.
2026-10-13 21:10:52 -07:00
branderson c5ca8d0efa feat(streaming): proxy /stream/ through the app
The app forwards /stream/ to the session manager, WebSocket upgrades
and the save-sync event stream included, ahead of helmet and
compression. A reverse proxy in front now needs no route of its own
for streams, and the session manager publishes no ports.
2026-10-13 21:08:53 -07:00
branderson 4130adfe58 docs: document Dotcom Arcade, streaming, proxy sign-in and saves
A new README for the combined project with setup from the Flashpoint
Ultimate torrent. New feature docs for streaming, proxy sign-in and
game saves; deployment, upgrade and streaming READMEs updated for the
single compose file; the project renamed throughout.
2026-10-13 19:31:06 -07:00
branderson 5bce9d2785 feat(scripts): download and extract Flashpoint Ultimate
setup-flashpoint.sh downloads the Ultimate torrent with aria2c and
extracts each archive in turn, checking free space first and deleting
it afterwards unless --keep-archives is given. From Base_1.zip it takes
only the database, settings and playlists. --with-infinity adds
Infinity for Linux's software, which streaming needs, without replacing
anything. Re-running resumes where it stopped.
2026-10-13 19:24:42 -07:00
branderson 70f3421418 build: run the app and streaming from one compose file
The app, session manager and streamer are built from source by a single
docker-compose.yml. Streaming is the opt-in "streaming" profile, enabled
by setting STREAMING_API_TOKEN. Replaces the separate production, dev and
streaming compose files.
2026-10-13 19:22:31 -07:00
branderson 05db4313ae chore: rename the project to Dotcom Arcade 2026-10-13 19:19:15 -07:00
branderson 5fc59f1f80 Merge flashpoint-ultimate-server's streaming into streaming/ 2026-10-13 19:16:52 -07:00
branderson 70824fb89d Merge pull request 'Arcade portal shell and discovery homepage' (#6) from portal-phase1 into main
Reviewed-on: branderson/flashpoint-web#6
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 17:37:23 -07:00
branderson 09b76b9414 Merge pull request 'Portal game page with in-place play' (#7) from portal-phase2 into portal-phase1
Reviewed-on: branderson/flashpoint-web#7
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 17:36:51 -07:00
branderson c044f5e9cf feat(portal): game page with in-place play
Game detail and play are one portal page: a stage with the screenshot
and a Play button (or Enter) that loads the game in place, controls
under it, details, plays, rating, tags, favorite and add to playlist,
and related games.
2026-10-13 11:18:25 -07:00
branderson bd47e16138 feat(games): rank related games by shared tags, series and developer 2026-10-13 11:18:24 -07:00
branderson a0b032bc79 fix(portal): drop the description under the mature games switch 2026-10-13 11:15:44 -07:00
branderson 00fb758432 Merge pull request 'Restore Flash and Shockwave streaming on main' (#7) from flash-shockwave-streaming into main
Reviewed-on: branderson/flashpoint-ultimate-server#7
Reviewed-by: branderson <brad@branderson.io>
2026-10-13 11:11:31 -07:00
branderson a7659d7fb8 Size Flash streams to the exact SWF stage
Scaling the display up relied on full screen scaling the movie, but games
that set StageScaleMode.NO_SCALE stay at their native size in full screen,
leaving a small game against black. At the exact stage size, full screen
fits every scale mode and the browser scales the stream.
2026-10-13 11:10:34 -07:00
branderson b996609832 Rewrap streamer README 2026-10-13 11:10:34 -07:00
branderson f6cb5555b6 Stream Shockwave and Flash games, sized from their content
A game is streamable when its platform is allowed (STREAM_PLATFORMS,
default Java, Shockwave and Flash) and its launcher resolves under the same
rules fp-command applies. The display is sized from what it launches:
Director movies including Afterburner .dcr and pre-7 VWCF configs, SWF
headers scaled up to fit 1280x960, a page's largest embed, or a projector's
stage. Dimensions are rounded up to even for H.264.
2026-10-13 11:10:34 -07:00
branderson 046495f3c3 Launch games the way Flashpoint's Linux launcher does
fp-command applies the launcher's rules to any application path: execs.json
mappings, .bat to .sh, and .exe under Wine, resolving paths case-insensitively
and splitting launch commands as the launcher's shell command would. Windows
programs run from a writable per-session mirror of the install, with Director
Prefs and Flash saves linked into the synced saves. OldCPUSimulator, which
hangs under Wine, becomes cpulimit; Flash projectors go full screen; and
Flashpoint Navigator's toolbars are hidden. This replaces the LocalGames case.
2026-10-13 11:10:34 -07:00
branderson 45166899b8 feat(settings): default the site tagline 2026-10-12 19:25:18 -07:00
branderson 24c895e1a0 docs(portal): document the discovery portal, endpoints and mature filter 2026-10-12 18:41:40 -07:00
branderson ee6fb4e951 feat(portal): arcade portal shell and discovery homepage
Chilled color scheme as swappable tokens, Fredoka wordmark with a
configurable tagline, genre categories, search and random hotkeys.
The homepage offers a Game of the Day, a Time Machine with a date
picker, recently played games and Flashpoint playlist shelves.
Mature games are hidden unless opted in from the user menu, stored
in the browser and the account. Browse lists default to a seeded
shuffle and accept release date ranges.
2026-10-12 18:09:20 -07:00
branderson d65f25aa2a feat(discovery): mature filter, release ranges, seeded shuffle and discovery endpoints 2026-10-12 17:44:53 -07:00
branderson 6781e2ae19 Merge pull request 'Keep players' game saves on their account' (#5) from account-saves into main
Reviewed-on: branderson/flashpoint-web#5
Reviewed-by: branderson <brad@branderson.io>
2026-10-12 16:37:13 -07:00
branderson 3ab6e05a00 fix(saves): leave Selkies settings out of game saves
The streaming client in a streamed game's iframe shares the app's origin and
keeps its settings in localStorage under its page address, which includes
the session. Those keys changed during play, so they were attributed to the
game and a new batch joined its save every session. Exclude them, and drop
any already recorded when gathering a save.
2026-10-12 16:17:09 -07:00
branderson 1e098674d8 feat(saves): keep players' game saves on their account
Saves games keep in the browser now sync with the signed-in player's
account: Ruffle SharedObjects and HTML5 localStorage, IndexedDB databases
(exported and imported whole, typed arrays and blobs included), and streamed
games' save files. Games share the app's origin, so storage that changes
while a game runs is attributed to it. Before a game starts, the account's
save is loaded unless this browser has a newer one; changes upload as they
happen; and a Saves dialog in the player restores any of the last 10, keeping
the save it replaces as a backup.
2026-10-12 16:17:09 -07:00
branderson 0980b789d5 feat(saves): store game saves on the player's account
Adds game_save_snapshots and /api/game-saves for copies of the saves games
keep in a player's browser. An upload matching the current save is a no-op,
the newest 10 snapshots per user and game are kept as backups, and saves may
be up to 10 MB, so the router parses its own bodies past the app's 1 MB JSON
limit.
2026-10-12 16:17:09 -07:00
branderson 62169a4ff7 Merge pull request 'Stop the I'm Feeling Lucky button animating' (#4) from calm-lucky-button into main
Reviewed-on: branderson/flashpoint-web#4
Reviewed-by: branderson <brad@branderson.io>
2026-10-12 02:18:18 -07:00
branderson 36d1c67bb0 fix(ui): stop the I'm Feeling Lucky button animating
The button bounced and pulsed continuously, which is distracting,
especially beside a running game. It keeps its hover effects.
2026-10-12 02:14:38 -07:00
branderson d735263741 Merge pull request 'Sign in through an authenticating reverse proxy' (#3) from trusted-header-login into main
Reviewed-on: branderson/flashpoint-web#3
Reviewed-by: branderson <brad@branderson.io>
2026-10-12 02:09:00 -07:00
branderson a1f53c5d1e fix(auth): read a repeated trusted header as one value, refuse conflicts
A proxy that sets the username header twice, as when Authentik's nginx
snippet and the documented lines are both present, made Node join the values
into "brad, brad" and create an account of that name instead of signing in
brad. Read each occurrence separately: identical repeats count once, and
conflicting ones are refused. The docs now note Authentik's snippet already
sets the headers.
2026-10-12 01:59:31 -07:00
branderson 561e1e641a Merge pull request 'Stream Flash games with the original Flash Player' (#2) from flash-streaming into main
Reviewed-on: branderson/flashpoint-web#2
Reviewed-by: branderson <brad@branderson.io>
2026-10-12 01:45:39 -07:00
branderson 98b2f1a0bb docs(auth): document trusted header login 2026-10-12 01:05:40 -07:00
branderson a6adc61627 feat(auth): sign in through a trusted proxy and let those users set a password
On load, a signed-out visitor first asks the backend to sign them in as the
user an authenticating proxy vouches for, before guest mode or a login
redirect takes over; an explicit logout skips this for the rest of the tab.
Settings gains a password card for signed-in users, where a proxy-signed-in
user can set a password without the current one to log in without the
proxy.
2026-10-12 01:05:40 -07:00
branderson 057192be16 feat(auth): sign in users vouched for by a trusted proxy header
With TRUSTED_HEADER_USERNAME and TRUSTED_PROXIES set, POST
/api/auth/trusted-login signs in the user an authenticating reverse proxy
(such as Authentik forward auth) names in that header, believing it only on
connections from the proxy addresses. Users are matched by username, so an
existing account is adopted; otherwise one is created, the first as admin
as with registration. New accounts get a random password, and a user the
proxy vouches for can set their own password without the current one, to log
in when reached without the proxy.
2026-10-12 00:55:29 -07:00
branderson 1965a1392b feat(streaming): stream Flash with the original player when Ruffle falls short
Flash games Ruffle can play now also report streamable, and the player
offers a switch to the original Flash Player streamed from the server.
Flash games launched from a page, which need the browser plugin, stream
instead of loading a page that can't play, and search no longer hides them
while streaming is enabled.
2026-10-11 17:50:24 -07:00
branderson e333c738ef Merge pull request 'Local games' (#5) from local-games into main
Reviewed-on: branderson/flashpoint-ultimate-server#5
2026-10-11 17:27:59 -07:00
branderson 41cc2bc76d Merge pull request 'Stream Windows games under Wine, starting with Australia Wildlife Rescue' (#4) from wine-games into local-games
Reviewed-on: branderson/flashpoint-ultimate-server#4
Reviewed-by: branderson <brad@branderson.io>
2026-10-11 17:26:12 -07:00
branderson 4c8a23378c Stream LocalGames Windows games at their projector's stage size
The session manager treats a LocalGames .exe as streamable when the file
exists, sizing the display from the Director projector's config chunk.
2026-10-11 16:18:07 -07:00
branderson e0e3b5d4bb Run Windows games from LocalGames under Wine
fp-launch runs a LocalGames .exe with Flashpoint's bundled Wine from a
writable copy, linking its Prefs directory, where Director projectors save,
into the synced saves directory. Players without a save start from the Prefs
the game ships with. The image adds the X, font and PulseAudio libraries the
bundled Wine loads.
2026-10-11 16:18:07 -07:00
branderson 762a8aede1 Merge pull request 'Per-player stream sessions with browser saves' (#2) from stream-sessions into java-streamer
Reviewed-on: branderson/flashpoint-ultimate-server#2
Reviewed-by: branderson <brad@branderson.io>
2026-10-11 02:42:25 -07:00
branderson 52e90ba164 Read the Flashpoint database with node:sqlite
better-sqlite3 has no prebuilt binary for the image's Node version and
node:24-slim can't compile it. The built-in module needs no native build.
2026-10-11 02:07:00 -07:00
branderson 3b4b9623f8 Merge pull request 'Stream games that can't run in a browser' (#1) from stream-sessions into main
Reviewed-on: branderson/flashpoint-web#1
Reviewed-by: branderson <brad@branderson.io>
2026-10-11 01:02:18 -07:00
branderson 5c5b11722d docs(streaming): document the session manager settings 2026-10-11 01:01:27 -07:00
branderson 4e21ec1529 feat(streaming): play streamed games in the player and keep their saves in the browser
Games the backend reports as streamable get a Play button. The player starts
a stream session, embeds the stream, and keeps the game's saves in
IndexedDB: sent when the session starts and updated as the server pushes
changes.
2026-10-11 01:01:27 -07:00
branderson f59621dc82 feat(streaming): report and start streamed sessions for games that can't run in a browser
Games on other platforms (Java applets first) can be played through a
session manager that streams them from a server-side container. When
STREAMING_API_URL and STREAMING_API_TOKEN are set, game details and launch
data report whether a game is streamable, and POST /games/:id/stream-session
starts a session.
2026-10-11 01:01:27 -07:00
branderson aadd6fe776 Let flashpoint-web ask whether a game can be streamed 2026-10-11 00:39:05 -07:00
branderson f5e9452191 Add session manager for per-player streams
Creates a streamer container per player on flashpoint-web's request, sized
to the game's applet, proxies its Selkies stream under /stream/<id>/, and
removes it when the player disconnects. Saves under /config/saves are
seeded from the browser at start and pushed back over server-sent events.
2026-10-11 00:37:44 -07:00
branderson 59d9ec5b4a Persist applet cookies to /config/saves
The JSObject stand-in kept cookies in memory, so saves were lost when the
game restarted. Write them to a file the session manager can sync, with the
policy granting only the agent jar access to that directory.
2026-10-11 00:33:10 -07:00
branderson 46ff37e7fb Strip appletviewer's menu bar and status line
A Java agent removes them when the viewer window opens, so the stream
shows only the applet. JSObject moves into the agent jar, which puts it on
the class path applets load from.
2026-10-11 00:22:16 -07:00
branderson ffd24cb667 Lock the stream to the game window's size
Following the browser's resolution left a small applet in the corner of a
large display and made the CPU encoder fall seconds behind.
2026-10-11 00:14:34 -07:00
branderson dca48bce51 Run applets that use LiveConnect or load images through the proxy
appletviewer has no netscape.javascript.JSObject, so applets that touch
JavaScript fail to load, and Java 8 denies applets the URLPermission they
need to fetch through an HTTP proxy. Add a JSObject stand-in with a working
document.cookie and a policy granting HTTP URL access.
2026-10-11 00:07:06 -07:00
branderson b0751fdbb1 Add Selkies streamer prototype for Java games
Runs a Flashpoint game natively in a container and streams it to the
browser. fp-launch follows the Linux launcher's sequence: start the game
server, mount the game's zip, and run startJava.sh through the proxy.
2026-10-10 23:36:13 -07:00