← Back to blog
ARTICLE ARCHIVE

Every story, in one place.

36 bilingual articles, newest first.

Try a Game Before Signing Up: Guest Bot Play in Seven Games

This week, Chinese Chess, Gomoku, Chinese Checkers, Guandan, Ka Wu Xing, Bull (Niuniu) and Blackjack gained guest bot play. Learn the controls and pace before signing up to play with friends.

Read article

Sealed Poker Dealing: Moving Hole Cards Out of the Game Process

How a separate dealer delivers hole cards, what bots receive, why dealing failures void a hand, and where the design still depends on trusting the operator.

Read article

Poker Apps with Squid: What Friend Groups Need

Looking for private Texas Hold’em with classic, doubling or full squid? Separate friend rooms from offline play, then compare seats, penalties, settlement and mid-round joins.

Read article

Choosing Among Seven Card, Mahjong and Board Games

Choose among poker, Zha Jin Hua, Dou Dizhu, Ka Wu Xing, Guandan, Gomoku and Chinese Chess by player count, information and learning goals.

Read article

Choosing a Game Platform: Rules, Fairness and Practice

Compare game platforms through concrete checks: rule variants, payment incentives, practice tools and what BluffKing’s fairness evidence actually covers.

Read article

Texas Hold’em: Your First Hand and How to Review It

Learn hole cards, betting rounds and five-card hands through a worked example, then use BluffKing practice tables and hand review to study your decisions.

Read article

Zha Jin Hua: Hand Rankings, Blind Bets and Comparisons

Learn Zha Jin Hua hand rankings, the cost of looking at your cards, and the special A-2-3 and off-suit 2-3-5 rules used on BluffKing.

Read article

Dou Dizhu: Bidding, Legal Plays and Teamwork

Learn the landlord and farmer roles, bidding and legal card combinations, with worked examples for comparing pairs and reading a settlement.

Read article

Ka Wu Xing Mahjong: Ready Hands, Wins and Kong Scoring

Learn three-player, 84-tile Xiangyang mahjong, including the five-tile wait, exposed ready hands and why kong payments differ from winning-hand scores.

Read article

Guandan: Wild Cards, Tribute and Team Progression

Learn four-player Guandan through wild-card and finishing-order examples, then understand tribute, partner leads and passing A on BluffKing.

Read article

Gomoku: Freestyle Rules and Your First Threats

Learn 15×15 freestyle Gomoku, overlines and win conditions, then use an open-four example to practise recognising immediate threats.

Read article

Chinese Chess: Moves, Check and Stalemate

Learn Xiangqi movement through cannon and horse examples, then distinguish checkmate, stalemate and BluffKing’s per-move clock.

Read article

Protobuf at the poker table: 46% less WebSocket traffic

100 tables and 900 connections: about 46% less WS payload than compact JSON. Updated with production retests after hot-path changes: complete server p99, protocol comparisons, and the limits of indexing, fewer copies, and buffer reuse.

Read article

BluffKing latency: tracing delays and measuring public capacity

From the 01:22 query failures to the 23:29 production measurement: diagnosis, changes and remaining headroom. September 9 update: a two-vCPU reproduction brings server p99 under 1ms, production, re-measured with the September 8 on-host method, falls from 7.08/12.20ms to 2.57/4.48ms, and the public ladders turn out to bound the test route, not the service.

Read article

The website test that re-reads read_cache.rs before a cache claim ships

A file:line citation is only a bookmark until something checks it. We turned one cache article's TTLs, field allowlist, invalidation path, and latency caveat into a website test, so drifted public claims fail before publishing.

Read article

Write the read-cache contract first: even a 5-second session cache must not extend auth

The useful part of this performance patch was not the HashMap. It was the contract: three read models, separate TTLs, field allowlists, synchronous invalidation, generation checks against late inserts, and tests for revocation and expiry before celebrating the cache hit.

Read article

Why WebSocket delivery backed up: the 2 Mbps suspect and a measured 22.3% byte cut

Production at 300 tables recorded 199 send-queue evictions while CPU and Postgres were not saturated. The same code held 1,000 local tables at 1.2 ms action p99 but produced 4.07 Mbit/s of JSON egress against a 2 Mbps production link. That narrows the bottleneck to outbound delivery; compact-v1 then cut the same-load bytes from 10.18 MB to 7.91 MB, while the exact component and new production capacity remain unproven.

Read article

Where fairness proof belongs: the architecture behind removing one button

A change that looked like deleting a button was really about where a trust promise belongs: review explains the hand, while the fairness page owns exported commit-reveal proof. The reusable move is testing the absence so broad claims cannot drift back onto the wrong screen.

Read article

2-vCPU production test: 150 passes, 200 lags, 300 collapses

The numbers up front: Tencent Cloud SA2.MEDIUM4, 2 vCPU, 3.6 GiB and 2 Mbps fixed public egress, with Postgres and Caddy on the same host. 150 players pass the latency budget, 200 miss it, and 300 hit a 4.1-second p99; that is the starting point for isolating outbound delivery, optimizing the code, and rerunning the same ladder.

Read article

Three layers of rate limiting: caller traffic, account quota, and machine capacity

Is this caller too fast? Has this account used its allowance? Is this box full? The third question cannot be built out of per-caller counters, and it is the one about survival. How we closed that gap in Rust and axum: shed instead of queue, limit the thing that actually costs money, replace fixed-window boundary doubling with GCRA, and choose each limiter's failure direction on purpose.

Read article

How to update a SHA-256 pin when a release script changes its dependency

A release helper correctly refreshed a public source URL, but did not tell the agent to update the SHA-256 pin that CI uses to guard hosted work. The fix was not another reminder; it was making the producer print its downstream pin and turning a stale assertion into a regression tripwire.

Read article

The limits of CSS static analysis: don't rebuild the browser inside a blocking gate

To prove that one CSS custom property was font-only, a locale gate nearly rebuilt the cascade inside itself. The robust boundary was not another selector case; it was admitting where static evidence ends and making the safe authoring path local, explicit, and testable.

Read article

How to bind a release to the correct CI workflow run

Trigger a workflow and then grab the latest green run, and you may be watching an old run, a concurrent run, or a different release entirely. A reliable pipeline carries one immutable identity from source intent to workflow attempt, then proves the public effect with version stamps.

Read article

The docs promised blog-cadence automation, but no scheduled job called it

Two documents said the daily heartbeat surfaced our blog staleness, citing a spec section that did not exist. History showed why: the wiring was deliberately deferred behind a sign-off gate, and that reasoning was honestly recorded — in the commit message. The documentation described the same work in the present tense. 59 branches then landed on main with nothing flagging it. Deferred work written in the present tense stops being a plan and becomes a claim.

Read article

A $400/month AI team would cost $53,403 at API list prices

30 days of ChatGPT Pro/Codex and Claude Max/Claude Code usage reconstructs to $53,403 at API list rates. See model tokens, cache costs and caveats.

Read article

Brand-language migration: reuse a layout without inheriting old vocabulary

A temporary table codename seeped into directories, components, tests, docs, machine data, and the company website. Cleaning it up was not a global replace; it was a brand-language migration with a target schema, an ordered cutover, semantics-preserving normalization, and a CI constraint.

Read article

From ChatGPT to Production-Grade AI Coding

For GPT and ChatGPT users moving into AI coding: a practical OpenAI Codex and Claude Code guide to agents, CLI, MCP, skills, verification and production delivery.

Read article

The test invoice was fake. The money was real.

A Telegram Stars payment test charged S$1,077 of real money through Apple. Not a Telegram bug, not an Apple bug — we had never established where safe test Stars should come from. Why a stable client's top-up still charges cash, how to pre-provision a zero-cash test balance today, how every cent came back the same day, and the fail-closed guard that caps a repeat through the server's invoice path at one attested Star.

Read article

Verify a poker hand yourself — and what a 'provably fair' verifier must refuse

"Provably fair" is worth nothing if you can't run the proof. Here's how to verify one of our hands — export it, then check it in the browser or from the CLI, the same verifier behind both — and the part worth stealing: the checks that earn trust are the ones that make the verifier refuse.

Read article

Encrypted dealing from source: which cards can the server see?

ADR-101 now lets a host enable Advanced encrypted dealing for all-human, no-AI practice-chip rooms. Only for hands in this mode, the server holds no plaintext of unshown hole cards. Trust the operator to run the audited open-source build; the running binary cannot be verified remotely. If any player drops, the whole table visibly downgrades to server-visible dealing. Practice chips, not real money.

Read article

Do we deal cooler hands on purpose? The architecture answer

A simple “no” is not enough. The real answer lives in the path from browser to session task, seed commit to flop / turn / river, and what actually recovers after disconnects or deploys.

Read article

How to turn one bug report into a whole-class cleanup

A 401 that didn't redirect was 33 of them. A toggle labeled "verifiable" was three surfaces, not one. The habit that turns a single bug report into a swept class — and the trailer that leaves the receipt.

Read article

We called it GTO. It wasn't.

A button in our app said "GTO." It was reading a 169-cell table, not solving a game. The honest taxonomy — chart vs CFR-approximation vs solved tree — and why we made a unit test fail if the word "GTO" ever comes back.

Read article

Five database failures in shared AI-agent memory

Memory shared by many agents across sessions quietly hit five classic database failures — bloat, concurrent writes, orphaned rows, schema drift, synchronized expiry. One was a single filename-compare away from silently overwriting the wrong records.

Read article

Guardrails for AI coding agents: isolated worktrees, evidence, and independent model review

Most of a three-platform app, written by AI agents — but agents over-report "done," step on each other, and loosen your tests. Here's the operating system that contains them.

Read article

Why every AI coding agent needs its own git worktree

Point two agents at one checkout and they corrupt each other. Here's the fix — and how to make it automatic.

Read article