Maya Workflow Kit
Blender에서 Maya 전체 워크플로를 한 번에 설치, 무료 오픈소스, Blender 4.5‑5.2 지원
Keycloak에 Django Unfold의 고대비 슬레이트·바이올렛 디자인을 적용해 다크 모드·다양한 변형·Tailwind CSS를 제공한다
Bring the high-contrast slate & violet aesthetics of Django Unfold to your Keycloak instance. Features dark mode, multiple variants, and Tailwind CSS.
플러그인FreeMarker · JavaScriptGitHub @ffalcinelli온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기This repository provides a custom Keycloak theme designed to emulate the aesthetics of the Django Unfold Theme (https://github.com/unfoldadmin/django-unfold)
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗[!WARNING] Disclaimer: This project is experimentally written almost entirely by AI. Any usage of this software should keep this in mind, and the execution of this software is at your own risk.
Keycloak Unfold is a modular custom theme for Keycloak designed to emulate the clean, modern aesthetics of the popular Django Unfold Theme. It builds on Keycloak's native v2 theme and overrides PatternFly 5 CSS variables to deliver a premium user interface out of the box.
prefers-color-scheme) and manual overrides via a interactive toggle..ftl).Keycloak Unfold is versioned independently using Semantic Versioning (SemVer) starting from 0.0.1.
| Theme Version | Supported Keycloak | Tested Keycloak | Base Theme | PatternFly Version | Django Unfold Alignment | Support Status |
|---|---|---|---|---|---|---|
0.0.x (current: 0.0.1) | >= 26.8.0 | v26.8.0 | v2 | PatternFly 5 (--pf-v5-*) | v0.101.0 | 🟢 Active |
X.0.0): Breaking template architecture redesigns or major Keycloak base theme upgrades.0.X.0): New theme variants, feature additions, or layout enhancements.0.0.X): Bug fixes, CSS refinements, and compatibility updates for Keycloak point releases.For detailed design system and upstream version alignments, see UNFOLD_VERSION.md.
The themes are registered in keycloak-themes.json and follow an inheritance chain:
graph TD
A[Keycloak keycloak.v2 / keycloak.v3] --> B[unfold-base]
B --> C[unfold-default]
B --> D[unfold-full]
C -.-> E[your child theme]
D -.-> E
unfold-base: the core theme. It holds every FreeMarker template (.ftl), including the single shared login layout login/template.ftl. It also holds the shared CSS, the self-hosted Inter font, logos, the dark mode script and the messages_*.properties bundles. The common/unfold-base type is imported by login, account and admin.unfold-default: the centered card login. The account and admin consoles keep the default Keycloak layout and only change colors and typography.unfold-full: the split-screen login, with the form on the left and a configurable hero image on the right (unfoldLayout=split). It also applies extra widget styling to the account and admin consoles.Login pages that the theme does not override (OTP, TOTP setup, device code, and so on) fall back to upstream keycloak.v2 and render inside the Unfold layout.
All key styling variables live in unfold-common.css:
:root {
/* Font family (Inter is bundled; no external font requests) */
--pf-v5-global--FontFamily--sans-serif: 'Inter', -apple-system, ..., sans-serif;
/* Primary theme accent */
--color-primary-600: #7c3aed; /* light mode accent */
--color-primary-500: #8b5cf6; /* dark mode accent */
/* Neutral slates */
--color-base-50: #f8fafc;
--color-base-900: #0f172a;
}
To change them after installation, use a child theme (Post-Install Customization). Do not edit the JAR.
Theme-specific strings ("Welcome back to", "Return to site", the terms sentence, the hero quote, and so on) are message keys prefixed with unfold, in theme/unfold-base/login/messages/. English and Italian ship with the theme. Add a messages_<lang>.properties file, or override single keys under Realm settings → Localization. When the realm has internationalization enabled, a language selector appears above the form.
Ensure you have Docker, Docker Compose and Node.js (v20+) installed.
docker compose up
This mounts theme/ directly, with theme caching off in dev mode, and imports the demo realms from demo/. Keycloak is available at http://localhost:8080. If that port is taken, publish another one with KC_PORT=8180 docker compose up.
admin / admintestuser / passworddemo realm): otpuser / password. It shows the upstream TOTP page inside the Unfold layout.The project uses Tailwind CSS v4. The compiled tailwind.css is committed, because Keycloak serves it as-is. If you add utility classes to .ftl templates, rebuild it. CI fails when the committed file is stale.
Build CSS:
npm run build
Watch and auto-compile (recommended for development):
npx @tailwindcss/cli -i ./theme/unfold-base/login/resources/css/tailwind-input.css -o ./theme/unfold-base/login/resources/css/tailwind.css --watch
To deploy this theme on a production Keycloak cluster, package it as a JAR file (Keycloak best practice). Tagged releases attach the JAR to the GitHub release and publish it to Maven Central as io.github.ffalcinelli:keycloak-unfold.
npm run package
This builds the CSS, prepares the META-INF files and writes keycloak-unfold-v<version>.jar to the repository root (requires zip).
mvn clean package
This writes the JAR to target/keycloak-unfold-v<version>.jar. Maven only packages the files. Build the CSS first with npm run build; the tests run through npm (see below).
Requires Keycloak 26.8.0 or newer.
.jar file to the providers/ directory of your Keycloak installation.bin/kc.sh build
bin/kc.sh start
Customize the installed theme through a child theme: a small folder in /opt/keycloak/themes/ that sets parent=unfold-default (or unfold-full) and contains only what you change. Everything else is inherited from the JAR, so upgrades only mean swapping the JAR.
[!IMPORTANT] Do not create a folder named
unfold-base,unfold-defaultorunfold-fullin/opt/keycloak/themes/. A folder theme with the same name replaces the JAR theme entirely rather than merging with it. Withparent=<same name>it makes login requests hang.
A ready-to-copy child theme is provided in customization/my-brand/:
my-brand/
├── common/resources/css/my-brand.css ← brand colors, shared by login/account/admin
├── login/theme.properties ← parent, logo, terms URL, dark mode, unfold-full options
├── login/resources/img/ ← logo-light.svg, logo-dark.svg, favicon.svg, login-bg.jpg
├── account/theme.properties
└── admin/theme.properties
customization/my-brand to /opt/keycloak/themes/my-brand. You can rename it.my-brand.css and login/theme.properties, and drop your images into login/resources/img/.my-brand as the realm's Login/Account/Admin theme.See customization/README.md for details and deployment patterns.
Set these in your child theme's login/theme.properties:
| Property | Applies to | Default | Description |
|---|---|---|---|
unfoldLogoUrl | all variants | img/logo-light.svg | Light mode logo path (relative to login/resources/) |
unfoldLogoUrlDark | all variants | img/logo-dark.svg | Dark mode logo path |
termsUrl | all variants | (unset: no terms link) | Terms of service link shown below the login form |
darkMode | all variants | true | false hides the toggle and ignores the OS dark preference (realm switch also applies) |
unfoldLayout | all variants | centered (split in unfold-full) | Login shell: centered card or split screen |
bgImage | unfold-full | img/login-bg.jpg | Split-screen hero image |
kcLogoLink | unfold-full | (unset: link hidden) | URL for the "Return to site" back-link |
unfoldQuote | unfold-full | unfoldQuote message key | Fixed quote over the hero image (overrides the translatable default) |
unfoldQuoteSubtext | unfold-full | unfoldQuoteSubtext key | Fixed subtext below the quote |
services:
keycloak:
image: quay.io/keycloak/keycloak:26.8.0
volumes:
- ./keycloak-unfold-v0.0.1.jar:/opt/keycloak/providers/keycloak-unfold.jar:ro
- ./my-brand:/opt/keycloak/themes/my-brand:ro
command: start-dev
npm install
npm run test
The suite starts Keycloak with docker compose up -d --wait and stops it afterwards. If Keycloak is already running, the suite reuses it. It refuses to run against a port that answers but is not Keycloak. To use another port:
KC_PORT=8180 KEYCLOAK_URL=http://localhost:8180 npm run test
To test the packaged JAR instead of the theme/ folder (CI does both):
mvn package
THEME_JAR=target/keycloak-unfold-v0.0.1.jar COMPOSE_FILE=docker-compose.jar.yml npm run test
Unit tests for the dark mode script run without Keycloak: npm run test:unit. For interactive test debugging, use npx playwright test --ui. To refresh the README screenshots, run npm run screenshots against a running instance.
npm run lint (ESLint, Stylelint and the package.json/pom.xml version sync check).npm run format:check (Prettier).npm run format.The unfold-default variant focuses on a clean, "Keycloak-native" feel with custom accent colors.
| Login Page | Account Console |
|---|---|
The unfold-full variant provides a highly customized split-screen, premium visual layout.
| Login Page | Account Console |
|---|---|