Rich Haines
90d · built 2026-09-30
Performance
What Rich Haines shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
+14.3engineers
delivers like 15.3 (15.3x pre-AI)
Output (ETV)
11.8ETV
+7243.8% vs 0.2 prior
Features share
52.8%
+52.8 pp vs prior window
Fixes share
5.6%
+5.6 pp vs prior window
Work mix
52.8% Features19.4% Maintenance2% Tests20.3% Docs5.6% Fixes
23 commits over 90 days, ending 2026-09-30.
Daily performance
Daily ETV, stacked by Features, Maintenance, Tests, Docs and Fixes.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 10 by ETV in the last 90 days.
- 1.8ETVfeat(docs): add Geistdocs site (#17311) ## Summary - add a package-backed Geistdocs app for versioned AI SDK documentation - add machine-readable documentation routes and scoped CI coverage - keep the existing ai-sdk.dev deployment unchanged; this is pre-cutover infrastructure ## Testing - `pnpm --filter ai-sdk-docs validate:site` - `pnpm check` - `pnpm type-check:full` - `pnpm validate:docs`github.com-vercel-ai · 159785c2 · 2026-07-15
- 1.8ETVMigrate docs to package-backed geistdocs (#2222) * Migrate docs to package-backed geistdocs * update agent install cmd on home page * add copy prompt component usage * update docs test for sitemap inclusion * cut unused components * address docs migration review feedback * address stale review feedback: geistdocs 1.8.2, version icons, cookbook prompts * drop Workflow from OSS products dropdown (self-link) * bump @vercel/geistdocs to 1.11.0 * fix: resolve pnpm-lock.yaml conflict marker from main merge --------- Co-authored-by: Peter Wielander <peter.wielander@vercel.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>github.com-vercel-workflow · aa93cc5e · 2026-07-13
- 1.6ETVPrepare Geistdocs site for ai-sdk.dev cutover (#21429) Upgrades the standalone AI SDK docs to Geistdocs 2.7.0 and preserves the public URL contract needed to move `ai-sdk.dev` off the combined Studio application. It also sends playground traffic to `playground.ai-sdk.dev` without forwarding old mutations across origins. - Refreshes the pinned v5 and v6 documentation snapshots. - Preserves legacy docs, version-host, SEO, Markdown, and playground recovery routes. - Keeps `/api/chat` and `/api/search` owned by the docs site. - Restores production parity for MDX components the original port simplified: framework quickstart cards, Support cards, snippet copy buttons, example-link rows, ButtonLink props, animated generative UI demos, properties-table spacing, model card data, and `<Note id>` anchors. **Review notes** - The app retains its existing React 18 type pins because React 19 type peer resolution breaks the repository-wide type-check; the docs type-check and production build pass. - Geistdocs requires the deprecated `phase` package at runtime; it has no install lifecycle script and cannot be pruned without breaking package components. Verified with `pnpm validate:site`, `pnpm check`, `pnpm type-check:full`, a frozen install, 283 built-server redirect probes, route-contract probes, and desktop/mobile browser checks of each restored component. --------- Co-authored-by: Gregor Martynus <39992+gr2m@users.noreply.github.com>github.com-vercel-ai · 137a8fee · 2026-09-25
- 1.6ETVfeat(docs): add cookbook family and /resources/recipes surface (#18463) ## Summary Brings the cookbook content family into the Geistdocs app (`apps/docs`) across v7/v6/v5, mirroring production's URL model: - **/cookbook/...** — recipe pages on their legacy URLs; canonical for sitemap.xml, sitemap.md, llms.txt, and search. `/cookbook` 308s to `/resources/recipes`, section roots redirect to their first recipe (as on ai-sdk.dev). - **/resources/recipes** — the Recipes landing page (featured guide book covers, filterable recipe list, contribution call-out) plus docs-style recipe pages under `/resources/recipes/[...slug]`. These pages emit a canonical link to their `/cookbook` twin and stay out of the crawl surfaces. Both surfaces serve `.md` variants and participate in version switching. ## Component ports (from the legacy ai-sdk.dev app) - Cookbook MDX components, previously stubs: `Browser`, `ChatGeneration`, `TextGeneration`, `ObjectGeneration`, `WeatherCard`. - Recipes landing components: `Book` (3D cover), `Guides`, `RecipeList`, badges. - Fixed the ported `Snippet` to accept `string[]` (v5 cookbook passes arrays). - Six image/video assets copied to `public/images/` (no third-party marks). ## Content sync - `cookbook` added to the sync families; new transform rule drops frontmatter-only section `index.mdx` files (title/collapsed hoisted into `meta.json`), with tests. ## Validation - `test:site`, `type-check:site`, clean-state `validate:site` (2,962 pages). - Crawled all cookbook + recipes pages across the three versions (518 pages): all 200, zero unported-component markers; redirects, `.md` content types, llms.txt/sitemap/search inclusion verified against production behavior. ## Follow-ups (out of scope) - `/resources` root and the remaining resources families (Tools Registry, Templates, Showcase); navbar Resources dropdown. - Examples/playground link families, edit-source links, feedback wiring.github.com-vercel-ai · e7eae7b6 · 2026-08-07
- 1.2ETVfeat(docs): add providers family, upgrade Geistdocs, bring components to production parity (#18336) ## Summary **Providers route family** — `content/providers` is now served by the Geistdocs app with v7 on the canonical `/providers` routes and maintenance documentation under `/v6/providers` and `/v5/providers`. Legacy `/v7/providers/**` URLs redirect to their canonical unversioned equivalents. Markdown routes, llms.txt, sitemap, search coverage, navigation, and live-site redirects are included for each served version. **Geistdocs 1.19.2** (from 1.15.5) + Next 16.2.12, adopting the package directory footer with theme switcher in place of our local footer. **Production-parity components** — the phase-1 simplified components are replaced with faithful ports of the live ai-sdk.dev versions: - Provider model cards (logos, capability badges, per-provider color glow) - The interactive Gateway/Provider/Custom code preview (live model picker, geist-themed syntax highlighting) - Template cards (all 17 templates with framework/feature icon wells) Provider brand logos are ported from the previous app; the README notes they're used nominatively and aren't covered by the repo license. ## Testing - Tests, formatting, lint, and type-check pass - Route contracts verified locally for v7, v6, and v5 (HTML, `.md`, llms.txt, sitemap.md, agents.md, search, and redirects) - Visually reviewed against production side by side - The production Turbopack compile currently exceeds the 16 GB Enhanced build machine; the Vercel project needs the Turbo build machine class for the expanded versioned MDX set ## Future Work - Keep version switching within the Providers section when the current provider page does not exist in the selected version. `VersionSelect` currently uses `/{version}/docs/introduction` as its shared missing-page fallback; it should accept or derive a content-family-specific fallback so provider pages land on `/{version}/providers/ai-sdk-providers` instead. --------- Co-authored-by: Gregor Martynus <39992+gr2m@users.noreply.github.com>github.com-vercel-ai · fbb154a0 · 2026-08-05
- 1.1ETVdocs: fix docsgraph page defects and resolve placeholders in Markdown routes (#21692) ## Background docsgraph's audit had 190 open page-defect findings for ai-sdk.dev (the page-defects consumer, `site=ai-sdk`). Those findings come from a model, so I checked each one against the SDK source in `packages/` before changing anything. ## Summary **Markdown routes** (`fix(docs): resolve code-sample placeholders…`). The interactive code preview fills in `__MODEL__`, `__IMAGE_MODEL__`, `__VIDEO_MODEL__`, and `__PROVIDER_IMPORT__` on the HTML page. The Markdown routes (`.md`, `llms.mdx`, `llms.txt`) served those tokens raw, so agents got code that can't run. This PR adds `resolveModelPlaceholders` (`apps/docs/lib/geistdocs/model-placeholders.ts`), which fills them in the same way the default AI Gateway tab does. It's wired into all 12 v5, v6, and v7 Markdown routes through the existing Geistdocs `transform` option. The default model IDs now live in that module, so the component and the Markdown routes can't drift. 14 findings were caused by this. **Content** (`docs: fix broken samples…`). 152 findings across 100 MDX files were valid (some are duplicates of each other) and are fixed here: - undefined identifiers and missing imports (`isStepCount`, `openai`, `ImageModelV4`, `generateText`, `apiKey`, …) - syntax errors: extra `)`, missing commas, `const .embeddingModel`, `{ symbol: string }` destructuring, `import … :`, invalid JSON - APIs that don't match the source: `registerTelemetryIntegration` → `registerTelemetry`, `dataPartsSchema` → `dataSchemas`, `await convertToModelMessages` (it's async), `reasoning` → `reasoningText`, `smoothStream` → `experimental_transform`, `summarize: 'v2'`, `ToolResultOutput`, the `generateText`/`streamText` timeout types, `streamUI` `generate` type - samples that contradict their own prose: Celsius/Fahrenheit direction, `toolCalls`/`toolResults`, "four hooks" when three are listed, `onFinish` vs `onEnd`, `toolApproval` missing from the approval sample - wrong file paths and route handlers (`app/api/...`, MCP Apps host routes exporting `POST`) - migration guides where a bulk rename had put v5 API names into the 4.0 and 3.1 samples Findings I didn't change: false positives, pure hardening suggestions for intentionally minimal samples, and anything already fixed on main by #21553 (the live site hasn't redeployed yet). Judgment calls reviewers may want to check: - `docs/advanced/caching`: the lifecycle-callback example now returns a text stream on a cache miss too, so hits and misses use the same protocol. A note tells readers to use `TextStreamChatTransport`. - `providers/google-vertex`: the URL Context, Google Search, and Google Maps model lists now say "Gemini 2.0 and newer", which matches the check in `google-prepare-tools.ts`. - `docs/ai-sdk-rsc/loading-state`: the client now reads both streamable values concurrently, so the loading state actually updates while streaming. ## End-to-End Verification - Ran `next dev` for `apps/docs` and requested `/docs/getting-started/nodejs.md`, `/v6/docs/getting-started/nodejs.md`, `/docs/reference/ai-sdk-core/generate-image.md`, and `/cookbook/next/generate-image-with-chat-prompt.md`. None of them contain placeholder tokens: text samples show `'anthropic/claude-sonnet-5.5'`, the image sample shows `'openai/gpt-image-2.5-sunburst'`, and `__PROVIDER_IMPORT__` lines are removed. The HTML page still renders (200). - `pnpm --filter ai-sdk-docs test:site`: 27/27 pass. The new test runs the resolver over every MDX file in `content/`. Pages with placeholders come out with none left, and pages without placeholders come out byte-identical. - `tsc --noEmit` in `apps/docs` (after `next typegen`) is clean, and `oxfmt --check` passes on all changed files. ## Checklist - [x] All commits are signed (PRs with unsigned commits cannot be merged) - [x] Tests have been added / updated (for bug fixes / features) - [x] Documentation has been added / updated (for bug fixes / features) - [ ] A _patch_ changeset for relevant packages has been added (for bug fixes / features - run `pnpm changeset` in the project root) - [x] I have reviewed this pull request (self-review) ## Future Work These problems turned up while verifying but weren't flagged, so they're not fixed here: - `providers/observability/maxim`: still uses `toAIStreamResponse()` and `ai/react`. - `providers/openai-compatible-providers/custom-providers`: model constructors are called with three arguments, but the source takes two. - `providers/community-providers/custom-providers`: the streaming sample still uses `tool-call-delta` with `argsTextDelta`. - `docs/reference/ai-sdk-core/generate-text`: the `onStepStart` event table lists fields that `GenerateTextStepStartEvent` doesn't have. - `cookbook/rsc/call-tools-in-parallel`: uses `toolResult.result`.github.com-vercel-ai · 823380e0 · 2026-09-29
- 0.6ETVfeat(docs): social cards, analytics, feedback, and the docs upsell card (#18670) Gets the docs app ready for cutover on the measurement and sharing side: pages now have proper social preview cards, we can see traffic, and readers can send feedback. - Social cards: every current-version docs page gets a generated preview image, and the old `/og/docs?title=…` links from production keep working with the same design. - Web analytics (pageviews) via Vercel Analytics. - Markdown/agent request tracking and the reader feedback widget, both through the Geistdocs platform under the `ai-sdk` site id. - The "Deploy and Scale AI Apps with Vercel" card now shows under the table of contents on documentation pages, same as the live site. ## Review notes - Feedback was briefly held off for an upstream widget bug (failed submissions reported success); fixed in Geistdocs 1.20.1 and re-enabled here. - Route-level rate limiting for the card renderer was suggested in review: input length caps, locale validation, and CDN caching bound the per-request cost, and request-rate abuse is handled at the platform layer (Vercel firewall) rather than in-route — matching how production serves the same public endpoint today. - Five landing pages repeat their title/description strings in two places (page metadata and the social card); a copy edit could leave a stale card. Worth a small tidy-up later. Verified by building the site from scratch, running its tests and checks, and exercising the new pieces in a browser: preview images render for both URL shapes (with size caps and caching), analytics beacons fire, the feedback widget and upsell card render on docs pages, and social metadata was compared before/after.github.com-vercel-ai · 228be30f · 2026-08-14
- 0.6ETVchore(docs): update Geistdocs migration to 1.28.1 (#20581) Carries the in-progress AI SDK docs migration (previously #19743) onto the current default branch and updates it to Geistdocs 1.28.1 with Next.js 16.3.3, including the partial-prefetch navigation fix. It retains the build worker cap needed to avoid static-generation OOMs. Supersedes #19743. Verified with a frozen install, docs tests and type-check, a 3,056-page production build, full repository type-check and lint, production route probes, and PPR client-navigation checks.github.com-vercel-ai · e2dab22e · 2026-09-10
- 0.5ETVfeat(docs): add the Resources section and keep old links working (#18630) Brings the Resources section of ai-sdk.dev into the docs app so it matches the live site: the Resources overview, Tools Registry, Templates, and Showcase pages. Old links keep working the way they do today — `/tools-registry`, `/showcase`, `/elements`, `/model-library`, and the old `/examples/...` links all land in the same places as on production. - The version picker in the sidebar now uses the same icon and colors as the live site: blue for the latest version, gray for older ones. - The sitemap lists the same Resources pages the live site lists. **Note for the team:** the Postgres.new card's image was broken on the live site (the file it points to never existed). Fixed here by using the database.build screenshot that already shipped with the old site's assets — the live site still needs the same one-line fix. ## Review notes - Two components set up code highlighting in very similar ways; worth merging into one shared helper later. - The list of old-link redirects has no automated check that destinations still exist; a small guard test would be a good follow-up. A few destinations dead-end today, exactly as they do on the live site. - Follow-up: the live site also points three old cookbook links at the message-persistence docs page (plus one Gemini guide alias); those predate this change and can be added separately. Verified by building the site from scratch, running its tests, and checking every new page and redirect against the live site.github.com-vercel-ai · 7d40fafc · 2026-08-11
- 0.4ETVdocs: add inbound cross-links to orphaned v4 docs pages (#3355) These pages had no inbound links from other docs pages' content (only sidebar/card navigation), so they were unreachable through prose. Adds one minimal cross-link each from a parent index or closely related page.github.com-vercel-workflow · a3331ac0 · 2026-08-05