ultratears
Unofficial native Windows port of Tears of the Kingdom 1.4.3 using static recompilation. Builds locally from the player's own extracted game dump; no game files included.
Personal NLHE cash drill trainer — static strategy packs, no solvers.
Translation pending
GamesTypeScript · JavaScriptGitHub @bernardshekOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Source of truth for the poker-trainer POC: a personal-first NLHE cash drill trainer (no live play, no solver in the web app). pnpm monorepo — Next.js App Router UI plus static strategy packs. Solvers never ship in the deployable web app or Vercel/Docker web image.
Default pack: packs/toy-6max-expand v0.5.0 (ships_solver_code: false). The browser loads the copy under apps/web/public/packs.
pnpm i
pnpm --filter @poker-trainer/pack-format build
pnpm test
pnpm dev # syncs packs, then http://localhost:3000
No .env is required. Do not commit secrets.
Other commands:
| Command | What it does |
|---|---|
pnpm build | Build pack-format, sync packs into public/, build Next app |
pnpm test | Vitest: PackManifest + drill pack schema + scoring |
pnpm typecheck | tsc --noEmit in packages |
pnpm validate-packs | CLI validate toy packs, including toy-6max-expand, and weeklock |
Requires Node 20+ and pnpm.
apps/web/ Next.js UI (Vercel Hobby target)
packages/pack-format/ Zod PackManifest (CDN) + compact drill spots + scoring
packs/toy-6max-expand/ Default drill pack v0.5.0 (synced → public/packs)
packs/toy-6max/ Slice-1 compact drill JSON
packs/toy-6max-multistreet/ Flop/turn/river practice nodes
packs/weeklock/ Week-lock fixture
packs/examples/… Full PackManifest fixture (CAS blob refs)
tools/pack-builder/ Stub only — offline/CI solver runner lives here later
tools/generate-toy-expand/ Regenerates toy expand / multistreet JSON
apps/web/scripts/sync-packs.mjs copies packs/ → apps/web/public/packs/ (predev and prebuild).
MVP ($0): compact drill packs under packs/ (default toy-6max-expand v0.5.0) are copied to apps/web/public/packs and fetched by the browser. No object store required.
Production target: Cloudflare R2 (not wired in this slice):
packs/{pack_id}/{version}/manifest.json
blobs/{sha256} # content-addressed, Cache-Control: immutable
Schema: packages/pack-format/src/manifest.ts (schema_version, pack_id, ships_solver_code: false, blob sha256 refs, provenance, …). Validate with validatePackManifest. Toy drill UI keeps a separate compact spot JSON path (DrillPackSchema / validatePack) so demos stay simple.
Never put AGPL solvers (TexasSolver, postflop-solver, …) in the web Docker/Vercel image. Separate pack-builder (offline/CI) vs web. Pack artifacts = manifest + blobs only. See NOTICE and pack provenance.ships_solver_code: false.
Live drills grade with gradeDrillNode only.
EV loss (bb) = max(0, bestEv − chosenEv).
localStorage key poker-trainer:user holds { id, display_name, created_at, pack_prefs } — shape documented for a later Postgres users table. Saved drill settings: poker-trainer:saved-drill.
.github/workflows/ci.yml on push to main and on pull requests: pnpm i --frozen-lockfile → pack-format build → pnpm test → pnpm typecheck → sync packs → web build. No solver install.
tools/pack-builder job that emits PackManifest + blobsaws s3 sync compatible) with immutable blob cache headersuser_id stub