Changelog - Board Docs

Changelog

Notable changes to the Board Godot SDK. The format follows Keep a Changelog, and the project adheres to Semantic Versioning.

Note: The Godot SDK is at v1.0.0-beta.1, the first beta. It covers the full public-API surface of the Board platform and is the first version intended for building games against, ahead of the stable 1.0.0.

[1.0.0-beta.1] — 2026-05-26

First beta release. The SDK covers the full public-API surface of the Board platform across input, session, save, avatar, pause, and application domains, with a no-build-script export-and-install path and a polished sample app.

Added

Changed

Removed

Compatibility

Migration Notes

If you’re upgrading from a pre-v1.0 prerelease:

  1. Rename is_ready() calls — search-and-replace Board.session.is_ready() → Board.session.is_session_ready() across your codebase.
  2. Drop the Board.services_ready signal handler if you wired one — the signal was never emitted; query Board.session.are_services_ready() directly instead.
  3. Replace the addon — re-copy addon/addons/board_sdk from the new SDK release into your project’s addons/ directory. The bundled board.aar updates with it.
  4. Bump plugin.cfg in your local copy if you symlinked the addon at a specific version. New version: 1.0.0-beta.1.
  5. Touch is a single per-frame snapshot — Board.input.contacts_received is the only touch signal. If you need discrete edges (tap-down / tap-up via is_touched, or piece-lifted), keep your own previous-frame map keyed by contact_id and diff each frame:
   var _prev := {}  # contact_id -> is_touched

func _on_contacts_received(contacts: Array) -> void:
          var seen := {}
          for contact in contacts:
              var id: int = contact.contact_id
              seen[id] = true
              var was_touched: bool = _prev.get(id, false)
              if contact.is_touched and not was_touched:
                  _on_tap_down(contact)
              elif was_touched and not contact.is_touched:
                  _on_tap_up(contact)
              _prev[id] = contact.is_touched
          for id in _prev.keys():
              if not seen.has(id):
                  _on_piece_lifted(id)
                  _prev.erase(id)
  1. Avatars are loaded per-player, not by arbitrary id — replace any raw-bytes loading with await Board.avatar.await_load_avatar(int(player.avatar_id)), which returns a ready-to-display ImageTexture. Drop your own decode and caching; the loader decodes, caches, and coalesces concurrent loads for you.

Earlier Versions

The 0.x prerelease series isn’t documented here. v1.0.0-beta.1 is the first documented release, intended for building games against ahead of the stable 1.0.0.