One Binary, Every Transport
One Go binary, embedded SQLite, one send API for APNs, FCM, and WebPush.
One relay holds the transport credentials, so every self-hosted backend can deliver.
# write the two required secrets to .env (bare KEY=value, no quotes)
cat > .env <<EOF
PUSHPORT_ADMIN_TOKEN=$(openssl rand -hex 32)
PUSHPORT_SECRET=$(openssl rand -base64 32)
EOF
# run the relay (SQLite lives in ./pushport/data on the host)
mkdir -p pushport/data
docker run -d --name pushport \
-p 8080:8080 -v "$(pwd)/pushport/data:/app/data" \
--env-file .env \
muniftanjim/pushport:latestThe full walkthrough is in Installation.
The admin creates an app and sets the transport credentials: APNs .p8, FCM service account, VAPID private key.
Self-hosted backends register as instances and get a token. Devices subscribe and receive a sealed push endpoint.
The backend POSTs an encrypted payload to the push endpoint. PushPort relays to APNs, FCM, or WebPush service.