Rename the Proxy function to `proxy` and simplify the `identify` example
with the `Identify` type helper.
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
Co-authored-by: Dominik Ferber <1765075+dferber90@users.noreply.github.com>
* @flags-sdk/posthog: upgrade posthog-node
* @flags-sdk/posthog: make local vs remote evaluation explicit
The default adapter passed POSTHOG_PERSONAL_API_KEY into the runtime
posthog-node client, which enabled local evaluation and started a
feature-flag poller in every warm process. On serverless this produced
large, traffic-independent PostHog feature flag request volume.
Local evaluation is now opt-in via POSTHOG_SECRET_KEY; without it the
adapter evaluates remotely. POSTHOG_PERSONAL_API_KEY is used only by
getProviderData (Flags Explorer) and no longer affects runtime
evaluation. Drops the forced 10s poll interval in favor of the v5
default. Updates docs, README, and tests.
* remove unused @vercel/edge-config dependency
* add remote vs local tradeoffs
* rm edge config tag
* modernize
* rm trimKey
* lockfile
* update
* fixes
* reword changeset
* merge changesets
* reword changelog
* [adapter-launchdarkly] support native Marketplace integration
- Read the Edge Config connection string from EXPERIMENTATION_CONFIG,
falling back to EDGE_CONFIG for the legacy Vercel integration
- Make LAUNCHDARKLY_PROJECT_SLUG / projectSlug optional; it is only used
to deep-link flags to the LaunchDarkly dashboard
* [adapter-launchdarkly] read EXPERIMENTATION_CONFIG only
Align with the Statsig adapter: the default adapter reads the Edge Config
connection string from EXPERIMENTATION_CONFIG only and no longer falls back
to EDGE_CONFIG. Legacy Vercel integration users can set EXPERIMENTATION_CONFIG
to their EDGE_CONFIG value or pass edgeConfigConnectionString explicitly.
* [adapter-launchdarkly] mark changeset as major (breaking change)
* Update changelog to have a single recommendation for legacy EDGE_CONFIG env var
* Bring back LAUNCHDARKLY_PROJECT_SLUG as required
Radix Select injects the selected option label into the trigger via a
client-only portal, so the statically rendered page ships an empty
trigger and the label pops in after hydration. Render the value as
SelectValue children instead, so the label is present in the SSR HTML
(this also disables the portal path via valueNodeHasChildren).
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Update docs and examples to pass the adapter factory directly
(adapter: vercelAdapter) instead of calling it (adapter: vercelAdapter()),
reflecting the AdapterOrFactory support in flag(). Applied consistently to
all zero-arg factory adapters (vercel, edge-config, custom adapter examples).
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: update to geistdocs 1.8.0 and drop Flags from OSS dropdown
Bump @vercel/geistdocs to 1.8.0 (eve logo, Streamdown dropped, AI Elements
last) and override navbarOssProducts to exclude Flags SDK on its own site.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: link eve to /docs in OSS dropdown
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Migrate docs app to Geistdocs canary
* Fix docs proxy matcher
* Use Geistdocs UI exports
* Update Geistdocs to 1.3.0
* upgrade geistdocs and fix svelte logo
* add copy prompt to certain docs pages
* migrate to 1.5.0
* refactor(docs): use geistdocs v1.5 Badge, CommandPrompt, ThemeAwareImage
Remove the local copies now exported by @vercel/geistdocs@1.5 and import
them from the package instead:
- Badge -> @vercel/geistdocs/components/badge (provider-list)
- CommandPrompt -> @vercel/geistdocs/components/command-prompt (install-command)
- ThemeAwareImage -> @vercel/geistdocs/components/theme-aware-image
(docs MDX components); migrate the SvelteKit MDX call site to the new
src={{ light, dark }} API.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(docs): restore install switcher width animation
The hero "For humans / For agents" switcher called router.refresh() on
every toggle (added in #366). That remounts/reconciles the switcher
subtree mid-toggle, resetting the CommandPrompt's measured width state so
the command-line width spring never plays — the line snapped instead of
growing.
Drop the refresh: this flag's only consumer is the switcher itself, so the
optimistic override already shows the correct command and the cookie
persists the choice across reloads (the server reads it and renders the
matching prebuilt `[code]`). The refresh changed nothing visible and only
broke the animation. startTransition() does not help, since router.refresh
already runs as a transition.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(docs): render home code blocks with geistdocs CodeBlock
Replace the hand-rolled shiki token renderer in HighlightedCode with
fumadocs highlight() + the geistdocs CodeBlock, highlighting with the
shared geistShikiTheme so the home page "Effortless setup" blocks match
the documentation (same syntax colors, header, language icon, copy
button, radius). transformerIcon() fills the filename icon slot; the
caption is preserved below.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(docs): equal-height home code blocks
Grow each HighlightedCode block to fill its grid cell (h-full root +
flex-1 wrapper forcing the Card to h-full) so both columns share the
taller block's height and their captions align. The Card and its <pre>
share bg-background-100, so the shorter block fills seamlessly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(docs): drop dead shadcn tokens (chart-*, sidebar-primary)
Only chart-1..5 and sidebar-primary are unused by both the app and the
geistdocs/fumadocs package CSS. The other shadcn tokens (secondary,
card-foreground, the remaining sidebar-* set, etc.) must stay: the package
stylesheet consumes them via var(--token) for its fd-* utility mappings
and the #nd-sidebar rule, and does not self-define them — the consuming
app has to provide them.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(docs): migrate consumers off shadcn tokens to Geist scale
Switch every shadcn-token consumer (select, switch, iframe-browser, the
home marketing pages, and the illustrations SVGs) to the Geist --ds-*
scale using the geistdocs PR #75 mapping (foreground->gray-1000,
muted->gray-100, muted-foreground->gray-800, border/input->gray-alpha-400,
ring->gray-600, destructive->red-800, background/card/popover->
background-100, accent->gray-100, etc.).
With no consumers left, drop the entire local shadcn layer from
geistdocs.css (the @theme --color-* mappings and the :root/.dark oklch
palette) and instead override fumadocs --color-fd-* and #nd-sidebar to
--ds-* (so the package's docs UI keeps working without the raw palette),
matching the geistdocs template. The geist utilities themselves come from
@vercel/geistdocs/styles.css.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Update geistdocs.css
* migrate to 1.6.0
* chore(docs): bump @vercel/geistdocs to 1.6.1
Picks up the Next.js logo gradient-id fix so the framework logo renders
correctly in the mobile docs menu.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Update pnpm-lock.yaml
* fix(docs): drop language icons from landing-page code blocks
The home "Effortless setup" snippets are Next.js examples, but the
language-based transformerIcon rendered a React glyph for the .tsx block.
Remove the icons (these blocks never had them) and hide the now-empty
header icon slot so the filename stays flush.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(docs): drop redundant streamdown @source
The streamdown @source pointed at a transitive dep path that doesn't
resolve under pnpm (matched nothing). Streamdown is now sourced upstream
from @vercel/geistdocs's own styles.css, so this line is unneeded.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* update
* bump @vercel/geistdocs
* Update pnpm-lock.yaml
* update
---------
Co-authored-by: christopherkindl <53372002+christopherkindl@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.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>
Updated dependencies to fix Next.js and React CVE vulnerabilities.
The fix-react2shell-next tool automatically updated the following packages to their secure versions:
- next
- react-server-dom-webpack
- react-server-dom-parcel
- react-server-dom-turbopack
All package.json files have been scanned and vulnerable versions have been patched to the correct fixed versions based on the official React advisory.
Co-authored-by: Vercel <vercel[bot]@users.noreply.github.com>