Open Source · Self-Hosted · Production Ready

Push Notifications
at 10,000+ devices/s

The developer-first push infrastructure. iOS, Android and Web in one platform — with real-time analytics, A/B testing, audience segmentation and full data ownership. No per-message fees. Ever.

0 devices/s Throughput
0 platforms iOS · Android · Web
0 % Data ownership
0 $/msg No vendor fees
🛍
MyShop
Flash Sale — 40% off today only!
📱
MyApp now
New message from Sarah
🔔
VisionPush
Your order is ready for pickup

Runs on your infrastructure

K3s / Kubernetes
PostgreSQL
Docker Compose
AWS · R2 · MinIO
APNs · FCM v1 · VAPID

Everything you need.
Nothing you don't.

Multi-Platform Delivery

APNs (iOS), FCM v1 (Android), and RFC 8030 Web Push over a single unified REST API. One call dispatches to all three platforms simultaneously. HTTP/2 multiplexing for APNs, OAuth2 token caching for FCM.

🍎 iOS (APNs) 🤖 Android (FCM v1) 🌐 Web (VAPID)

Real-Time Analytics

Columnar engine powered by Apache Parquet and DataFusion. Sent, delivered, failed, bounced — all tracked per device and platform. Sub-second queries over millions of events without an OLAP database.

Audience Segmentation

Create dynamic segments with tag-based, language, platform, and activity filters. Target exactly the right users without code changes. Segments re-evaluate at send time.

A/B Testing

Run split tests with weighted variants. Compare different titles, bodies, or deep links. Auto-select the winner by delivery rate. Results visible in real-time analytics.

Scheduled Campaigns

Schedule pushes for any future date and time. The worker polls every 30 seconds and dispatches when the time arrives. Cancel before dispatch if needed.

Localization

Pass content in multiple languages. Each device receives its matching locale, falling back to English. No server-side templates, no content management overhead.

In-App Messages

Serve in-app messages via the SDK's polling endpoint. Design message templates in the admin panel. Delivered without FCM/APNs — works even when push tokens expire.

Webhooks

Subscribe to delivery events — sent, delivered, failed, bounced. Every event hits your endpoint in real time. HMAC-SHA256 signing for payload verification.

Data Ownership

Self-hosted on your own server. Your device tokens, user data, and analytics stay in your own database — VisionLab never sees them. Push delivery still routes through the OS gateways every provider relies on (Apple APNs, Google FCM); we list these as sub-processors so your GDPR records stay accurate.

From SDK to delivered — in milliseconds.

01

Register the device

Call register from your iOS, Android, or JS SDK. The SDK forwards the push token to VisionPush and associates it with your user.

Swift
VisionPush.shared.registerDevice(
  apnsToken: deviceToken,
  externalId: "user-123"
)
02

Send via API or Dashboard

Trigger a push from your backend API or the visual campaign composer. Target all devices, a segment, or specific user IDs.

REST
POST /v1/push/send
{
  "app_id": "uuid",
  "contents": {
    "en": { "title": "Hello!",
            "body": "Your order shipped." }
  }
}
03

Worker delivers and tracks

The Rust worker batches devices, dispatches to APNs/FCM/VAPID in parallel, and writes every result to analytics. Throttled? AIMD backoff handles it automatically.

Analytics
GET /v1/analytics/campaigns/{id}/funnel

sent      12,345   ████████████
delivered 11,800   ███████████░
failed       345   
bounced      200   
🌐
visionpush-api
Axum · OAuth 2.1
NATS JetStream
⚙️
visionpush-worker
Rust · Tokio
🍎 APNs
🤖 FCM v1
🌐 VAPID

Built for scale from day one.

Rust-powered worker with buffered concurrency — 500 parallel APNs streams, 200 FCM threads. NATS JetStream as the dispatch backbone. Scales horizontally via KEDA — one new pod per 100 pending messages.

HTTP/2 multiplexing for APNs — one TCP connection, thousands of in-flight requests
FCM v1 with OAuth2 token caching — zero re-auth overhead per batch
AIMD backoff + full jitter — adaptive throttling under provider rate limits, permit release before sleep so rest of batch keeps moving
KEDA event-driven autoscaling — worker replicas scale with NATS consumer lag, not CPU
Parquet columnar analytics — sub-second queries over millions of events, nightly compaction
loadtest output
$ RATE_MS=0 NUM_BATCHES=200 cargo run --bin loadtest

 Connected to NATS (nats://localhost:4222)
 Found FCM project: com.example.app
  Publishing 200 batches × 500 devices...

  Batch  50/200  [████░░░░░░░░░]
  Batch 100/200  [████████░░░░░]
  Batch 150/200  [████████████░]
  Batch 200/200  [█████████████] done

── Results ──────────────────────────
  Total devices  : 100,000
  Delivered      : 100,000  (100%)
  Duration       : 9.19 s
  Throughput     : 10,881 devices/s
  p50 latency    : 41 ms
  p99 latency    : 187 ms
─────────────────────────────────────

One platform. Three SDKs.

Drop in the SDK, register the device, done. Every platform gets the same delivery guarantees and analytics pipeline.

Installation

Swift Package Manager

// Package.swift
.package(
  url: "https://github.com/VisionLab-de/visionpush-swift",
  from: "1.0.0"
)
Setup in AppDelegate
import VisionPush

VisionPush.configure(
  apiKey: "vp_live_...",
  appId: "your-app-uuid",
  apiUrl: "https://api.yourdomain.com"
)

// In didRegisterForRemoteNotificationsWithDeviceToken:
VisionPush.shared.registerDevice(
  apnsToken: deviceToken,
  externalId: "user-123"
)
Installation

build.gradle.kts

dependencies {
  implementation(
    "de.visionlab:visionpush-android:1.0.0"
  )
}
Setup in Application
VisionPush.configure(
  context = this,
  apiKey = "vp_live_...",
  appId = "your-app-uuid",
  apiUrl = "https://api.yourdomain.com"
)

// In FirebaseMessagingService.onNewToken():
VisionPush.shared.registerDevice(
  fcmToken = token,
  externalId = "user-123"
)
Installation
npm install @visionpush/sdk
Setup
import { VisionPush } from '@visionpush/sdk'

const vp = new VisionPush({
  apiKey: 'vp_live_...',
  appId: 'your-app-uuid',
  vapidPublicKey: 'your-vapid-key',
  serviceWorkerPath: '/visionpush-sw.js',
})

await vp.init()
await vp.requestPermission({ externalId: 'user-123' })

Own your infrastructure.
Own your data.

VisionPush is fully open source. Run it on a single VPS with Docker Compose, or in a high-availability K3s cluster with Helm and ArgoCD. No license fees, no seat limits, no data leaving your servers.

No per-message fees or usage limits
Device tokens and analytics stay on your servers
GDPR-compliant by architecture, not by policy
Audit the full codebase — no black boxes
Kubernetes-native: HPA, PodDisruptionBudget, NetworkPolicy
Docker Compose Single VPS
git clone github.com/VisionLab-de/VisionPush
docker compose -f infra/docker/docker-compose.yml \
  up -d --build

PostgreSQL, NATS, API, Worker, Grafana, Prometheus — all in one command.

Kubernetes (K3s) Production
bash infra/k8s/bootstrap/install.sh
kubectl apply -f infra/k8s/apps/visionpush.yaml

K3s + Traefik + cert-manager + CloudNativePG + ArgoCD. GitOps from day one.

Battle-tested technologies.

🦀
Rust API + Worker
🔺
Angular 18 Admin Panel
🐘
PostgreSQL Primary Database
📨
NATS JetStream Message Queue
📊
Apache Parquet Analytics Engine
☸️
K3s + Helm Orchestration
🔄
ArgoCD GitOps Delivery
📡
OpenTelemetry Traces + Metrics
🔒
OAuth 2.1 / OIDC Auth (PKCE)
🗝️
HashiCorp Vault Secret Management
📈
Prometheus + Grafana Observability
📝
Loki + Tempo Logs + Traces

Everything is documented.

Free forever · Open Source

Ready to send your first push?

Open the dashboard and send to your first device in under 5 minutes.

No credit card. No account required for self-hosted deployments.