Skip to content

Open Tabletop 0.18.0

Choose a tag to compare

@github-actions github-actions released this 23 Sep 21:44
· 82 commits to main since this release

Added

  • Add a local Proxmox VE LXC installer and updater for bare-metal Node.js 26, PostgreSQL 16,
    Redis, non-root systemd operation, optional NFS-backed assets, and fetching a selected Git ref
    directly from the application repository, including the matching in-container installer.

Changed

  • Move all six bundled asset trees into public/static_assets/. Centralize their filesystem
    location in STATIC_ASSETS_DIR, shared by HTTP serving, browser fixtures, and collider tools,
    while preserving public URLs and saved references, Mahjong caching, and audio range requests.
  • Organize 19 browser modules into public/editor/, public/rendering/, public/ui/, and
    public/table/ by responsibility. Update imports, page scripts, test fixtures, and current
    documentation while preserving module behavior and script loading order.
  • Complete the client composition cleanup by moving table-shell controls, personal audio/theme
    settings, dice defaults, piece menus/control hints, and transient visual effects into focused
    modules. Preserve room binding and render order, and add production-join, live-node handoff,
    preference persistence, menu capture, and effect lifecycle regression coverage.
  • Extract semantic pointer/keyboard routing and piece-drag state into focused client controllers,
    preserving mode priority, click/deal/dispense behavior, grid/group transforms, touch re-anchoring,
    and release handling. Add routing/gesture regressions and desktop/touch production-bootstrap checks.
  • Wait for a new Proxmox LXC's IPv4 address and default route before installing packages,
    rebooting the container once if networking is not ready and failing clearly if it remains offline.
  • Split client bootstrap into feature-owned piece, hand, inspection, chat, private notebook,
    scoreboard/room-notes, timer, membership, and library-response bindings. Reuse existing mesh
    and row builders while retaining explicit patch order, replay requests, and session handling;
    add lifecycle/replay and desktop/touch panel regression coverage.
  • Extract table/grid presentation, scale and lighting controls, lighting drafts, graphics-quality
    UI, and room-setting bindings into a client controller; isolate skybox loading, resolution,
    and texture cleanup in a separate controller, with unit and desktop/touch component coverage.
  • Expand project agent guidance with an existing-code-first feature workflow, architecture and
    privacy boundaries, verification requirements, and preservation of user edits; reconcile the
    DRY cleanup plan with current documentation timing and client progress tracking.
  • Extract player presence into a dedicated client controller: seats and camera framing, public
    hand fans, player markers and held-piece labels, roster/turn presentation, avatar controls,
    and player room bindings, with hydration and desktop/touch roster coverage.
  • Extract local multi-selection, marquee gestures, highlight rings, batch actions, recoloring,
    and compose/gather planning into a dedicated client controller with selection-rule and
    desktop/touch toolbar coverage, and document its API and ownership boundaries in the client
    reference and architecture guides.
  • Extract enlarged-piece and drawn-card inspection, color/team/finish controls, deferred
    double-clicks, and inspection pointer rotation into a dedicated client controller.
  • Extract private-hand rendering, Show selection, rearrangement and sorting, collapse persistence,
    card inspection entry, and play/drag gestures into a dedicated client controller.
  • Raise the dice tray's invisible collision walls and ceiling to 1.5× their visual-wall height
    while keeping the visible walls unchanged, and collect tray geometry, placement, spawn, recovery,
    and Scoop tuning values in shared knobs.
  • Extract personal dice-tray rendering, placement, camera travel, die lookup, and tray actions
    into a dedicated client controller.
  • Extract measurement overlay construction, selection, previews, permission checks, drag state,
    room bindings, and measure controls into a dedicated client controller.
  • Enable nesting on new unprivileged Proxmox Debian 13 LXCs so the packaged Redis service can
    create its systemd user namespace, fail and retry APT index updates on transient fetch errors,
    and allow retrying the NodeSource key import after a partial installation.
  • Move whiteboard mesh, stroke replay, ownership/camera mode, drawing gestures, room messages,
    and controls into a dedicated client controller while keeping table input wiring thin.
  • Extract reusable dialog focus, responsive sheet, cluster, drawer, radial-menu, and hold-repeat
    mechanics from the table client into a dedicated UI-surfaces module, with desktop/touch
    component-parity coverage.
  • Pin the container's non-root appuser/appgroup identity to UID 100 and GID 101 for stable
    NFS and bind-mount ownership, and document an NFS-backed Portainer/Dockhand assets volume.
  • Bring the Portainer/Dockhand stack example into production-config parity with bootstrap
    administrator provisioning, migration and rate-limit controls, session lifetime, trusted-proxy
    settings, named storage that preserves the non-root application user's write access, and
    password-file setup and troubleshooting guidance.
  • Move the production Docker image from Node.js 22 to Node.js 24 while retaining the Node.js
    20.9 minimum for direct installations.
  • Begin the browser-client decomposition with table feature modules for piece mesh replacement,
    buffered interpolation, safe piece-property access, and local collider diagnostics.
  • Extend component parity coverage with real desktop/mobile custom-collider scenes and a shared
    component-state gallery that asserts button, field, dropdown, multiselect, and checkbox states.
  • Finish the shared UI migration by replacing legacy button, field, icon, and action-row class
    names in static and generated interfaces with the canonical component classes, then remove the
    compatibility selectors from the stylesheet.
  • Standardize action rows, field groups, labels, helper copy, and live status lines with shared
    layout primitives; migrate custom-collider workflows, library save actions, lighting actions,
    and scene naming to those primitives.
  • Give every overlay and the native custom-collider dialog one shared modal anatomy for backdrops,
    headers, titles, close actions, bodies, and footers while retaining their feature-specific layouts.
  • Unify buttons, text fields, dropdowns, multiselects, and native checkboxes behind shared
    component classes and design tokens, including consistent hover, focus, pressed, disabled, and
    busy states. Migrate the custom collider editor and existing dropdowns to the shared controls.
  • Reuse the shared table-piece limit as the default movement-handler group size, keeping movement
    validation aligned with the authoritative piece-capacity policy.
  • Share thumbnail-grid rendering and image-shape conversion between the image-deck and
    double-sided-tile library workflows.
  • Build server physics and live deck/stack collider updates from the shared renderer-neutral
    collider specification, keeping collision and debug geometry on one set of rules.
  • Centralize overlay kinds, measurement settings, room caps, and whiteboard protocol limits so
    browser rendering, server validation, scene restoration, and history retention share one policy.

Fixed

  • Prevent a late skybox load from restoring a background after Sky Off or replacing a newer
    resolution choice for the same image; stale callbacks now discard their textures.
  • Space scooped dice by their collider size and settle them on the tray floor so they no longer
    spawn overlapping at the center and scatter when physics resolves the collision.
  • Keep every Dice Box add-die choice on the same compact grid footprint instead of mixing square
    icon buttons with differently sized model-die buttons.
  • Place measurement shapes and labels on the rendered board surface instead of a board-wide
    height, so tall 3D board geometry or custom colliders do not make them float above play.
  • Give Save Table a temporary checked icon and label after saving without losing its original icon,
    render the Reset menu divider independently from the danger button, and keep the timer value
    visible in compact UI mode.
  • Keep the poker-stack collider regression expectation aligned with the resized poker-chip model.