TapePlay Run Fast — MIT original-source demo
Original: iguangyu/dou-cl, Copyright(c)2026 iguangyu, MIT License.
Pinned commit:105cc05cb4f30365543bcb708dc0ab43cfb2c4b2
https://github.com/iguangyu/dou-cl/tree/105cc05cb4f30365543bcb708dc0ab43cfb2c4b2
Original LICENSE.txt and source copyright notices retained. Transport dependency ws8.22.0 is separately MIT; see WS-LICENSE.txt and dependency lock.

R11 PWA shell: independent same-origin manifest/icons and service worker registration, NO fetch handler or Cache API; all gameplay/private APIs remain network-only. No core changes.

TapePlay modifications2026-11-08: new SC/English browser presentation, source/variant disclosures, fixed local navigation, public-view/card selection UI, local nickname preference, WS transport proxy/origin and packet-shape boundary, source download/build/verification scripts. Original src/net/server.js, runner.js, games/paodekuai.js, games/base.js, core/cards/combo/rules.js, bot.js, tests and all upstream files are byte-for-byte unchanged. Browser advisory validation/hints use those exact original CommonJS bodies wrapped by a small loader; the original backend remains authoritative. No rules, deals, AI or accounting are rewritten. Original createServers options select paodekuai, loopback,650ms bot delay and90s timeout. Browser-origin checking uses the documented WS headers event; no source backend file is patched.

Source variant: three players,52 non-joker cards,17 each,1 unused. Spade3 starts and must be in the first play; if it is unused, the actual source falls back to seat0 (despite its comment suggesting the smallest holder). Straights5+, pair sequences2+. Replies can Pass even when a beating play exists. First out wins. Winner source score0; other players minus remaining cards. This is NOT a zero-sum chip balance or a universal16-card/forced-follow/highest-single Run Fast rules certification. Original heuristic bots fill empty seats and take timeout/disconnected turns.

Unauthenticated local in-memory demo. Each WS connection is a seat, not wallet identity. Reload/leave hands an active seat to a source bot, with no guaranteed reconnect/resume. Front proxy denies foreign browser origins and malformed packet shapes, but this is not an audited secure service; raw loopback Node/CLI access remains unauthenticated. Original Math.random shuffle and bot access to server state are not fairness-certified. No official points, wallet, BEM, recharge, round fee, transfer, redemption, real payment, monthly fee or monthly grant. NEVER attach value.

No original bitmap/audio/font assets are served in the UI. Cards and suits are HTML/CSS/system glyphs, system fonts only. Original MIT-associated docs/screenshots are preserved in the source snapshot/download, not imported as product art. No public-room IP, Telegram, database or external service is contacted by this runtime; upstream README examples were not executed. No account/signup/deployment/push. Native mobile/device/PWA installation is unverified by HTTP/DOM tests. Source ZIP is this isolated module, not a restarted full handoff package. No endorsement by iguangyu implied.

R12 transport: browser sockets use the page origin (ws or wss). An optional https module origin is allowlisted only when every public origin is set; hostile origins stay rejected. Loopback remains the default. This configuration is not public hosting or a value-ready service.
