Skip to content

Releases

0.20.2

Choose a tag to compare

@github-actions github-actions released this 12 Nov 01:13

Release 0.20.2

Summary

  • Lobby: a table with players closes again, now an hour after it was created instead of the old 5 minutes; a table whose game is starting never closes, and an unjoined one still closes after 5 minutes. Its players see a "table closed" notice instead of a reconnect that ends in "This table no longer exists".

Features

  • feat: expire lobby rooms an hour after creation with a notice (a979111)

Maintenance

  • chore: set version to 0.20.2 (81f7ea5)
  • chore: bump version to 0.21.0 (25f8dce)

Stats

  • Code changes (lock files and SVG assets excluded): 12 files changed, 102 insertions(+), 14 deletions(-)

0.20.1

Choose a tag to compare

@github-actions github-actions released this 10 Nov 10:13

Release 0.20.1

Summary

  • Game client: opponents' hands and melds draw each tile's edge and shadow per tile instead of through a group filter, fixing misplaced depth on the top seat in Firefox on macOS; the opening screen's OK no longer reserves the width of the long waiting text and shows a short "Waiting…" once pressed; a riichi offer now plays the decision chime like call offers.
  • Infrastructure: the deploy notes state that a spot-deploy that goes through interrupted no game.

Features

  • feat: chime for a v2 riichi offer like a call offer (d89418b)

Bug Fixes

  • bug: draw v2 opponent tiles' edge and shadow per tile, not by filter (2933511)
  • bug: shrink the v2 opening screen's OK to a short waiting label (529fc4e)

Maintenance

  • chore: set version to 0.20.1 (141dce4)
  • chore: note that a passing deploy interrupted no game (310c27d)
  • chore: bump version to 0.21.0 (2a9cfe5)

Stats

  • Code changes (lock files and SVG assets excluded): 13 files changed, 80 insertions(+), 65 deletions(-)

0.20.0

Choose a tag to compare

@github-actions github-actions released this 10 Nov 09:08

Release 0.20.0

Summary

  • Decisions: every chi and kan is its own one-press button (no second tile-choice step), and all decision controls are flat boxes of one height, coloured by kind; a riichi hand's forced discard no longer shows a timer.
  • Keyboard: the board can be played from the keyboard — digits press decisions, Esc/right-click pass or discard the drawn tile, arrows move between tiles — with optional key hints and a Controls help panel; focus no longer gets lost between screens.
  • Settings menu: new rows for leaving the game (and back to the lobby in a replay), connection ping, corner indices on tiles, the wind letters' script per language and keeping Auto win between rounds; a click that closes the menu now also plays the tile under it.
  • Replay: controls rebuilt around the viewer's own turns (own-turn, step and round moves with keys), seat views from the chrome and the opening seating, greyed tsumogiri discards, and a replay link without a seat opens at the logged-in player's own seat.
  • Board: round results wait 1.5s and hide while pressed so the final board can be read; live nameplates are plain hover badges; the furiten mark scales with the badge text; centre text is unselectable.
  • Protocol: an app-level PING/pong lets the client time its round trip; the game endpoint answers it before routing, without touching a session.
  • Fixes: a closed kan's red five stays face up; opponent backs lose a stray beige band; the room page, the opening seating and the settings menu no longer jump as their contents arrive.
  • Storybook: one page for every decision, split tiles and system pages, a compact melds page with red fives, and new seat scenarios for the call options.

Features

  • feat: hold v2 round results 1.5s and show the board while pressed (7781961)
  • feat: add a back-to-lobby row to the v2 replay's settings menu (ca16b91)
  • feat: make the v2 centre's text unselectable (d083fed)
  • feat: drop the v2 centre's "vs name" label while differences show (c430ac9)
  • feat: make v2 live nameplates plain badges with no click pinning (66171ab)
  • feat: size the v2 furiten mark with the own badge's text (73452e6)
  • feat: rework the v2 replay controls around the viewer's own turns (1ac5570)
  • feat: add a corner indices setting that labels v2 tiles (1784418)
  • feat: let the player pick the v2 wind letters' script per language (a1c05e8)
  • feat: offer every chi and kan as its own v2 decision button (514f134)
  • feat: hide the v2 timer on a riichi hand's plain discard (b623ee3)
  • feat: show the connection's ping in the v2 settings menu (a6534a3)
  • feat: play the v2 board from the keyboard, with a controls help panel (9493681)
  • feat: add a leave row to the game's settings menu (ef1cad5)
  • feat: play a tile on the click that closes the settings menu (86ce393)
  • feat: add a setting that keeps Auto win between rounds (905273f)

Bug Fixes

  • bug: draw v2 opponent backs' edge as their end, not a beige band (83e8ca9)
  • bug: keep a closed kan's red five face up (699ec32)
  • bug: stop the settings menu resizing when a switch toggles (bab3206)
  • bug: stop the game start's seating growing as the first deal arrives (fd4b6c2)
  • bug: stop the room page jumping when the seat arrives (ee44307)

Maintenance

  • chore: lift v2 decision button tiles by 1px (42d22c8)
  • chore: show every v2 decision on one storybook page (6260c0b)
  • chore: split the v2 storybook index into tiles and system pages (9dde5bc)
  • chore: compact the v2 melds storybook and show its red fives (8faa1cc)
  • chore: bump version to 0.20.0 (5dcf6a0)

Stats

  • Code changes (lock files and SVG assets excluded): 155 files changed, 4706 insertions(+), 1864 deletions(-)

0.19.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 15:02

Release 0.19.0

Summary

  • Rules: Aligned scoring and game end with Tenhou's rules: renhou and kiriage mangan are off, and the all-last dealer ends the game when first with the winning score threshold (agariyame and tenpaiyame), with a repeat taking priority over the threshold in the extension rounds.
  • Payments: Pao now covers the whole hand, stacked yakuman included. In a double ron the honba bonus goes only to the winner closest to the discarder.
  • Kan: A kan is allowed with one live tile left in the wall, and a replacement tile drawn as the wall empties is rinshan, never haitei. Deferred kan dora is revealed at the replacement discard, so a ron on that discard counts it and its ura.
  • Game client: A double right-click no longer discards the next draw after answering a call. Phone side melds stay on the board by closing the gaps between them, and the top badge holds a bot's whole name.
  • Infrastructure: A deploy now refuses to start while the game server has a started or pending game.
  • Docs: The ruleset states what Ronin does, spells out how final points are rounded, and drops an unsourced claim about JPML karaten.

Features

  • feat: end the game when the all-last dealer stays in first place (527c7e8)

Bug Fixes

  • bug: make pao cover the whole hand, stacked yakuman included (7cf0577)
  • bug: reveal deferred kan dora before ron on the replacement discard (22d6a8e)
  • bug: pay double ron honba only to the winner closest to the discarder (a848079)
  • bug: allow kan with one live tile left in the wall (fb2b7f3)
  • bug: disable renhou and keep one rules profile (29eccea)
  • bug: score 4 han 30 fu exactly, without kiriage mangan (374f2cf)
  • bug: stop a double right-click from also discarding the next draw (4d9935d)
  • bug: keep phone side melds on the board and bot names on the top badge (efabb77)

Maintenance

  • chore: refine rules doc (6be52d8)
  • chore: refuse a deploy while games are live (a9dd8f5)
  • chore: bump version to 0.19.0 (63cf378)

Stats

  • Code changes (lock files and SVG assets excluded): 67 files changed, 839 insertions(+), 323 deletions(-)

0.18.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 09:40

Release 0.18.0

Summary

  • Phone board: the game is playable in a phone browser with its bars shown (iOS 26 Safari, Android Chrome), where it used to fall to a 2px river. The board runs to the screen's bottom edge, the centre is a short, wide panel that leaves the discards more room, and ordinary melds stay on the board on short phones.
  • Phone controls: decisions stand in one right-aligned row by the hand, the play switches in a left column, and a finger's first tap lifts a tile while the second discards it. Result panels are centred, with dora and ura on one line on narrow phones.
  • Browser and app: a swipe or the Full screen button hides the browser's bars, a swipe down no longer reloads a live game, and the lobby and game install as a phone app.
  • Orientation: the upright board is gone. Portrait viewports under 768px wide ask to rotate, in live games and replays; tablets and large windows keep the board.
  • Game pacing: turns and calls get 10s of free decision time (was 5s) and result screens 15s (was 10s). The 20s bank and the game start confirmation are unchanged.
  • Settings: an animations switch turns off tile motion without changing game timing, and the mouse-only rows are hidden on touch devices.
  • Lobby: colors move to the game's teal, and the glows are gone.
  • Desktop: switches show full names in a row, and short desktops use the same single decision row as phones.
  • Tooling: the visual check covers browser-boxed phones and no longer fails on an empty river or the latest discard's offset. Makefile.local holds a machine's own make targets.

Features

  • feat: make the lobby and game installable as a phone app (51d4469)
  • feat: move lobby colors to the game's teal and drop the glows (2ca3511)
  • feat: add an animations switch to the game settings (4702df5)
  • feat: give 10s for turns and calls and 15s for result screens (5082e80)
  • feat: make a finger's first tap lift a tile and the second discard it (ca8e23a)
  • feat: make replays landscape only and drop the upright board (98bb3a4)
  • feat: let phones hide the browser bars by swipe or full screen (aa26547)
  • feat: shrink a short phone's centre so its discards can grow (e63608a)
  • feat: put phone play switches in a left column, name them on desktop (6244a29)
  • feat: put phone and short-desktop decisions in one row by the hand (f1c047d)
  • feat: let the phone board run to the screen's bottom edge (5a96439)
  • feat: give the phone board a short, wide centre panel (3b03ef8)
  • feat: move the phone switches into the own band, drop the own badge (7710c92)

Bug Fixes

  • bug: keep bot names whole on the top badge and fix false visual checks (83fb7e1)
  • bug: ask to rotate only in portrait viewports under 768px wide (de089f4)
  • bug: hide the desktop-only settings rows on touch devices (a26567e)
  • bug: put dora and ura on one line in a narrow phone result (3439620)
  • bug: centre the phone result panel and align its columns (a6bec87)
  • bug: stop a swipe down from reloading a live game on a phone (e2a2cb1)
  • bug: align a phone's decision buttons on one right edge (c5c24b9)
  • bug: keep the centre's counts on one line on a tall phone centre (13bd8fb)
  • bug: register the centre's shorter side and raise the counts' one-line bound (6c0585c)
  • bug: keep ordinary melds on short phones and fit the centre's text (1fbef6d)
  • bug: keep narrow phones solving when the replay row cannot fit (30eb56a)
  • bug: keep the v2 board playable in a phone browser with its bars shown (ec03b69)

Maintenance

  • chore: let make load this machine's own targets from Makefile.local (a9e88f9)
  • chore: let the visual check accept controls over the own third row (feae3d2)
  • chore: re-pin the look doc to the phone board's solved sizes (32dfe14)
  • chore: drop script details from AGENTS.md commands (8d087be)
  • chore: bump version to 0.18.0 (a4e2a78)

Stats

  • Code changes (lock files and SVG assets excluded): 114 files changed, 2863 insertions(+), 1650 deletions(-)

0.17.1

Choose a tag to compare

@github-actions github-actions released this 08 Nov 08:54

Release 0.17.1

Summary

  • Accounts: Usernames are now 3-16 characters and matched in full, so a trailing newline no longer passes. Humans cannot register names reserved for bots (ai followed by a dash or underscore) or anything starting with nanashi, in any letter case, and the register form now shows the translated reserved-name error.
  • Bots: New bots must be named ai-<lowercase>. AI seats appear as ai-tsumogiri-N in games and the room seat list, and run-games bots follow the same scheme.

Features

  • feat: cap usernames at 16 and reserve the ai- prefix for bots (122d4ff)

Maintenance

  • chore: set version to 0.17.1 (8a87543)
  • chore: bump version to 0.18.0 (34bde9e)

Stats

  • Code changes (lock files and SVG assets excluded): 48 files changed, 207 insertions(+), 104 deletions(-)

0.17.0

Choose a tag to compare

@github-actions github-actions released this 08 Nov 07:35

Release 0.17.0

Summary

  • Game rules: chi is now offered both with and without a held red five, so a hand holding a red and a plain five gets every pairing instead of a single option.
  • Game client layout: the own hand is drawn at 1.6 river tiles off phones and grows on phones up to the side strips; desktop chrome scales continuously from regular to large, side name badges use their real lane, and the top badge keeps ordinary names whole.
  • Game client stability: own and opponent melds keep their size across draws, sideways tiles stay on their row's baseline, tile edges stay attached during hand reflows, and the round-result panel keeps its size when confirming and stays compact and centred.
  • Game client polish: the selected tile lifts clearly above the 5px hover lift, mouse and auto-discards no longer show the keyboard focus ring, game-end actions stay on one row under classic scrollbars, and "Game over" is now "Final results".
  • Replay: scrolling the wheel holds each round result briefly instead of halting on it.
  • Lobby: new terms of service and privacy policy pages in en, ja and ru, linked from every page footer and the login and register forms; leaving a page no longer flashes a lost connection.
  • Infrastructure: deploy host, SSH user and domain now live in a gitignored per-target env file, so the repository can be deployed to other servers without editing tracked files.

Features

  • feat: add terms of service and privacy policy pages (8bf0131)
  • feat: let v2 round-result tiles grow with the free box off phones (56666da)
  • feat: scale v2 desktop chrome continuously from regular to large (849cf43)
  • feat: let v2 desktop side badges use their real lane (ac8e05f)
  • feat: let the v2 phone own hand grow up to clear of the side strips (3216149)
  • feat: draw the v2 own hand at 1.6 river tiles off a phone (996b72f)
  • feat: lift a v2 hand tile 5px on hover instead of 4px (7029842)
  • feat: hold v2 replay results briefly under the wheel instead of halting (d344605)

Bug Fixes

  • bug: keep the v2 game-end actions on one row under classic scrollbars (bd56291)
  • bug: stop the lobby flashing a lost connection when leaving a page (05c8141)
  • bug: revert the v2 round-result growth to the compact panel (2a49281)
  • bug: centre the v2 result's tile rows with its text on wide panels (fab0319)
  • bug: centre the v2 result text under the hand and size its rules by it (a98b0ff)
  • bug: keep an ordinary name whole on the v2 top badge as chrome grows (f19e1be)
  • bug: recover the v2 river pixel the own-fit prebound misses (1fa4ec2)
  • bug: stop the v2 phone corner bound from shrinking the river tile (b151275)
  • bug: keep the v2 desktop selected-tile lift above the hover lift (092b202)
  • bug: stop v2 storybook rows clipping tile edges and lifted tiles (623c5c6)
  • bug: keep v2 sideways tiles on their row's baseline (8a6cb9c)
  • bug: offer chi both with and without a held red five (d400006)
  • bug: size v2 own melds from their structure, never the current hand (678cb7b)
  • bug: keep a v2 opponent's meld size steady across a draw (5c6cadf)
  • bug: keep a v2 right-hand tile's edge attached while its hand reflows (66a8395)
  • bug: keep the v2 tile edge visible in gaps that run along the light (a036e3e)
  • bug: keep the v2 result panel's size when it starts waiting for others (788dfe5)
  • bug: stop outlining the v2 tile a mouse click or auto-discard played (e2ccae1)

Maintenance

  • chore: keep deploy host, user and domain out of the repository (88832f3)
  • chore: trim agent instructions to what the code cannot say (94738ab)
  • chore: apply the frontend formatter to the v2 caps changes (172db08)
  • chore: pin the v2 top badge's ordinary-name lane (77b794c)
  • chore: drop the stale v2 card-wide badge note and pin badge widths directly (e1c5543)
  • chore: fix v2 chrome test lint and list the remaining tier literals (2589b09)
  • chore: say the v2 desktop control row stands at least 12px up (753a58d)
  • chore: state the v2 phone own-tile bounds as rules, without history (9df4748)
  • chore: give the board storybook's game end the live game's four actions (6b50b85)
  • chore: rename the v2 game end's Game over to Final results (7677222)
  • chore: bump version to 0.17.0 (8923da0)

Stats

  • Code changes (lock files and SVG assets excluded): 101 files changed, 1619 insertions(+), 689 deletions(-)

0.16.0

Choose a tag to compare

@github-actions github-actions released this 07 Nov 00:20

Release 0.16.0

Summary

  • Lobby sessions: Sessions are now stored in SQLite as hashed tokens, so restarts and deploys no longer log everyone out. Expiry slides: 30 idle days for accounts, 7 for guests, with a 90-day cap.
  • Rooms: Waiting rooms stay open while anyone is in them. A lost connection holds the seat for 5 minutes, and the room page reconnects on its own with backoff.
  • Security: Guest login is rate-limited per client IP. The engine and the wire now accept only strict integer tile ids, kan actions must name their kan type, and malformed action data raises a game error instead of a raw validation error.
  • Rules: A closed kan now prevents the Four Winds abort, and a further kan reveals an earlier kan's deferred dora.
  • Performance: Waits, tenpai and riichi discards are computed from native shanten masks. Each draw makes fewer state copies and skips wall re-validation, ron checks run once per discard, a broadcast is encoded once for all recipients (or not at all when nobody receives it), and each connection uses one send-deadline timer. Below-level log calls are dropped cheaply, and finished replays are encoded off the event loop.
  • Tooling: make profile-games now reports game server CPU per message and the garbage-collection share of CPU. Deploys use an SSH key file.

Features

  • feat: a further kan reveals the earlier kan's deferred dora (d6bef4c)
  • feat: a closed kan prevents the Four Winds abort (bb08cca)
  • feat: rate-limit guest login per client IP (4f45ceb)
  • feat: slide session expiry with idle timeout and 90-day cap (b9f2ca6)
  • feat: persist lobby sessions in SQLite with hashed tokens (90eaf12)

Bug Fixes

  • bug: validate engine action tile ids and require a kan type (ecb4578)
  • bug: raise InvalidGameActionError for malformed action data (7e0d512)
  • bug: accept only real ints as wire tile ids (80142b8)
  • bug: encode finished replays off the event loop (806434a)
  • bug: keep waiting rooms open and hold seats through lost connections (71876a8)

Maintenance

  • chore: say the chi check mirrors the kuikae rule itself (2e294f8)
  • chore: skip encoding a broadcast nobody will receive !perf (1552f9b)
  • chore: track the send deadline with one timer per connection !perf (a892219)
  • chore: skip the trial player in chi checks and unneeded discard checks !perf (211e438)
  • chore: encode a broadcast once when every recipient gets the same !perf (1bbab51)
  • chore: draw from the wall without re-running its validators !perf (b13ab4b)
  • chore: copy the state three times per draw instead of six !perf (f6c1c2d)
  • chore: drop a stale is_tempai docstring line, space a tenpai loop (36ecc20)
  • chore: check tile ownership with one set comparison !perf (d480b30)
  • chore: keep the wait id on the game runtime, not the frozen state !perf (3e0f6e4)
  • chore: check each discard's completing seats once !perf (cb2dd8a)
  • chore: compute waits, tenpai and riichi discards from native masks !perf (c792ec9)
  • chore: keep the below-level logging test independent of LOG_LEVEL (d0d24e5)
  • chore: drop below-level log calls before merging context !perf (cd5a883)
  • chore: pin strict tile ids in the second chi sequence slot too (4fbded0)
  • chore: limit the GC timer's profile cross-check to the main thread (7c5845a)
  • chore: name only the possible later-kan case in the kan dora note (334a85c)
  • chore: drop a stale rate-limit comment, tidy two lists, cite karaten (a8c7025)
  • chore: say GC samples show under the GC timer, archive its readout (e017400)
  • chore: report the profiled game server's GC share of CPU (6867ac2)
  • chore: report game server CPU per handled and outbound message (2c69719)
  • chore: pin idle timeouts, guest renewal and the expiry guard in tests (7d30535)
  • chore: note that guest login to an account frees the guest's name (5f6c70f)
  • chore: deploy over SSH with a key file, default id_ed25519 (344b39c)
  • chore: bump version to 0.16.0 (39697a3)

Stats

  • Code changes (lock files and SVG assets excluded): 93 files changed, 2064 insertions(+), 951 deletions(-)

0.15.0

Choose a tag to compare

@github-actions github-actions released this 06 Nov 10:59

Release 0.15.0

Summary

  • Gameplay: A Tenhou-style start screen with an OK button holds the first deal until every human seat confirms (or a 10 s timeout), which also unlocks browser sound; AI player turns are paced at 1 s so humans can follow consecutive AI discards. Replays stay unpaced and identical. Bots must now confirm the first deal (GAME_START_CONFIRM).
  • Localization: The game client is now translated into English, Japanese and Russian — mahjong terms, play screen, result screens and replay pages — with a language switch in the settings menu that redraws in place and shares the lobby's language cookie. Wording, plurals, list joins and decimals follow each language and the glossary.
  • Browser support: Browsers too old to lay out the board (before Chrome/Edge 108, Firefox 128, Safari 16.4) get a notice on the game page and a banner in the lobby instead of a broken board; the notice also works on Safari before 15.4.
  • Frontend: The page body follows the visible viewport height, so phones no longer scroll past the board; sound unlocks without navigator.userActivation, retries failed loads and drops late plays instead of bursting a backlog; the language buttons meet the 40 px tap target; the footer version links to its GitHub release.

Features

  • feat: link the footer version to its GitHub release (45bedb9)
  • feat: language switch in the game client's menu (77f658a)
  • feat: translate the game client's replay pages (72611de)
  • feat: translate the game client's result screens (b108d92)
  • feat: translate the game client's play screen (8da3bd5)
  • feat: translate mahjong terms in the game client (5edd1f2)
  • feat: translation foundation for the game client (ab8b9da)
  • feat: notice for browsers too old to lay out the game board (3e6eaf6)
  • feat: game start screen waits for every OK, pace AI player turns (7c10a80)

Bug Fixes

  • bug: language buttons meet the 40px target and show state without colour (23b33e9)
  • bug: clearer replay summaries across languages (cedf2b7)
  • bug: fix result-screen wording and decimals per language (b5b7816)
  • bug: tidy play-screen wording and joins across languages (a1655b4)
  • bug: grammatical ru tile-action labels, stricter vocabulary tests (35f5341)
  • bug: keep the old-browser notice working and tidy i18n docs (73331dd)
  • bug: size the page body by the visible viewport height (c73554f)
  • bug: sound improvements (0328438)

Maintenance

  • chore: drop the Esc hint from the Pass button (58ac96c)
  • chore: bump version to 0.15.0 (f193c00)

Stats

  • Code changes (lock files and SVG assets excluded): 218 files changed, 5987 insertions(+), 1941 deletions(-)

0.14.2

Choose a tag to compare

@github-actions github-actions released this 06 Nov 01:54

Release 0.14.2

Summary

Monitoring page: charts fill the collected history on long ranges with time labels, rate charts no longer blank at every deploy, and the page keeps 25 key charts instead of 52.

Bug Fixes

  • bug: make monitoring charts readable on long ranges, keep key metrics (0e82e83)

Maintenance

  • chore: set version to 0.14.2 (c272411)
  • chore: bump version to 0.15.0 (5b0d08f)

Stats

  • Code changes (lock files and SVG assets excluded): 17 files changed, 275 insertions(+), 312 deletions(-)