SignalWire Docs
a[href="/docs"] {
@font-face {
font-family: 'Lexend';
src: url('https://files.buildwithfern.com/signalwire.docs.buildwithfern.com/docs/0601e0a909219a542cdd581e3f8f1ff8fb208978cbc9bca1c90df02fd8062bb1/assets/fonts/lexend-400.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
} @font-face { font-family: 'Instrument Sans'; src: url('https://files.buildwithfern.com/signalwire.docs.buildwithfern.com/docs/2ee17598a98d8a59e4df8152d015bec9ab8e4d5672cc0ab42bef806b568e3971/assets/fonts/instrument-sans.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; } @font-face { font-family: 'Instrument Sans'; src: url('https://files.buildwithfern.com/signalwire.docs.buildwithfern.com/docs/2ee17598a98d8a59e4df8152d015bec9ab8e4d5672cc0ab42bef806b568e3971/assets/fonts/instrument-sans.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: 'JetBrains Mono'; src: url('https://files.buildwithfern.com/signalwire.docs.buildwithfern.com/docs/14425ba9c695763c1547f48a206b7aa60350a33ae23de09f0407877f3fcd89eb/assets/fonts/jetbrains-mono-400.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
:root {
--header-height: 64px;
--header-height-real: 64px;
--mobile-header-height-real: 64px;
--content-width: 640px;
--sidebar-width: 288px;
--page-width: 100vw;
--logo-height: 25px;
--font-body: 'Lexend', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
--font-heading: 'Instrument Sans', 'Lexend', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
--font-code: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
}
:root {
/* for backwards compatibility */
--typography-body-font-family: var(--font-body);
--typography-heading-font-family: var(--font-heading);
--typography-code-font-family: var(--font-code);
}
.light, :root {
--accent-1: #f8f9fa; --accent-2: #f1f5fc; --accent-3: #e5edfd; --accent-4: #d5e5ff; --accent-5: #c2daff; --accent-6: #acccff; --accent-7: #93b9ff; --accent-8: #709ffd; --accent-9: #044ef4; --accent-10: #0544d3; --accent-11: #104edd; --accent-12: #102c68;
--accent-a1: #50515203; --accent-a2: #1563fc0a; --accent-a3: #bbd1ff55; --accent-a4: #d5e5ff; --accent-a5: #c2daff; --accent-a6: #acccff; --accent-a7: #93b9ff; --accent-a8: #0000ff55; --accent-a9: #004bf4fb; --accent-a10: #0040d2fa; --accent-a11: #0042dbef; --accent-a12: #001e5eef;
--accent-contrast: #fff; --accent-surface: #eff4fdcc; --accent-indicator: #044ef4; --accent-track: #044ef4; }
@supports (color: color(display-p3 1 1 1)) { @media (color-gamut: p3) { .light, :root { --accent-1: oklch(98.1% 0.0019 263.1); --accent-2: oklch(96.8% 0.0105 263.1); --accent-3: oklch(94.5% 0.0224 263.1); --accent-4: oklch(91.9% 0.0441 263.1); --accent-5: oklch(88.6% 0.0667 263.1); --accent-6: oklch(84.5% 0.0932 263.1); --accent-7: oklch(78.8% 0.1134 263.1); --accent-8: oklch(71% 0.1478 263.1); --accent-9: oklch(51.1% 0.2539 263.1); --accent-10: oklch(46.2% 0.2255 263.1); --accent-11: oklch(49% 0.2255 263.1); --accent-12: oklch(31.3% 0.1117 263.1);
--accent-a1: color(display-p3 0 0.0078 0.0078 / 0.008);
--accent-a2: color(display-p3 0 0.251 0.8667 / 0.032);
--accent-a3: color(display-p3 0 0.298 0.9412 / 0.08);
--accent-a4: color(display-p3 0.5843 0.7176 1 / 0.334);
--accent-a5: color(display-p3 0 0.3333 0.9882 / 0.204);
--accent-a6: color(display-p3 0 0.3333 0.9765 / 0.288);
--accent-a7: color(display-p3 0 0.2902 0.9608 / 0.38);
--accent-a8: color(display-p3 0 0.2745 0.9451 / 0.512);
--accent-a9: color(display-p3 0 0.2039 0.9137 / 0.872);
--accent-a10: color(display-p3 0 0.1725 0.7725 / 0.888);
--accent-a11: color(display-p3 0 0.1882 0.8118 / 0.856);
--accent-a12: color(display-p3 0 0.0863 0.3333 / 0.908);
--accent-contrast: #fff;
--accent-surface: color(display-p3 0.9373 0.9529 0.9843 / 0.8);
--accent-indicator: oklch(51.1% 0.2539 263.1);
--accent-track: oklch(51.1% 0.2539 263.1);
}
} }
.light, :root {
--grayscale-1: #fcfcfd; --grayscale-2: #f9f9fb; --grayscale-3: #f0f0f3; --grayscale-4: #e8e8ec; --grayscale-5: #e0e1e6; --grayscale-6: #d9d9e0; --grayscale-7: #cdced6; --grayscale-8: #b9bbc6; --grayscale-9: #8b8d98; --grayscale-10: #80838d; --grayscale-11: #60646c; --grayscale-12: #1c2024;
--grayscale-a1: #00005503; --grayscale-a2: #00005506; --grayscale-a3: #0000330f; --grayscale-a4: #00002d17; --grayscale-a5: #0009321f; --grayscale-a6: #00002f26; --grayscale-a7: #00062e32; --grayscale-a8: #00083046; --grayscale-a9: #00051d74; --grayscale-a10: #00071b7f; --grayscale-a11: #0007149f; --grayscale-a12: #000509e3;
--grayscale-contrast: #000; --grayscale-surface: #ffffffcc; --grayscale-indicator: #8b8d98; --grayscale-track: #8b8d98; }
@supports (color: color(display-p3 1 1 1)) { @media (color-gamut: p3) { .light, :root { --grayscale-1: color(display-p3 0.988 0.988 0.992); --grayscale-2: color(display-p3 0.976 0.976 0.984); --grayscale-3: color(display-p3 0.94 0.941 0.953); --grayscale-4: color(display-p3 0.908 0.909 0.925); --grayscale-5: color(display-p3 0.88 0.881 0.901); --grayscale-6: color(display-p3 0.85 0.852 0.876); --grayscale-7: color(display-p3 0.805 0.808 0.838); --grayscale-8: color(display-p3 0.727 0.733 0.773); --grayscale-9: color(display-p3 0.547 0.553 0.592); --grayscale-10: color(display-p3 0.503 0.512 0.549); --grayscale-11: color(display-p3 0.379 0.392 0.421); --grayscale-12: color(display-p3 0.113 0.125 0.14);
--grayscale-a1: #00005503;
--grayscale-a2: #00005506;
--grayscale-a3: #0000330f;
--grayscale-a4: #00002d17;
--grayscale-a5: #0009321f;
--grayscale-a6: #00002f26;
--grayscale-a7: #00062e32;
--grayscale-a8: #00083046;
--grayscale-a9: #00051d74;
--grayscale-a10: #00071b7f;
--grayscale-a11: #0007149f;
--grayscale-a12: #000509e3;
--grayscale-contrast: #000;
--grayscale-surface: color(display-p3 1 1 1 / 80%);
--grayscale-indicator: color(display-p3 0.547 0.553 0.592);
--grayscale-track: color(display-p3 0.547 0.553 0.592);
}
} }
.dark {
--accent-1: #091110; --accent-2: #0e1b19; --accent-3: #062c28; --accent-4: #003b35; --accent-5: #004842; --accent-6: #005750; --accent-7: #0e6961; --accent-8: #0d8076; --accent-9: #40e0d0; --accent-10: #2fd5c6; --accent-11: #32d7c7; --accent-12: #b9f6ed;
--accent-a1: #00ce0004; --accent-a2: #0ffb2b0e; --accent-a3: #00fe9820; --accent-a4: #00feb330; --accent-a5: #00fcc53e; --accent-a6: #00fdcf4e; --accent-a7: #0efdd861; --accent-a8: #0cffde79; --accent-a9: #47feeadf; --accent-a10: #36ffebd3; --accent-a11: #3affead5; --accent-a12: #c0fff5f6;
--accent-contrast: #042824; --accent-surface: #0e281a80; --accent-indicator: #40e0d0; --accent-track: #40e0d0; }
@supports (color: color(display-p3 1 1 1)) { @media (color-gamut: p3) { .dark { --accent-1: oklch(16.9% 0.0126 185.1); --accent-2: oklch(20.7% 0.0187 185.1); --accent-3: oklch(26.7% 0.0423 185.1); --accent-4: oklch(31.3% 0.0628 185.1); --accent-5: oklch(35.9% 0.0687 185.1); --accent-6: oklch(41% 0.0723 185.1); --accent-7: oklch(47.1% 0.0793 185.1); --accent-8: oklch(54% 0.0926 185.1); --accent-9: oklch(82.2% 0.1307 185.1); --accent-10: oklch(79% 0.1307 185.1); --accent-11: oklch(79.5% 0.1307 185.1); --accent-12: oklch(92.9% 0.0629 185.1);
--accent-a1: color(display-p3 0 0.9608 0 / 0.013);
--accent-a2: color(display-p3 0.2745 1 0.2392 / 0.054);
--accent-a3: color(display-p3 0.1882 0.9961 0.6431 / 0.121);
--accent-a4: color(display-p3 0.2275 1 0.7333 / 0.183);
--accent-a5: color(display-p3 0.2863 1 0.8 / 0.237);
--accent-a6: color(display-p3 0.3333 1 0.8392 / 0.299);
--accent-a7: color(display-p3 0.4078 1 0.8784 / 0.37);
--accent-a8: color(display-p3 0.4275 1 0.8941 / 0.465);
--accent-a9: color(display-p3 0.5216 1 0.9373 / 0.859);
--accent-a10: color(display-p3 0.4902 0.9961 0.9333 / 0.814);
--accent-a11: color(display-p3 0.502 1 0.9294 / 0.822);
--accent-a12: color(display-p3 0.8078 0.9961 0.9686 / 0.955);
--accent-contrast: #042824;
--accent-surface: color(display-p3 0.0706 0.149 0.102 / 0.5);
--accent-indicator: oklch(82.2% 0.1307 185.1);
--accent-track: oklch(82.2% 0.1307 185.1);
}
} }
.dark {
--grayscale-1: #111113; --grayscale-2: #18191b; --grayscale-3: #212225; --grayscale-4: #272a2d; --grayscale-5: #2e3135; --grayscale-6: #363a3f; --grayscale-7: #43484e; --grayscale-8: #5a6169; --grayscale-9: #696e77; --grayscale-10: #777b84; --grayscale-11: #b0b4ba; --grayscale-12: #edeef0;
--grayscale-a1: #00000000; --grayscale-a2: #d8f4f609; --grayscale-a3: #ddeaf814; --grayscale-a4: #d3edf81d; --grayscale-a5: #d9edfe25; --grayscale-a6: #d6ebfd30; --grayscale-a7: #d9edff40; --grayscale-a8: #d9edff5d; --grayscale-a9: #dfebfd6d; --grayscale-a10: #e5edfd7b; --grayscale-a11: #f1f7feb5; --grayscale-a12: #fcfdffef;
--grayscale-contrast: #fff; --grayscale-surface: rgba(0, 0, 0, 0.05); --grayscale-indicator: #696e77; --grayscale-track: #696e77; }
@supports (color: color(display-p3 1 1 1)) { @media (color-gamut: p3) { .dark { --grayscale-1: color(display-p3 0.067 0.067 0.074); --grayscale-2: color(display-p3 0.095 0.098 0.105); --grayscale-3: color(display-p3 0.13 0.135 0.145); --grayscale-4: color(display-p3 0.156 0.163 0.176); --grayscale-5: color(display-p3 0.183 0.191 0.206); --grayscale-6: color(display-p3 0.215 0.226 0.244); --grayscale-7: color(display-p3 0.265 0.28 0.302); --grayscale-8: color(display-p3 0.357 0.381 0.409); --grayscale-9: color(display-p3 0.415 0.431 0.463); --grayscale-10: color(display-p3 0.469 0.483 0.514); --grayscale-11: color(display-p3 0.692 0.704 0.728); --grayscale-12: color(display-p3 0.93 0.933 0.94);
--grayscale-a1: #00000000;
--grayscale-a2: #d8f4f609;
--grayscale-a3: #ddeaf814;
--grayscale-a4: #d3edf81d;
--grayscale-a5: #d9edfe25;
--grayscale-a6: #d6ebfd30;
--grayscale-a7: #d9edff40;
--grayscale-a8: #d9edff5d;
--grayscale-a9: #dfebfd6d;
--grayscale-a10: #e5edfd7b;
--grayscale-a11: #f1f7feb5;
--grayscale-a12: #fcfdffef;
--grayscale-contrast: #fff;
--grayscale-surface: color(display-p3 0 0 0 / 5%);
--grayscale-indicator: color(display-p3 0.415 0.431 0.463);
--grayscale-track: color(display-p3 0.415 0.431 0.463);
}
} }
.light, :root {
color-scheme: light;
--accent: rgba(4, 78, 244, 1);
--background: rgba(250, 251, 252, 1);
--border: initial;
--sidebar-background: initial;
--header-background: color-mix(in srgb, var(--background), transparent 30%);
--card-background: initial;
--theme-color: #fafbfc;
}
.dark {
color-scheme: dark;
--accent: rgba(64, 224, 208, 1);
--background: rgba(14, 14, 24, 1);
--border: initial;
--sidebar-background: initial;
--header-background: color-mix(in srgb, var(--background), transparent 30%);
--card-background: initial;
--theme-color: #0e0e18;
}
/* =============================================================================
SIGNALWIRE BRAND TOKENS Source: temp/signalwire-tokens.css (extracted from the brand style guide) ============================================================================= */
/* --- Brand palette (locked, mode-independent) --- */ :root { --sw-blue: #044EF4; --sw-fuchsia: #F72A72; --sw-turquoise: #40E0D0; --sw-gold: #FFD700;
--sw-purple: #601BE6;
/* RGB channels for alpha compositing */ --sw-blue-rgb: 4, 78, 244; --sw-fuchsia-rgb: 247, 42, 114; --sw-turquoise-rgb: 64, 224, 208; --sw-gold-rgb: 255, 215, 0; --sw-purple-rgb: 96, 27, 230;
/* Fixed light background (stays light in both themes) */ --sw-light-bg: #FAFBFC;
/* Typography (mode-independent) */ --type-line-height-body: 1.7; --type-line-height-heading: 1.2; --type-letter-spacing-eyebrow: 0.14em; --type-size-code: 14px;
/* Radius */ --radius-sm: 4px; --radius-xl: 12px; }
/* --- Dark mode tokens --- / .dark { / Surfaces */ --bg-page: #0e0e18; --bg-surface: #181a28; --bg-surface-raised: #222436;
/* Foreground */ --fg-default: #f0f0f4; --fg-secondary: #e8e8ec; --fg-muted: #a0a0aa; --fg-subtle: #73737e; --fg-headings: var(--fg-default); --fg-emphasis: var(--sw-turquoise); --fg-emphasis-small: var(--sw-turquoise);
/* Borders */ --border-default: rgba(255, 255, 255, 0.12); --border-strong: rgba(255, 255, 255, 0.15);
/* Inline code */ --code-bg: rgba(255, 255, 255, 0.06); --code-fg: var(--sw-turquoise);
/* Links */ --interactive-link-default: var(--sw-turquoise); --interactive-link-hover: var(--sw-fuchsia); --interactive-link-visited: var(--fg-muted);
/* Callouts */ --callout-info-bg: rgba(var(--sw-blue-rgb), 0.06); --callout-info-border: rgba(var(--sw-blue-rgb), 0.18); --callout-warn-bg: rgba(var(--sw-gold-rgb), 0.04); --callout-warn-border: rgba(var(--sw-gold-rgb), 0.16); --callout-danger-bg: rgba(var(--sw-fuchsia-rgb), 0.06); --callout-danger-border: rgba(var(--sw-fuchsia-rgb), 0.18); --callout-success-bg: rgba(var(--sw-turquoise-rgb), 0.06); --callout-success-border: rgba(var(--sw-turquoise-rgb), 0.18);
/* Tables */ --table-header-bg: transparent; --table-header-text: var(--sw-fuchsia); --table-row-hover: rgba(255, 255, 255, 0.03); --table-border: rgba(255, 255, 255, 0.07);
/* Card */ --card-hover-border: var(--fg-default); --card-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); --card-inset: inset 0 1px 0 rgba(255, 255, 255, 0.04); --card-inset-hover: inset 0 1px 0 rgba(255, 255, 255, 0.06);
--card-hover-shadow: 0 16px 40px rgba(0, 0, 0, 0.25);
/* Status */ --status-success: #22c55e; --status-error: #ef4444; --status-neutral: #a0a0aa; }
/* --- Light mode tokens --- / :root:not(.dark) { / Surfaces */ --bg-page: #FAFBFC; --bg-surface: #F3F4F6; --bg-surface-raised: #E8EAF0;
/* Foreground / --fg-default: #1A1A18; --fg-secondary: #3A3A38; --fg-muted: #737371; --fg-subtle: #A8A8A6; --fg-headings: #070c2d; --fg-emphasis: var(--sw-fuchsia); --fg-emphasis-small: #AB0A42; / Darkened fuchsia — AAA on light bg (7.1:1) */
/* Borders */ --border-default: rgba(0, 0, 0, 0.1); --border-strong: rgba(0, 0, 0, 0.18);
/* Inline code */ --code-bg: rgba(0, 0, 0, 0.06); --code-fg: var(--sw-blue);
/* Links */ --interactive-link-default: var(--sw-blue); --interactive-link-hover: var(--sw-fuchsia); --interactive-link-visited: var(--fg-muted);
/* Callouts */ --callout-info-bg: rgba(var(--sw-blue-rgb), 0.06); --callout-info-border: rgba(var(--sw-blue-rgb), 0.18); --callout-warn-bg: rgba(var(--sw-gold-rgb), 0.04); --callout-warn-border: rgba(var(--sw-gold-rgb), 0.16); --callout-danger-bg: rgba(var(--sw-fuchsia-rgb), 0.06); --callout-danger-border: rgba(var(--sw-fuchsia-rgb), 0.18); --callout-success-bg: rgba(var(--sw-turquoise-rgb), 0.06); --callout-success-border: rgba(var(--sw-turquoise-rgb), 0.18);
/* Tables */ --table-header-bg: var(--sw-blue); --table-header-text: #ffffff; --table-row-hover: rgba(0, 0, 0, 0.02); --table-border: rgba(0, 0, 0, 0.1);
/* Card */ --card-hover-border: var(--sw-blue); --card-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); --card-inset: 0 0 0 0 transparent; --card-inset-hover: 0 0 0 0 transparent;
--card-hover-shadow: 0 16px 40px rgba(0, 0, 0, 0.1);
/* Status */ --status-success: #16a34a; --status-error: #dc2626; --status-neutral: #737371; }
/* ============================================================================= SIGNALWIRE BRAND OVERRIDES Applies brand tokens to Fern components. Requires brand-tokens.css. ============================================================================= */
/* --- Headings: neutral color, not accent (brand rule: colored headings = violation) --- */ h1, h2, h3, h4, h5, h6, .fern-page-heading { color: var(--fg-headings); letter-spacing: -0.02em; line-height: var(--type-line-height-heading); }
/* --- Body: DTCG line-height --- */ body { line-height: var(--type-line-height-body); }
/* --- Links: brand link colors with fuchsia hover --- */ .fern-mdx-link, .fern-markdown a:not([class]) { transition: color 0.15s ease; }
.fern-mdx-link:hover, .fern-markdown a:not([class]):hover, .fern-mdx-link:hover code, .fern-markdown a:not([class]):hover code { color: var(--interactive-link-hover); }
/* --- Inline code: brand code colors per mode --- */ :not(pre) > code { background: var(--code-bg); color: var(--code-fg); border-radius: var(--radius-sm); padding: 0.125em 0.375em; font-size: var(--type-size-code); }
/* --- Sidebar: brand surface color --- */ .fern-sidebar-container { background: var(--bg-surface); }
/* --- Tables: brand-aligned header and borders --- */ .fern-markdown table th { background: var(--table-header-bg); color: var(--table-header-text); border-bottom: 2px solid var(--table-border); }
.fern-markdown table td { border-bottom: 1px solid var(--table-border); }
.fern-markdown table tr:hover td { background: var(--table-row-hover); }
/* --- Callouts: brand colors via Fern's data-intent attributes --- */ .fern-callout[data-intent="note"] { background: var(--callout-info-bg); border-color: var(--callout-info-border); }
.fern-callout[data-intent="warning"] { background: var(--callout-warn-bg); border-color: var(--callout-warn-border); }
.fern-callout[data-intent="error"] { background: var(--callout-danger-bg); border-color: var(--callout-danger-border); }
.fern-callout[data-intent="success"], .fern-callout[data-intent="tip"], .fern-callout[data-intent="check"] { background: var(--callout-success-bg); border-color: var(--callout-success-border); }
/* --- Cards: matches .lp-feature from style guide. Raised bg, depth shadow, inset highlight, fuchsia ring on hover. No colored borders on any state (brand rule). --- */ .fern-card { background: var(--bg-surface-raised) !important; border: none !important; border-radius: var(--radius-xl); box-shadow: var(--card-shadow), var(--card-inset) !important; transition: transform 0.3s ease, box-shadow 0.3s ease; }
.fern-card.interactive:hover { transform: translateY(-3px); box-shadow: 0 0 0 1.5px rgba(var(--sw-fuchsia-rgb), 0.15), var(--card-hover-shadow), var(--card-inset-hover), inset 0 -1px 0 var(--card-hover-border) !important; }
/* --- API property keys: brand specifies code at weight 400 only. Fern defaults to 600 which causes faux-bold blur with our single-weight woff2. --- */ .fern-api-property-key { font-weight: 400; }
/* --- Touch targets: 48px minimum on mobile (DTCG/WCAG) --- */ @media (max-width: 768px) { .fern-button { min-height: 48px; } }
/* ============================================================================= SIGNALWIRE DOCS — SITE-SPECIFIC STYLES Layout, components, and overrides specific to the docs site. Brand tokens live in brand-tokens.css; Fern overrides in brand-overrides.css. ============================================================================= */
/*
- Diagram images: solid background + color inversion for dark mode.
- Usage: Add class="diagram" to the img element and include "diagram"
- in the filename (e.g., my_diagram.webp). Fern's zoom library (rmiz)
- strips classes when cloning images, so zoomed diagrams use a
- path-based selector [src*="diagram"] instead. */
/* Diagram image: solid background (light mode only) */ img.diagram { background-color: var(--sw-light-bg); }
/* Diagram image: invert colors in dark mode (no background) */ .dark img.diagram { background-color: transparent; filter: invert(1) hue-rotate(180deg); }
/* Zoomed image: solid background */ [data-rmiz-modal-content] img { background-color: var(--sw-light-bg) !important; }
.dark [data-rmiz-modal-content] img { background-color: var(--bg-page) !important; }
/* Zoomed diagram: dark bg on container, invert only the image / .dark [data-rmiz-modal-content]:has(img[src="diagram"]) { background-color: var(--bg-page) !important; }
.dark [data-rmiz-modal-content] img[src*="diagram"] { background-color: transparent !important; filter: invert(1) hue-rotate(180deg); }
/* Logo right-text branding */ .fern-logo-text { font-family: var(--typography-heading-font-family), sans-serif; font-weight: 500; font-size: 1.25rem !important; color: var(--grayscale-12) !important; letter-spacing: -0.01em; position: relative; top: -1px; }
/* Status dropdown link — pulsing gray dot indicator */ @keyframes status-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.5; transform: scale(0.85); } }
a[href*="status.signalwire.com"]::after { content: ""; display: inline-block; width: 0.5rem; height: 0.5rem; margin-left: 0.375rem; border-radius: 50%; background-color: var(--status-neutral); vertical-align: middle; animation: status-pulse 2s ease-in-out infinite; }
/* "Run in Postman" button — Fern wraps external link images with mx-auto
(block-centered) and appends an external-link icon. Both look out of place
for a small, inline-feeling CTA, so override them. On hover the image
itself scales up slightly (no surrounding box) for clear, in-place feedback. /
a[href="god.gw.postman.com"] {
display: inline-block;
transition: transform 0.15s ease;
}
a[href*="god.gw.postman.com"]:hover {
transform: scale(1.05);
}
a[href*="god.gw.postman.com"] > svg.external-link-icon {
display: none;
}
a[href*="god.gw.postman.com"] > img {
margin-inline: 0 !important;
}
/* Required/Optional indicator colors */ .required-yes { color: var(--status-success); font-weight: 600; }
.required-no { color: var(--status-error); font-weight: 600; }
/* ============================================================================= LANDING PAGE STYLING ============================================================================= */
.lp-page-container { min-height: 100vh; position: relative;
.dashed-pattern { position: absolute; top: -50vh; height: calc(100% + 50vh); width: 1rem; opacity: 1; pointer-events: none; mask: linear-gradient( to bottom, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 1) 90%, transparent 100% ); -webkit-mask: linear-gradient( to bottom, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 1) 90%, transparent 100% ); }
.dashed-pattern-left { left: -1rem; border-right: 1px solid var(--grayscale-5); }
.dashed-pattern-right { right: -1rem; border-left: 1px solid var(--grayscale-5); }
.main-content { max-width: 60rem; margin: 0 auto; position: relative; padding: 4rem 0 3rem; }
/* --- Hero Section --- */
.hero-section { margin-bottom: 4rem; position: relative; overflow: clip; }
.hero-content { position: relative; padding: 0 2rem; }
/* --- Products Section --- */
.products-section { border-top: 1px solid var(--grayscale-5); padding: 3.5rem 2rem; }
.products-section h2 { font-size: 1.25rem; font-weight: 700; color: var(--grayscale-12); margin-bottom: 0.25rem; }
.section-header { margin-bottom: 2rem; }
.section-header p { font-size: 0.875rem; color: var(--text-body); }
/* --- Homepage Callout --- */
.hp-callout { display: flex; align-items: center; gap: 1.5rem; padding: 1.5rem 2rem; margin: 2rem 2rem 3rem; border-radius: 0.75rem; background: var(--grayscale-a2); font-size: 0.875rem; }
.hp-callout-desc { color: var(--grayscale-a11); flex: 1; line-height: 1.5; }
.hp-callout-desc strong { color: var(--grayscale-12); font-weight: 700; }
/* --- Responsive Design --- */
@media (max-width: 640px) { .main-content { padding: 2rem 0; }
.dashed-pattern-left,
.dashed-pattern-right {
display: none;
}
.hero-section {
margin-bottom: 2.5rem;
}
.hero-content {
padding: 0 1rem;
}
.products-section {
padding: 2.5rem 1rem;
}
.hp-callout {
flex-direction: column;
align-items: flex-start;
padding: 1rem;
margin: 0 1rem;
gap: 0.25rem;
}
} }
/* ============================================================================= PRODUCT SELECTOR STYLING
- 3-column grouped layout for the product dropdown.
- Column 1 (Products): Platform, Call Flow Builder
- Column 2 (SDKs): Server SDKs, Browser SDK
- Column 3 (APIs): APIs, SWML
- Home is hidden. Compatibility API appears as a footer link. */
/* Custom SVG product icons — match Font Awesome icon sizing. FA icons render at ~23px inside the 56px container. Fern wraps custom SVGs in span.fern-file-icon.size-5 (Tailwind 1.25rem = 20px). */ .fern-selection-item-icon .fern-file-icon { width: 23px !important; height: 23px !important; }
.fern-selection-item-icon .fern-file-icon svg { width: 100%; height: 100%; }
/* --- Desktop (≥ 1024 px) --- / @media (min-width: 1024px) { / Dropdown panel — rounded corners, scroll when content exceeds viewport */ div[data-testid="product-dropdown-content"] { border-radius: 1.5rem !important; max-height: 70vh; overflow-y: auto; }
div:has(> .fern-product-selector-radio-group) { margin-top: 0.5rem; }
/* 3-column grouped grid */ .fern-product-selector-radio-group { display: grid; grid-template-columns: repeat(3, 1fr); column-gap: 1.5rem; row-gap: 0.5rem; padding: 3rem 1.25rem 0.4rem;
/* Hide Home */
> a[href="/docs"] {
display: none;
}
/* Anchor base styling */
> a {
max-width: 320px;
position: relative;
.fern-selection-item {
border-radius: 1rem;
height: 100%;
}
}
/* --- Column 1: Products --- */
> a[href*="platform"] {
grid-column: 1;
grid-row: 1;
}
> a[href*="call-flow-builder"] {
grid-column: 1;
grid-row: 2;
}
/* --- Column 2: SDKs --- */
> a[href*="server-sdks"] {
grid-column: 2;
grid-row: 1;
}
> a[href*="browser-sdk"] {
grid-column: 2;
grid-row: 2;
}
/* --- Column 3: APIs --- */
> a[href$="/apis"] {
grid-column: 3;
grid-row: 1;
}
> a[href*="swml"] {
grid-column: 3;
grid-row: 2;
}
/* Full-width separator line above the footer row */
&::after {
content: "";
grid-column: 1 / -1;
grid-row: 3;
align-self: start;
border-top: 1px solid var(--grayscale-a5);
pointer-events: none;
}
/* Compatibility API — text-only link, right-aligned */
> a[href*="compatibility-api"] {
grid-column: 1 / -1;
grid-row: 3;
max-width: none;
width: fit-content;
margin-left: auto;
display: flex;
align-items: center;
padding: 0.5rem 0.25rem 0;
.fern-selection-item {
display: none;
}
&::after {
content: "Migrating from Twilio™? See Compatibility API \2192";
font-size: 0.8rem;
color: var(--grayscale-a9);
}
&:hover::after {
color: var(--accent-a11);
}
}
/* Group header labels — shared style */
> a[href*="platform"]::before,
> a[href*="server-sdks"]::before,
> a[href$="/apis"]::before {
position: absolute;
top: -2rem;
left: 0.5rem;
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--grayscale-a9);
pointer-events: none;
}
> a[href*="platform"]::before {
content: "Explore SignalWire";
color: var(--text-primary);
}
> a[href*="server-sdks"]::before {
content: "SDKs";
}
> a[href$="/apis"]::before {
content: "APIs";
}
} }
/* --- Mobile (< 1024 px) --- / @media (max-width: 1023px) { / Hide Home */ .fern-product-selector-radio-group > a[href="/docs"] { display: none !important; }
/* Top padding for first group label, margin for subsequent group labels */ .fern-product-selector-radio-group { padding-top: 2rem; }
.fern-product-selector-radio-group > a[href*="server-sdks"], .fern-product-selector-radio-group > a[href$="/apis"] { margin-top: 2rem; }
/* position: relative + overflow: visible so ::before isn't clipped by the anchor / .fern-product-selector-radio-group > a[href="platform"], .fern-product-selector-radio-group > a[href*="server-sdks"], .fern-product-selector-radio-group > a[href$="/apis"] { position: relative; overflow: visible !important; }
/* Group labels — repositioned for vertical list / .fern-product-selector-radio-group > a[href="platform"]::before, .fern-product-selector-radio-group > a[href*="server-sdks"]::before, .fern-product-selector-radio-group > a[href$="/apis"]::before { position: absolute; top: -1.5rem; left: 0.5rem; font-size: 0.7rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--grayscale-a9); pointer-events: none; }
.fern-product-selector-radio-group > a[href*="platform"]::before { content: "Explore SignalWire"; color: var(--text-primary); } .fern-product-selector-radio-group > a[href*="server-sdks"]::before { content: "SDKs"; } .fern-product-selector-radio-group > a[href$="/apis"]::before { content: "APIs"; }
/* Compatibility API — same footer treatment as desktop / .fern-product-selector-radio-group > a[href="compatibility-api"] { display: flex !important; justify-content: flex-end; align-items: center; padding: 0.5rem 0.25rem 0; border-top: 1px solid var(--grayscale-a5); margin-top: 0.25rem; }
.fern-product-selector-radio-group > a[href*="compatibility-api"] .fern-selection-item { display: none; }
.fern-product-selector-radio-group > a[href*="compatibility-api"]::after { content: "Migrating from Twilio™? See Compatibility API \2192"; font-size: 0.8rem; color: var(--grayscale-a9); margin-bottom: 2px; }
.fern-product-selector-radio-group > a[href*="compatibility-api"]:hover::after { color: var(--accent-a11); } }
/* =============================================================================
VARIANT SIDEBAR SECTIONS — SPACING FIX
Match the 24px section gap from non-variant sidebars (e.g. Server SDK v4).
V4 uses ul.space-y-6 which gives each margin-bottom: 24px.
V2 with collapsed: false uses ul.fern-sidebar-group-level-1.mt-2
where elements only get margin-bottom: 1px by default.
========================================================================== */
.fern-sidebar-group-level-1.mt-2 > li {
margin-bottom: 24px;
}
.fern-sidebar-group-level-1.mt-2 > li:last-child {
margin-bottom: 0;
}
#builtwithfern{display:flex!important}#builtwithfern *{display:initial!important;width:unset!important}#builtwithfern,#builtwithfern *{opacity:1!important;visibility:initial!important;left:unset!important;top:unset!important;right:unset!important;bottom:unset!important;inset:unset!important;position:relative!important;overflow:visible!important}(function(){(window.requestAnimationFrame??window.setTimeout)(()=>{let a=document.getElementById("fern-header")?.clientHeight??0;document.documentElement.style.setProperty("--header-height",${String(a)}px)})})()(function(){window.__FERN_PRE_HYDRATION_HTML=document.body.innerHTML})()(function(){var f=self.__next_f=self.__next_f||[];var p=[].push;Object.defineProperty(f,"push",{configurable:true,get:function(){return function(){try{return p.apply(f,arguments)}catch(e){if(e instanceof TypeError&&e.message.indexOf("enqueue")!==-1)return;throw e}}},set:function(v){p=v}})})()For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
:root {
--bprogress-color: var(--accent);
--bprogress-height: 3px;
--bprogress-spinner-size: 18px;
--bprogress-spinner-animation-duration: 400ms;
--bprogress-spinner-border-size: 2px;
--bprogress-box-shadow: 0 0 10px var(--accent), 0 0 5px var(--accent);
--bprogress-z-index: 99999;
--bprogress-spinner-top: 15px;
--bprogress-spinner-bottom: auto;
--bprogress-spinner-right: 15px;
--bprogress-spinner-left: auto;
}
.bprogress { width: 0; height: 0; pointer-events: none; z-index: var(--bprogress-z-index); }
.bprogress .bar { background: var(--bprogress-color); position: fixed; z-index: var(--bprogress-z-index); top: 0; left: 0; width: 100%; height: var(--bprogress-height); }
/* Fancy blur effect */ .bprogress .peg { display: block; position: absolute; right: 0; width: 100px; height: 100%; box-shadow: var(--bprogress-box-shadow); opacity: 1.0; transform: rotate(3deg) translate(0px, -4px); }
/* Remove these to get rid of the spinner */ .bprogress .spinner { display: block; position: fixed; z-index: var(--bprogress-z-index); top: var(--bprogress-spinner-top); bottom: var(--bprogress-spinner-bottom); right: var(--bprogress-spinner-right); left: var(--bprogress-spinner-left); }
.bprogress .spinner-icon { width: var(--bprogress-spinner-size); height: var(--bprogress-spinner-size); box-sizing: border-box; border: solid var(--bprogress-spinner-border-size) transparent; border-top-color: var(--bprogress-color); border-left-color: var(--bprogress-color); border-radius: 50%; -webkit-animation: bprogress-spinner var(--bprogress-spinner-animation-duration) linear infinite; animation: bprogress-spinner var(--bprogress-spinner-animation-duration) linear infinite; }
.bprogress-custom-parent { overflow: hidden; position: relative; }
.bprogress-custom-parent .bprogress .spinner, .bprogress-custom-parent .bprogress .bar { position: absolute; }
.bprogress .indeterminate { position: fixed; top: 0; left: 0; width: 100%; height: var(--bprogress-height); overflow: hidden; }
.bprogress .indeterminate .inc, .bprogress .indeterminate .dec { position: absolute; top: 0; height: 100%; background-color: var(--bprogress-color); }
.bprogress .indeterminate .inc { animation: bprogress-indeterminate-increase 2s infinite; }
.bprogress .indeterminate .dec { animation: bprogress-indeterminate-decrease 2s 0.5s infinite; }
@-webkit-keyframes bprogress-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } }
@keyframes bprogress-spinner { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
@keyframes bprogress-indeterminate-increase { from { left: -5%; width: 5%; } to { left: 130%; width: 100%; } }
@keyframes bprogress-indeterminate-decrease {
from { left: -80%; width: 80%; }
to { left: 110%; width: 10%; }
}
((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)(function(){if(new URLSearchParams(window.location.search).get("embedded")==="true"){document.documentElement.dataset.embedded="true"}})()
html,
body {
scroll-padding-top: calc(
var(--header-height) + var(--mobile-toc-height, 0px) + (var(--spacing) * 4)
);
}
Search/Log inSign upSupport[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}LightrequestAnimationFrame(function(){$RT=performance.now()});SignalWire Docs$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;b<a.length;b+=2){var c=a[b],e=a[b+1];null!==e.parentNode&&e.parentNode.removeChild(e);var f=c.parentNode;if(f){var g=c.previousSibling,h=0;do{if(c&&8===c.nodeType){var d=c.data;if("/$"===d||"/&"===d)if(0===h)break;else h--;else"$"!==d&&"$?"!==d&&"$"!==d&&"$!"!==d&&"&"!==d||h++}d=c.nextSibling;f.removeChild(c);c=d}while(c);for(;e.firstChild;)f.insertBefore(e.firstChild,c);g.data="$";g._reactRetry&&requestAnimationFrame(g._reactRetry)}}a.length=0};
$RC=function(a,b){if(b=document.getElementById(b))(a=document.getElementById(a))?(a.previousSibling.data="$",$RB.push(a,b),2===$RB.length&&("number"!==typeof $RT?requestAnimationFrame($RV.bind(null,$RB)):(a=performance.now(),setTimeout($RV.bind(null,$RB),2300>a&&2E3<a?2300-a:$RT+300-a)))):b.parentNode.removeChild(b)};$RC("B:0","S:0")Home.fa-secondary{opacity:.4}HomeOverview and getting started$RC("B:1","S:1")Home.fa-secondary{opacity:.4}HomeOverview and getting started$RC("B:2","S:2")Log inSign upSupport$RC("B:3","S:3")
#fern-toc,
#fern-sidebar[data-state="sticky"],
#fern-sidebar[data-state="fixed"],
#fern-sidebar-spacer {
visibility: hidden;
width: 0;
overflow: hidden;
display: none;
}
Built with$RC("B:4","S:4")Build on SignalWireVoice, video, messaging, and AI — one programmable platform, every interface you need..fa-secondary{opacity:.4}New to SignalWire? Set up your account, grab API credentials, and start building.Get startedWhat are you building?.fa-secondary{opacity:.4}AI voice agentLLM-powered phone agents and virtual assistants.fa-secondary{opacity:.4}Browser or mobileWebRTC voice, video, and chat in your app.fa-secondary{opacity:.4}Server applicationBackend call routing, SMS, and IVR systems.fa-secondary{opacity:.4}No-codeDrag-and-drop call flows and Dashboard AI agentsInterfaces & SDKsAPIs, markup languages, and client libraries for building on SignalWire..fa-secondary{opacity:.4}REST APIsComplete API reference for voice, video, messaging, and AI services.
SWMLMarkup language that unifies LLMs, TTS, and STT with PSTN, SIP, and WebRTC..fa-secondary{opacity:.4}Server SDKsBuild AI agents, control calls, send messages, and more..fa-secondary{opacity:.4}Browser SDKAdd video calling, audio calling, and chat directly to your website.ToolsNo-code builders and utilities to accelerate development..fa-secondary{opacity:.4}Call Flow BuilderBuild drag-and-drop calling applications without writing code..fa-secondary{opacity:.4}Platform & DashboardManage your SignalWire space, phone numbers, and resources..fa-secondary{opacity:.4}WirestarterScaffold a new SignalWire project in seconds..fa-secondary{opacity:.4}SWSHInteractive shell for testing SWML scripts and API calls..fa-secondary{opacity:.4}Migrating from Twilio*? Drop-in compatible APIs and SDKs — switch with a few lines of code.Compatibility API*Twilio and TwiML are trademarks of Twilio, Inc. SignalWire, Inc. and its products are not affiliated with or endorsed by Twilio, Inc.$RC("B:5","S:5")(self.__next_f=self.__next_f||[]).push([0])self.__next_f.push([1,"1:"$Sreact.fragment"\n2:I[490875,["https://app.buildwithfern.com/_next/static/chunks/0iic_u0w3xl_w.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/next/static/chunks/0apuwnoo_2a.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt"],"default"]\n3:I[311055,["https://app.buildwithfern.com/_next/static/chunks/0iic_u0w3xl_w.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/next/static/chunks/0apuwn5gg08_1_fno.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/next/static/chunks/05avxud39v-..js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/_next/static/chunks/0b1af9jj1~.l6.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/_next/static/chunks/0mxgt5atpwyit.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt"],"default"]\n4:I[338314,["https://app.buildwithfern.com/_next/static/chunks/0iic_u0w3xl_w.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/next/static/chunks/0apuwnoo_2a.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/_next/static/chunks/06wdl99nx.yg.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/_next/static/chunks/0oo_2a.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt"],"default"]\n2e:I[139220,["https://app.buildwithfern.com/_next/static/chunks/0iic_u0w3xl_w.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","https://app.buildwithfern.com/next/static/chunks/0apuwn8h.css?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","precedence":"next","crossOrigin":"anonymous","nonce":"$undefined"}],["$","script","script-0",{"src":"https://app.buildwithfern.com/_next/static/chunks/0iic_u0w3xl_w.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"https://app.buildwithfern.com/next/static/chunks/0apuwnoo_2a.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt"],"default",1]\n:HL["https://app.buildwithfern.com/next/static/chunks/0d7.qm3ii8h.css?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","style",{"crossOrigin":""}]\n:HL["https://app.buildwithfern.com/_next/static/chunks/0nao4hgu6hbof.css?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","style",{"crossOrigin":""}]\n:HC["https://app.buildwithfern.com",""]\n:HL["https://app.buildwithfern.com/_next/static/chunks/14l8pac9ug4ph.css?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","style",{"crossOrigin":""}]\n"])self.__next_f.push([1,"0:{"P":null,"c":["","signalwire.com","default","false","false","everyone","_default","%2Fdocs"],"q":"","i":false,"f":[[["",{"children":[["domain","signalwire.com","d",null],{"children":["(main)",{"children":[["mode","default","d",null],{"children":[["requiresLogin","false","d",null],{"children":[["isLoggedIn","false","d",null],{"children":[["roles","everyone","d",null],{"children":[["locale","_default","d",null],{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}],"announcement":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}],"explorer":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}],"sidebar":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}]}],"headertabs":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}],"languageSelect":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}],"logo":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}],"productSelect":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}],"sidebar":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}],"versionSelect":["(SLOT)",{"children":[["slug","%2Fdocs","d",null],{"children":["PAGE",{}]}]}]}]}]}]}]}]}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"https://app.buildwithfern.com/next/static/chunks/0d7.qm3iioo_2a.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","async":true,"nonce":"$undefined"}]],["$","$L2",null,{"parallelRouterKey":"children","error":"$3","errorStyles":[],"errorScripts":[["$","script","script-0",{"src":"https://app.buildwithfern.com/_next/static/chunks/06wdl99nx.yg.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","async":true}],["$","script","script-1",{"src":"https://app.buildwithfern.com/_next/static/chunks/05gg08_1_fno.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","async":true}],["$","script","script-2",{"src":"https://app.buildwithfern.com/next/static/chunks/05avxud39v-..js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","async":true}],["$","script","script-3",{"src":"https://app.buildwithfern.com/_next/static/chunks/0b1af9jj1.l6.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","async":true}],["$","script","script-4",{"src":"https://app.buildwithfern.com/_next/static/chunks/0mxgt5atpwyit.js?dpl=dpl_C9rSKagUxfLUUNrhDPNCvkxVzhXt","async":true}]],"template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":["$L5",[]],"forbidden":[[["$","title",null,{"children":"403: This page could not be accessed."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top
… [truncated — open the raw llms.txt above for the full file]
llmtxt.app – AI SEO & Search Engine Optimization Directory