Replace the deterministic 100/200ms retry schedule with full-jitter exponential
backoff, jitter MAX_BATCH_WAIT_MS by ±20% to desynchronize concurrent flushes,
and log when a flush exhausts all retries.
Helpers extracted to utils/backoff.ts so they can be reused.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Precompute install-audience flag for the hero switcher
The home hero's "For humans / For agents" tab was tracked in React
state, so every reload snapped back to the default tab and broke the
"page is static without layout shift" promise. Model it as a
precomputed flag like the other hero flags:
- Add `installAudienceFlag` (`'humans' | 'agents'`, cookie key
`install-audience`, default `'agents'`) and include it in
`rootFlags` so `generatePermutations` covers both variants
- Read the flag on the server and publish it via `FlagValues`
- New `InstallCommand` client wrapper renders `CommandPromptRoot`
with the server value and, on click, writes the cookie + calls
`router.refresh()` (optimistic override pattern mirroring
`FlagToggle`)
Result: the proxy's `precompute(rootFlags)` reads the cookie, rewrites
to the matching `[code]`, and SSR renders the correct tab from the
start — reloads stay on the user's choice with no client-only state.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Update layout.tsx
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Sync docs template with @vercel/geistdocs 1.2.0 + 1.2.1
Pulls in template updates via `@vercel/geistdocs@1.2.1 update --sync`:
- 1.2.0: new NavbarLogo (oss product switcher variant), geist theme
tokens + icons, updated docs layout, MobileDocsBar, redesigned navbar
and mobile menu
- 1.2.1: CommandPrompt UI component, IconCheck / IconCopy fallback
icons, supporting CSS tokens and @utility rules (material-small,
text-label-13, text-label-14-mono, text-label-16-mono,
--ds-shadow-border-small light/dark)
Home page intentionally left untouched because flags-sdk uses a custom
home/[code] routing structure. package.json left untouched to preserve
workspace/catalog references and app-specific deps (flags,
@vercel/toolbar, newer Next).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Cap footer max-w and use LogoFlagsSdk in navbar
- Cap the footer inner row at max-w-[1448px] so it aligns with the
navbar on very wide screens
- Render the Flags SDK wordmark (LogoFlagsSdk) directly in the navbar
via the oss NavbarLogo trigger; drop the duplicate entry from the
product switcher dropdown
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Use bg-background-200 for docs container
Matches the navbar background so docs pages (principles, frameworks,
providers, etc.) no longer sit on a lighter surface than the header.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Use CommandPrompt humans/agents switcher in hero CTA
Replaces the Get Started button + CopySnippet in the home hero with
the CommandPrompt switcher. Triggers and surface are aligned to the
left via `items-start` on the root so they line up with the hero
heading instead of being centered.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Use full npm install command in hero CommandPrompt
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Default hero CommandPrompt to the agents tab
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Bump navbar Flags SDK logo to height 22
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Use MobileDocsBar for docs mobile navigation
Disables the default Fumadocs TOC popover and renders the
MobileDocsBar (sidebar trigger + TOC sheet) above the docs title,
matching the geistdocs template.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Override fumadocs primary at :root so prose links render gray-1000
Matches the workflow docs tweak — broadens the fd-primary override
from #nd-toc to :root so in-content links pick up the design-system
foreground color instead of the default blue.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Use new --ds-shadow-menu on hero "Try the Flags SDK" card
- Update --ds-shadow-menu to the 4-layer geist menu shadow
- Apply it to the flags-toggle card via `shadow-(--ds-shadow-menu)`;
drop the stock `shadow-md` and redundant border
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Use LogoFlagsSdk as the app Logo; add AI SDK to product switcher
- Replace the inline triangle SVG + "Flags SDK" text in geistdocs.tsx
with `<LogoFlagsSdk height={22} />`, so navbar & template consumers
get the real wordmark
- Revert navbar.tsx to import `Logo` from `@/geistdocs` (single source
of truth) — the direct LogoFlagsSdk import is no longer needed
- Add `LogoAiSdk` to OSS_PRODUCT_LINKS at the top of the list
(`ai-sdk.dev`)
- Give LogoAiSdk the same `color` prop pattern as the other SDK logos
- Formatter cleanup in app/[lang]/layout.tsx
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Restore FrameworkSwitcher and theme the Next.js icon
- Re-mount <FrameworkSwitcher /> at the top of the desktop sidebar and
the mobile Sheet (lost during the 1.2.x template sync)
- Rewrite the Next.js icon to mirror LogoIconNextSvg from
@vercel/geistcn-assets: circle uses currentColor + text-gray-1000 so
it auto-inverts per theme; gradient stops for the "N" use
var(--ds-background-100) so the highlight stays readable in light
and dark
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Docs: active nav state, geist shadow, restored framework icon + TOC offset
- DesktopMenu: mark nav items active when pathname falls under the
item's section (match on first three path segments, ignore locale
prefix); add `data-[active]:text-gray-1000` to the selector
- CodeBlock: restore the `#next` / `#svelte` title-suffix parser so
framework icons render in code block headers again
- FrameworkSwitcher: apply `--ds-shadow-menu` to the popover content
- geistdocs.css: push `#nd-toc` over with `md:pl-8`
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Add AI agent detection and automatic markdown rewrites
When AI agents (Claude, ChatGPT, Cursor, etc.) request docs pages,
the proxy now detects them and transparently rewrites to the markdown
route — matching the geistdocs template default.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Fix: Missing `detectionMethod` property in `TrackMdRequestParams` type causes TypeScript compilation error and build failure.
This commit fixes the issue reported at apps/docs/lib/geistdocs/md-tracking.ts:24
**Bug explanation:**
The `trackMdRequest` function in `apps/docs/lib/geistdocs/md-tracking.ts` destructures `detectionMethod` from its parameter (line 24) and includes it in the JSON body sent to the tracking endpoint (line 38). However, the `TrackMdRequestParams` type definition (lines 6-12) does not include `detectionMethod` as a property.
In `apps/docs/proxy.ts` (line 82-87), `trackMdRequest` is called with `detectionMethod: agentResult.method` when an AI agent is detected, where `agentResult.method` is of type `DetectionMethod | null` from `@/lib/ai-agent-detection`.
This causes an exact TypeScript compilation error confirmed in the build logs:
```
./lib/geistdocs/md-tracking.ts:24:3
Type error: Property 'detectionMethod' does not exist on type 'TrackMdRequestParams'.
```
This error causes the entire `docs` build to fail (`next build` exits with code 1).
**Fix explanation:**
Added `detectionMethod?: DetectionMethod | null` as an optional property to the `TrackMdRequestParams` type, and added the corresponding `import type { DetectionMethod } from "@/lib/ai-agent-detection"` import at the top of the file. The property is optional (`?`) because most call sites (for `.md` URL tracking, `llms.txt` tracking, and header-negotiated tracking) don't pass a `detectionMethod` — only the agent-rewrite tracking path does. The `| null` union matches the `DetectionResult.method` type from `ai-agent-detection.ts`.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: molebox <hello@richardhaines.dev>
* format
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>
Co-authored-by: Dominik Ferber <dominik.ferber@gmail.com>
The playground app requires the FLAGS environment variable during build. This was already configured in release-snapshot.yaml but missing from the main release workflow, causing build failures.
The SDK key validation now uses a regex (/^vf_(?:server|client)_/) to require
the format vf_server_* or vf_client_* instead of accepting any string starting
with vf_. This prevents false positives with third-party service identifiers
that happen to start with vf_ (e.g., Stripe identity flow IDs like
vf_1PyHgVLpWuMxVFx...).
Adds isValidSdkKey() helper function and updates parseSdkKeyFromFlagsConnectionString()
to use the stricter validation. Updates all tests to use valid SDK key formats.
* Added check to check skills size
* Change glob -> readdirSync
* Shorten description length
* Added check for name, compatibility and body
* Added back some parts that were removed to avoid regressions
* More cleanup
* Feedback: Used grey-matter for frontmatter parsing
* Added pnpm setup and install deps in Skills Quality job
* Refine triggers