Date: 2026-07-31
What's New
- Rule Violations in the Schedule View — The schedule listing now has a toggleable Violations column showing per-song rule breaches at a glance, backed by a live re-check pass that re-evaluates a finished schedule against your current rules — so if you tighten a rule after generating, you'll see what it now breaks without regenerating.
- Rule Flexibility Badge — Each rule setting in the Rules list and rule forms now shows a measured flexibility score (colour-coded emerald/amber/red), calculated by simulating a full week against your library. It tells you at a glance whether a rule is realistic for your rotation or too tight to satisfy consistently.
- Disregard Rules During Generation — Before generating a schedule, you can now pick specific rules to disregard for that run. A read-only summary afterward shows exactly which rules (including any since deleted) were set aside, so nothing is silently ignored.
- Schedule Reminders — MusicOne now sends an automatic reminder email when a day still needs scheduling attention, deep-linking straight to that day. This relies on your station having a timezone set (see below) and is skipped for stations without one recognised.
- Station Timezone — You can now set a timezone when creating a station, or change it later from station settings. This powers Schedule Reminders and other time-aware features going forward.
- Replace Panel — Upcoming View — Opening the replace panel on a slot now shows the upcoming rotation choices for that slot, not just the immediate candidates, making it easier to pick a good swap.
- Light Theme (Beta) — MusicOne now offers a light theme, toggled from the navbar account menu. Every major surface — schedules, categories, clocks, rules, settings, charts, tooltips, and pickers — has been migrated with accessibility-checked contrast.
- Date & Time Format Preferences — Choose your preferred date, time, and week-start format from Preferences; it's now applied consistently across schedules, categories, preferences, and media history.
- Categories — Bulk Actions, Packet Details & Track Artists — Multi-select song rows and packet items with a right-click menu and bulk-act on them from the action bar, even for songs inside a packet. Packet rows now show average length and rotation-stack distribution, and you can sort packets by name. Track rows also get an editable, sortable Artist column.
- Collapsible Schedule Sidebar — Collapse the calendar sidebar to give the schedule list more room; your preference is saved.
- CSV Category & Sound Code Import — CSV imports can now assign songs to categories and sound codes straight from spreadsheet columns, with a preview of any new categories the import will create. A "mood" column can also be mapped directly into sound codes.
- Intro/Outro Sync (M1, CSV, CloudSync) — Set intro, outro, and ending points for a track from a new slider and cold/fade toggle in the media dialog. These fields now round-trip through CSV import/export and sync automatically to connected CloudSync automation software (P1).
- Dynamic Cart IDs — Cart ID fields now accept variable placeholders (e.g. weekday, sequence number) that auto-expand per track occurrence, so you no longer have to hand-number carts that follow a pattern.
- New Export Formats — Added Rivendell (.riv) and ENCO DADpro ASCII (.asc) schedule exporters, plus mAirList Block command export, expanding the list of playout systems MusicOne can hand a schedule to directly.
- Category-Scoped Rules — Gender, tempo, sound code, and clock rules can now be scoped to specific categories rather than applying station-wide.
- Safer Station Removal — Removing a station now snapshots it to secure storage first and emails the organisation owner, and MusicOne's operators can restore a removed station from that snapshot if needed. The removal flow itself is unchanged for you — this adds a safety net behind it.
Fixes
- Packets — a song can now belong to only one packet per station; packet creation is blocked inside virtual categories; packet membership resolves reliably across every row instead of an arbitrary one; damaged or gapped packet rankings are automatically repaired and normalised on import; packets with no songs are dropped rather than imported.
- Scheduling engine — candidates are now evaluated at a slot's real position within the hour; a song being swapped out no longer counts against its own hourly limit; candidate lookups are correctly scoped to your organisation and station; rule-violation reports now list every setting a song actually breaks, not just the first match; two edge cases that could starve the candidate pool under "search depth" settings were closed.
- Artist separation — the custom separation threshold now scales correctly with the slider and uses the rule's actual separation time (not double it); your slider position is no longer lost on save.
- CSV import/export — a blank mapped Title cell no longer blanks the stored title; an unmapped Title column no longer renames tracks to their cart number; importing an artist-less file no longer wipes artist names off already-matched songs; file paths and durations now survive an export/import round trip intact; encoding is auto-detected instead of assumed UTF‑8; duplicate-drop warnings now name the actual song and packet involved; category CSV export now populates virtual categories and always includes the Category column.
- Playout import/export mapping — PlayIt Live and PlayoutONE command imports now map to MusicOne's predefined command types instead of falling back to a generic passthrough; Note commands are prefixed so they're identifiable at a glance; command/marker labels show the correct start time; unset gender/tempo on .m1 imports stay blank instead of defaulting to male/medium; WAIT command export now derives its length from duration and formats hour-plus holds correctly.
- Other — mobile slot swaps now resolve through the real slot instead of a temporary stand-in; media history now attributes every scheduled play to the correct category; a sync race that could let inbound CloudSync data collide with an in-progress import was fixed; preference migrations no longer needlessly re-run on every page load.
Under the Hood
- Internal refactors ahead of further scheduling work:
loadScheduleContextextracted from schedule start-up; the replace panel's UI split into reusable components (UpcomingList, PanelModeToggle, PanelRow, Violations, LastPlaysSquares).
- Rule flexibility simulation now runs as a background job (the scheduling core gained dry-run/collect-all modes) so measuring a rule's strictness no longer blocks the API.
- CloudSync gained groundwork for routing media to the correct station by player type, plus a job that automatically sweeps stale import sessions.
- Light theme groundwork: design tokens split into light/dark blocks with an automated audit script to catch any unmigrated colours.
- CI now runs every package's tests via Turbo and reports all failures instead of stopping at the first one; new test coverage added for the CSV importer and packet logic.