Contributions
19 PRs merged across 8 upstream repos. Plus a public patches repo with drop-in fixes shipped before merge in Bun, npm, pnpm, and Yarn formats. The workflow: find the bug, file the upstream PR, drop the patch into the repo so my projects (and anyone else hitting the same thing) can ship without waiting. When the fix lands in a release, I bump the dep and delete the patch. Every merged PR listed here shipped as a patch first.
Merged PRs
- expo/expo (8 PRs):
- #44548
textContentTypemodifier wrapping SwiftUI’stextContentType(_:)with all 45UITextContentTypevalues. Wires@expo/uiTextFieldandSecureFieldinto iOS keychain autofill for passwords, emails, addresses, credit cards, and OTP codes. Before this,@expo/uitext fields could not participate in iOS autofill at all. Includes#availableguards for the iOS 17+ values (creditCardExpiration,birthdate, etc.) and iOS 17.4+ values (cellularEID,cellularIMEI) - #44547
textInputAutocapitalizationmodifier (iOS 15+) with all fourTextInputAutocapitalizationmodes:never,words,sentences,characters. Before this, the only way to disable auto-capitalization on@expo/uiTextFieldwas forcingkeyboardType="ascii-capable", which changed the keyboard layout entirely. Username and email fields can now behave correctly without that workaround - #43958
PersistentFileLog.readEntriesrace condition where reads bypassed theserialQueuethat guards every write. Caused flakyUpdatesLogReaderTests.PurgeOldLogsfailures inexpo-updatesCI when a read executed before a queued write flushed to disk and returnedentries1.count == 1instead of2. Fix wrapsreadEntriesinserialQueue.syncso reads wait for pending writes. No deadlock risk because all callers are external to the queue - #43955
scrollTargetBehaviorandscrollTargetLayoutmodifiers (iOS 17+) for paging and view-aligned scroll snapping in@expo/uiScrollView. Brings SwiftUI’s snap-paging API to React Native through@expo/uimodifier composition with#availableguards for iOS 17, tvOS 17, and macOS 14 - #43923
defaultScrollAnchorForRolemodifier (iOS 18+) wrapping the two-parameterdefaultScrollAnchor(_:for:)overload. Lets you set independent scroll anchors perScrollAnchorRole(initialOffset,sizeChanges,alignment), so a chat view can anchor to bottom globally but start at top via a per-role override. Also addednullsupport to match Apple’sUnitPoint?signature and the missing@platform macos 14.0+JSDoc to the single-arg version from #43914 - #43914
defaultScrollAnchormodifier (iOS 17+) for controlling where aScrollVieworListstarts. Removes the need forscaleEffect(y: -1)flips, reversed data arrays, and inverted scroll indicator hacks that chat UIs traditionally relied on. Reuses the existingUnitPointOptionsenum and falls back to a no-op on iOS < 17 - #43228 per-axis
scaleEffectaccepting{ x, y }in addition tonumber. Unblocks the inverted-list pattern for chat threads: flip theListvertically withscaleEffect({ x: 1, y: -1 })and flip each row back, so messages anchor to the bottom and new content pushes up naturally. Backwards-compatible:scaleEffect(0.5)still normalizes to{ x: 0.5, y: 0.5 }in the TS layer before hitting native - #43158
ClipShapeModifierandMaskModifierwere silently renderingRectanglefor any shape other thancircleorroundedRectanglebecause they used a rawStringfield instead of theShapeTypeenum from #40748. Every other shape modifier (BackgroundModifier,ContainerShapeModifier,ContentShapeModifier,GlassEffectModifier) already usedShapeType. Switched both to exhaustiveShapeTypeswitching with nodefaultfallthrough, addedroundedCornerStyleandcornerSizefields, and unblockedcapsuleandellipseinclipShape()andmask()
- #44548
- get-convex/better-auth (4 PRs):
- #218 four bugs causing stale auth state and incorrect
isAuthenticatedvalues. (1)getCookie()parsed cookies from JSON, which turnedexpiresinto a string. Comparingstring < new Date()coerced the Date to a number and the string toNaN, andNaN < anythingis alwaysfalse, so expired cookies were never filtered out. (2) Cookies persisted after/get-sessionreturnednull, so combined with bug 1, stale credentials shipped indefinitely. (3) Sign-out stored"{}"inlocalCacheNameandJSON.parse("{}")returns truthy{}, breakingif (sessionData)checks. Fix stores"null"soJSON.parse("null")returnsnull. (4)isAuthenticatedwassession !== null, which returnedtruefor{}(from bug 3) andundefinedduring loading edges. Fix usesBoolean(session?.session) - #245 widened the
better-authpeer dep from exact1.4.9to>=1.4.9 <1.5.0after verifying every import path is stable across 1.4.9 through 1.4.18. Explicitly excludes 1.5.0, which movedcreateAuthEndpointandcreateAuthMiddlewarefrombetter-auth/pluginstobetter-auth/api, removed thebetter-auth/adapters/testexport path, and deletedrunAdapterTestentirely - #267 concurrent
fetchAccessTokendedup withuseRef. On page load,sessionIdtransitions fromundefinedto a value, which creates a newfetchAccessTokenreference and triggersConvexProviderWithAuthto callsetAuth()again while the first request is still in-flight. React 18 StrictMode doubles this in dev. Each/convex/tokencall hits the DB for session middleware and runs JWT signing, so N concurrent calls meant N redundant round-trips with only one result used. Fix stores the in-flight promise in auseRefso concurrent callers share it, withforceRefreshToken: truebypassing the guard and.finally()clearing the ref after resolution. Closes #219, likely reduces the action count reported in #186 - #278 removed the dead
react-dompeer dep declaration. Zero imports ofreact-dom,ReactDOM,createRoot,hydrateRoot,flushSync, orcreatePortalacross all 32 files insrc/. None of the exports (/react,/nextjs,/react-start) touch it. The declaration was generating peer dep warnings inbunandpnpmprojects that don’t usereact-dom
- #218 four bugs causing stale auth state and incorrect
- napi-rs/napi-rs (1 PR): #3189 cross-compile regression in the v3 CLI rewrite. When
--cross-compile/-xwas passed for a linux or darwin target,pickBinary()incli/src/api/build.tsskippedcargo-zigbuildif host platform, arch, and abi matched target, logged a warning, then silently fell through tocargo build. The whole point of--cross-compileon a native build is to pin a lower glibc via zig’s linker. Without it, buildingx86_64-unknown-linux-gnuonubuntu-latest(glibc 2.39) produced binaries incompatible with glibc < 2.35 systems like Amazon Linux 2023 (glibc 2.34) and Vercel’s build container. v2 had this fix in #1432 (resolving #1430) but it wasn’t carried over during the v3 rewrite in #1492. Fix removes the platform-match conditions in theelsebranch ofpickBinary()so--cross-compilealways usescargo-zigbuildfor non-Windows targets - shadcn-ui/ui (1 PR): #9331 registered the
@ramonclaudio-coderabbitshadcn registry in the official open source directory per request in #8892. Adds entries toapps/v4/public/r/registries.jsonandapps/v4/registry/directory.jsonso the registry is discoverable through the shadcn CLI. The registry itself ships a framework-agnostic CodeRabbit API client, pluggable storage adapters (LocalStorage, Convex, Supabase, PostgreSQL, MySQL), and React components for generating developer activity reports - oven-sh/bun (1 PR): #21855 added the
decompressproperty to theBunFetchRequestInitinterface with JSDoc documentation. The option already worked at runtime in Bun’sfetch(), but TypeScript users had to@ts-ignoreit on every call to disable response decompression. Now it’s a first-class typed option, no escape hatch required - fuma-nama/fumadocs (2 PRs):
- #2092 fixed the TanStack Start template in
create-fumadocs-app. Wired thevite-reactplugin with the requiredcustomViteReactPlugin: trueflag, configured a customNotFoundcomponent for TanStack Router, and bumped deps to current versions. Resolved four issues at once: TanStack Startvite-reactplugin warning, missing custom 404 component warning, module resolution errors during client-side navigation, and React hydration errors caused byuseMemonull references that flashed errors mid-route-change - #2095 prettier formatting fix that unblocked the changesets release PR #2093 for
create-fumadocs-app@15.7.0. The release PR was stuck on a formatting check, so I ran the formatter and shipped the diff so the release could go out
- #2092 fixed the TanStack Start template in
- rudrankriyam/App-Store-Connect-CLI (1 PR): #784 Mac App Store screenshot support for the
ascCLI. New--provider macosgrabs the frontmost window of a running macOS app by bundle ID usingscreencapture -l <windowID>, where the window ID comes from a Swift one-liner piped toswift -viaCGWindowListCopyWindowInfo. No cgo, no extra binaries. New--device macrenders to the 2880x1800APP_DESKTOPcanvas without a device bezel, with optional title, subtitle, and background color overlays via--title,--subtitle,--bg-color,--title-color, and--subtitle-color. Using canvas flags on a non-canvas device returns an error instead of silently ignoring them. Requires Screen Recording permission for the terminal and Xcode Command Line Tools forswift. Also fixedASC_TIMEOUTbeing silently ignored forscreenshots captureandscreenshots frame, both now useContextWithTimeout. Tested against a regular windowed app and a menubar panel app - TanStack/db (1 PR): #17 corrected the stale README link to the example todo app, repointing it at
examples/react/todo. Tiny fix, but it was the first thing I clicked when I landed on the repo and it 404’d. Was PR #17 in the repo, early days
Patches
Open (PRs still awaiting upstream merge):
expo-router56.0.0-canary-20260212-4f61309:Stack.Toolbarinfinite render loop on stateful screens. Any child screen holding local state that re-rendered triggered a loop throughStack.Toolbar, making stateful stack navigators unusable on canary. Patched against the canary while waiting for expo/expo#44563 to merge, which resolves expo/expo#44561@shopify/mini-oxygen4.0.0: Vite 7 support. The real blocker is aReferenceError: __vite_ssr_exportName__ is not definedfrom a missing 6th SSR key in the mini-oxygen worker runtime, plusgetBuiltins()support, afetchModuleimporter fix, deprecatedrootremoval, and bumping thevitepeer dep from^5.1.0 || ^6.2.1to^7.0.0. Shipped as Shopify/hydrogen#3493 with three sibling patches so the whole Hydrogen stack installs on Vite 7 together:@shopify/hydrogen2026.1.0(widensvitepeer dep to^5.1.0 || ^6.2.1 || ^7.0.0),@shopify/hydrogen-react2026.1.0(same), and@shopify/cli-hydrogen11.1.9(widens from^5.1.0 || ^6.2.0to include^7.0.0)bun1.3.9: two PRs against bun itself. oven-sh/bun#27085 fixesincludePrereleasesemantics in peer dep semver validation, where bun was rejecting valid prerelease versions during install. oven-sh/bun#27086 fixes an invalid YAML sequence in theupdate-root-certsworkflow’slabelsfield that was breaking bun’s own CI- no patch (CI workflow, not runtime code):
@astrojs/compilerneeds-xadded to thex86_64-unknown-linux-gnubuild for glibc compat, same class of issue as the napi-rs regression above. Tracked in withastro/compiler-rs#22 - no patch (docs website feature, not runtime code):
shadcn/uiraw<ComponentsList>tag leaks into the copy-to-markdown output on component pages. Tracked in shadcn-ui/ui#9484
Released (PR merged; patch either still active until the next release, already dropped, or tracked without a local patch file):
Active, awaiting next release:
@expo/ui56.0.0-canary-20260212-4f61309:textContentTypemodifier with all 45UITextContentTypevalues, merged in expo/expo#44548, awaiting the next canary@expo/ui56.0.0-canary-20260212-4f61309:textInputAutocapitalizationmodifier, merged in expo/expo#44547, awaiting the next canary@expo/ui56.0.0-canary-20260212-4f61309:scrollTargetBehaviorandscrollTargetLayoutmodifiers, merged in expo/expo#43955, awaiting the next canary
Dropped after release (detailed descriptions in the Merged PRs section above):
@expo/ui56.0.0-canary-20260212-4f61309→56.0.0-canary-20260305-5163746: #43158, #43228@expo/ui56.0.0-canary-20260212-4f61309→56.0.0-canary-20260401-5e87ef7: #43914, #43923expo-modules-core56.0.0-canary-20260212-4f61309→56.0.0-canary-20260401-5e87ef7: #43958@convex-dev/better-auth0.10.10→0.10.11: #218, #245@convex-dev/better-auth0.10.11→0.10.12: #267@convex-dev/better-auth0.10.12→0.10.13: #278bun1.2.20→1.2.21: #21855create-fumadocs-app15.6.4→15.6.5: #2092, #2095convex1.31.3→1.31.4(not my PR):WebSocketManageraddEventListenerguard, patched while reporting (baafbf5)
No patch, tracked in the patches repo for completeness because the upstream change can’t be applied locally: napi-rs/napi-rs#3189 (CLI bundles to dist), shadcn-ui/ui#9331 (docs site JSON), App-Store-Connect-CLI#784 (Swift binary), TanStack/db#17 (README only).
Closed (patches dropped after upstream fixed the underlying issue a different way, or docs-only PRs I closed myself):
react-native-view-shot4.0.3: React Native 0.84 new architecture compat.RCTScrollViewwas removed in 0.84, so thesnapshotContentContainercheck had to switch toUIScrollView. Never filed a PR because upstream adopted the same approach in5.0.0-alpha.2(gre/react-native-view-shot#587)@tobilu/qmd1.0.7:typescriptwas inpeerDependenciesinstead ofdevDependencies, andtscwas missing from thepreparescript, so a global install produced a package with no compiled output. Upstream rebuilt the fix differently in1.1.0+, I closed tobi/qmd#197@tobilu/qmddocs: tool name, param names, and ghost params inmcp-setup.mdout of sync withinputSchemainsrc/mcp.ts. Corrections documented in tobi/qmd#95 (closed by me, still stale upstream)
Issues I filed upstream
- panva/jose#752
process.getBuiltinModulemisuse broke Edge Runtime and Next.js middleware. Traces convinced @panva the bug was real, fixed inv6.0.4 - shadcn-ui/ui#8892 registry directory submission for CodeRabbit. @shadcn asked me to send a PR, I shipped #9331 which auto-closed this issue on merge
- get-convex/better-auth#219 potential duplicate token requests during concurrent
fetchAccessTokencalls. Fixed by my own PR #267 - anthropics/claude-code#18181 manual update doesn’t fix the symlink when
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICis set. @bcherny replied “Fix incoming” and closed it - cursor/cursor#3182 unable to update spending limit or toggle usage-based pricing on the main dashboard. Fixed upstream (cursor later disabled their issue tracker)
- Textualize/textual#5980 emoji with variation selectors cause button layout misalignment in Ghostty. Closed after the discussion concluded the fix belongs in terminal emulators via DEC mode 2027, not in
textual - Shopify/hydrogen#3263 Vite 7 support in
@shopify/mini-oxygen, open and tracked by my PR #3493 - anthropics/claude-code#18075 feature request for an env var to set a custom Chromium browser path, open
- anthropics/claude-code#20664
--fork-sessiondoesn’t inheritCLAUDE_CODE_TASK_LIST_IDfrom the parent session, stale aftergithub-actionsauto-closed it for inactivity with no human response - tobi/qmd#198
bun install -grequires manualbun pm trust better-sqlite3, closed by me as a known runtime limitation
- Ray