Rich Haines
90d · built 2026-09-08
Performance
What Rich Haines shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
+10.1engineers
delivers like 11.1 (11.1x pre-AI)
Output (ETV)
8.5ETV
+1928.6% vs 0.4 prior
Features share
54.8%
−4.7 pp vs prior window
Fixes share
7.2%
+7.2 pp vs prior window
Work mix
54.8% Features19.1% Maintenance1.8% Tests17.1% Docs7.2% Fixes
20 commits over 90 days, ending 2026-09-08.
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.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
- 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.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
- 0.2ETVdocs: Update redirected vercel.com/nextjs.org links to current targets (#13685) ## Description These stale links were found by an automated docs link audit (docsgraph). Each old URL currently serves a **308** redirect; this PR points them at the current target so readers (and the crawler) skip the extra hop. Only the path component of each href was rewritten — scheme and host are unchanged, and existing `#fragments`/query strings are preserved. Every new target was verified to resolve `200`. | Page | Old path | New path | | --- | --- | --- | | `/docs` (+ sidebar `meta.json`) | `/docs/vercel-platform/glossary` | `/docs/glossary` | | `/docs/core-concepts/remote-caching` | `/docs/concepts/monorepos/remote-caching` | `/docs/monorepos/remote-caching` | | `/docs/core-concepts/remote-caching` | `/docs/deployments/overview` | `/docs/deployments` | | `/docs/crafting-your-repository/constructing-ci` | `/docs/accounts/create-a-team#find-your-team-id` | `/docs/accounts#creating-a-team` | | `/docs/crafting-your-repository/structuring-a-repository` | `/docs/vercel-platform/glossary` | `/docs/glossary` | | `/docs/crafting-your-repository/using-environment-variables` | `/docs/projects/environment-variables` | `/docs/environment-variables` | | `/docs/getting-started/add-to-existing-repository` | `/docs/vercel-platform/glossary` | `/docs/glossary` | | `/docs/guides/ci-vendors/vercel` | `/docs/concepts/monorepos/turborepo` | `/docs/monorepos/turborepo` | | `/docs/guides/frameworks/framework-bindings` | `nextjs.org/docs/app/building-your-application/routing/linking-and-navigating` | `nextjs.org/docs/app/getting-started/linking-and-navigating` | | `/docs/guides/frameworks/nextjs` | `nextjs.org/docs/app/api-reference/create-next-app` | `nextjs.org/docs/app/api-reference/cli/create-next-app` | | `/docs/guides/single-package-workspaces` | `/docs/vercel-platform/glossary` | `/docs/glossary` | | `/docs/messages/recursive-turbo-invocations` | `/docs/vercel-platform/glossary` | `/docs/glossary` | Notes: - `/docs/accounts/create-a-team` redirects to a fragment URL (`/docs/accounts#creating-a-team`), so the replacement's fragment supersedes the old `#find-your-team-id`. - The glossary link in `apps/docs/content/docs/meta.json` (sidebar) had the same stale path and was updated alongside the page content. - Older blog posts also contain `/docs/concepts/monorepos/remote-caching`; those were left untouched as historical content, outside the audited docs pages. ## Testing Instructions `pnpm check-links` in `apps/docs` passes. ▲ Created with [Vercel devbox](https://vercel.com/vercel/~/sandboxes/devboxes/2sevqnrrizhtmbnnl7kndkm1e0sd) Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>github.com-vercel-turborepo · b23e283b · 2026-08-05
- 0.1ETVdocs: update redirected links to current targets (#96723) ## What Updates docs links whose targets have moved. Found by an automated docs link audit: every old URL below currently serves a `308` (permanent redirect), so readers take an extra hop and the links rot as redirect maps are pruned. Each replacement is the **final `200` URL** of the redirect chain (verified with `curl -sIL`), not just the first hop. Only the path component was rewritten — scheme, host, query strings (`?utm_source=...`) and fragments are untouched. | Old path | Now points at | | --- | --- | | `vercel.com/docs/concepts/functions/edge-functions/og-image-generation` | `/docs/og-image-generation` | | `vercel.com/docs/frameworks/nextjs` | `/docs/frameworks/full-stack/nextjs` | | `vercel.com/docs/observability/otel-overview` | `/docs/tracing/instrumentation` | | `vercel.com/docs/concepts/observability/otel-overview/quickstart` | `/docs/tracing/instrumentation` | | `vercel.com/docs/edge-config/get-started` | `/docs/global-config/get-started` | | `vercel.com/docs/functions/vercel-functions-package` | `/docs/functions/functions-api-reference/vercel-functions-package` | | `vercel.com/docs/edge-network/overview` | `/docs/cdn` | | `vercel.com/docs/storage/vercel-blob` (×4) | `/docs/vercel-blob` | | `vercel.com/docs/storage/vercel-blob/server-upload` | `/docs/vercel-blob/server-upload` | | `vercel.com/docs/storage/vercel-blob/client-upload` | `/docs/vercel-blob/client-upload` | | `vercel.com/docs/concepts/image-optimization` | `/docs/image-optimization` | | `nextjs.org/docs/app/building-your-application/rendering` | `/docs/app/getting-started/caching` | The four Pages Router pages flagged by the audit (`deploying`, `guides/instrumentation`, `guides/open-telemetry`, `guides/redirecting`) share their source with the App Router versions via frontmatter `source:`, so fixing the App Router files covers them. ## One link worth a reviewer's eye In `use-client.mdx`, the client-server **boundary** link pointed at `/docs/app/building-your-application/rendering#network-boundary`. That path 308s to `/docs/app/getting-started/caching`, which is what this PR uses — but the redirect target is topically unrelated to the client-server boundary, and no `#network-boundary` heading exists on it (or anywhere else in `docs/`). If you'd prefer, `/docs/app/getting-started/server-and-client-components` is the closer page and I'm happy to switch it (the anchor would have to be dropped either way). ## Also checked: `viewTransition` The `next-config-js` reference index on nextjs.org still lists an entry linking to `/docs/app/api-reference/config/next-config-js/viewTransition`, which 404s. No change is needed in this repo: that page was intentionally deleted in 28a9465d4 ("docs: view transitions guide — skill section, source-audit fixes, flag-removal docs", #96097) as the docs half of the `experimental.viewTransition` flag removal (#96098), and the guide now states that view transitions work with no configuration. There is no surviving config option to repoint at, and no link to it remains anywhere in `docs/` or `packages/*/src` on `main` — the stale index entry comes from the nextjs.org versioned (v15) nav manifest, outside this repo. ## Verification - `prettier --check` passes on all changed files. - `alex` (`lint-language`) reports only pre-existing prose warnings on untouched lines. - No `next.js` build was run; this is a docs-only, path-only change. ▲ Created with [Vercel devbox](https://vercel.com/vercel/~/sandboxes/devboxes/1us5zdxyl2nk5ccodexgd9w3f6k2) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Joseph <sephxd1234@gmail.com> Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>github.com-vercel-next.js · 5092386e · 2026-08-06
- 0.1ETVfeat(docs): upgrade Geistdocs to 1.15.5, enable Ask AI, dedupe section Overview pages (#17894) ## Summary Upgrades the docs app from `@vercel/geistdocs` 1.11.3 to **1.15.5** and adapts the app to the new version's behavior. ### Package upgrade - `@vercel/geistdocs` 1.11.3 → 1.15.5 (Fumadocs/Next peers unchanged; lockfile churn is the geistdocs dependency orbit) - 1.15.5 pins `radix-ui` to 1.6.4 upstream — 1.6.5 breaks SSR consumers (`createContext` in the RSC graph); earlier revisions of this PR relied on the workspace release-age gate to avoid it - All resolved versions clear the workspace 3-day release-age policy — no exclusions, mergeable now - App-layer body background override (`bg-background-200`) matching the 1.15 template — since 1.15 the package defaults the body to `background-100`, which left white gutters around the docs container ### Section Overview dedup Geistdocs 1.15 surfaces folder index pages as a synthetic "Overview" sidebar item. Our sections carried a legacy dual-landing pattern (card-grid `index.mdx` + real `overview.mdx`), producing two "Overview" entries per section. - The content sync now drops a folder's `index.mdx` when an `overview.mdx` sibling exists (the card grids were redundant with the sidebar), carrying the index title into `meta.json` (folder display names) and preserving `collapsed: true` → `defaultOpen: false` - `transformDir` moved into `sync-content-utils.mjs` with unit tests - Redirects for the retired folder URLs (`/docs/<section>` → `/docs/<section>/overview`, plus `.md` variants, both versions) ### Ask AI - New `app/api/chat/route.ts` via `createChatRoute` with both version sources; env-switchable to proxy mode (`GEISTDOCS_CHAT_PROXY_URL`) - Model: `anthropic/claude-fable-5` (AI Gateway mode) - AI SDK-specific suggested prompts; page actions now follow package defaults (only `editSource` stays off until source paths map) ## Testing - `pnpm --filter ai-sdk-docs validate:site` from a clean state (7 tests + full production build), re-run on 1.15.5 - Local production server: route contracts (HTML/`.md`/llms.txt/agents.md/sitemap.md for v6+v7), redirects (including `.md` variants), single Overview per section, capitalized folder names, chat route streams ## Known upstream follow-ups (geistdocs, not this PR) - Page-actions label reveal uses `md:` under Geist breakpoints (601px), so the labeled copy button still overflows at 601–768px — fix is a one-liner (`lg:`) in `page-actions-client.tsx` (not in 1.15.5/1.16.0) - 1.16.0 (directory footer, theme switcher, navbar tweaks) is a deliberate follow-up: our app renders a local footer, so adopting the package footer needs its own passgithub.com-vercel-ai · 6bbf49d0 · 2026-07-28