# Changelog All notable changes to this project will be documented in this file. ## 2.5.1 - 2026-08-03 ### Added - Template regions now include a dedicated advanced animation modal for editing intro, outro, and Attention Seekers settings directly. ### Changed - Template region animation settings now store as a single JSON object with `intro`, `outro`, and `loop` keys. - The template editor advanced animation field now edits the JSON object directly instead of separate preset selects. - Animate.css is now loaded from vendored assets so template previews and player rendering use the local copy. ### Fixed - Existing databases now migrate legacy animation columns into `animation_json` and then drop the old columns. ## 2.5.0 - 2026-08-03 ### Added - Template regions now support intro, exit, and Attention Seekers animation presets in the editor, with in-canvas preview controls. ### Changed - The template editor now locks editing while preview playback is running so animation changes are easier to inspect. ### Fixed - Existing databases now receive the template region animation columns through the versioned migration path. ## 2.4.2 - 2026-08-02 ### Added - Screen-level controls are now shown on the dashboard for quicker access to screen actions. - Connected clients can now be moved to another screen from the dashboard, and the player redirects to the new screen after the binding updates. - Playlist slide config now includes a mute toggle for video and RTMP items, and the player honors the stored mute state during playback. ### Changed - Playlist canvas lock now stores `canvas_id` on `c_playlists` and links directly to `c_canvas_sizes`. - Playlist add and edit now keep the selected canvas size tied to the playlist form flow, so canvas changes stay consistent while editing. - RBAC permission sections now follow the same order as the admin sidebar, with section spacing kept in 10-point increments. - Admin add/edit pages now share form view-model helpers and common form shells across data sources, signage, RBAC, and user settings, reducing duplicated template markup. - Playlist editing now goes through a shared form page helper with dedicated schedule-rule cards and drag sorting, keeping slide rows and rule state in sync. - Data sources now use per-section route modules for API sources, RSS feeds, and timetables, while the shared controller only keeps the root `/data-sources` redirect. - The consolidated admin shell also refreshed shared layout, toast, login, and error rendering to match the newer helper registration flow. - Connected client row actions now use consistent icon-and-label buttons for pause and blackout across the server-rendered page and live dashboard updates. ### Fixed - Canvas filtering for playlist slides now follows the selected canvas size id instead of a derived signature. - Saving API sources and RSS feeds no longer throws an internal server error after the route split, because the shared data-source refresh task service is wired through the web bootstrap again. ## 2.4.1 - 2026-08-02 ### Changed - Playlist canvas size is now stored on `c_playlists.canvas_signature` and the migration backfills existing single-canvas playlists. ### Fixed - Playlist canvas sizing no longer relies on startup bootstrap logic. ## 2.4.0 - 2026-08-02 ### Added - Playlist slide scheduling now supports multiple OR-ed rule blocks instead of a single date-or-time schedule. ### Changed - Playlist slide schedule data now stores rule sets in `schedule_rules_json`, and the migration backfills legacy schedule columns before dropping them. ### Fixed - Legacy `schedule_mode`, date, time, and day columns are removed from `c_playlist_slides` after the new rule schema is installed. ## 2.3.0 - 2026-08-02 ### Added - Shared add/edit form templates now cover API sources, RSS feeds, announcements, canvas sizes, screens, and templates, reducing duplicate page markup. - Schedule data source CRUD was added for grouped events in the admin UI. - The schedule region was added for rendering grouped events in slides and player playback. - Schedule data now flows through `scheduleGroups` in the slide editor and player payloads, letting the schedule region show upcoming or current entries from a selected group. ### Changed - Admin save actions were standardized around the shared `saveActionButtons` helper, including save, save-and-close, save-and-new, cancel, and delete controls. - Admin routes and page renderers now route through the shared form/view helpers instead of separate add/edit templates for the refactored sections. - Toast, error, login, and shared layout rendering were refreshed to line up with the consolidated admin shell and helper registration flow. ### Fixed - Canvas size defaults now seed only once during bootstrap when `c_canvas_sizes` is empty, instead of running from the schema layout path on every startup. - The schema bootstrap file is now limited to table layout definitions, with one-time seed data handled by the bootstrap layer. ## 2.2.2 - 2026-08-01 ### Fixed - The theme bootstrap now resolves saved `auto` to an actual dark or light value on first paint, so explicit dark mode no longer flashes white while the page loads. - The shared app header is now sticky so the top navigation stays visible while scrolling. ## 2.2.1 - 2026-08-01 ### Fixed - Managed-font source files are now tracked correctly so packaged releases include the `src/web/lib/media` module instead of shipping a broken build. ## 2.2.0 - 2026-08-01 ### Added - Announcement management is now wired for the admin UI and player overlay, with color, template, and expiry controls. - Time / Date regions now render live in the editor and player. ### Changed - Announcement lists now default-sort by Description and show the affected screens for each announcement. - Role add and edit pages now include a Cancel action alongside the save buttons. - Announcement publishing now only targets explicitly assigned screens; unassigned announcements no longer publish globally. ### Fixed - Announcement screen labels now correctly distinguish No Screens, partial assignments, and All Screens. - Role duplicate-name validation on edit now checks the correct RBAC table. ## 2.1.1 - 2026-08-01 ### Added - API source latest-response viewing now supports collapsing and expanding all JSON sections from the edit page. - Placeholder transforms now support basic string helpers like `.upper()`, `.title()`, and `.lower()`. ### Changed - The API source add page now matches the edit page’s section titles and layout more closely. - API source placeholder suggestions now stay leaf-only, so container paths and arrays are no longer suggested as placeholders. - Slide editor and player placeholder resolution now share the same parsing and transform logic. - API source and RSS editor helper text now shows the new placeholder transform syntax. - API sources, RSS feeds, slides, users, and roles now render their delete actions in a disabled outlined-danger state when deletion is blocked, matching the rest of the admin tables. - The users edit page no longer wraps all sections in one outer card, so the profile, password, and roles cards render as separate sections. ### Fixed - API source item-path overrides continue to treat the final path as an array source, while nested object fields remain available for placeholders. - The API source latest-response panel now opens as a tree view by default instead of a flat JSON blob. ## 2.1.0 - 2026-07-30 ### Added - Screen and dashboard player links now render the full player URL instead of only the player base host. ### Changed - The player registry now uses a singleton `d_players` row and `d_screens.player_id` points at that shared player record. - Player startup is now responsible for creating the shared player record, while onboarding and state polling no longer create extra player rows. - The screen/player binding path was simplified so opening a screen binds it to the shared player record without trying to re-register the player. - Added notes near the singleton-player code paths to make the future multi-player migration work easier to revisit. - Managed fonts now have dedicated editor/player sync handling, including a scheduled font sweep, sorted font-family lists, the TinyMCE fullscreen button, and shared font stylesheet loading in the WYSIWYG editor. - Text and RSS region types now own their own default style and fallback behavior instead of relying on shared slide helper fallbacks. - Image and video region handling was also pushed further into modular per-type modules, keeping their editor, preview, and player logic closer to the region itself instead of the shared slide helper layer. ### Fixed - Removed several onboarding and runtime code paths that were still inserting or refreshing `d_players` rows during normal player playback. - Fixed the screen-binding flow so it no longer writes a device UUID into `d_screens.player_id`, which avoided foreign key errors under the shared-player model. ## 2.0.0 - 2026-07-28 ### Breaking Changes - Breaking database schema changes were introduced in this release; existing databases may require migration or recreation before upgrading. ### Added - Broader player and admin release coverage across onboarding, playlist playback, background task handling, and media-region support. ### Changed - The database bootstrap and migration flow were reorganized, with shared DB helpers split out to support the newer schema layout. - Admin and signage views were updated around the newer list, playlist, and RBAC behavior, including playlist scheduling and screen/client actions. - Player runtime, onboarding, and region rendering were tightened so HTML, image, RSS, RTMP, text, video, and webpage regions follow the newer playback flow. - Background task, upload sync, and data-source refresh handling were refined across the web app and startup paths. - Docker, environment, README, and websocket/api documentation were refreshed to match the current release structure. ### Fixed - Client name checks, playlist editing, and slide/media synchronization paths were adjusted to better preserve existing references during admin and player updates. ## 1.5.16 - 2026-07-26 ### Added - Background task handling was split into dedicated handler and scheduling modules, with startup data-source refreshes and unused-upload cleanup wired through the shared setup flow. ### Changed - The admin shell, shared theme, and toast presentation were refreshed to match the newer layout and notification styling. - Playlist scheduling now handles video-duration toggles and already-assigned slides more clearly in the picker and editor UI. - RBAC and settings views were updated to align with the revised admin layout and shared table behavior. ### Fixed - Template and slide thumbnail refreshes now run through the background task queue so template-wide thumbnail regeneration stays consistent. ## 1.5.15 - 2026-07-26 ### Changed - Player slide transitions now start and pause video playback around the fade window so video regions stay aligned with the slide boundary. - Dashboard action cards now use a three-column grid on wider layouts. ### Fixed - Slide video duration probes now preserve sub-second precision instead of rounding to whole seconds. ## 1.5.14 - 2026-07-26 ### Fixed - Dashboard client action icons now render valid Bootstrap Icon classes without duplicating the `bi-` prefix. ## 1.5.13 - 2026-07-26 ### Added - Shared table helpers for pagination, search, and sorting across the admin and signage views. ### Changed - Refreshed the shared admin shell and moved common UI behavior into shared layout and helper modules. - Reworked dashboard, background tasks, RBAC, and signage list pages to use the newer shared table and state flow. - Updated the admin and player branding assets and tightened the page scripts around the new layout structure. ## 1.5.12 - 2026-07-26 ### Changed - Shared web UI helpers are now loaded once in the admin shell and reused across the dashboard, admin, and template editor. - Template lists now show slide counts, and the template editor tracks which regions are already in use. ### Fixed - Template editing now blocks removal of regions that are still referenced by slides. ## 1.5.11 - 2026-07-26 ### Added - Video regions are now supported end to end, including player rendering, admin editing, playlist scheduling, and player sync. ### Changed - The slide, template, and playlist flows were updated so video content can be created, configured, and scheduled alongside existing region types. - Player rendering and related media handling now recognize the new video region implementation. ### Fixed - Region and upload handling were adjusted so video media syncs cleanly through the player and web admin paths. ## 1.5.10 - 2026-07-26 ### Added - Scheduled background tasks now have their own settings page, separate permission gate, and manual run action alongside the main queue view. - The slide editor now includes a refreshed preview/sidebar layout and a cropper-based image upload flow. ### Changed - Background task and admin list views now use richer pagination and filtering so queue state, task sources, and recurring jobs stay easier to navigate. - The admin shell and shared styling were refreshed to support the updated settings pages, slide editor layout, and task table presentation. ### Fixed - Upload sync and slide thumbnail refresh handling were tightened so slide changes queue follow-up work more reliably. ## 1.5.9 - 2026-07-26 ### Fixed - User creation now keeps the role checkboxes inside the add-user form so selected roles are submitted correctly. ## 1.5.8 - 2026-07-25 ### Fixed - Upload removal requests now authenticate correctly when a deployed player parses a bodyless `DELETE` request as an empty object, which could cause 401s for newly uploaded images. ## 1.5.6 - 2026-07-25 ### Changed - Playlist slide picker now uses a button to reveal already added slides, while still defaulting to showing only available slides. - Already-added slides in the picker are now labeled and visually muted to make them easier to spot. ### Fixed - Thumbnails in slide and playlist tables now follow the slide canvas ratio and cap at 5.5rem tall. - Thumbnail-only table columns are no longer sortable. ## 1.5.5 - 2026-07-25 ### Fixed - Fixed a migration gap that could leave `slides.thumbnail_path` missing on upgraded databases. ## 1.5.4 - 2026-07-25 ### Added - Cropper.js has been added to aid with image uploading. ### Changed - Upgraded Multer to 2.x to remove the deprecated 1.x dependency warning. - Tightened a few admin UI details, including slide editor and RBAC list spacing/typography adjustments. ## 1.5.3 - 2026-07-25 ### Added - A modal-based slide picker for playlist editing with search, multi-select, and slide thumbnails. - Reusable modal and table-pagination helpers for the admin UI. - Slide thumbnail previews in playlist schedules, with image fallbacks when a thumbnail is missing. ### Changed - RTMP playback now probes session readiness more aggressively and retries startup before surfacing failures. - Playlist editing now includes richer scheduling controls, live slide counts, and support for skipping unavailable RTMP slides. - Admin lists and background task pages now preserve filter and pagination state during AJAX navigation. - Shared admin shell styling and helpers were refreshed to support the newer list, modal, and pagination UI. ### Fixed - Player upload sync and route handling now degrade more gracefully when backend services are unavailable. - RTMP and playlist playback now recover more cleanly when a stream fails to initialize or respond in time. ## 1.5.2 - 2026-07-25 ### Fixed - Fixed player media upload sync so signed upload requests are verified after the request body has been parsed. ## 1.5.1 - 2026-07-25 ### Fixed - Fixed the account page so it can save changes again. ## 1.5.0 - 2026-07-25 ### Added - RTMP slide regions with ffmpeg-to-HLS playback support in the player. - Service-worker-backed player caching and offline recovery paths for playlists and playback state. - Broader slide, template, playlist, RSS, and API source support, including richer region handling and background refresh processing. ### Changed - Reworked the web admin app around a newer modular route and view layout, with shared helpers moving into `src/web/lib`, `src/web/pages`, and `src/web/views`. - Refreshed the admin shell styling and theme bootstrapping, including local AdminLTE assets, vendored Bootstrap Icons, and earlier theme initialization on first paint. - Rebuilt RBAC around CRUD permissions and updated the admin screens for roles, users, and action gating. - Refactored the player onboarding flow, client-name handling, and runtime storage so screen identities persist more reliably across refreshes. - Tightened duplicate-name checks and other admin-side validation paths. ### Fixed - Improved player fallback behavior when the database is unavailable. - Cleaned up player runtime and routing paths so screen lookups and live updates degrade more gracefully. ### Docs and Ops - Updated Docker, environment, and documentation files to match the current release structure and player/web APIs. ## 1.4.6 - 2026-07-22 ### Changed - Refined RBAC enforcement across the admin UI and route layer, especially for list actions and edit screens. - Updated the dashboard and admin styling to match the revised permission model and page layout. - Adjusted database helpers and admin data views to support the newer RBAC and list rendering behavior. ## 1.4.5 - 2026-07-21 ### Changed - Renamed the admin screen commands route to client commands and aligned the dashboard copy with client-focused terminology. - Updated the RBAC and database helpers to support the revised client command flow. - Refined the client list view and dashboard interactions around the new client command behavior. ## 1.4.4 - 2026-07-21 ### Fixed - Rendered 404 pages for unmatched routes. ## 1.4.3 - 2026-07-21 ### Fixed - Fixed RBAC client action visibility. ## 1.4.2 - 2026-07-21 ### Fixed - Fixed duplicate permissions cleanup. ## 1.4.1 - 2026-07-21 ### Added - RBAC roles system support. ### Changed - Version bump to 1.4.1. ### Fixed - Schema migration audit columns. ## 1.3.4 - 2026-07-21 ### Fixed - Fixed duplicate onboarding client names. ## 1.3.3 - 2026-07-21 ### Changed - Added the first round of modular admin-page work, including a shared admin route layer and refreshed dashboard/list rendering. - Updated the admin shell styling and layout handling for the newer page structure. - Adjusted package metadata and lockfile state to match the release. ## 1.3.2 - 2026-07-21 ### Changed - Version bump to 1.3.2. ## 1.3.0 - 2026-07-20 ### Added - Split shared helpers, bootstrap logic, route groups, and upload-sync behavior out of `web.js`. - Split websocket and runtime handling into `runtime.js`. - Split playlist assembly and revision hashing into `playlist.js`. - Split onboarding and player HTTP routes into dedicated modules. - Split render utilities and template loading into `render-helpers.js`. ### Changed - Kept `web.js` focused on wiring and server startup. - Kept `player.js` mostly as startup and orchestration. ### Fixed - Fixed screen playlist reassignment so changing a screen's playlist now triggers a refresh. - Fixed single-slide playlist refresh behavior so updates do not get stuck behind the current slide. ## 1.1.5 - 2026-07-15 ### Fixed - Fixed text pasting in the admin UI. ## 1.1.4 - 2026-07-15 ### Fixed - Fixed the admin table and playlist reorder UI. ## 1.1.3 - 2026-07-15 ### Added - Playlist drag sorting. - Local SortableJS. - Playlist UI updates. ## 1.1.2 - 2026-07-14 ### Changed - Updated the admin layout and frame shell styling. - Refined `src/web/view.js` so view rendering handles the revised shell structure. - Adjusted package metadata for the release. ## 1.1.1 - 2026-07-14 ### Changed - Refreshed favicon and layout assets. ## 1.1.0 - 2026-07-14 ### Changed - Refactored the web server and release workflow. ## 1.0.2 - 2026-07-14 ### Fixed - Handled player redirects on screen slug change. ## 1.0.1 - 2026-07-14 ### Changed - Made screen slugs editable. ## 1.0.0 - 2026-07-14 ### Fixed - Initial release.