Changelogs

Follow up on the latest improvements and updates.

Changelog

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: loadScheduleContext extracted 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.

Changelog

Date: 2026-06-30

What's New

  • Song Filters — A new clock item type lets you define criteria-based slots directly in your clock (e.g. "play any uptempo song from the 80s"). MusicOne schedules the best-matching track automatically. You can manually pin a specific song to a filter slot, and the system will protect your pick from being swapped out during re-scheduling. When you edit a slot, any dependent filter slots downstream are automatically re-evaluated and re-filled.
  • Configurable Artist Separation — Station settings now include a slider (10–90%) that controls how strictly artists are kept apart across your whole station, with a live preview right in the rule form so you can see the effect before you save. It applies to both manual search and live scheduling, and it auto-hides when your library doesn't have enough qualifying artists to matter. We also moved it to a clearer spot in the UI based on early feedback.
  • Track Start/Stop Dates — Songs can now be given a start and stop date, so they automatically enter and leave rotation on a schedule — handy for seasonal tracks, promos, or anything with a shelf life, without you having to remember to pull it manually.
  • Team & Permissions — Station owners can now invite team members and control exactly what each person can access. A new Team page (visible to owners only) lets you assign per-station access levels: full editors or view-only. Viewers see the schedule and library but all editing controls are locked. Permissions are enforced server-side, and changing someone's access immediately invalidates their active session so the new level takes effect right away.
  • Schedule Column Customisation — Choose which columns appear in your schedule view: Tempo, Gender, Cart #, Hit Year, and Track Length are all toggleable, and your preferences are saved per station. Category items can now also be sorted by their rotation stack position, so you can see at a glance where each song sits in the rotation queue.
  • PlayIt Live Export — Schedules can now be exported in PlayIt Live format (.pipl), ready to load directly into PlayIt playout software.
  • Improved Manual Stop Panel — The manual stop list is now virtualised, so stations with large libraries load and scroll smoothly. It supports load-more pagination, sortable columns, and shows rule violations inline so you can see at a glance whether a track is eligible before adding it.
  • Clearer Scheduler Error Messages — Error messages from the scheduling engine have been rewritten in plain language, so when something can't be placed, it's easier to understand why and what to do about it.
  • Inline Editing for Media Columns — Tempo, gender, and sound codes can now be edited directly in the category media list — no dialog needed.
  • CSV Import Auto-Mapping — The CSV library importer now auto-maps columns for you, with a dedicated mapping dialog you can adjust and save for next time.
  • Standardised Empty States — Empty states across the app (no rules, no schedules, etc.) have been redesigned for clarity and accessibility.

Fixes

  • Category and schedule overview metrics (tempo, gender, turnover, spins) now correctly account for packet-based categories.
  • CSV track imports validate cart IDs upfront and warn you about duplicates before importing.
  • Artist names are refreshed on every sync, not just on initial import, so name changes propagate reliably — plus related artist-handling fixes.
  • Linked (intro/outro) tracks now come through correctly on import.
  • "Last played" times in rotation history were showing the wrong slot time — fixed.
  • Fixed an issue affecting clock length figures in the KPI view.
  • Renewal and payment confirmation emails now attach the invoice PDF and copy the right internal recipients.
  • After shuffling a category, MusicOne now automatically repairs "seams" where two songs by directly-linked artists ended up back-to-back at the shuffle boundary. Artist separation also now only applies to directly-linked artists, not artists who merely share a common collaborator — so separation rules won't over-trigger.
  • Fixed a bug where typing a time into a time picker could overwrite the existing value on the first digit.
  • Fixed the daypart icon on manual stop's current slot showing the wrong colour.
  • Fixed a billing issue where a past-due subscription wasn't recovered correctly if a renewal date was moved forward.
  • Total plays count for a song now only counts plays that actually aired.
  • Fixed the CSV import dialog closing unexpectedly when the column-mapping dialog's close button was pressed.

Under the Hood

  • Added a rotation-integrity tripwire that flags categories without enough available songs to reliably fill their slots — an early internal warning system to help catch thin rotations before they become on-air problems.
  • Fixed a startup issue affecting the API and relay services under our dev toolchain (no user-facing impact).
  • Fixed the mobile app failing to reach the API/relay server over local development networks (internal/dev-facing).