Get ZITADEL running on your local machine in under 3 minutes. This guide walks you through deploying ZITADEL with Docker Compose, creating your first application, and understanding the authentication flow.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/zitadel/zitadel/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
Before you begin, make sure you have:- Docker and Docker Compose installed (Get Docker)
- curl or a web browser to interact with ZITADEL
- A terminal/command prompt
Step 1: Deploy ZITADEL Locally
ZITADEL provides a production-ready Docker Compose stack that includes everything you need: the API backend, Login UI, PostgreSQL database, and Traefik proxy.Download the configuration files
Start the stack
- Pull the ZITADEL API (
zitadel-api), Login UI (zitadel-login), PostgreSQL, and Traefik images - Initialize the database with the first instance
- Start all services and wait for health checks to pass
Verify ZITADEL is running
Step 2: Access the Management Console
The ZITADEL Management Console is your administrative hub for managing organizations, users, applications, and policies.Get your initial admin credentials
Log in to the Console
- Navigate to http://localhost:8080/ui/console
- Enter the admin username and password from the logs
- You’ll be prompted to change the password on first login
Step 3: Create Your First Application
Now let’s create an application that will use ZITADEL for authentication.Create a new project
- Navigate to Projects in the sidebar
- Click + New Project
- Enter a name (e.g., “My First App”)
- Click Create
Add an application
- Inside your project, click + New Application
- Enter an application name (e.g., “Web App”)
- Select User Agent (for SPAs) or Web (for server-side apps)
- Click Continue
Configure redirect URIs
- Redirect URI:
http://localhost:3000/auth/callback - Post Logout Redirect URI:
http://localhost:3000
Step 4: Understand the Architecture
Here’s what’s running in your Docker Compose stack:Service Overview
zitadel-api — Go Backend
zitadel-api — Go Backend
- gRPC, connectRPC, and REST API endpoints
- Event sourcing and relational projections
- OIDC/SAML protocol flows
- User management and authorization
zitadel-login — Next.js Login UI
zitadel-login — Next.js Login UI
http://localhost:8080/ui/v2/login/postgres — PostgreSQL Database
postgres — PostgreSQL Database
- Events table: Immutable audit trail of every mutation
- Relational projections: Optimized views for queries
proxy — Traefik Reverse Proxy
proxy — Traefik Reverse Proxy
/→ Login UI/ui/v2/login/→ Login UI/api/*→ ZITADEL API- Everything else (OIDC, gRPC, SAML) → ZITADEL API
Step 5: Test the OIDC Flow
Let’s verify that OpenID Connect authentication works.OIDC Flow Overview
User authenticates
Step 6: Explore the API
ZITADEL exposes every capability over a typed API. Here’s how to create a user with the V2 REST API:Create a service account for API access
- Go to Users → Service Accounts
- Click + New Service Account
- Enter a name (e.g., “API Client”)
- Click Create
- Grant IAM_OWNER role (for testing only — use least privilege in production)
Generate a Personal Access Token (PAT)
- Open the service account details
- Go to Personal Access Tokens
- Click + New
- Set an expiration date
- Click Create and copy the token
Next Steps
You’ve successfully deployed ZITADEL and created your first application! Here’s what to explore next:Integrate with Your Framework
Understand Multi-Tenancy
Enable Passkeys
Production Deployment
OIDC Integration
API Reference
Troubleshooting
Port 8080 already in use
Port 8080 already in use
.env and change PROXY_HTTP_PUBLISHED_PORT to another port (e.g., 8888). Then restart:http://localhost:8888 instead.Instance not found error
Instance not found error
ZITADEL_EXTERNALDOMAIN and ZITADEL_EXTERNALPORT don’t match your actual URL.For local development with default settings:ZITADEL_EXTERNALDOMAIN=localhostZITADEL_EXTERNALPORT=8080
ZITADEL_EXTERNALPORT in .env and restart.Services won't start
Services won't start
- PostgreSQL data corruption:
docker compose down -v(destroys data!) - Insufficient Docker resources: Increase memory/CPU in Docker settings
Can't log in to the console
Can't log in to the console
- Check existing users:
docker compose logs zitadel-api | grep "Initial instance" - Or recreate the instance:
docker compose down -v && docker compose up -d --wait(destroys all data!)