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.
Metadata
Release files for yeaboi-web-assets 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| yeaboi_web_assets-1.0.1.tar.gz | 1.4 MB | With provenance | Details for yeaboi_web_assets-1.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| yeaboi_web_assets-1.0.1-py3-none-any.whl | Python 3 | none | any | Details for yeaboi_web_assets-1.0.1-py3-none-any.whl |
Total release size: 2.2 MB
Release files / yeaboi_web_assets-1.0.1.tar.gz
| Download URL | yeaboi_web_assets-1.0.1.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ec5fa709685d9ef162c7df4ab7e611f032b4458ef32dff2cd2737bb16f70c726
|
|
BLAKE2b-256 checksum How to use checksums |
a69c9e606f2374f839f219f114e3384ef731ac8509427b87874524071f9d1708
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logRelease files / yeaboi_web_assets-1.0.1-py3-none-any.whl
| Download URL | yeaboi_web_assets-1.0.1-py3-none-any.whl |
|---|---|
| Size | 793.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8d02ef3c8407d7b0fff55d66aeedb231852e37be13749e6ae740a0db62834268
|
|
BLAKE2b-256 checksum How to use checksums |
4ac0413fbaa7e748ecf8db9cc5a14b072f15eaf5ce36abc596fadb420387308d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logSecurity for yeaboi-web-assets 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for yeaboi_web_assets-1.0.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.