Release preparation, stacked on #1, so the diff shows only these changes.
Legal: the setup script carries no download links
scripts/setup-flashpoint.sh no longer has the Ultimate torrent's or Infinity's URL built in. Users download the .torrent file and the Infinity archive from Flashpoint's own downloads page and pass them in (--torrent, --infinity). The script then only checks space, downloads what that torrent describes, extracts and organizes. Hardcoding the torrent made it a tool for fetching "every Flash game", and that was the riskiest version.
The script header and a new Legal section in the README say four things:
Flashpoint's legal standing is unsettled.
Dotcom Arcade contains no games and links to no game downloads.
Users are responsible for complying with copyright law where they live.
Removal requests go to Flashpoint.
This lowers the risk but doesn't remove it. Only legal advice settles that.
Storage and hosting requirements, up front
The README opens with a warning and a requirements table:
storage: more than 2.3 TB, or 4.6 TB keeping the archives;
time: a day or more;
the base server;
streaming: roughly 1 to 2 CPU cores, 1 GB of RAM and a few Mbps of upload per player streaming at once, since each runs the game and encodes video on the CPU;
HTTPS.
The deployment guide and streaming guide repeat the requirements where they're relevant.
The setup script checks the space first, before downloading anything. It sizes the download from the torrent (aria2c -S), works out what each disk needs given --keep-archives and whether downloads and the destination share a disk, and refuses to start without the room. Then it asks for confirmation, unless --yes is given; without a terminal it requires --yes. A re-run with nothing left to do skips all of this.
The per-player CPU figure is an estimate, not a measurement. Watching docker stats on flashbox during a stream would confirm or correct it.
Seeding
New flags:--seed-ratio N and --seed-hours N keep aria2c seeding after the download, stopping at whichever limit comes first, and then extraction begins. Seeding before extracting needs no extra disk. A ratio of 0 is refused, because aria2c reads it as "seed forever".
README: a "Please seed" section covers the flags, long-term seeding with --keep-archives and a regular torrent client, and opening ports 6881-6999.
Reminder: when someone downloads without seeding, the script suggests it at the end.
Fixed: re-running with --torrent after extraction had started would have downloaded the deleted archives again. The script now skips the download step in that case.
The app proxies /stream/
The backend forwards /stream/ to the session manager, including WebSocket upgrades and the save-sync event stream. It's mounted ahead of helmet and compression, which would break the Selkies page and the event stream, and long-lived stream connections are exempt from the server's idle timeout. With that:
The session manager publishes no ports at all; only the app reaches it over the compose network.
A reverse proxy in front needs no special route, just WebSocket support and long timeouts.
Configured with STREAMING_STREAM_URL, which compose defaults to http://session-manager:8081.
Gitea CI and images
.gitea/workflows/images.yml builds the app, session manager and streamer images and pushes them to the Gitea instance's registry under the repository owner. Pushes to main publish a main tag; v* tags publish versions and latest. The registry host comes from the runner's server URL, so no hostname is committed. It needs repository secrets REGISTRY_USERNAME and REGISTRY_TOKEN (package write), and Actions with a runner enabled on the repo.
Prebuilt images: compose can pull them with IMAGE_PREFIX. It still builds from source by default.
Old workflow removed: upstream's Docker Hub workflow is gone. A GitHub workflow can come back when the repo is mirrored there.
Update checker: it now reads APP_UPDATE_URL, a GitHub- or Gitea-style "latest release" API URL. It's off when that's unset, and the Settings card then hides itself, so nobody gets pointed at upstream's releases.
Leftovers removed
Old sections: the /flash and /html5 sections and their views. Old URLs redirect to the same path under /browse, so /flash/<id>/play becomes /browse/<id>/play.
Stars endpoint: the GitHub star count endpoint and its docs.
HOME_RECENT_HOURS: unused since the old homepage went.
Upstream docs:docs/superpowers (design notes) and docs/13-code-reviews.
Upstream links: the issue template's link to upstream discussions, and the upstream-specific paths in CLAUDE.md.
Testing
Backend: 266 tests pass. They include new stream proxy tests against a stand-in session manager:
HTTP forwarding with the full path;
other routes untouched;
WebSocket upgrade;
502 when it's down.
There's also a test that update checks are skipped without a source.
Frontend: 163 tests pass, typecheck passes, and lint is unchanged.
The setup script passes shellcheck. I ran it against small archives built to match Ultimate's layout:
a 9 TB torrent (fake aria2c) is refused;
a small one passes the check;
no --yes without a terminal refuses;
extraction and Base_1.zip selection still work;
a re-run is quiet;
the seeding flags reach aria2c as --seed-ratio/--seed-time, with --seed-hours alone seeding for that long regardless of ratio;
a re-run mid-extraction doesn't download again.
Compose and the workflow parse as YAML. With no Docker or Gitea runner in the sandbox, the real stack and the workflow are untested. The first push to main after merging is the workflow's first run.
**Summary generated by LLM agent**
Release preparation, stacked on #1, so the diff shows only these changes.
## Legal: the setup script carries no download links
`scripts/setup-flashpoint.sh` no longer has the Ultimate torrent's or Infinity's URL built in. Users download the `.torrent` file and the Infinity archive from Flashpoint's own downloads page and pass them in (`--torrent`, `--infinity`). The script then only checks space, downloads what that torrent describes, extracts and organizes. Hardcoding the torrent made it a tool for fetching "every Flash game", and that was the riskiest version.
The script header and a new Legal section in the README say four things:
- Flashpoint's legal standing is unsettled.
- Dotcom Arcade contains no games and links to no game downloads.
- Users are responsible for complying with copyright law where they live.
- Removal requests go to Flashpoint.
This lowers the risk but doesn't remove it. Only legal advice settles that.
## Storage and hosting requirements, up front
- **The README opens with a warning and a requirements table:**
- storage: more than 2.3 TB, or 4.6 TB keeping the archives;
- time: a day or more;
- the base server;
- streaming: roughly 1 to 2 CPU cores, 1 GB of RAM and a few Mbps of upload per player streaming at once, since each runs the game and encodes video on the CPU;
- HTTPS.
- **The deployment guide and streaming guide** repeat the requirements where they're relevant.
- **The setup script checks the space first,** before downloading anything. It sizes the download from the torrent (`aria2c -S`), works out what each disk needs given `--keep-archives` and whether downloads and the destination share a disk, and refuses to start without the room. Then it asks for confirmation, unless `--yes` is given; without a terminal it requires `--yes`. A re-run with nothing left to do skips all of this.
The per-player CPU figure is an estimate, not a measurement. Watching `docker stats` on flashbox during a stream would confirm or correct it.
## Seeding
- **New flags:** `--seed-ratio N` and `--seed-hours N` keep aria2c seeding after the download, stopping at whichever limit comes first, and then extraction begins. Seeding before extracting needs no extra disk. A ratio of 0 is refused, because aria2c reads it as "seed forever".
- **README:** a "Please seed" section covers the flags, long-term seeding with `--keep-archives` and a regular torrent client, and opening ports 6881-6999.
- **Reminder:** when someone downloads without seeding, the script suggests it at the end.
- **Fixed:** re-running with `--torrent` after extraction had started would have downloaded the deleted archives again. The script now skips the download step in that case.
## The app proxies `/stream/`
The backend forwards `/stream/` to the session manager, including WebSocket upgrades and the save-sync event stream. It's mounted ahead of helmet and compression, which would break the Selkies page and the event stream, and long-lived stream connections are exempt from the server's idle timeout. With that:
- The session manager publishes no ports at all; only the app reaches it over the compose network.
- A reverse proxy in front needs no special route, just WebSocket support and long timeouts.
Configured with `STREAMING_STREAM_URL`, which compose defaults to `http://session-manager:8081`.
## Gitea CI and images
- **`.gitea/workflows/images.yml`** builds the app, session manager and streamer images and pushes them to the Gitea instance's registry under the repository owner. Pushes to `main` publish a `main` tag; `v*` tags publish versions and `latest`. The registry host comes from the runner's server URL, so no hostname is committed. It needs repository secrets `REGISTRY_USERNAME` and `REGISTRY_TOKEN` (package write), and Actions with a runner enabled on the repo.
- **Prebuilt images:** compose can pull them with `IMAGE_PREFIX`. It still builds from source by default.
- **Old workflow removed:** upstream's Docker Hub workflow is gone. A GitHub workflow can come back when the repo is mirrored there.
- **Update checker:** it now reads `APP_UPDATE_URL`, a GitHub- or Gitea-style "latest release" API URL. It's off when that's unset, and the Settings card then hides itself, so nobody gets pointed at upstream's releases.
## Leftovers removed
- **Old sections:** the `/flash` and `/html5` sections and their views. Old URLs redirect to the same path under `/browse`, so `/flash/<id>/play` becomes `/browse/<id>/play`.
- **Stars endpoint:** the GitHub star count endpoint and its docs.
- **`HOME_RECENT_HOURS`:** unused since the old homepage went.
- **Upstream docs:** `docs/superpowers` (design notes) and `docs/13-code-reviews`.
- **Upstream links:** the issue template's link to upstream discussions, and the upstream-specific paths in `CLAUDE.md`.
## Testing
- Backend: 266 tests pass. They include new stream proxy tests against a stand-in session manager:
- HTTP forwarding with the full path;
- other routes untouched;
- WebSocket upgrade;
- 502 when it's down.
There's also a test that update checks are skipped without a source.
- Frontend: 163 tests pass, typecheck passes, and lint is unchanged.
- The setup script passes shellcheck. I ran it against small archives built to match Ultimate's layout:
- a 9 TB torrent (fake `aria2c`) is refused;
- a small one passes the check;
- no `--yes` without a terminal refuses;
- extraction and `Base_1.zip` selection still work;
- a re-run is quiet;
- the seeding flags reach aria2c as `--seed-ratio`/`--seed-time`, with `--seed-hours` alone seeding for that long regardless of ratio;
- a re-run mid-extraction doesn't download again.
- Compose and the workflow parse as YAML. With no Docker or Gitea runner in the sandbox, the real stack and the workflow are untested. The first push to `main` after merging is the workflow's first run.
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.
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.
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/.
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.
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.
--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.
branderson
approved these changes 2026-10-13 22:14:25 -07:00
branderson
merged commit c49fd1e4e9 into rebrand-and-docs2026-10-13 22:14:31 -07:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary generated by LLM agent
Release preparation, stacked on #1, so the diff shows only these changes.
Legal: the setup script carries no download links
scripts/setup-flashpoint.shno longer has the Ultimate torrent's or Infinity's URL built in. Users download the.torrentfile and the Infinity archive from Flashpoint's own downloads page and pass them in (--torrent,--infinity). The script then only checks space, downloads what that torrent describes, extracts and organizes. Hardcoding the torrent made it a tool for fetching "every Flash game", and that was the riskiest version.The script header and a new Legal section in the README say four things:
This lowers the risk but doesn't remove it. Only legal advice settles that.
Storage and hosting requirements, up front
aria2c -S), works out what each disk needs given--keep-archivesand whether downloads and the destination share a disk, and refuses to start without the room. Then it asks for confirmation, unless--yesis given; without a terminal it requires--yes. A re-run with nothing left to do skips all of this.The per-player CPU figure is an estimate, not a measurement. Watching
docker statson flashbox during a stream would confirm or correct it.Seeding
--seed-ratio Nand--seed-hours Nkeep aria2c seeding after the download, stopping at whichever limit comes first, and then extraction begins. Seeding before extracting needs no extra disk. A ratio of 0 is refused, because aria2c reads it as "seed forever".--keep-archivesand a regular torrent client, and opening ports 6881-6999.--torrentafter extraction had started would have downloaded the deleted archives again. The script now skips the download step in that case.The app proxies
/stream/The backend forwards
/stream/to the session manager, including WebSocket upgrades and the save-sync event stream. It's mounted ahead of helmet and compression, which would break the Selkies page and the event stream, and long-lived stream connections are exempt from the server's idle timeout. With that:Configured with
STREAMING_STREAM_URL, which compose defaults tohttp://session-manager:8081.Gitea CI and images
.gitea/workflows/images.ymlbuilds the app, session manager and streamer images and pushes them to the Gitea instance's registry under the repository owner. Pushes tomainpublish amaintag;v*tags publish versions andlatest. The registry host comes from the runner's server URL, so no hostname is committed. It needs repository secretsREGISTRY_USERNAMEandREGISTRY_TOKEN(package write), and Actions with a runner enabled on the repo.IMAGE_PREFIX. It still builds from source by default.APP_UPDATE_URL, a GitHub- or Gitea-style "latest release" API URL. It's off when that's unset, and the Settings card then hides itself, so nobody gets pointed at upstream's releases.Leftovers removed
/flashand/html5sections and their views. Old URLs redirect to the same path under/browse, so/flash/<id>/playbecomes/browse/<id>/play.HOME_RECENT_HOURS: unused since the old homepage went.docs/superpowers(design notes) anddocs/13-code-reviews.CLAUDE.md.Testing
Backend: 266 tests pass. They include new stream proxy tests against a stand-in session manager:
There's also a test that update checks are skipped without a source.
Frontend: 163 tests pass, typecheck passes, and lint is unchanged.
The setup script passes shellcheck. I ran it against small archives built to match Ultimate's layout:
aria2c) is refused;--yeswithout a terminal refuses;Base_1.zipselection still work;--seed-ratio/--seed-time, with--seed-hoursalone seeding for that long regardless of ratio;Compose and the workflow parse as YAML. With no Docker or Gitea runner in the sandbox, the real stack and the workflow are untested. The first push to
mainafter merging is the workflow's first run.