This release is a pre-release and may not be stable for production use.
yeaboi-frontend
Every browser-facing surface of yeaboi: the retro and poker live boards, the share gate, the reporting slide deck, the supervised-ship board, and the static HTML exports. Preact + TypeScript, built with Vite.
Published to PyPI as yeaboi-web-assets — a data-only wheel holding one .js and one .css per
entry. That is how the bundles reach a pip install yeaboi on a machine with no Node.
make install # npm ci
make dev # Vite on :5399 with HMR, proxying /api to a yeaboi dev board
make test # typecheck (incl. the enums --check) + vitest
make build # the six bundles, into yeaboi_web_assets/static/
make ship-gate # the full local gate: lint, format-check, test, build, contracts, wheel
The bundles are self-contained, and that is not a style rule
No CDN, no external <link>, no eval/new Function, no dynamic import(), classic IIFE rather
than ESM. An exported report is opened over file://, where a type="module" script does not
execute at all, and a tunnel-served board runs under a CSP with no external origins and no eval.
Both failures are invisible on localhost and on a LAN; they show up only for the teammate on the
tunnel or the person who opens a report from disk months later.
vite.config.ts is written to enforce this (cssCodeSplit: false, modulePreload: false, an
assetsInlineLimit high enough that every asset becomes a data: URI). The assertions live in the
yeaboi repo's tests/unit/test_web_assets.py, which runs them against whatever is actually
installed — so what is checked is what ships, not what this repo happened to build.
Two artifacts come from yeaboi, and neither is edited here
contracts/web/ is vendored from yeaboi and pinned by
sha in .contracts-rev. make contracts-check fails if a vendored file was edited in place, and
notes when the pin has fallen behind upstream.
enums.json— the tuples the server validates against (retro grids, reaction emoji, avatars, the poker deck, evidence sources, the two terminal fonts).scripts/gen-enums.mjsrenderssrc/types/enums.tsfrom it;npm run typecheckruns--checkfirst, so a stale file fails before anything reads it. Never editsrc/types/enums.ts.fixtures/— snapshots of what the server actually sends, written by a Python test that drives real boards through a real round.src/test/fixtures/wire.tsasserts each onesatisfiesits interface intypes/board.ts, so a response field that quietly stopped being sent fails the typecheck here rather than renderingundefinedto somebody on a tunnel.
Both are reached through the @contracts alias — declared in vite.config.ts and tsconfig.json,
which must agree. Changing a board tuple is a yeaboi PR first, then make contracts-sync here.
make contracts-sync # re-vendor from the tip of yeaboi, record the sha
make gen-enums # re-render src/types/enums.ts from the vendored contract
Releasing
.github/workflows/publish.yml publishes to PyPI over trusted publishing (OIDC) — no token,
nothing to rotate. It fires when a merge to main carries a version in pyproject.toml that PyPI
does not already have. workflow_dispatch with a suffix input (rc1) builds a pre-release without
committing the suffix anywhere.
The wheel is built from bundles produced moments earlier in the same job; the build output is not
committed. make wheel-check builds the real wheel, installs it into a throwaway environment and
resolves the files the way yeaboi does — because .gitignore doubles as hatchling's exclude list,
and a missing artifacts entry would ship an empty wheel that installs perfectly and renders
nothing. make dist-check asserts the self-contained rules on the same build, one release earlier
than the yeaboi side can.
Development against a running board
The Python side finds bundles through $YEABOI_WEB_STATIC before anything else, so a sibling
yeaboi checkout can serve this tree's build with nothing published:
make build
YEABOI_WEB_STATIC=../yeaboi-frontend/yeaboi_web_assets/static # then run yeaboi's `make dev-board`
make dev is the faster loop when only the front end is changing — Vite's own server with HMR,
proxying /api to whichever board is running.
Known gaps
No ESLint. This tree never had one; with strict TypeScript on, tsc --noEmit is what rejects code,
and npm run lint says so rather than pretending otherwise. Prettier is real.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yeaboi_web_assets-1.0.0rc1.tar.gz.
File metadata
- Download URL: yeaboi_web_assets-1.0.0rc1.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29bda763bee8e16f41df07fdf365521a61ca5be45c4d5d9aa45fec6452e6c6fb
|
|
| MD5 |
77b28baa9700749ccc3e9753576dcfe7
|
|
| BLAKE2b-256 |
843986938fc6b1d7107cf3eb1c5dfde8f2405dec591c6e471c0a6880a73c8819
|
Provenance
The following attestation bundles were made for yeaboi_web_assets-1.0.0rc1.tar.gz:
Publisher:
publish.yml on yeaboi-ai/yeaboi-frontend
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yeaboi_web_assets-1.0.0rc1.tar.gz -
Subject digest:
29bda763bee8e16f41df07fdf365521a61ca5be45c4d5d9aa45fec6452e6c6fb - Sigstore transparency entry: 2588284256
- Sigstore integration time:
-
Permalink:
yeaboi-ai/yeaboi-frontend@f250009faa7406977846b380528eb5544398c2a6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/yeaboi-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f250009faa7406977846b380528eb5544398c2a6 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file yeaboi_web_assets-1.0.0rc1-py3-none-any.whl.
File metadata
- Download URL: yeaboi_web_assets-1.0.0rc1-py3-none-any.whl
- Upload date:
- Size: 793.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30af81386d6f546fc7641aad5cb7eeac1216a57e719d9609af43470496af9aea
|
|
| MD5 |
2b67fce1f58f43ad8caa11c5f08ebec2
|
|
| BLAKE2b-256 |
c3805c0fd974bc97ceffb3274c4722d04a0a3bdb06a25362163559ffe29011b1
|
Provenance
The following attestation bundles were made for yeaboi_web_assets-1.0.0rc1-py3-none-any.whl:
Publisher:
publish.yml on yeaboi-ai/yeaboi-frontend
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yeaboi_web_assets-1.0.0rc1-py3-none-any.whl -
Subject digest:
30af81386d6f546fc7641aad5cb7eeac1216a57e719d9609af43470496af9aea - Sigstore transparency entry: 2588284365
- Sigstore integration time:
-
Permalink:
yeaboi-ai/yeaboi-frontend@f250009faa7406977846b380528eb5544398c2a6 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/yeaboi-ai
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f250009faa7406977846b380528eb5544398c2a6 -
Trigger Event:
workflow_dispatch
-
Statement type: