Release 1.61.0

Release date: April 6, 2026

Release Notes - Seatmap Platform

Version 1.61.0 - 2026-04-06

Release Focus: GPU Memory Optimization, Unified Section States, Image Pipeline Overhaul, Error Handling UX, and Editor Stability Fixes


What’s New

This release introduces automatic GPU capability detection to prevent crashes on memory-limited mobile devices, completes the unified section state system across all outline types, overhauls the image pipeline from PNG to WebP, adds contextual error overlays for event loading failures, and fixes multiple editor regressions.


New Features

Constrained GPU mode (SEAT-831)

Large venues on memory-limited devices (iPhone, low-end Android) could crash due to GPU memory exhaustion when uploading high-resolution background textures. The renderer now auto-detects device capabilities and adapts its rendering strategy.

How it works:

  • A GPU micro-benchmark runs at initialization, measuring texture upload throughput
  • Devices scoring above the threshold are classified as constrained and receive:
    • Canvas dimensions capped to 2048px (reduced GPU memory allocation)
    • Two-layer detail texture system: a low-resolution full venue texture stays in GPU memory, while a high-resolution crop is loaded on-demand when the user zooms into a section
    • Stale detail texture crops are discarded on viewport changes to prevent memory leaks
  • Desktop and high-end mobile devices continue to use full-resolution textures as before
  • The tier can be forced via gpuTier: 'constrained' in settings or ?gpuTier=constrained URL parameter

For host apps: No changes required. The optimization is automatic and transparent.

Unified section API (SEAT-892)

Section disable, enable, and filter operations now work consistently across all outline types – SVG background sections, editor-created shapes, auto-generated outlines, and fallback outlines.

New source-agnostic API methods:

New method Replaces (deprecated)
disableSections(ids, options?) disableSvgSectionsByIds()
enableSections(ids) enableSvgSectionsByIds()
filterSections(ids, options?) filterSvgSectionsByIds()
removeFilterSections(ids?) removeFilterSvgSectionsByIds()
disableSectionsByNames(names, options?) disableSvgSectionsByNames()
enableSectionsByNames(names) enableSvgSectionsByNames()

The new names reflect that these methods work on all section types, not just SVG-bound sections. The deprecated names continue to work.

Themeable opacity: The unavailable and filtered states now support an opacity property in svgSectionStyles, overriding the defaults (0.5 and 0.3 respectively). The cursor theme value is also respected – previously hardcoded values overrode theme settings.

Bug fix: filterSections({ resetAll: true }) now correctly clears the previous filtered state. Previously it called the wrong internal method, leaving data-filtered attributes in the DOM.

Internal changes:

  • All state operations route through OutlineStateManager instead of the legacy SVGSectionManipulator
  • CSS bgColor fill applies directly to all outline elements
  • The default theme state supports bgColor for setting a base fill
  • SVGSectionManipulator is deprecated

For host apps: No API changes needed. Existing calls work the same but now affect all section types. Migrate to the new method names at your convenience. If you had workarounds for shape sections not responding to disable/filter, you can remove them.

Documentation: Section States & Styling – full API reference, migration guide, and theming examples.

Playground: Load the unifiedSectionStates preset to test all states interactively.

Error handling UX

The renderer now shows contextual error overlays when event loading fails, replacing the previous silent failure mode.

Error states:

  • Event not found (HTTP 404): “Event not found / The requested event does not exist”
  • Event archived (HTTP 410): “Event is no longer available / This event has been archived”
  • Event not published (HTTP 422): “Event is not available / This event has not been published yet”
  • Generic error: “Failed to load event / Error {status}”

All error messages are customizable via loader.errorTexts in renderer settings:

const renderer = new SeatmapBookingRenderer(container, {
  publicKey: 'your-key',
  loader: {
    enabled: true,
    style: 'overlay',
    errorTexts: {
      eventArchived: { title: 'Event ended', subtitle: 'This event is over' },
      eventNotPublished: { title: 'Coming soon' },
      eventNotFound: { title: 'Not found' },
      genericError: { title: 'Something went wrong' },
    },
  },
});

The error overlay inherits the loader theme (colors, font size, opacity). Both overlay and top-bar loader styles display errors as a centered overlay.

Booking landing page

New documentation landing page for the booking-client package with:

  • Interactive playground for testing renderer configurations
  • API reference with method signatures
  • Embed code example for iframe integration

Manual GA label anchoring (SEAT-624)

GA (General Admission) sections now support manual label placement and custom label styling. Previously, GA labels were auto-positioned at the section centroid. Editors can now drag the label anchor point to any position within the section and customize label font, size, and color.


Improvements

Outline ID optimization

Section outlines in the SVG overlay now use numeric IDs internally instead of UUID strings. This improves outline initialization performance (O(1) lookup vs linear search per section) and reduces SVG payload size. A database migration (V97) replaces existing GUIDs in persisted SVGs.

For host apps: No impact. This is an internal optimization with no API changes.

Image pipeline: PNG to WebP (SEAT-897)

The converter service now generates WebP images instead of PNG for venue backgrounds. This reduces image payload size by 30-50% and improves progressive loading quality.

For host apps: No changes required. The renderer automatically handles WebP images.

Editor GA color display (SEAT-828)

The editor now correctly displays the chosen GA section color in the canvas. Previously the color was stored but not visually reflected in the editor view.

Booking API thumbnails (SEAT-779)

Schema thumbnails in the private v2 Booking API have been validated with E2E tests, confirming correct generation and serving for all venue types.

Build-time version

The booking-client version is now read from package.json at build time instead of using a hardcoded string, ensuring the reported version always matches the published package.


Bug Fixes

High Priority

  • SEAT-897: Black default fills and white stripe artifacts in the converter/booking-client image pipeline. Fixed Sharp palette: true stripping alpha channels, re-enabled blur for progressive loading, and aligned WebGL premultipliedAlpha between context and textures
  • SEAT-894: Changing “Starting from” number on round tables no longer appends 0 to all seat numbers. The input value is now coerced to integer before seat name computation
  • SEAT-893: Undo now works correctly after hiding a whole table. Previously, hiding a table from outside TABLE_EDIT mode did not register an undo snapshot

Editor Regressions

  • SEAT-891: Venue deletion no longer fails with 409 Data Conflict
  • SEAT-890: SVG section bindings (mapping) are now preserved after save. The backgroundSvg field was not persisted during schema save
  • SEAT-889: GA section deletion from the inspector now persists correctly after save

Renderer Fixes

  • SEAT-809: Zoom and pan visual artifacts resolved via detail texture pipeline improvements (stale crop discard, canvas-based cropping instead of createImageBitmap)
  • SEAT-791: Fixed Spring IncorrectResultSizeDataAccessException on duplicate organization keys. Database migration V96 adds unique constraints on private_key and public_key
  • GA background-bound labels now preserved across outline rebuilds
  • WebGL section label vertical alignment now matches Canvas2D baseline

Booking API

GA shape fill color (SEAT-829)

The fill color of GA section shapes (used for pricing tier visualization) is now returned in the booking API response under sectors[].shapes[].fill.

Example response:

{
  "sectors": [
    {
      "id": 1,
      "name": "Floor A",
      "isGa": true,
      "shapes": [
        {
          "text": "Floor A",
          "textColor": "#FFFFFF",
          "fill": "#3498db",
          "width": 250,
          "height": 250
        }
      ]
    }
  ]
}

Host apps can use shapes[].fill to render GA section colors in their own UI (venue pickers, event cards, section legends).

Distinct event error responses

The booking API now returns specific HTTP status codes for different event states:

Scenario HTTP Status Error Code
Event does not exist 404 Not Found ENTITY_NOT_FOUND
Event is archived 410 Gone EVENT_ARCHIVED
Event is not published 422 Unprocessable EVENT_NOT_PUBLISHED

Previously, all non-available events returned a generic 404.


Editor

Label inspector improvements (SEAT-810, SEAT-834)

  • Fill, stroke, and border width controls are now hidden for Label objects – these had no visual effect and confused users
  • Labels show a dedicated Text Color picker with alpha/opacity support (default: 50% opacity)
  • The color picker across all shape types now includes an alpha slider for transparency control. Colors with alpha < 1 are stored as rgba() values; fully opaque colors remain hex for backward compatibility

Converter Service

New: AWS_PUBLIC_BASE_URL environment variable (SEAT-887)

The converter-service now supports a configurable public URL base for S3-compatible storage providers. Previously, public file URLs were hardcoded for AWS S3 with a special case for Yandex Cloud, which broke URLs for other providers (DigitalOcean Spaces, MinIO, etc.).

New env var: AWS_PUBLIC_BASE_URL – optional. When set, used as the public URL prefix for all generated image URLs.

URL resolution priority:

  1. AWS_PUBLIC_BASE_URL (explicit) – e.g., https://bucket.nyc3.digitaloceanspaces.com
  2. AWS_ENDPOINT_URL (derived path-style: endpoint/bucket)
  3. Default: AWS virtual-hosted (bucket.s3.region.amazonaws.com)

Action required: Self-hosted customers using non-AWS S3 providers should add AWS_PUBLIC_BASE_URL to their converter-service configuration.

WebP output format (SEAT-897)

The converter now generates WebP images instead of PNG. This change is transparent to host apps – the renderer accepts both formats.


Knowledge Base

Custom 404 Page

  • New “Seat not found” 404 page with an SVG venue illustration, themed for both dark and light modes
  • Replaces the previous soft-404 behavior where unknown URLs returned the homepage with HTTP 200

Features Page Expansion

  • Added 9 new capability cards: 3D Venue Preview, Curved & Circular Venues, Seat Name Validation, Event Lifecycle Management, WebGL High-Performance Rendering, Keyboard Shortcuts, Round Tables, On-Premise Deployment, Iframe Embedding
  • Page word count increased from ~457 to 800+ to meet SEO content depth requirements

Structured Data (JSON-LD)

  • Added BreadcrumbList schema to all non-home pages
  • Added WebPage schema to marketing pages (features, demo, integration)
  • Added TechArticle schema to all Knowledge Base documentation pages
  • Added Organization foundingDate and Offer availability to homepage schema
  • Fixed FAQPage JSON-LD output that produced double-escaped quotes

Technical SEO

  • Fixed nginx trailing-slash redirects that leaked internal port 8081
  • Added absolute_redirect off to nginx configuration
  • Changed nginx try_files fallback from /index.html to =404 for proper 404 handling
  • Added Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, and Permissions-Policy headers

Sitemap

  • Excluded 27 robots.txt-disallowed URLs from sitemap (renderer examples, language pages)
  • Excluded /tags/* taxonomy pages from sitemap
  • Added .Date fallback for lastmod when .Lastmod is empty (fixes 76% missing lastmod)

Performance

  • Fixed features page LCP (4.2s -> ~2.0s) by removing loading="lazy" from above-fold image and adding fetchpriority="high"
  • Extended async CSS loading to all pages (was only homepage and KB)
  • Added font preload for red-hat-text-v19-latin-600.woff2

Design Improvements

  • Release cards: added minor/patch visual hierarchy (gold left border for minor, “patch” badge for fixes), card background fill, box-shadow, hover lift effect
  • FAQ page: card-based Q&A layout with gold section headings, bordered answer cards, hover states
  • Hamburger menu touch target increased from 24x22px to 44x44px

Migration Guide

For Existing Users

This release is 100% backward compatible.

No code changes required. The deprecated *SvgSections* method names continue to work. Migrate to the new names (disableSections, enableSections, filterSections, removeFilterSections) when convenient – see the migration table for the full mapping.

New loader.errorTexts customization is optional – defaults are provided for all error states.

For Self-Hosted Deployments

  1. Converter service: If using a non-AWS S3 provider, add AWS_PUBLIC_BASE_URL to your configuration
  2. Editor S3 config: New S3_ENDPOINT and S3_PATH_STYLE environment variables available for Garage/MinIO
  3. Database: Five new Flyway migrations (V94-V98) are applied automatically on startup. V97 is a data migration that replaces GUIDs in SVG outlines – review deployment notes for details
  4. Error tracking: Optional GlitchTip DSN configuration available for per-service error reporting

See Deployment Changes for full details.


Additional Documentation


Questions? Contact the Seatmap team or check our documentation at seatmap.pro.