Accessibility-first, multi-tenant live chat support widget embeddable on arbitrary client websites via a JS snippet.
This repo started life as a Tenon.io-era spec that was written but never built (see the original post, Build vs. Buy is even harder when you care about accessibility). It is now being built as an AFixt product.
Phase 0 (repo foundations) complete — tooling, CI, ADRs, workspace scaffolds.
Implementation work is sequenced by phase in .claude/plans/ and tracked in
GitHub issues.
CLAUDE.md— orientation for Claude Code and new contributorsrequirements.md— product spec (RFC 2119 language)docs/adr/— architecture decisionsusecases/— every user-facing interaction as.uc.yaml, per ADR-0002
nvm use # Node 22, per .nvmrc
bash scripts/bootstrap.sh # install local tool binaries (semgrep, osv-scanner, trufflehog, lychee)
npm ci # install workspace dependencies
docker compose up -d # MySQL + Redis + MailHog + MinIO
npm run dev # run api, ui, and widget in parallelThen npm run check:all should pass on a clean clone — it is the same gate
Husky runs on pre-push.
This repo installs private @afixt/* scoped packages (usecase-runner,
a11y-assert). In CI, npm authenticates via an organization-level GitHub
Actions secret named NPM_TOKEN — actions/setup-node writes a runner-local
.npmrc from it, which is why no auth token is committed to this repo's
.npmrc (local installs keep using your own credentials).
If installing an @afixt/* package returns 404, that is an authentication
problem, not a missing package. The usual cause is a stale repo-level
NPM_TOKEN secret shadowing the org-level one — delete the repo-level secret
rather than overriding it per repository.
From the repo root:
| Script | Purpose |
|---|---|
npm run dev |
Run api, ui, widget in parallel |
npm run check |
lint + typecheck + stylelint + markdownlint + usecases:validate |
npm run check:all |
check + test + build + size + dupes + links + security + license:check (pre-push gate) |
npm test |
Vitest across workspaces |
npm run test:e2e |
Generate Playwright specs from usecases/ and run them |
docker compose up |
MySQL + Redis + MailHog + MinIO + api + ui + widget-preview |
- Node 22 (pinned via
.nvmrcandengines) - Conventional Commits enforced via Husky
commit-msg - Run
scripts/bootstrap.shonce to install local tool binaries (semgrep, osv-scanner, trufflehog, lychee) required by pre-push hooks - All user-facing changes must include a corresponding
.uc.yamlupdate (enforced by a CI diff gate) - Note user-visible changes under
## [Unreleased]inCHANGELOG.md; the release flow promotes that section to the new version heading
Proprietary. © AFixt. This is a private product ("private": true); it is not
licensed for external use or redistribution.