-
-
Notifications
You must be signed in to change notification settings - Fork 0
Install and host
QBSheet is a static web application. It needs no backend server. You can host it on any static host, and you can also open a build from a local directory.
You need Node 20 or a later version.
git clone https://github.com/gbyo/qbsheet.gitcd qbsheet && npm ciThen run the checks and the build:
npm run lintnpm run typechecknpm test -- --runnpm run buildThe build writes the site to dist/.
Vite writes relative asset paths by default. So one build works at the root of a domain, below a repository path, and from a local directory.
A deployment that needs an absolute path can set BASE_PATH:
BASE_PATH=/qbsheet/ npm run buildRun this form of the build before a pull request. It catches a change that only works at the root of a domain.
- Open the repository settings.
- Open the Pages section.
- Set the source to GitHub Actions.
The workflow publishes dist/ with the official Pages actions. It needs no repository secret.
The build creates a service worker. It works like this:
- It precaches the application shell and the content-hashed assets.
- It uses a network-first strategy for a navigation, with the cached shell as the offline fallback.
- It never caches a response from a tournament control server.
The last rule is deliberate. A cached assignment or a cached acknowledgement is a correctness bug, not a performance win. It is a confident wrong answer.
npm startVite normally serves the application at http://localhost:5173.
The application is fully usable with a QBJ file and no server at all. Open a game file and score.
- Start the Local Tournament Server in Fruity.
- Add the Vite address to the QBSheet origin setting of that server.
- Type the local network address of the server in the scoresheet.
The origin allowlist covers CORS only. A room credential and a session credential still authenticate every room operation.
Keep these constraints. They are features, not current limits.
- No analytics, no telemetry, no font host, and no script host.
- No call to any origin except a tournament control server that the operator typed in.
- The assets must work at the root of a domain, below a repository path, and from a local directory.
- The application must stay usable when storage is unavailable. It then says that storage is not durable.
The repository also publishes a browser-independent core. Fruity consumes it as a Git dependency, so the desktop application and the browser application run the same scoring engine.
npm run build:coreThe entry point is src/core/index.ts. It must stay free of React imports, DOM imports, and
persistence imports.
QBSheet · AGPL-3.0-or-later · The specifications in
docs/ are normative. This wiki is a guide.
Report a security problem with
SECURITY.md. Do not open a public issue
for a security problem.