PushCron
Campaign-Centric Push Notification Scheduling Platform
Overview
Mobile app teams need to send scheduled push notifications on recurring or calendar-based schedules. Existing tools like Firebase Console, OneSignal, or Braze either lack fine-grained scheduling control, charge per-message at scale, or require deep platform lock-in.
PushCron is a self-hostable SaaS web application that gives teams full control over FCM scheduling with proper retry semantics, idempotency, and multi-app support. A single docker compose up deploys the entire stack.
Campaign-Centric Model
The platform is built around a campaign-centric authoring model:
- - A campaign owns its content collection, schedules, and timezone configuration.
- - Collections hold messages and their variation matrices with round-robin or random selection strategies.
- - Timezone-aware scheduling: authored wall-clock times are applied separately per target timezone, producing distinct UTC send moments.
- - Multiple Firebase applications managed from one dashboard.
Key Features
- Flexible scheduling - daily, weekly, interval, and calendar-date schedules with multiple time slots
- Timezone targeting - deliver notifications at the right local time across all target timezones
- Message variations - content collection with round-robin or random selection for A/B-style rotation
- Guaranteed delivery - retry with exponential backoff, idempotency enforcement, zero duplicate sends
- Real-time dashboard - WebSocket-powered live updates, execution logs, last/next run visibility
- Multi-app support - manage multiple Firebase applications from a single instance
- Self-hostable - full stack deploys with a single Docker Compose command
- Observability - OpenTelemetry traces and metrics with structured logging and correlation IDs
Architecture
The system is composed of decoupled services communicating through shared PostgreSQL and Redis:
Dashboard API - Express-based REST API serving the Vue.js SPA, handling CRUD operations, Google OAuth authentication, and real-time WebSocket updates via Socket.IO.
Publisher Worker - long-running Node.js process that evaluates schedules from PostgreSQL, creates Graphile Worker jobs, calls the FCM HTTP v1 API, handles retries, and logs execution results.
Frontend SPA - Vue.js 3 application with Tailwind CSS v4, TanStack Query for data fetching, PrimeVue widgets, and Pinia for state management.
Infrastructure - PostgreSQL as the single source of truth, Redis for dashboard-local concerns, Graphile Worker as the queue engine, and Docker Compose for orchestration.
Technologies
Frontend: Vue.js 3 • Tailwind CSS v4 • TanStack Query • PrimeVue • Pinia • Socket.IO
Backend: Node.js • TypeScript • Express 5 • Drizzle ORM • Awilix DI
Infrastructure: PostgreSQL • Redis • Graphile Worker • Docker Compose
Integrations: Firebase Cloud Messaging (FCM HTTP v1) • Google OAuth
Observability: OpenTelemetry • Winston • Correlation IDs
Testing: Vitest • Unit + Integration tests
Architecture: Monorepo (pnpm workspaces) • Decoupled services • Zod validation