Custom CSS
Pro plans can fully restyle the public link page that members land on during the Steam ↔ Discord verify flow. Drop CSS into the dashboard editor and it is injected into every link page on your Org — no rebuild, no propagation delay, live on the next request.
Where to find it. Dashboard → Org Settings → Custom CSS. Pro tier only — Free and Standard see a tier-lock prompt with an upgrade button.
How it works
- Your CSS is appended to the page's
<style>block after the platform stylesheet, so any selector you write wins by source order alone — no!importantneeded for normal overrides. - Changes take effect on the next page load. There is no build step and no cache to bust.
- Only CSS is accepted.
<script>,<link>, and HTML tags are stripped server-side. CSS@importis allowed but discouraged — prefer self-contained rules for performance. - Set the field to empty to revert to the default theme.
CSS variables
The fastest way to retheme is to override the design tokens at :root. Every surface, border, and accent on the page reads from these.
Colors
| Variable | Default | Used for |
|---|---|---|
--bg | #08090b | Page background. |
--bg-1 | #0c0e11 | Slightly raised regions (topbar, footbar). |
--bg-2 | #11141a | Second-level surfaces. |
--surface | #14181f | Cards, avatars, badges, buttons. |
--surface-1 | #1a1f28 | Hover / active states on surfaces. |
--surface-2 | #232932 | Strong-emphasis surfaces. |
--line | rgba(255,255,255,0.06) | Hairline dividers. |
--line-2 | rgba(255,255,255,0.10) | Card / button borders. |
--line-3 | rgba(255,255,255,0.16) | Focused / hovered borders. |
--line-warm | rgba(232,90,43,0.22) | Ember-tinted accent borders. |
--fg | #f5f5f7 | Primary text. |
--fg-1 | #d4d4d8 | Body copy. |
--fg-2 | #8a8d94 | Secondary text, labels. |
--fg-3 | #5a5e66 | Tertiary text, footbar. |
--fg-4 | #3a3d44 | Disabled text. |
--ember | #ff6b3d | Brand accent / primary button. |
--ember-1 | #e85a2b | Primary button hover. |
--ember-2 | #c44a23 | Primary button active. |
--ember-glow | rgba(255,107,61,0.4) | Glow / focus ring around primary CTA. |
--ok / --ok-2 | #4ade80 / #16a34a | Success icon, success borders. |
--warn | #fbbf24 | Warning text. |
--err / --err-2 | #f87171 / #dc2626 | Error icon, danger button. |
--discord | #5865f2 | Discord brand chip. |
--steam | #66c0f4 | Steam brand chip. |
Shape, typography, motion
| Variable | Default | Used for |
|---|---|---|
--radius | 10px | Cards, buttons. |
--radius-sm | 6px | Avatar, badge. |
--radius-xs | 4px | Pill chips. |
--font | 'Inter', system-ui | UI font stack. |
--font-mono | 'JetBrains Mono' | IDs, timestamps, footbar. |
--shadow-1 | inset hairline + 1px ring | Resting card elevation. |
--shadow-2 | inset hairline + ring + drop | Raised / hovered cards. |
--ease | cubic-bezier(0.16,1,0.3,1) | Default easing curve. |
Page structure
Every link page renders the same skeleton. Target any of these selectors to restyle that region.
| Selector | Region |
|---|---|
body / .app | Root containers — set background image / gradient here. |
.backdrop | Decorative full-bleed layer behind content. Default has a subtle ember radial; safe to overwrite. |
.topbar / .topbar-left / .topbar-right | Top header strip. Houses brand, breadcrumb, nav, status dot. |
.brand / .brand-mark | Logo + Org name in the top-left. .brand-mark wraps the avatar image / initial. |
.crumb / .crumb-sep / .divider | Breadcrumb “account / link”. |
.nav-links | Org-defined external links in the topbar. |
.status-dot / .status-text | Operational pill on the right. |
.work / .work-inner | Main content column. |
.work-eyebrow | Tiny uppercase label above the hero heading. |
.work-h1 | Hero heading. |
.work-sub | Hero subhead paragraph. |
.work-aside + children | Right-side metadata column with .work-aside-item, .work-aside-label, .work-aside-value. |
.id-row + children | Identity card: .id-avatar, .id-avatar-placeholder, .id-info, .id-name, .id-meta, .id-source. |
.flow + children | Verify stepper: .flow-item, .flow-item.done, .flow-dot, .flow-text, .flow-name, .flow-meta. |
.outcome-icon / .outcome-icon.ok / .outcome-icon.err | Success / error icon in the result state. |
.rail + children | Side rail card: .rail-head, .rail-eyebrow, .rail-title, .rail-sub, .rail-foot. |
.trust-row | Single trust signal row inside the rail. |
.actions | Button group container. |
.btn | Base button. |
.btn-primary | Ember-tinted primary CTA. Uses --ember + --ember-glow. |
.btn-secondary | Surface-tinted secondary action. |
.btn-danger | Red destructive action. Uses --err / --err-2. |
.btn-ghost | Transparent text-only button. |
.meta-link / .meta-link.danger | Inline text links in metadata. |
.footbar / .footbar-left / .footbar-right | Bottom status bar. |
.badge | Monospace pill used in footbar and metadata. |
Recipes
1. Switch the brand accent to hot pink
Overriding --ember and friends retunes every primary button, glow, and focus ring at once.
:root {
--ember: #ff0050;
--ember-1: #e60048;
--ember-2: #cc0040;
--ember-glow: rgba(255, 0, 80, 0.45);
--line-warm: rgba(255, 0, 80, 0.22);
}
2. Light theme
:root {
--bg: #f7f7f8;
--bg-1: #ffffff;
--bg-2: #f0f0f3;
--surface: #ffffff;
--surface-1: #f5f5f7;
--surface-2: #ebebef;
--line: rgba(0, 0, 0, 0.08);
--line-2: rgba(0, 0, 0, 0.12);
--line-3: rgba(0, 0, 0, 0.18);
--fg: #0a0a0b;
--fg-1: #2a2a2e;
--fg-2: #5a5e66;
--fg-3: #8a8d94;
}
3. Custom background image
body {
background:
linear-gradient(180deg, rgba(8,9,11,0.85) 0%, rgba(8,9,11,0.95) 100%),
url('https://cdn.example.com/bg.jpg') center / cover no-repeat fixed;
}
.backdrop { display: none; }
4. Custom display font
/* @import is allowed; loaded once per page */
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;600;700&display=swap');
:root {
--font: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif;
}
.work-h1 { letter-spacing: -0.02em; }
5. Hide the footbar
.footbar { display: none; }
.work { padding-bottom: 32px; }
6. Glassmorphism rail
.rail {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
backdrop-filter: blur(24px) saturate(160%);
-webkit-backdrop-filter: blur(24px) saturate(160%);
}
Tips
- Test on mobile. The page tightens at
max-width: 640px. Wrap mobile-only overrides in the same media query. - Prefer tokens over hex. If you re-tune the palette via
:rootvariables, every component stays in sync automatically. - Use
!importantsparingly. Source order already favors your CSS — reach for!importantonly when overriding an inline style. - Validate visually. The dashboard editor is plain-text; open the link page in a new tab and refresh after each save to confirm.
- No JS.
<script>tags are stripped. For dynamic behavior, file a feature request rather than trying to smuggle it through CSS.