Skip to content

Self-hosting

palumb’s runtime is open source: palumb-core (triggers, delivery, channels, audience, digests) is AGPL-3.0 and @palumb/sdk is MIT. If you’d rather run it on your own infrastructure, you can — it’s the same SDK and the same API as managed, just pointed at a stack you operate.

Everything runs from one Docker Compose (palumb-localenv): PostgreSQL, Restate, a dev SMTP sink, palumb-core, and palumb-engine (the durable runtime).

Terminal window
git clone <the palumb repos>
cd palumb-localenv
docker compose up -d --build # start the stack
docker compose exec palumb-core npm run seed # create a tenant + print an API key

That gives you a palumb-core at http://localhost:3000, a Restate runtime at http://localhost:8080 (ingress) / http://localhost:9070 (admin), and palumb-engine.

It’s the Quickstart, with two differences:

  • Base URL — point your app’s API calls (triggers, PUT /v1/bridge, channels) at your own palumb-core (http://localhost:3000) instead of the managed endpoint. The Bridge SDK itself takes no base URL — palumb calls it.

  • Register the engine with Restate — a one-time platform step managed palumb does for you: tell your Restate where palumb-engine lives.

    Terminal window
    curl -sS http://localhost:9070/deployments \
    -H 'Content-Type: application/json' \
    -d '{ "uri": "http://palumb-engine:9090" }'

From there, configuring a channel, adding subscribers, connecting your Bridge (PUT /v1/bridge), and firing triggers are exactly the same API calls as the Quickstart — just against your own base URL.

The repos (palumb-core, palumb-engine, palumb-localenv, palumb-sdk) carry the deployment detail — environment variables, the encryption key for channel credentials, migrations, and how each service is built. For a production self-host you run and own the runtime and all of that infrastructure — but not the managed control plane (dashboard, provisioning, billing), which stays hosted-only.

…which is exactly why most teams pick managed. 🙂