Bean Notifications
Plug-and-play toasts. Twelve editable templates. Nine screen positions. Type-driven icons. Built right.
Most notification scripts hand you one preset, hardcoded colors, and a layout you can't touch without digging through Lua. Bean Notifications flips that — every visual lives in a real ScreenGui Frame in your ReplicatedStorage. You drag it. You recolor it. You duplicate it. The Lua side runs the pipeline; the looks are 100% yours.
It also actually ships production-ready: rate-limited, sanitized, race-free on join, mobile-aware, and tested against the kinds of edge cases free models silently break on.
✦ FEATURES
- Twelve built-in presets — Clean, Neon, Glass, Gradient, Military, RP, Classic, Mini, VIP, Horror, eSports, Kids. Every one is a real Frame you can edit live in Studio.
- Nine screen positions — top / middle / bottom across left / center / right. Middle row stacks outward from the vertical center for centered banners and modal-style alerts.
- Type-driven icons — pass Type = "Success" and the configured green check icon appears, automatically tinted. Eight built-in types ship pre-tuned (Success, Error, Warning, Info, Question, Star, Heart, Lock) and you can register your own in two lines (Coin, Skull, Crown — whatever fits your game).
- Editable templates, no code required — open ReplicatedStorage.Notify.Templates.GridPreview, drag anything around, recolor, add UICorner / UIStroke / UIGradient / custom backgrounds. Duplicate a Frame, rename it, and that name becomes a usable preset instantly.
- Server-authoritative pipeline — Title and Body sanitized (control chars stripped, length capped), asset paths whitelisted, Color3 only accepted as a true Color3 value, per-player token-bucket rate limit (5/s + 10 burst, configurable).
- Race-free join handshake — notifications fired during Players.PlayerAdded are buffered server-side until the client signals ready. Nothing gets dropped during the join window. (Pending queue capped at 20 per player.)
- Hover-to-pause, progress bar, click-to-dismiss — every behavior toggleable globally in Config or per-call in options.
- Built-in chat commands — type /notify show in chat to fire every preset across every position instantly. Plus /notify <preset>, /notify <preset> <Type>, /notify walk, /notify clear, and /notify help. Studio-only by default; configurable per-UserId or open to all.
- Showcase API — :Showcase(player) fires every preset across every position in one shot for screenshots; :ShowcaseSequential(player) fires them one at a time for walkthrough videos.
- Optional sound per call — pass an asset id, it plays on show.
- Stack overflow strategies — DropOldest (default) / Queue / DropNew, configurable.
- Client-side hooks — NotificationShown and NotificationHidden BindableEvents for buyer extensions (analytics, accessibility narration, sound layers, anything).
- Mobile-aware — touch users get tap-to-close cleanly; hover-to-pause is correctly skipped instead of silently breaking.
- Frame attributes for behavior — Compact (one-line, no body), TitleUpper (auto-uppercase) — set on the template Frame in the Properties panel, no script edits.
✦ THREE LINES TO SHIP
Code:
local Notify = require(game.ServerScriptService.NotifyServer.API)
Notify:Send(player, "Saved!", nil, "Clean", { Type = "Success" })
Notify:Broadcast("Server restart in 60s", nil, "Horror", { Type = "Warning" })
✦ EDIT THE VISUALS, NO CODE
Open ReplicatedStorage.Notify.Templates.GridPreview. Inside you'll find one Frame per preset with named children the system reads:
- Title — TextLabel (required)
- Body — TextLabel (optional, removed in Compact)
- IconHolder > Icon — ImageLabel (optional, hidden when no icon)
- CloseButton — TextButton (optional)
- ProgressBarBackground > ProgressBar — Frames (optional)
Recolor them. Resize them. Drop in custom backgrounds. Add accent bars, shadows, gradients. Move things around entirely. Duplicate a Frame, rename it "MyCustomPreset", and your next Notify:Send(..., "MyCustomPreset") uses it.
✦ TYPE-DRIVEN ICONS
Pass a Type with your notification and the system uses the configured icon asset and tint color from Config.IconTypes:
Code:
Notify:Send(player, "Saved!", nil, "Clean", { Type = "Success" })
Notify:Send(player, "Banned", "Cheating detected.", "Horror", { Type = "Error" })
Notify:Send(player, "Locked", "VIP only.", "VIP", { Type = "Lock" })
Built-in types ship with colors pre-tuned (green Success, red Error, yellow Warning, blue Info, etc.) and blank Asset slots so you drop in icons that match your game's art style — Material, Phosphor, Outlined, your own commission. To configure:
Code:
Config.IconTypes = {
Success = { Asset = "rbxassetid://12345", Color = Color3.fromRGB( 80, 220, 130) },
Error = { Asset = "rbxassetid://12346", Color = Color3.fromRGB(230, 80, 80) },
Warning = { Asset = "rbxassetid://12347", Color = Color3.fromRGB(255, 200, 60) },
-- ...
-- Add your own types in two lines:
Coin = { Asset = "rbxassetid://12348", Color = Color3.fromRGB(255, 200, 70) },
Skull = { Asset = "rbxassetid://12349", Color = Color3.fromRGB(220, 220, 220) },
}
✦ OPTIONS REFERENCE
Code:
Preset string visual style (defaults to Config.DefaultPreset)
Position string one of nine — TopLeft / TopCenter / TopRight / MiddleLeft /
MiddleCenter / MiddleRight / BottomLeft / BottomCenter / BottomRight
Duration number seconds before auto-dismiss (0.5 to 600)
Type string semantic icon type — uses Config.IconTypes for asset + tint
Icon string rbxassetid:// or numeric id (overrides Type's asset)
Color Color3 overrides the title text color
Sound string rbxassetid:// or numeric id, plays on show
Volume number 0 to 5
✦ FULL API
Server — require(game.ServerScriptService.NotifyServer.API)
Code:
:Send(player, title, body?, preset?, options?) -> bool
:Broadcast(title, body?, preset?, options?) -> bool
:Clear(player) -> bool
:ClearAll() -> bool
:Showcase(player, options?) -> bool
:ShowcaseSequential(player, interval?, options?) -> bool
:GetPresetNames() -> { string }
:GetPositions() -> { string }
:GetTypes() -> { string }
Client — require(game.StarterPlayer.StarterPlayerScripts.NotifyClient.API)
Code:
:Show(title, body?, preset?, options?) -> id?
:Dismiss(id) -> bool
:DismissAll() -> bool
:Showcase(options?) -> bool
:ShowcaseSequential(interval?, options?) -> bool
:GetPresetNames() -> { string }
:GetPositions() -> { string }
:GetTypes() -> { string }
.NotificationShown -> RBXScriptSignal
.NotificationHidden -> RBXScriptSignal
Server API is also exposed at _G.BeanDevNotifyAPI and shared.BeanDevNotifyAPI for tooling that prefers globals.
✦ INSTANT TESTING — CHAT COMMANDS
Drag the install package in, hit Play, type /notify show in the chat box. Every preset fires across every position in one go. Done. No test scripts to write, no config to wire up.
Code:
/notify fire a default test toast
/notify <preset> test a specific preset (e.g. /notify Horror)
/notify <preset> <Type> preset + Type icon (e.g. /notify Clean Success)
/notify show fire every preset across every position
/notify walk walk through every preset, one at a time
/notify clear clear all current notifications
/notify help show the command list as a notification
Locked to Roblox Studio playtest by default — live-game players cannot run them. Open access to specific UserIds, the game owner only, or all players by changing Config.ChatCommands.Permission. Disable entirely with Enabled = false or by deleting the ChatCommands Script (it's fully modular).
Works on both TextChatService (modern Roblox chat) and LegacyChatService — detected automatically at server start, no buyer config needed.
✦ SECURITY
- Title (1-80 chars) and Body (up to 240 chars) sanitized — control characters stripped, leading/trailing whitespace trimmed, length capped
- Icon and Sound restricted to rbxassetid:// and rbxasset:// formats only
- Type whitelisted against Config.IconTypes; unknown types are dropped silently
- Position whitelisted server-side (32 char cap, alphanumeric + underscore only)
- Color3 only accepted as a true Color3 value, never coerced from strings
- Duration clamped to 0.5-60s server-side, 0.5-600s client-side
- Per-player rate limit — token bucket, 5/s + 10 burst, all configurable
- Chat commands gated server-side (Studio-only by default) — players cannot trigger test floods in live games
- Rich text disabled by default; enable Config.Display.AllowRichText only if every Title and Body comes from a trusted source
✦ INSTALL
One minute. Drag-and-drop. The install package lives in ServerStorage so it's out of the way of your live game.
- Open BeanNotifications_INSTALL_PACKAGE in ServerStorage
- Drag the children of 1_ReplicatedStorage into ReplicatedStorage
- Drag the children of 2_ServerScriptService into ServerScriptService
- Drag the children of 3_StarterPlayerScripts into StarterPlayer.StarterPlayerScripts
- Delete the install package — system runs on play
- Hit Play, type /notify show in chat to verify everything works
No webhooks. No obfuscation. No external dependencies. Full source.
✦ PAIRS WELL WITH
- Bean Tags — overhead nameplate ranks
- Bean Chat Tags — in-chat rank prefixes
- Bean Loading — animated loading screen
All by Bean Development. Bundle pricing on the way.
Lifetime updates ✦ Discord support ✦ Full source
