Push that works before you publish.
Test against an isolated development namespace while provider credentials, retries, and delivery live in the hosted gateway.
No credentials on disk
Provider keys stay in hosted secret storage and can rotate without changing project files.
Isolated registrations
Development and preview devices cannot accidentally receive live sends.
Delivery is observable
Attempts, provider outcomes, failures, and suppression become Signals.
Push, running
local developmentBuild the complete push flow locally
Register development devices, render payloads, and exercise notification-triggering behavior before the application is published.
- Development registrations stay isolated
- Templates and deep-link data live with the project
- Local sends produce the same delivery Signals
title = "Your note is ready"
body = "Open {{note.title}} to keep working."
deep_link = "/notes/{{note.id}}"Managed delivery in production
Shovelbase holds provider credentials, handles delivery retries, and records the outcome while your code expresses only who should receive what.
- Credentials are stored and rotated remotely
- Idempotent sends and invalid-device cleanup
- Provider responses become queryable Signals
await app.push.send({
userId: note.ownerId,
template: "note-ready",
data: { note },
})Built for real applications
What teams build with Push.
Transactional updates
Tell someone when an order, report, or workflow changes state.
Product activity
Bring people back when collaborators mention, reply, or assign them.
Scheduled reminders
Combine Jobs and Push for timely, personalized notifications.
Your project owns the notification intent; Shovelbase owns the provider-specific delivery machinery.
Why Shovelbase →