Skip to content

Hosting

app.state.dbt.com bundles two things: dbt Labs' cloud storage and a gRPC decision server running 24/7. dbt-state-oss decouples them — you bring your own storage (local / S3 / Azure / GCS) and you choose where the server runs.

The server is a small gRPC service. It doesn't have to run 24/7, but a process must be listening while dbt is talking to it — dbt opens a gRPC channel and makes several calls during the run. Your storage backend keeps the data; the server just has to be reachable during the run.

1. Co-located sidecar (simplest)

Start the server next to dbt (on localhost) just for the run; state persists in your backend between runs. No standing infrastructure.

host use case
developer's local machine local dev / interactive runs
GitHub Actions CI runs (server as a background step)
Snowflake notebook run alongside dbt inside Snowflake
Databricks notebook run alongside dbt inside Databricks
Databricks dbt job / workflow scheduled jobs (server as a sidecar task)

2. Central always-on

Your own app.state.dbt.com: one long-lived server the whole team/CI points at, so NO-OP state is shared across runs. Add TLS + OAuth (see Install & run).

host fit
container / VM — Cloud Run, Azure Container Apps, ECS/Fargate, Kubernetes, plain VM ✅ a long-lived gRPC service fits naturally
serverless — AWS Lambda, Azure Functions ❌ request/response only; can't host a persistent gRPC listener the client dials during a run

Tested scope

Only the local sidecar is tested end-to-end. The other rows are deployment patterns, not yet verified here.