=== BLR Backline ===
Contributors: badlittlerobot
Tags: music, bands, releases, events, artist management
Requires at least: 6.9
Tested up to: 6.9
Requires PHP: 8.0
Stable tag: 1.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

A private front-end workspace for bands and music projects to keep releases, media, and schedules organized.

== Description ==

BLR Backline is the core workspace for bands, musicians, and music projects running on WordPress.

Version 1.1 focuses the base plugin on the essential information a working band needs to keep organized without turning the dashboard into a full CRM or business suite.

Core features include:

* Dashboard
* Albums
* Tracks
* Images
* Events
* Calendar
* Notifications
* Front-end profile and user access controls
* Shared module, route, capability, media, and view infrastructure for Backline extensions
* Optional uninstall cleanup controls

For business administration, install the separate BLR Backline Operations extension. Operations adds Contacts, Outreach, Opportunities, Submissions, Tasks, and Finances while using the same Backline dashboard and access system.

BLR Backline bundles its dashboard assets locally and does not include telemetry, usage tracking, external analytics, or call-home behavior.

== Installation ==

1. Upload the `blr-backline` folder to `/wp-content/plugins/` or install the ZIP through WordPress.
2. Activate BLR Backline.
3. Open Backline Settings.
4. Configure the dashboard slug, allowed users, enabled modules, and branding.
5. Optionally install BLR Backline Operations for business/admin workflows.

== Privacy ==

The Backline base plugin stores records and settings needed for albums, tracks, images, events, notifications, user access, and dashboard behavior. The plugin does not send analytics or telemetry to the plugin author.

Extensions can register their own privacy/export behavior through Backline. BLR Backline Operations provides the contact and outreach privacy workflows associated with its business records.

If uninstall cleanup is enabled in Backline settings, plugin-owned base data can be removed during uninstall. Otherwise data is preserved.

== Third-Party Resources ==

BLR Backline bundles AdminKit, Bootstrap, Select2, Flatpickr, and Feather Icons locally. Additional license and source details are documented in `assets/THIRD_PARTY_ASSETS.md`.

== Frequently Asked Questions ==

= Who can access the dashboard? =

Administrators always have access. Other users must be explicitly added to the allowed users list and assigned the modules they need.

= Where are Contacts, Outreach, Tasks, and Finances? =

Beginning with Backline 1.1, those business workflows live in the separate BLR Backline Operations extension.

= Will upgrading from 1.0.5 delete my business records? =

No. Backline 1.1 and Operations 1.0 preserve the existing post types and metadata so the split does not require destructive record migration.

= Does the plugin collect analytics or telemetry? =

No.

= Will uninstalling the plugin remove its data? =

Only if uninstall cleanup is enabled in Backline settings. Otherwise data is preserved.

== Changelog ==

= 1.1.0 =

* Refocused BLR Backline as the core artist/release workspace: Dashboard, Albums, Tracks, Images, Events, Calendar, and Notifications.
* Moved Contacts, Outreach, Tasks, and Finances to the separate BLR Backline Operations extension.
* Preserved the Backline extension APIs for modules, routes, navigation, capabilities, views, forms, and dashboard integration.
* Preserved existing 1.0.x business data for use by BLR Backline Operations without destructive migration.
* Removed base-dashboard dependencies on business modules and guarded optional extension privacy/cleanup integrations.
= 1.0.5 =

* Hardened permissions and access controls, including administrator-only wp-admin ACL/settings access, a dedicated Manage media capability, Finance access isolation, restricted Users-directory visibility, and preserved per-user Outreach/Contacts permission independence.
* Strengthened Outreach campaign creation and delivery with atomic submission IDs, ownership-aware campaign locks, serialized queue construction, normalized-email deduplication, authoritative sent-state protection, atomic contact send totals, and durable daily send-limit tracking.
* Improved Outreach queue behavior with exact-day quota rollback, stale Sending recovery, deferred next-day processing after daily limits, skipped-recipient handling, empty-queue protection, safer Failed-recipient retries, and cleanup of duplicate legacy recipient logs.
* Separated Outreach delivery state from manual workflow state so replies, follow-ups, closures, notes, and retries no longer overwrite successful-delivery history or distort campaign reporting.
* Locked Outreach campaign messages, recipients, and attachments once delivery begins, preserved CRM history during rollback and duplicate cleanup, and added bounded cleanup for campaign logs and scheduled processing events.
* Added track release-status provenance so manual track status is separated from inheritance by published Released albums, including transactional reconciliation when album membership or release state changes.
* Hardened public Discography data so only valid published Released content is returned by default, draft/private/scheduled/trashed albums cannot create release evidence, internal track notes stay private, and direct public helper calls enforce the same visibility rules as archive queries.
* Added corrective Discography migrations for legacy track status data, bounded migration retries with diagnostics, transactional taxonomy saves, cleanup of deleted tracks from pending/scheduled releases, and safer term seeding.
* Improved Events with canonical UTC timestamps, validated local timezones, DST ambiguity rejection, bounded legacy migration, corrected site-timezone parsing, and consistent dashboard, calendar, notification, and public date comparisons.
* Hardened fan signup and newsletter confirmation with signed attribution fields, atomic email-scoped locks, generic existing-subscriber responses, cache-safe forms, POST confirmation, deferred CRM metadata until confirmation, and safe rollback when confirmation email delivery fails.
* Improved Finance security and consistency by keeping receipts private to Finance, restricting attachment queries, validating new uploads and dates, preventing reused attachments from being re-parented, rejecting negative amounts, normalizing legacy values, and removing unsupported Partial calculations.
* Improved Finance reporting by removing the 5,000-record aggregation ceiling, calculating totals in bounded batches, and preventing summary totals from combining different currencies.
* Hardened media lifecycle handling so reusable Backline-managed files are not physically deleted during normal record/settings cleanup, while uninstall and migration deletion loops are bounded against undeletable records.
* Improved reliability with atomic rate-limit reservations, trusted-proxy IP handling, persistent-cache-safe filters and invalidation, transactional profile/avatar updates, preserved task completion timestamps, and centralized build upgrade handling.
* Fixed frontend initialization issues affecting Outreach Send Now and Calendar views, clarified upload-limit errors, completed Outreach cron cleanup across activation/deactivation/module changes/uninstall, and aligned public single-item APIs with their corresponding public list rules.


= 1.0.4 =

* Added a first-class Images section with an image archive and shared Backline image upload flow.
* Added legacy image backfills that adopt both older Backline-owned uploads and images already saved as album, track, or event artwork, so referenced artwork automatically appears in Backline image archives and selectors.
* Restricted all Backline media archives and selectors to Backline-managed media for every user, including WordPress administrators; unrelated WordPress Media Library files remain outside Backline.
* Added standalone image-library uploads that automatically become available in Backline artwork and mixed media selectors.
* Added a multi-select visual media picker to outreach campaigns for attaching existing Media Vault images and audio tracks.
* Added a live visual attachment summary to outreach campaigns with thumbnails, file details, and one-tap removal.
* Added secure campaign attachment validation, count and total-size limits, and queue-time file availability checks.
* Added selected attachments to campaign detail views and passed validated local files through WordPress mail delivery.
* Changed outreach attachment cleanup so campaigns only remove their file references and never delete shared Media Vault files.
* Improved the mobile dashboard presentation with app-like spacing, touch targets, cards, forms, navigation, dropdowns, modals, tables, and media picker layouts.

= 1.0.3 =

* Added Radio as a contact type across contact forms, filters, labels, documentation, and translations.
* Fixed a fatal error when redisplaying a contact form after validation failed with no newsletter status selected.
* Fixed task relationship validation so users cannot link or reveal records from modules they cannot access.
* Restricted task assignees to administrators and users explicitly allowed into Backline.
* Fixed notifications so per-user module assignments are respected for task, outreach, and event alerts.
* Preserved unrelated Media Library files during uninstall cleanup; only Backline-managed attachments are removed.
* Fixed initial outreach cron scheduling during plugin activation.
* Cleaned up unreachable outreach save logic and made album, track, and event image replacements transactional so failed saves restore the prior record and media state.

= 1.0.2 =

* Added add-on extensibility filters for available modules, module labels, module capability mapping, operator capabilities, user-enabled modules, and route-to-module ownership.
* Added support for registering add-on routes with a module key so dashboard routing can enforce module enablement and access rules.
* Added a view path filter so add-ons can render their own templates through the Backline router and layout system.
* Added filters for module-granted capabilities and final allowed-operator capabilities so add-ons can grant CPT, taxonomy, and workflow caps cleanly.
* Added a custom capability filter so add-ons can participate in Backline administrator capability grants during upgrades.

= 1.0.1 =

* Renamed plugin display name to BLR Backline.
* Changed the default front-end dashboard slug to `blr-backline`.
* Removed Gravatar fallback avatar loading.
* Moved flagged inline scripts and styles to WordPress enqueue/inline asset APIs.
* Tightened upload and request sanitization.

= 1.0.0 =

* Initial public release.
* Added front-end dashboard for bands, musicians, and music projects.
* Added release and track management.
* Added contact management.
* Added outreach campaign management.
* Added background outreach queue processing with campaign locking.
* Added newsletter signup handling with email confirmation support.
* Added newsletter subscription statuses for pending, subscribed, and unsubscribed contacts.
* Added event and calendar views.
* Added task and workflow tracking.
* Added front-end profile management.
* Added privacy exporter and eraser support for supported plugin data.
* Added newsletter confirmation details to supported privacy export data.
* Added optional uninstall cleanup controls.
* Bundled dashboard assets locally so the BLR Backline interface does not require third-party CDN assets at runtime.
