SimpleLinks Docs

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 SettingsCustom 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 !important needed 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 @import is 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

VariableDefaultUsed for
--bg#08090bPage background.
--bg-1#0c0e11Slightly raised regions (topbar, footbar).
--bg-2#11141aSecond-level surfaces.
--surface#14181fCards, avatars, badges, buttons.
--surface-1#1a1f28Hover / active states on surfaces.
--surface-2#232932Strong-emphasis surfaces.
--linergba(255,255,255,0.06)Hairline dividers.
--line-2rgba(255,255,255,0.10)Card / button borders.
--line-3rgba(255,255,255,0.16)Focused / hovered borders.
--line-warmrgba(232,90,43,0.22)Ember-tinted accent borders.
--fg#f5f5f7Primary text.
--fg-1#d4d4d8Body copy.
--fg-2#8a8d94Secondary text, labels.
--fg-3#5a5e66Tertiary text, footbar.
--fg-4#3a3d44Disabled text.
--ember#ff6b3dBrand accent / primary button.
--ember-1#e85a2bPrimary button hover.
--ember-2#c44a23Primary button active.
--ember-glowrgba(255,107,61,0.4)Glow / focus ring around primary CTA.
--ok / --ok-2#4ade80 / #16a34aSuccess icon, success borders.
--warn#fbbf24Warning text.
--err / --err-2#f87171 / #dc2626Error icon, danger button.
--discord#5865f2Discord brand chip.
--steam#66c0f4Steam brand chip.

Shape, typography, motion

VariableDefaultUsed for
--radius10pxCards, buttons.
--radius-sm6pxAvatar, badge.
--radius-xs4pxPill chips.
--font'Inter', system-uiUI font stack.
--font-mono'JetBrains Mono'IDs, timestamps, footbar.
--shadow-1inset hairline + 1px ringResting card elevation.
--shadow-2inset hairline + ring + dropRaised / hovered cards.
--easecubic-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.

SelectorRegion
body / .appRoot containers — set background image / gradient here.
.backdropDecorative full-bleed layer behind content. Default has a subtle ember radial; safe to overwrite.
.topbar / .topbar-left / .topbar-rightTop header strip. Houses brand, breadcrumb, nav, status dot.
.brand / .brand-markLogo + Org name in the top-left. .brand-mark wraps the avatar image / initial.
.crumb / .crumb-sep / .dividerBreadcrumb “account / link”.
.nav-linksOrg-defined external links in the topbar.
.status-dot / .status-textOperational pill on the right.
.work / .work-innerMain content column.
.work-eyebrowTiny uppercase label above the hero heading.
.work-h1Hero heading.
.work-subHero subhead paragraph.
.work-aside + childrenRight-side metadata column with .work-aside-item, .work-aside-label, .work-aside-value.
.id-row + childrenIdentity card: .id-avatar, .id-avatar-placeholder, .id-info, .id-name, .id-meta, .id-source.
.flow + childrenVerify stepper: .flow-item, .flow-item.done, .flow-dot, .flow-text, .flow-name, .flow-meta.
.outcome-icon / .outcome-icon.ok / .outcome-icon.errSuccess / error icon in the result state.
.rail + childrenSide rail card: .rail-head, .rail-eyebrow, .rail-title, .rail-sub, .rail-foot.
.trust-rowSingle trust signal row inside the rail.
.actionsButton group container.
.btnBase button.
.btn-primaryEmber-tinted primary CTA. Uses --ember + --ember-glow.
.btn-secondarySurface-tinted secondary action.
.btn-dangerRed destructive action. Uses --err / --err-2.
.btn-ghostTransparent text-only button.
.meta-link / .meta-link.dangerInline text links in metadata.
.footbar / .footbar-left / .footbar-rightBottom status bar.
.badgeMonospace 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 :root variables, every component stays in sync automatically.
  • Use !important sparingly. Source order already favors your CSS — reach for !important only 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.