Announcements
Announcements are how you broadcast messages to users — either platform-wide, or scoped to a specific company. They support scheduling, a banner image, and — because they implement the same contracts as everything else — comments and reactions.

Global or scoped
app/Models/Announcement.php — announceable is a polymorphic relation to whatever the announcement is scoped to. A null announceable means the announcement is global — shown to every user. A set announceable (typically a Company) scopes it to that company only. This is the same pattern themes use for global vs. scoped design tokens.
Scheduling
AnnouncementStatus is Active, Pending, or Inactive. Beyond that field, starts_at/ends_at define a visibility window:
// Scope a query to announcements that are live right now (status + window)...
Announcement::visible() : Illuminate\Database\Eloquent\BuilderWho sees what
The listing logic makes a distinction worth copying if you build similar features: everyday visitors only see announcements that are live right now (->visible()), while anyone holding the broader indexAny ability sees everything — including future and expired announcements, for editing purposes.
Actions (app/Actions/Announcements/)
// Create an announcement (starts life as Pending) and sync its banner...
CreateAnnouncement::create(array $input) : App\Models\Announcement
// Update an announcement's fields and banner...
UpdateAnnouncement::update(Announcement $announcement, array $input) : void
// Delete an announcement...
DeleteAnnouncement::delete(Announcement $announcement) : voidTrait Methods (HasAnnouncements)
// The announcements belonging to this model...
$model->announcements() : Illuminate\Database\Eloquent\Relations\MorphMany
// Determine whether this model has any announcements...
$model->hasAnnouncements() : boolComments and reactions
Because Announcement implements CommentableInterface and ReactableInterface, it gets a full discussion thread and reaction chips for free — see Comments and Reactions for how those work. The banner image is a single-file Spatie Media Library collection, the same pattern used for profile avatars and company logos.
In the frontend
routes/{management,_dashboard}/announcements/* for full CRUD and listing; the dashboard's -components/announcements-card.vue renders the live, relevant announcements for the current user.