One set of OCI images. No cloud lock-in: any container runtime, any cloud, or on-prem.
git clone https://github.com/openpark/openpark && cd openpark
cp .env.example .env # change the three secrets
docker compose up -d # web, api, postgres
# plate reading (optional, off by default, runs inside your deployment):
docker compose --profile ai up -d Open http://localhost:8080, create the first tenant at /signup. Single-tenant installs run the same code path with one tenant.
helm install openpark ./deploy/helm/openpark \
--set database.url=postgres://openpark_app:…@db/openpark \
--set database.adminUrl=postgres://openpark:…@db/openpark \
--set auth.jwtSecret=$(openssl rand -hex 32) \
--set ingress.host=parking.example.com Export the inventory from Import / export in the app (or GET /v1/inventory/export) and import it on the other side. Slot and site codes are the stable keys.
With the AI profile, plate images never leave your deployment: no external AI API is called. Only plate crops are stored, and purged after 30 days by default.