ForkOrFry is a local-first browser-extension fork of Hurry Curry for single-player play.
It is still very beta. The game is not fully working yet, but the direction is clear: run inside an extension-owned surface, keep progress local, and remove the server dependency from the shipped experience.
Project links: Contributing · Security · Code of Conduct · Releases
Need to report something? Open a bug report or suggest a feature.
- a browser extension build, not a full-tab web app
- a single-player fork with bots replacing remote players over time
- a local-only runtime that persists progress inside the browser
- an upstream-derived port of Hurry Curry, trimmed for the burger level
Latest prerelease: v0.0.1-beta.1
What works today:
- the extension can load the bundled Godot web export offline
- the host shell can open inside the browser extension UI
- local bootstrap, pause/resume, checkpoint, and reset flows are in place
- the real game scene can be reached from the extension runtime path
What is still rough:
- gameplay is not yet fully local-authoritative after spawn
- multiplayer/server assumptions are still being removed from the live runtime
- the polished player-facing experience is still a work in progress
This repo currently uses npm for the extension workflow.
- Run
npm installinextension/. - Run
npm run buildinextension/. - Open
about:debugging#/runtime/this-firefoxin Firefox. - Click Load Temporary Add-on.
- Select
extension/dist/firefox-mv3/manifest.json. - Open the extension popup and start from the host surface.
extension/— extension app, popup UI, runtime host, runtime frame, tests, packaging scriptsdocs/— AMO and project documentation.upstream-reference/— read-only upstream reference copyLICENSE/THIRD_PARTY_NOTICES.md— licensing and attribution
flowchart LR
PU[Extension popup UI] --> BG[Background trigger and launch control]
BG --> PW[Host page in popup window]
BG --> FT[Host page in full tab - debug only]
PW --> RH[runtime-host controller]
FT --> RH
RH --> RF[runtime-frame iframe]
RF --> UA[upstream local adapter]
UA --> GE[Bundled Godot web export]
GE --> LS[local single-player session]
RH --> ST[browser.storage.local]
LS --> ST
The intended shipped surfaces are the popup and side-panel-style extension flow around the runtime host. The full-tab path stays available only as a temporary debug surface for transfer/testing and is not the production runtime target.
- Node.js
^20.19.0 || >=22.12.0 - npm
zip/unzip- Firefox for temporary loading and manual verification
cd extension
npm installcd extension
npm run dev
npm run build
npm test
npm run lint
npm run export:godot-web
npm run sync:godot-web-export -- /absolute/path/to/godot-web-export
npm run package:firefoxThe bundled Godot web export lives under:
extension/public/upstream/hurrycurry-web/
Two workflows matter right now:
npm run sync:godot-web-export -- /absolute/path/to/godot-web-export- copies an already-exported Godot web build into the extension package
npm run export:godot-web- builds a writable temp copy of the upstream client
- overlays tracked local patches from
extension/upstream/hurrycurry-client-overlay/ - exports a fresh Godot web build
- syncs it into
extension/public/upstream/hurrycurry-web/
The sync/export path writes a manifest.json so runtime-frame.html can load the bundled export offline.
- Load the temporary add-on in Firefox.
- Open the toolbar popup and click Arm idle trigger.
- Let Firefox enter the configured idle state.
- Return to activity and confirm the host opens or refocuses.
- Use Move to full tab only as a debug/dev check and confirm the run transfers.
- Close and reopen the active surface to confirm checkpoint resume.
- keep changes aligned with the extension-hosted, single-player, local-only direction
- do not reintroduce server or multiplayer runtime requirements
- do not add Docker or Rust-server runtime dependencies to the shipped path
- preserve the host/runtime seam while replacing the child runtime
- prefer small, verifiable slices
- update docs when the product direction changes materially
The upstream hurrycurry project is AGPL-3.0-only. This repo is being prepared for AGPL-3.0-only distribution as the safest baseline for bundling and modifying that code for local extension distribution.