Count It is a local-first rhythm-reading MVP for Backwerd Rhythm Shop. It helps musicians connect standard notation to spoken subdivision counts through guided practice and short, scored challenges.
The app deliberately begins with a small, verified straight-subdivision catalog. Rhythm notation, timing, accepted answers, distractors, and explanations all come from the same structured data model; no answer is inferred from an SVG.
- Build:
2026-08-03.2 - Status: MVP built and publicly available
- Live app: https://count-it.backwerdrhythmshop.com/
- Public app guide: https://guides.backwerdrhythmshop.com/count-it/
- Repository: https://github.com/backwerdrimshot/count-it
Build identifiers use ISO YYYY-MM-DD, based on the date the shipped app update
began. The value stays fixed while that release pass is completed across code and
documentation.
- Practice: move through one-beat or four-beat prompts, reveal the count, inspect the subdivision guide, and read a short explanation.
- Challenge: answer five multiple-choice questions with immediate feedback, explanations, score, accuracy, retry, and a locally stored personal best.
- Three cumulative levels: quarter/eighth-note foundations, eighth-note placement with rests, and verified sixteenth-note cells.
- Responsive, accessible UI: phone, tablet, and desktop layouts; keyboard shortcuts 1–4 for answers; visible focus; semantic controls; and live feedback.
- Deterministic rhythm engine: seeded question generation, non-repeating prompts until vocabulary exhaustion, exactly one correct option, and misconception-based distractors.
Requirements: Node.js 22.13 or newer and pnpm 11.
pnpm install
pnpm devOpen the local URL printed by Vite (normally http://localhost:3000).
pnpm test
pnpm lint
pnpm buildsrc/rhythm/owns the catalog, counting-system maps, prompt assembly, validation, and rhythm types.src/question/owns seeded randomness, distractor construction, question generation, and pure challenge-session state transitions.app/RhythmNotation.tsxrenders the structured notation recipes with VexFlow.app/CountItApp.tsxcontains the responsive Practice and Challenge experience and persists only lightweight preferences/best score inlocalStorage.tests/verifies catalog validity, count mappings, supported levels, distractor correctness, seeded generation, non-repetition, scoring, reset behavior, and invalid-input failures.
See docs/supported-rhythm-catalog.md for the complete MVP vocabulary and counting rules.
See docs/notation-engraving-standard.md for the beam, dot, partial-beam, and visual-review contract. The local /notation-audit route renders the complete review sheet.
- The visible MVP uses the standard American
1 e & asystem. Eastman and Takadimi mappings remain internal compatibility data for later expansion. - Every catalog recipe fills exactly one quarter-note beat and is validated at startup/test time.
- Every catalog recipe is checked against an independent engraving baseline for beams, dots, and partial-beam direction.
- A four-beat prompt is assembled from four independently verified cells, so beat numbers are substituted consistently.
- Full-beat rests are excluded from scored prompts because an answer containing no spoken syllable would be ambiguous in a text-choice interaction.
- Distractors are generated from other valid active-position patterns or a deliberate beat-number error and are rejected if they normalize to the correct answer.
- Straight quarter-, eighth-, and sixteenth-note subdivisions in 4/4 only.
- No triplets, compound meter, ties across beats, syncopation across barlines, audio input/playback, tempo engine, accounts, cloud sync, analytics, or backend.
- Standard counting is the only user-selectable system in this release.
- Progress is device-local and intentionally lightweight.
Count It requires no account or backend and does not send practice progress or scores
off-device. Lightweight preferences and the personal best stay in localStorage.
Keyboard shortcuts, visible focus, semantic controls, live feedback, and responsive
layouts support phone, tablet, and desktop use.
The public build is at count-it.backwerdrhythmshop.com, and as of
2026-08-01 it serves a current build — verified by the shop site's Link
audit, which runs on GitHub Actions where that domain is reachable and reported
now shipped for this app.
Publishing is configured in Cloudflare, outside this repository. There is no deploy workflow here and none is wanted: the Workers Git integration is configured dashboard-side and is not visible from git. That has one consequence worth internalising — you cannot tell from this repo whether a merge published. Check the Cloudflare dashboard, or run the site repo's Link audit workflow, which fetches the live origin and reports what it finds.
This app spent roughly 2026-07-27 to 2026-08-01 with four merged releases that never reached users, because nothing in the repo published and nothing said so. That is the failure mode this section exists to prevent.
- This app was scaffolded as an OpenAI Sites project.
.openai/hosting.jsonstill carries its project id andbuild/sites-vite-plugin.tsstill packages the metadata, but Sites is no longer the live origin. The site repo settled the question by fingerprinting four origins against known-good examples: this one answers like a Cloudflare Worker and shows none of the GitHub Pages tells that Stick Lab still leaks through the same proxy. CNAMEis gone. It was a GitHub Pages leftover;pages-build-deploymentlast ran 2026-07-21 and Pages is not the origin..github/workflows/workers.ymlis gone. It was a manual-only (workflow_dispatch) path that required acloudflare-workers-productionenvironment holdingCLOUDFLARE_API_TOKENandCLOUDFLARE_ACCOUNT_ID. Those secrets were never added and the workflow never ran once in 31 runs of this repo's history, so it published nothing and could not have. It is in git history if the API-token route is ever wanted again.vite.config.tsbuilds a Wrangler config inline, but that islocalBindingConfig— dev bindings only, not a deploy config.
vinext build emits a complete deploy config at dist/server/wrangler.json:
worker name, compatibility flags, entry point, assets directory. There is no
hand-maintained wrangler.jsonc to drift from it. pnpm deploy:dry-run runs
the whole thing locally without credentials.
Size headroom is thin. The build is 2655 KiB, 995 KiB gzipped, against the 1 MiB Workers script limit on the free plan — about 5 KiB of room. On a paid plan the limit is 3 MiB. On free, one added dependency breaks the deploy, and the failure reads like an unrelated build error. No bindings are required; the
IMAGESbindingworker/index.tsdeclares is unreachable, since nothing importsnext/imageand no built asset references/_vinext/image.
- Report a problem emails
support@backwerdrhythmshop.com. - Request a feature emails
feedback@backwerdrhythmshop.com. - Both controls are available in the app footer and prefill the app name, build, page URL, and browser details to make follow-up easier.
The navy/orange visual language and structured rhythm-recipe approach were adapted from the local Backwerd Rhythm Shop applications and the Rhythm Repper implementation. Count It owns its copied data and UI code and has no runtime dependency on those projects. Product scope follows the Count It product brief and the Backwerd Rhythm Shop app-portfolio notes supplied for this build.
The footer shows a running visit count next to the build stamp. It comes from our own
Cloudflare Worker at counter.backwerdrhythmshop.com, which stores exactly one thing:
an integer per app. No IP, no user agent, no cookie, no timestamp — nothing tied to a
visitor. Counted once per browser session; localhost and file:// only read the number
so development never inflates it.
It is progressive enhancement. If the endpoint is offline, blocked, or not yet deployed, the footer renders exactly as it did before and the app is unaffected.
Backwerd Rhythm Shop posts practice ideas, new app releases, and classroom tips:
- Facebook — https://www.facebook.com/backwerdrhythmshop/
- Instagram — https://www.instagram.com/backwerdrhythmshop/
- YouTube — https://www.youtube.com/@backwerdrhythmshop
These three links also appear as icon buttons in the app footer.
© 2026 Backwerd Rimshot, LLC. All rights reserved.