GitHub - licenseware/ory-admin-ui: A modern admin panel for Ory Kratos. Manage identities, sessions, and schemas through a responsive dark/light UI — ships as a single Go binary or Docker image.

2 min read Original article ↗

GitHub Repo stars Docker Pulls GitHub Release GitHub Downloads (all assets, all releases) Docker Image Size GitHub commit activity GitHub last commit License: Apache-2.0 PRs Welcome Powered by Ory

Admin UI for Ory Kratos. Manage identities, sessions, and schemas across multiple environments.

Dashboard

Quick Start

docker run -p 8080:8080 licenseware/ory-admin-ui

Open http://localhost:8080, configure your Kratos endpoint in the Settings tab.

With Custom Profiles

cat > config.json <<EOF
{
  "local": {
    "kratosAdminBaseURL": "http://localhost:4455",
    "kratosPublicBaseURL": "http://localhost:4433"
  },
  "prod": {
    "kratosAdminBaseURL": "https://kratos-admin.example.com",
    "kratosPublicBaseURL": "https://kratos-public.example.com"
  }
}
EOF

docker run -p 8080:8080 \
    -v ./config.json:/public/config.json:ro licenseware/ory-admin-ui

NOTE: You must ensure the CORS is setup corrrectly, i.e., by putting the Kratos Admin URL behind a load-balancer/reverse-proxy.

Features

  • Identity CRUD with pagination
  • Session management and revocation
  • Courier message viewer
  • Identity schema browser
  • Multi-profile support (switch between environments, import/export)
  • Profile switcher in header (AWS-style)
  • Dark/light theme with system preference detection
  • Runtime configuration (no rebuild needed)
  • Responsive design

Configuration

The API endpoints can be configured in three ways (in order of priority):

Two endpoints are available:

Endpoint Default Port Purpose
kratosAdminBaseURL 4434 Admin API - identity CRUD, session mgmt
kratosPublicBaseURL 4433 Public API - identity schemas

1. Profiles (Settings UI)

Users can create and switch between profiles via the Settings page. Saved to localStorage, takes highest priority.

2. Runtime Configuration (Recommended)

Mount a config.json file at runtime:

{
  "local": {
    "kratosAdminBaseURL": "http://localhost:4434",
    "kratosPublicBaseURL": "http://localhost:4433"
  },
  "prod-eu": {
    "kratosAdminBaseURL": "https://kratos-admin.eu.example.com",
    "kratosPublicBaseURL": "https://kratos.eu.example.com"
  }
}

Docker:

docker run -p 8080:8080 \
  -v ./config.json:/public/config.json:ro \
  licenseware/ory-admin-ui

Kubernetes:

spec:
  containers:
    - name: ory-admin-ui
      image: licenseware/ory-admin-ui
      volumeMounts:
        - name: config
          mountPath: /public/config.json
          subPath: config.json
          readOnly: true
  volumes:
    - name: config
      configMap:
        name: ory-admin-ui-config
        optional: false
        defaultMode: 0444

3. Build-time Environment Variable

Set during build (baked into the bundle):

VITE_DEFAULT_PROFILES={"local":{"kratosAdminBaseURL":"http://localhost:4434","kratosPublicBaseURL":"http://localhost:4433"}}

Priority: Profiles UI > Runtime Config > Build-time Env > Hardcoded fallback

Development

docker compose up -d

bun install
bun start

Vision

Building a unified admin UI for the Ory ecosystem. Currently supports Kratos.

Hydra, Keto, and Oathkeeper support planned.

Contributing

PRs welcome. Fork, branch, PR.

License

Apache-2.0