website logo
Back to projects

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

Live Demo