Jiwon Choi
90d · built 2026-09-08
Performance
What Jiwon Choi shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
−0.6engineers
delivers like 0.4 (0.4x pre-AI)
Output (ETV)
2.7ETV
+56.8% vs 1.7 prior
Features share
16.6%
−7.1 pp vs prior window
Fixes share
46.8%
+35.0 pp vs prior window
Work mix
16.6% Features5.3% Maintenance25.7% Tests5.7% Docs46.8% Fixes
17 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.
- 0.8ETVReplace CSRBailout error with `ReactDOM.browser` behind a flag (#96826) CSRBailout error is the use case for `ReactDOM.browser()`. Replace behind an experimental flag. This PR replaces the bailout error used in next/dynamic ssr: false.github.com-vercel-next.js · 23985382 · 2026-08-27
- 0.5ETV[ts-plugin] Preserve TypeScript quick info metadata (#95863) ### Why? VS Code passes a maximum hover length and verbosity level to TypeScript's `getQuickInfoAtPosition` API when a user expands a hover. The Next.js TypeScript plugin intercepted that call and forwarded the file name and position, dropping the remaining arguments. The plugin also replaced TypeScript's `QuickInfo` object when it added config documentation, which discarded native fields such as `canIncreaseVerbosityLevel`. As a result, hovers for Next.js config exports could not expand and lost native type information. This supersedes #86290 with a narrower behavior change. The plugin preserves native `QuickInfo` when it adds documentation to valid config values and config identifiers. Invalid config values keep the existing synthesized override, and hovers inside function initializers retain TypeScript's existing behavior. x-ref: https://github.com/microsoft/vscode/issues/232685#issuecomment-3484167019 | Before | After | |--------|-------| | <img width="1656" height="390" alt="Config hover without expandable metadata" src="https://github.com/user-attachments/assets/ed39a851-7096-448b-bffe-55c5320c1713" /> | <img width="1668" height="384" alt="Config hover with expandable metadata" src="https://github.com/user-attachments/assets/0a3a0cbc-5c75-4b6f-90fc-bbcef028d06b" /> | ### How? The plugin forwards all QuickInfo arguments to TypeScript and passes the native result into the config hover rules. For valid config values and identifiers, those rules copy the native `QuickInfo` fields and append the Next.js documentation. They synthesize the existing fallback when TypeScript returns no QuickInfo. Focused tests cover argument forwarding, metadata preservation, missing native QuickInfo, invalid config values, and function config boundaries. ### Test plan Open a minimal Next.js app in Cursor with workspace TypeScript 6.0.2 and the package built from this PR. Hover `export const metadata: Metadata`, then select the expansion control. The hover expands from `Metadata` to its full property type while the Next.js config documentation and link remain visible. <!-- NEXT_JS_LLM -->github.com-vercel-next.js · 26824378 · 2026-07-24
- 0.3ETV[DevTools] Add ignore-listed stack frame disclosure (#36828)github.com-facebook-react · 52912a14 · 2026-06-25
- 0.3ETVFix early OTel proxy tracers in Cache Components prerenders (#95317) > [!TIP] > Best reviewed with hide whitespace. ### Why? Cache Components prerenders can fail when an OpenTelemetry tracer is acquired before provider registration and later resolves through proxy tracer delegation: ``` Next.js encountered the unstable value `Math.random()` while prerendering ``` Current behavior: https://github.com/vercel/next.js/actions/runs/28518518762/job/84536475151?pr=95317#step:32:343 ### How? Patch proxy tracer delegation to apply the same Cache Components span instrumentation used for normal tracer lookup. Closes https://github.com/vercel/next.js/issues/94753 <!-- NEXT_JS_LLM_PR -->github.com-vercel-next.js · fa71595a · 2026-07-01
- 0.2ETVPrevent resolved promise to suspend due to missing status (#4271) * test: cover resolved undefined suspense paths * fix: skip empty suspense thenables * refactor: restore non-conditional suspense thenablesgithub.com-vercel-swr · a89bbe71 · 2026-06-19
- 0.2ETVReplace resumed render bailout error with ReactDOM.browser behind a flag (#96844) Stacked on #96843. This PR replaces the bailout error used to abort resumed renders with `ReactDOM.browser()` behind the experimental flag. ### How? Pass the flag to the App Router runtime, use `ReactDOM.browser()` as the abort reason when enabled, and preserve existing behavior otherwise. <!-- NEXT_JS_LLM -->github.com-vercel-next.js · a65ccea5 · 2026-08-27
- 0.2ETVRemove generated error codes (#97687) ### Why? Should come up with better solution that does not block PRs with git conflict x-ref: https://vercel.slack.com/archives/C02CDC2ALJH/p1785263902728189?thread_ts=1785263687.502649&cid=C02CDC2ALJH ### How? - Delete `errors.json`, the error-code SWC plugin, generated WASM, merge driver, and validation/build tooling. - Stop attaching error codes to server-rendering digests, redboxes, and telemetry; native `Error.code` and `Error.name` remain available where applicable. - Remove the development-overlay error feedback UI, middleware, and telemetry event that depended on stable codes. - Update fixtures, snapshots, and guidance for code-free errors and numeric-only digests. <!-- NEXT_JS_LLM -->github.com-vercel-next.js · d7aa66c3 · 2026-08-21
- 0.1ETVReturn APP_PAGE instead of PAGES for production Instant Navigation tests (#95184) ### Why? Current behavior: https://github.com/vercel/next.js/actions/runs/28225010081/job/83615571987?pr=95184#step:31:8732 For a minimal-mode resume request carrying the Instant Navigation testing cookie, Next.js skips the postponed render so the test receives only the prefetched static shell. The resulting empty continuation was represented as `PAGES`, but the App Page handler requires `APP_PAGE`, causing error: ``` Error: Invariant app-page handler received invalid cache entry PAGES ``` ### How? Return an empty `APP_PAGE` response with the correct HTML or RSC content type and postponed metadata. If the document continuation has no `<head>` chunk, insert the Instant Navigation bootstrap while flushing the stream. Add production regression coverage for document and RSC-prefetch resume requests using build-generated postponed state. <!-- NEXT_JS_LLM_PR -->github.com-vercel-next.js · b1f49163 · 2026-06-26
- 0.1ETVThrow for empty or incomplete generateStaticParams results with output: export (#95969) > [!TIP] > This PR is best reviewed commit by commit. ### Why? With `output: 'export'`, an empty array or incomplete params can be reported as a missing `generateStaticParams` function, even when the function exists. ### How? - Throw when any `generateStaticParams` invocation returns `[]`. - Throw when any composed parent and child params object omits a dynamic route parameter. - Extend the troubleshooting page added in #95968 with the export-specific cases. Stacked on #95968. Supersedes #95388. <!-- NEXT_JS_LLM --> Co-authored-by: SukkaW <isukkaw@gmail.com>github.com-vercel-next.js · f2e6abb4 · 2026-07-23
- 0.1ETVThrow when generateStaticParams returns invalid values (#95968) > [!TIP] > This PR is best reviewed commit by commit. ### Why? `generateStaticParams` must return an array of objects, but Next.js does not currently provide a clear error when it returns something else. ### How? - Throw when `generateStaticParams` does not return an array. - Throw when an item in the returned array is not an object. - Keep allowing `{}`. The follow-up rejects it with `output: 'export'` when it leaves a dynamic route parameter missing. Follow-up: #95969 Supersedes #95388. <!-- NEXT_JS_LLM --> Co-authored-by: SukkaW <isukkaw@gmail.com> --------- Co-authored-by: Joseph <joseph.chamochumbi@vercel.com>github.com-vercel-next.js · 81643544 · 2026-07-23