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.
Runs on your infrastructure
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.
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.
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.
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.
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.
Pass content in multiple languages. Each device receives its matching locale, falling back to English. No server-side templates, no content management overhead.
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.
Subscribe to delivery events — sent, delivered, failed, bounced. Every event hits your endpoint in real time. HMAC-SHA256 signing for payload verification.
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.
Call register from your iOS, Android, or JS SDK. The SDK forwards the push token to VisionPush and associates it with your user.
VisionPush.shared.registerDevice(
apnsToken: deviceToken,
externalId: "user-123"
)
Trigger a push from your backend API or the visual campaign composer. Target all devices, a segment, or specific user IDs.
POST /v1/push/send
{
"app_id": "uuid",
"contents": {
"en": { "title": "Hello!",
"body": "Your order shipped." }
}
}
The Rust worker batches devices, dispatches to APNs/FCM/VAPID in parallel, and writes every result to analytics. Throttled? AIMD backoff handles it automatically.
GET /v1/analytics/campaigns/{id}/funnel
sent 12,345 ████████████
delivered 11,800 ███████████░
failed 345 ░
bounced 200 ░
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.
$ 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 ─────────────────────────────────────
Drop in the SDK, register the device, done. Every platform gets the same delivery guarantees and analytics pipeline.
Swift Package Manager
// Package.swift
.package(
url: "https://github.com/VisionLab-de/visionpush-swift",
from: "1.0.0"
)
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"
)
build.gradle.kts
dependencies {
implementation(
"de.visionlab:visionpush-android:1.0.0"
)
}
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"
)
npm install @visionpush/sdk
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' })
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.
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.
bash infra/k8s/bootstrap/install.sh
kubectl apply -f infra/k8s/apps/visionpush.yaml
K3s + Traefik + cert-manager + CloudNativePG + ArgoCD. GitOps from day one.
Set up a local dev environment in 5 minutes with Docker Compose.
System design, data flow, crates, NATS streams, database schema.
All REST endpoints with request/response examples. Also at /docs.
Production K3s + Helm + ArgoCD with GitOps, KEDA, CloudNativePG.
Prometheus metrics, Grafana dashboards, Loki logs, Tempo traces, alert rules.
Secret management, NetworkPolicy, container hardening, supply chain scanning.
iOS, Android, and JavaScript/TypeScript integration guides.
Scaling, backup/restore, incident response, secret rotation.
Open the dashboard and send to your first device in under 5 minutes.