keycloak-doctor GitHub ↗

Brand

The mark, the palette and the two rules for using them.

The name#

keycloak-doctor, one word, lowercase, hyphenated, in monospace wherever a monospace font is available. Not "Keycloak Doctor", not "KeycloakDoctor": the name is a command you type. It is a third-party tool and it is not affiliated with, endorsed by, or a product of Keycloak or Red Hat — never present it as one.

The mark#

FileUse
docs/assets/logo.svgthe mark, everywhere it is shown at 24px or larger
docs/assets/favicon.svgbrowser tabs and anything under 24px
docs/assets/og-card.svgsource of the link-preview card, 1200×630
docs/assets/og-card.pngthe card itself — what a search result, a Slack unfurl or a tweet shows

Three elements, each carrying one of the tool's claims:

logo.svg and favicon.svg are hand-written SVG with no external references, no embedded raster and no font dependency, so they scale from a favicon to a slide and stay a few hundred bytes. The favicon.svg variant is the same mark with the detail a 16px tab cannot resolve taken out — a larger keyhole, one thicker pulse spike. Keep them in step: a change to one is a change to both.

Palette#

TokenHexWhere
Deep blue#0B3A66the tile, and the keyhole punched out of the shield
Shield#EAF2FBthe shield face
Pulse#F0A02Athe pulse, and nothing else — it is the accent, not a fill

The site uses its own interface palette (internal/site/assets/style.css), which is theme-aware and independent of these three: the mark has to survive on a light page, on a dark page and on a coloured slide, so it carries its own background instead of borrowing one.

Using it#

og-card.png is the only raster file here, and it is committed rather than generated at build time on purpose: no crawler and no chat client renders SVG, so an SVG in og:image means no preview at all. The PNG is a render of og-card.svg at exactly 1200×630 — the size every consumer crops from — and the site serves it next to its pages, with og:image:width/height declared so a client does not have to download it to lay the card out.

After editing og-card.svg, re-render it:

# wrap the SVG in a page so the render has no margin, then screenshot it at 1200x630
CHROME="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
printf '<!doctype html><style>html,body{margin:0;background:#071F35}svg{display:block}</style>%s' \
  "$(cat docs/assets/og-card.svg)" > /tmp/og.html
"$CHROME" --headless --disable-gpu --hide-scrollbars --force-device-scale-factor=1 \
  --screenshot=docs/assets/og-card.png --window-size=1200,630 "file:///tmp/og.html"
sips -g pixelWidth -g pixelHeight docs/assets/og-card.png   # must say 1200 x 630

Text in the card is real SVG text, so it is rendered with the fonts of the machine that renders it — one more reason the PNG is committed instead of built in CI, where those fonts are not the same.

Regenerating a preview of the mark#

The SVG is the source; there is nothing to build. To look at a change before committing it, render a large preview and a tab-sized one:

qlmanage -t -s 384 -o /tmp docs/assets/logo.svg      # macOS
qlmanage -t -s 32  -o /tmp docs/assets/favicon.svg

The site copies the served files verbatim next to its pages (cmd/gen-site reads them from docs/assets/), and the README points at the same mark. One mark, one copy of it: there is no second place to update.