Release 1.61.0
Important Release Documents
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
constrainedand 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=constrainedURL 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
OutlineStateManagerinstead of the legacySVGSectionManipulator - CSS
bgColorfill applies directly to all outline elements - The
defaulttheme state supportsbgColorfor setting a base fill SVGSectionManipulatoris 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: truestripping alpha channels, re-enabled blur for progressive loading, and aligned WebGLpremultipliedAlphabetween 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_EDITmode 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
backgroundSvgfield 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
IncorrectResultSizeDataAccessExceptionon duplicate organization keys. Database migration V96 adds unique constraints onprivate_keyandpublic_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:
AWS_PUBLIC_BASE_URL(explicit) – e.g.,https://bucket.nyc3.digitaloceanspaces.comAWS_ENDPOINT_URL(derived path-style:endpoint/bucket)- 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 offto nginx configuration - Changed nginx
try_filesfallback from/index.htmlto=404for 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
.Datefallback for lastmod when.Lastmodis empty (fixes 76% missing lastmod)
Performance
- Fixed features page LCP (4.2s -> ~2.0s) by removing
loading="lazy"from above-fold image and addingfetchpriority="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
- Converter service: If using a non-AWS S3 provider, add
AWS_PUBLIC_BASE_URLto your configuration - Editor S3 config: New
S3_ENDPOINTandS3_PATH_STYLEenvironment variables available for Garage/MinIO - 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
- Error tracking: Optional GlitchTip DSN configuration available for per-service error reporting
See Deployment Changes for full details.
Additional Documentation
- Deployment Changes - Database migrations, environment variables, Helm changes
- Renderer API Changes - Error messages API, constrained GPU mode, unified section API
- Backend API Changes - Event error responses, GA shape fill color
Questions? Contact the Seatmap team or check our documentation at seatmap.pro.