Sueta

Ultimate Broadcast

2.4.0

High-performance announcements for Paper, Purpur & Folia: per-player subscriptions, Discord mirroring, scheduling, countdowns, 5 channels, MiniMessage and zero main-thread SQL. 1.21-26.3.

·Plugin
Tested MC versions
1.18, 1.19, 1.20, 1.21, 26.1, 26.2, 26.3

Ultimate Broadcast

📢 Ultimate Broadcast

The announcement platform that players don't hate. A high-performance broadcast plugin for Paper, Purpur and Folia with per-player subscriptions, Discord mirroring, scheduled announcements, countdowns and five delivery channels — all driven by MiniMessage and a fully asynchronous storage engine.

v2.4.0 is a rescue release. Versions 2.1.0–2.3.0 shipped a malformed config.yml that could stop the plugin from enabling on a fresh install, and their newest builds were not listed for Minecraft 1.21.5+. 2.4.0 fixes both, repairs existing configs automatically and restores support for every version from 1.21 to 26.3.


✨ Why servers switch to Ultimate Broadcast

🔔 Players control what they receive

The number one complaint about announcement plugins is spam. Ultimate Broadcast ships a real subscription centre:

  • /broadcast toggle — master switch, instantly respected by the scheduler.
  • /broadcast settings — a clean GUI with one toggle per category.
  • Categories are configurable (announcements, events, tips, promotions, social).
  • Preferences persist in SQLite/MySQL and survive restarts.
  • Opted-out players are skipped before a single message is rendered, so you don't pay for players who don't want the message.

💬 Discord mirroring without a bot

Mirror announcements to a Discord channel through a webhook — no bot token, no Node.js process, no extra plugin. Delivery runs on its own daemon thread with rate-limit handling and retries, and can be limited to manual, scheduled, random or countdown messages.

🧵 True Folia support

Folia has no global main thread. Ultimate Broadcast detects Folia at runtime and routes work through the global region scheduler, async scheduler and per-entity scheduler — verified on Folia 26.3. On Paper the same code uses the standard scheduler, so one jar covers both.

⚡ Zero main-thread SQL

Every history, statistics and preference write is queued on a single background thread. No INSERT ever runs inside a tick, even when the scheduler fires on a full server. SQLite uses WAL + a single writer, which removes the database is locked errors that plague broadcast plugins under load.

🎨 Five channels, one syntax

chat, actionbar, title, subtitle and bossbar all accept the same MiniMessage/legacy input:

/broadcast send title <gradient:#8B5CF6:#22D3EE><bold>Double XP Weekend</bold></gradient>
/broadcast send bossbar &eRestart in 5 minutes
/broadcast send actionbar <yellow>%player%<gray>, vote for rewards!

🧠 Smart delivery guard

  • Duplicate messages inside a configurable window are dropped (proxy echo protection).
  • A hard per-second cap stops announcement loops.
  • Sounds and particles are skipped automatically when TPS drops below your threshold.
  • Minimum-player rules keep small servers quiet.
  • Per-player cooldowns on scheduled entries.

🩹 Config that repairs itself

If config.yml is invalid — including the exact indentation bug shipped in 2.1.0–2.3.0 — the plugin backs the file up, fixes it, and continues starting. Legacy settings.database / countdown.database keys are migrated in memory. No more "plugin disabled itself after update".


🚀 Feature tour

AreaWhat you get
ChannelsChat, action bar, title, subtitle, boss bar
SchedulingInterval or HH:MM time-of-day, sub-messages, per-player cooldowns, weighted random pool
TargetingAll, world, permission, world list, permission list
FormattingMiniMessage + legacy & codes + &#RRGGBB hex in the same string
PlaceholdersBuilt-in %player%, %online%, %world%, %time%, %ping% and full PlaceholderAPI support per recipient
PersistenceSQLite or MySQL, asynchronous writes, automatic history pruning
SafetyDuplicate window, rate cap, TPS-aware effects, subscription filtering
Operations/broadcast stats, history, scheduled list, safe reload, debug reasons
IntegrationsPlaceholderAPI, Discord webhooks, BungeeCord/Velocity plugin messaging
PlatformsPaper, Purpur, Folia — Minecraft 1.21 → 26.3, Java 21+

📋 Commands

CommandDescriptionPermission
/broadcast <message>Send a chat announcementultimatebroadcast.use
/broadcast send <channel> <message>Send via chat, actionbar, title, subtitle or bossbarultimatebroadcast.admin
/broadcast preview <message>Preview exactly what players will seeultimatebroadcast.preview
/broadcast toggle [category]Opt out of one category or everythingultimatebroadcast.receive.toggle
/broadcast settingsOpen the personal subscription GUIultimatebroadcast.receive.toggle
/broadcast schedule <minutes> <message>Repeat a message until restartultimatebroadcast.admin
/broadcast listList scheduled entries and their next runultimatebroadcast.admin
/broadcast cancel <id>Cancel a scheduled entryultimatebroadcast.admin
/broadcast countdown <seconds> <message> [--type]Live countdown in any channelultimatebroadcast.admin
/broadcast historyLast 20 delivered announcementsultimatebroadcast.history
/broadcast statsDelivery, duplicate and storage statisticsultimatebroadcast.admin
/broadcast guiAdmin control panelultimatebroadcast.admin
/broadcast discord testVerify the webhookultimatebroadcast.admin
/broadcast reloadReload configuration safelyultimatebroadcast.admin

Aliases: /b, /bc.


🔐 Permissions

PermissionDefaultDescription
ultimatebroadcast.useopSend chat announcements
ultimatebroadcast.adminopScheduling, GUI, stats, reload
ultimatebroadcast.previewopPreview messages
ultimatebroadcast.historyopView history
ultimatebroadcast.bypass.cooldownopIgnore the command cooldown
ultimatebroadcast.receivetrueReceive announcements
ultimatebroadcast.receive.toggletrueOpen the subscription menu
ultimatebroadcast.category.<id>trueReceive a specific category

Upgrade note: ultimatebroadcast.use now defaults to op. In 2.x it defaulted to true, which allowed any player to broadcast on servers that never changed it. Grant the node explicitly if you want player broadcasts.


⚙️ Configuration example

delivery:
  min-players: 0
  dedupe-window-seconds: 8
  max-per-second: 3
  low-tps-threshold: 15.0
  skip-effects-on-low-tps: true

categories:
  announcements:
    display: "<gradient:#8B5CF6:#22D3EE><bold>Announcements</bold></gradient>"
    default: true
  events:
    display: "<gradient:#F59E0B:#EF4444><bold>Events</bold></gradient>"
    default: true

scheduler:
  broadcasts:
    - id: "discord"
      enabled: true
      interval: 15
      category: "social"
      message: "<aqua>Join our Discord: <white>discord.gg/example</white></aqua>"
      broadcast-to: "all"
      cooldown-per-player: 900

integrations:
  discord:
    enabled: true
    webhook-url: "https://discord.com/api/webhooks/..."
    events: [manual, scheduled]

Messages accept MiniMessage, legacy codes and hex:

<gradient:#FFD700:#FFAA00><bold>Welcome to the server!</bold></gradient>
&aGreen legacy text &#FF55FF and hex

🧪 Verified compatibility

PlatformVersionResult
Paper1.21.4✅ enabled, all 5 channels delivered
Paper26.3✅ enabled, all 5 channels delivered
Folia26.3✅ enabled, region scheduler active

Requires Java 21+ (Minecraft 26.x itself requires Java 25).


❓ FAQ

Will my 2.x config break?
No. Legacy keys are migrated in memory and invalid YAML is repaired with a timestamped backup. Comments in your file are preserved.

Does it work on Spigot?
No. Ultimate Broadcast uses the Adventure API for hex gradients and titles, which Spigot does not provide. The 2.x listings that claimed Spigot support could not actually enable on Spigot; 2.4.0 lists Paper, Purpur and Folia so the download button tells the truth.

Why did my old version stop appearing on 1.21.9?
2.1.0–2.3.0 were published with an incomplete game_versions list. 2.4.0 is listed for 1.21 → 26.3.

How do I report a bug?
Open an issue on the project's Modrinth page with your server version, plugin version and latest.log.


Built for server owners who care about TPS, and players who care about their chat.

Similar projects

Plugin →