Pushbox is a Laravel package inspired by Mailbook: it lets you preview FCM push payloads for Notification classes in the browser, without wiring a one-off controller in your app.
Requirements: PHP 8.4+, Laravel 11 or 12.
composer require --dev andriichuk/pushboxRegister the service provider and facade (Laravel 11+ auto-discovers them; otherwise add Andriichuk\Pushbox\PushboxServiceProvider to config/app.php).
Publish configuration (optional):
php artisan vendor:publish --tag="pushbox-config"Scaffold the registration file:
php artisan pushbox:installThis creates routes/pushbox.php where you register notifications (same idea as Mailbook’s routes/mailbook.php).
Open /pushbox (or your configured pushbox.path) when the app runs with routes enabled (by default: local only — see Security).
// routes/pushbox.php
use Andriichuk\Pushbox\Facades\Pushbox;
use App\Notifications\OrderShippedNotification;
Pushbox::add(OrderShippedNotification::class);
Pushbox::add(function (): OrderShippedNotification {
$order = Order::factory()->create();
return new OrderShippedNotification($order);
});Many notifications expect a notifiable user. Mirror Mailbook’s API:
Pushbox::to(User::factory()->make())->add(WelcomeNotification::class);You can also scope several registrations:
Pushbox::to(User::factory()->make())->group(function () {
Pushbox::add(WelcomeNotification::class);
Pushbox::add(TrialEndedNotification::class);
});Pushbox::category('Orders')->group(function () {
Pushbox::add(OrderCreatedNotification::class);
Pushbox::add(OrderShippedNotification::class);
});Pushbox::add(OrderCreatedNotification::class)
->variant('1 item', fn () => new OrderCreatedNotification(Order::factory()->withOneProduct()->create()))
->variant('2 items', fn () => new OrderCreatedNotification(Order::factory()->withTwoProducts()->create()));Add locales to config/pushbox.php (locales array). The UI shows a dropdown; the preview resolver sets app()->setLocale() while resolving payloads.
When pushbox.database_rollback is true, previews run inside a DB transaction that is rolled back after rendering (handy when factories persist models), similar to Mailbook.
Install the channel package (suggested):
composer require laravel-notification-channels/fcmImplement toFcm($notifiable) on your notification as documented by that package. Pushbox serializes the returned FcmMessage via toArray() for the UI — no Firebase HTTP request happens during preview.
Dangerous: sends a real notification through your configured FCM driver.
PUSHBOX_ALLOW_SEND=truepushbox.send.fcm.token/PUSHBOX_FCM_TOKENfor test sends- By default, sends are only reasonable in
local; setPUSHBOX_SEND_NON_LOCAL=true(andpushbox.send_allow_non_local) only if you explicitly need staging.
Every send is logged under the pushbox.sent / pushbox.send_failed context.
- Routes register when
pushbox.enabledis true and eitherpushbox.local_onlyis false or the environment islocal/testing. - Optional IP allowlist:
PUSHBOX_ALLOWED_IPS(comma-separated). - Keep the package in
require-devif you only need previews locally.
| Mailbook | Pushbox |
|---|---|
routes/mailbook.php |
routes/pushbox.php |
Mailbook::add() |
Pushbox::add() |
Mailbook::to() / group() / category() / variant() |
Same fluent ideas |
| Preview HTML mail | Preview FCM JSON |
| Optional send | Optional FCM send (gated) |
composer test
# or
./vendor/bin/phpunitThe MIT License. See LICENSE.md.