A project can be released as a link that plays only the game: no editor, no sign-in, just the game view filling the browser window.
Decisions (agreed in chat)
Frozen copy, not live. Publishing copies the saved project to data/releases/<token>.json. Edits made in the editor afterwards reach players only after "Update release". A half-finished change never lands in front of a player.
One link per project, which stays the same when the release is updated. The token is random (128 bit) and cannot be guessed. "Take down" makes the link dead.
UI: the main menu gets "Release…", a dialog with the link and a copy button, "Publish" or "Update release" (with the date of the released copy) and "Take down".
Start: the game always starts in the project's start scene. "Play from: active scene" only applies in the editor.
"Click to play" before the start: browsers allow no sound without a click, and the keyboard would have no focus.
Persistent variables get their own save area per link, separate from the editor's test runs.
Plugins are not loaded in this first version. If a project uses plugins, the dialog warns.
Not in this step: fullscreen button, touch controls, zoom modes other than Auto, export as ZIP.
Page
Own page play.html with its own bundle (Vite multi-page): Pixi and the runtime, not the editor.
Body background Theme.colors.background, one canvas over the whole window.
Zoom: Auto only, i.e. the largest zoom step that fits entirely, no fit.
The drawing code of the game view is shared with the editor, so there is one drawing path and no copy that drifts apart.
API
GET ?r=releases/{token}: the only route without a sign-in. Returns the released copy.
GET/POST/DELETE ?r=projects/{id}/release: state, publish or update, take down. Whoever may load the project may release it.
Deleting a project takes its release down.
A project can be released as a link that plays only the game: no editor, no sign-in, just the game view filling the browser window.
## Decisions (agreed in chat)
1. **Frozen copy, not live.** Publishing copies the saved project to `data/releases/<token>.json`. Edits made in the editor afterwards reach players only after "Update release". A half-finished change never lands in front of a player.
2. **One link per project**, which stays the same when the release is updated. The token is random (128 bit) and cannot be guessed. "Take down" makes the link dead.
3. **UI:** the main menu gets "Release…", a dialog with the link and a copy button, "Publish" or "Update release" (with the date of the released copy) and "Take down".
4. **Start:** the game always starts in the project's start scene. "Play from: active scene" only applies in the editor.
5. **"Click to play"** before the start: browsers allow no sound without a click, and the keyboard would have no focus.
6. **Persistent variables** get their own save area per link, separate from the editor's test runs.
7. **Plugins are not loaded** in this first version. If a project uses plugins, the dialog warns.
8. **Not in this step:** fullscreen button, touch controls, zoom modes other than Auto, export as ZIP.
## Page
- Own page `play.html` with its own bundle (Vite multi-page): Pixi and the runtime, not the editor.
- Body background `Theme.colors.background`, one canvas over the whole window.
- Zoom: **Auto** only, i.e. the largest zoom step that fits entirely, no fit.
- The drawing code of the game view is shared with the editor, so there is one drawing path and no copy that drifts apart.
## API
- `GET ?r=releases/{token}`: the only route without a sign-in. Returns the released copy.
- `GET/POST/DELETE ?r=projects/{id}/release`: state, publish or update, take down. Whoever may load the project may release it.
- Deleting a project takes its release down.
admin
added this to the Development project 2026-09-29 13:00:21 +02:00
admin
moved this to Next in Development on 2026-09-29 13:00:34 +02:00
Main menu → Release… opens a dialog with the state (not released, released and up to date, or changed since), the link with Copy link and Open, Publish / Update release and Take down (with a confirmation).
Publish saves first. While anything is unsaved, nothing is published.
The link is https://nockal.com/game-maker/play.html?game=<32 hex>. It stays the same on update. After take down and publishing again there is a new one.
The player page needs no login and shows only the game on Theme.colors.background:
Zoom Auto, the largest step where the whole camera fits.
"Click to play" before the start, by click or Enter. The caption size is Theme.captionSize.
All keys belong to the game, Tab included. After Stop game it offers "Click to play again".
The game always starts in the start scene. Persistent variables are stored per link in the browser. Plugins are not loaded, the dialog warns about that and about a project without a scene.
Zoom steps are now 25, 50, 100, 200, 300, 400, 500 and 600%, in the game tab, Auto in the editor and the game link.
Under the hood
Starting, the frame and Load scene live in src/runtime/GameRun.ts, shared by Play in the editor and the player page.
WorldViewport moved to src/viewport/ and no longer needs the EditorState. gamePointer.ts and projectFiles.ts exist once for both.
API: GET ?r=releases/{token} is the only route besides auth/* without a session. The public answer carries the token as project.id. Release files are stored with 0640, nginx does not serve them directly (measured 403).
Tests
./check.sh → 194 files, 2808 tests, CHECK EXIT 0
php releases.test.php → ALL PASSED – 20 checks (also in CI)
full e2e run (local) → ALL PASSED – 1574 checks
New e2e module 60 with real mouse and keyboard in a browser without session: publish, update, take down, page colour, no __gm on the player page, zoom 4 for a 300x180 camera, arrow key moves the crate, s stops, caption size and cursor, dead link.
Counter-checks: 3 unit, 2 PHP (0644 file mode, new token on every publish), 3 browser (project id in the public answer, fit instead of auto, no keyboard). All fail as expected.
Found on the way, not fixed:data/projects/<id>.json and the snapshot files are readable without login (HTTP 200, mode 0644).
Done in `4194f3e` and `24d360a`, wiki `d0ed6bd`.
**What you get**
- **Main menu → Release…** opens a dialog with the state (not released, released and up to date, or changed since), the link with **Copy link** and **Open**, **Publish** / **Update release** and **Take down** (with a confirmation).
- Publish saves first. While anything is unsaved, nothing is published.
- The link is `https://nockal.com/game-maker/play.html?game=<32 hex>`. It stays the same on update. After take down and publishing again there is a new one.
- **The player page** needs no login and shows only the game on `Theme.colors.background`:
- Zoom **Auto**, the largest step where the whole camera fits.
- "Click to play" before the start, by click or Enter. The caption size is `Theme.captionSize`.
- All keys belong to the game, Tab included. After `Stop game` it offers "Click to play again".
- The game always starts in the start scene. Persistent variables are stored per link in the browser. Plugins are not loaded, the dialog warns about that and about a project without a scene.
- Zoom steps are now 25, 50, 100, 200, **300**, 400, **500** and **600**%, in the game tab, Auto in the editor and the game link.
**Under the hood**
- Starting, the frame and `Load scene` live in `src/runtime/GameRun.ts`, shared by Play in the editor and the player page.
- `WorldViewport` moved to `src/viewport/` and no longer needs the `EditorState`. `gamePointer.ts` and `projectFiles.ts` exist once for both.
- API: `GET ?r=releases/{token}` is the only route besides `auth/*` without a session. The public answer carries the token as `project.id`. Release files are stored with 0640, nginx does not serve them directly (measured 403).
**Tests**
```
./check.sh → 194 files, 2808 tests, CHECK EXIT 0
php releases.test.php → ALL PASSED – 20 checks (also in CI)
full e2e run (local) → ALL PASSED – 1574 checks
```
- New e2e module 60 with real mouse and keyboard in a browser without session: publish, update, take down, page colour, no `__gm` on the player page, zoom 4 for a 300x180 camera, arrow key moves the crate, `s` stops, caption size and cursor, dead link.
- Counter-checks: 3 unit, 2 PHP (0644 file mode, new token on every publish), 3 browser (project id in the public answer, `fit` instead of `auto`, no keyboard). All fail as expected.
**Found on the way, not fixed:** `data/projects/<id>.json` and the snapshot files are readable without login (HTTP 200, mode 0644).
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.
A project can be released as a link that plays only the game: no editor, no sign-in, just the game view filling the browser window.
Decisions (agreed in chat)
data/releases/<token>.json. Edits made in the editor afterwards reach players only after "Update release". A half-finished change never lands in front of a player.Page
play.htmlwith its own bundle (Vite multi-page): Pixi and the runtime, not the editor.Theme.colors.background, one canvas over the whole window.API
GET ?r=releases/{token}: the only route without a sign-in. Returns the released copy.GET/POST/DELETE ?r=projects/{id}/release: state, publish or update, take down. Whoever may load the project may release it.Done in
4194f3eand24d360a, wikid0ed6bd.What you get
https://nockal.com/game-maker/play.html?game=<32 hex>. It stays the same on update. After take down and publishing again there is a new one.Theme.colors.background:Theme.captionSize.Stop gameit offers "Click to play again".Under the hood
Load scenelive insrc/runtime/GameRun.ts, shared by Play in the editor and the player page.WorldViewportmoved tosrc/viewport/and no longer needs theEditorState.gamePointer.tsandprojectFiles.tsexist once for both.GET ?r=releases/{token}is the only route besidesauth/*without a session. The public answer carries the token asproject.id. Release files are stored with 0640, nginx does not serve them directly (measured 403).Tests
__gmon the player page, zoom 4 for a 300x180 camera, arrow key moves the crate,sstops, caption size and cursor, dead link.fitinstead ofauto, no keyboard). All fail as expected.Found on the way, not fixed:
data/projects/<id>.jsonand the snapshot files are readable without login (HTTP 200, mode 0644).