Skip to content

Changelog Diff

69 upgrades tracked, 175 breaking changes documented. Know what breaks before you upgrade.

69
Upgrades tracked
175
Breaking changes
305
New features

Next.js

v14 → v15 · 2024-10
3 breaking4 new2 deprecated
highAsync Request APIs

cookies(), headers(), params, searchParams are now async and must be awaited.

Add `await` before all calls to cookies(), headers(). Wrap params with `await` in page/layout components.
highCaching defaults changed

fetch() requests and route handlers are no longer cached by default.

Add `force-cache` option explicitly to fetch calls that need caching.
mediumReact 19 required

Minimum React version bumped to 19. Some third-party libraries may not be compatible.

Update react and react-dom to ^19.0.0. Check compatibility of UI libraries.
Turbopack stable for devPartial Prerendering (experimental)next/after APIInstrumentation hook stable
unstable_cache → use cacheLife/cacheTaggeo/ip in middleware

Major upgrade. Async request APIs affect nearly every dynamic page. Plan 2-4 hours for medium projects.

React

v18 → v19 · 2024-12
3 breaking5 new3 deprecated
mediumref as prop

Function components now receive ref as a regular prop. forwardRef is no longer needed.

Remove forwardRef wrappers, accept ref directly as a prop.
lowContext as provider

<Context> can be used directly as a provider instead of <Context.Provider>.

Optional: replace <MyContext.Provider> with <MyContext>.
mediumCleanup functions in ref callbacks

Ref callbacks now support cleanup functions. Returning a value from ref callbacks is no longer allowed unless it's a cleanup.

Ensure ref callbacks don't return non-cleanup values.
Actions (useActionState)use() hookServer Components stableDocument Metadata (<title>, <meta>)Stylesheet support
forwardRef (use ref prop)React.createFactoryreact-test-renderer (use @testing-library/react)

Smooth upgrade for most apps. forwardRef removal is the biggest refactor. 1-2 hours typical.

Tailwind CSS

v3 → v4 · 2025-01
3 breaking5 new3 deprecated
highCSS-first configuration

tailwind.config.js is replaced by CSS @theme directive. All customization moves to CSS.

Move theme customizations from tailwind.config.js to @theme {} block in your CSS file.
mediumRemoved utilities

Some utilities renamed or removed: bg-opacity-* → bg-color/opacity, flex-grow → grow, etc.

Run the upgrade tool: npx @tailwindcss/upgrade
mediumPostCSS plugin change

@tailwindcss/postcss replaces the old tailwindcss PostCSS plugin.

Replace `tailwindcss` with `@tailwindcss/postcss` in postcss.config.
Lightning CSS engine (10x faster)@starting-style animationsContainer queries built-in3D transformscolor-mix() support
tailwind.config.js (use CSS @theme)@apply in external filessafelist (use @source)

Significant config migration. Use the official upgrade tool. 1-3 hours depending on customization.

TypeScript

v5.3 → v5.7 · 2025-03
2 breaking4 new2 deprecated
lowStricter indexing

Indexed access types are stricter with noUncheckedIndexedAccess patterns.

Add explicit undefined checks where TS now flags potential issues.
mediumNode16 module resolution default

Default moduleResolution changed in some scenarios.

Explicitly set moduleResolution in tsconfig.json if you experience import issues.
Inferred type predicatesPath rewriting in --emitMatched type narrowingRelative imports in config files
--target ES3Implicit any in some edge cases

Mostly additive. Incremental upgrade, minimal breaking. 30 min.

Prisma

v5 → v6 · 2024-12
3 breaking4 new2 deprecated
mediumNode.js 18+ required

Dropped support for Node.js 16.

Upgrade Node.js to 18 or later.
highStrict undefined vs null

Prisma now distinguishes between null and undefined in queries. Passing undefined no longer means 'skip this field'.

Review all queries where undefined was used as 'no filter'. Use Prisma.skip or omit the field explicitly.
mediumNo more implicit many-to-many

Implicit many-to-many relations must be made explicit.

Create explicit join tables for many-to-many relationships.
Typed SQL (prisma.sql)Prisma Postgres (managed)Omit API stableStrict undefined handling
beforeExit hook on library engineImplicit many-to-many shorthand

The null vs undefined change is the biggest headache. Audit all Prisma queries. 2-4 hours.

ESLint

v8 → v9 · 2024-04
3 breaking4 new3 deprecated
highFlat config required

.eslintrc.* files no longer supported. Must use eslint.config.js (flat config).

Convert .eslintrc to eslint.config.js. Use @eslint/migrate-config helper.
mediumNode.js 18.18+ required

Dropped support for Node.js < 18.18.

Upgrade Node.js.
lowRemoved formatters

Built-in formatters removed except stylish.

Install separate formatter packages if needed.
Flat config (simpler, composable)Config inspectorParallel lintingLanguage plugins API
.eslintrc.* config formateslintignore file (use ignores in config)Built-in formatters

Config migration is the whole upgrade. Use the migration tool. 1-2 hours.

Stripe API

v2023-10 → v2025-03 · 2025-03
2 breaking4 new2 deprecated
highCheckout Sessions v2

payment_method_types auto-detection is now default. Explicit types may behave differently.

Test checkout flows thoroughly. Remove explicit payment_method_types if relying on auto.
mediumSubscription schedule phases

Phase start/end behavior changed for backdated subscriptions.

Review subscription schedule creation with specific start dates.
Embedded pricing tablesAdaptive pricing (auto currency)Revenue recognition v2Meter-based billing GA
Sources API (use PaymentMethods)Charges API direct usage (use PaymentIntents)

Pin your API version. Test webhook handlers with new event schemas. 1-2 hours.

Supabase

v1.x → v2.x · 2024-04
3 breaking5 new3 deprecated
highAuth client rewrite

supabase-js v2 auth methods renamed. signIn() split into signInWithPassword(), signInWithOAuth(), etc.

Replace all signIn/signUp calls with specific method variants.
mediumRealtime v2

Channel-based API replaces old subscription model.

Rewrite realtime subscriptions using channel().on() pattern.
mediumStorage v2

Bucket policies and upload methods changed.

Update storage upload calls and review bucket RLS policies.
Multiplayer presenceBroadcast (pub/sub)Edge Functions improvementsVault (secret storage)AI/pgvector integration
supabase-js v1 patternsOld realtime subscriptionssignIn() generic method

Auth rewrite is the most impactful. Use find-and-replace. 2-3 hours per project.

Drizzle ORM

v0.32 → v0.38 · 2025-02
2 breaking5 new2 deprecated
highRelations API rewrite

New relational query builder replaces the old one. Query syntax changed.

Update relational queries to new .query.tableName.findMany() pattern.
mediumPrepared statements API change

db.query.*.prepare() signature changed.

Update prepared statement calls to new pattern.
Live queriesDrizzle Studio v2Seeding APIMulti-project schemasImproved PostgreSQL array support
Old relations() API syntaxLegacy migrate() options

Relations API change is the big one. 1-2 hours if using relational queries, 15 min otherwise.

Astro

v4 → v5 · 2024-12
3 breaking5 new2 deprecated
highContent Collections v2

Content layer API replaces file-based collections. New loader pattern.

Update content config to use glob() loader. File references change format.
mediumVite 6 and Node 18+ required

Dropped Node 16 support. Vite upgraded to v6.

Upgrade Node.js to 18+.
lowRenamed integration hooks

Some integration API hooks renamed for consistency.

Update custom integrations to use new hook names.
Content Layer APIServer IslandsSimplified prerenderingastro:env moduleVite 6 with Environment API
Legacy content collections (without loader)Node 16 support

Content Collections migration is the main work. Use the codemod: npx @astrojs/upgrade. 1-2 hours.

Vitest

v1 → v2 · 2024-07
3 breaking4 new2 deprecated
lowNode 18+ required

Dropped Node 16.

Upgrade Node.js.
mediumDefault pool changed

Default pool changed from threads to forks for better isolation.

If relying on shared state between tests, set pool: 'threads' explicitly.
lowSnapshot format change

Snapshot serialization updated. All snapshots regenerated on first run.

Run vitest --update to regenerate snapshots.
Browser mode stableProject-based configurationImproved type checkingBenchmark improvements
--api flag (use --ui)Custom reporters v1 format

Smooth upgrade. Regenerate snapshots, check pool setting. 15-30 min.

Clerk

v4 → v5 · 2024-10
3 breaking4 new3 deprecated
highMiddleware rewrite

clerkMiddleware() replaces authMiddleware(). New matcher pattern.

Replace authMiddleware with clerkMiddleware. Update route matchers.
mediumAuth helper changes

auth() is now async and must be awaited.

Add await before all auth() calls in server components and route handlers.
lowComponent prop changes

Some SignIn/SignUp component props renamed.

Update component props per migration guide.
Custom pages in UI componentsOrganization permissionsSession token customizationWaitlist mode
authMiddleware (use clerkMiddleware)withClerkMiddlewareClerk.js v4 methods

Middleware migration is the main effort. 1-2 hours. Use the codemod if available.

Nuxt

v3.10 → v3.15 · 2025-01
2 breaking5 new2 deprecated
lowRoute rules strictening

Route rules validation is stricter. Invalid rules now throw.

Review routeRules in nuxt.config for typos or invalid options.
lowNitro 2.10 required

Internal Nitro engine updated with some API changes.

Update any direct Nitro API usage.
Nuxt Scripts stableNuxt FontsBuilt-in component islandsImproved data fetching with getCachedDatauseAsyncData improvements
experimental.componentIslands (now stable)Nitro v1 APIs

Incremental updates, mostly additive. 15-30 min to update and test.

Hono

v3 → v4 · 2024-03
2 breaking5 new2 deprecated
mediumContext.req.query() return type changed

c.req.query() now returns string | undefined instead of string. Multi-value queries via c.req.queries().

Add null checks on query params. Use c.req.queries() for multi-value params.
lowJSX import changed

JSX pragma source updated for hono/jsx.

Update tsconfig.json: set jsxImportSource to 'hono/jsx'.
hono/jsx stableHonoX meta-frameworkRPC client type inference (hc<>)Testing helper improvementsBun and Deno adapters improved
Old JSX pragma styleSome middleware options renamed

Minor breaking changes. JSX and RPC upgrades make it worth it. 30-60 min.

Vite

v5 → v6 · 2024-11
3 breaking4 new2 deprecated
mediumEnvironment API

New Environment API replaces some internals. Custom plugin authors must update.

If writing plugins: check environment.name instead of deprecated server/build mode checks.
mediumSass API changed

Legacy Sass API removed. Modern Sass API required.

Upgrade sass package to 1.45.0+. Update sass.renderSync() → sass.compile().
lowNode 18+ required

Dropped Node 16 support.

Upgrade Node.js.
Environment API (multi-environment builds)Rolldown experimentalImproved CSS bundlingFaster cold start with module runner
Legacy Sass APIresolveId() without object return

Mostly plugin-author concerns. App developers: 15-30 min. Plugin authors: review Environment API.

Svelte

v4 → v5 · 2024-10
3 breaking5 new4 deprecated
highRunes required for reactivity

New $state, $derived, $effect runes replace let declarations for reactive state. Old syntax works in legacy mode only.

Replace `let count = 0` with `let count = $state(0)`. Use migration script: `npx sv migrate svelte-5`.
highEvent handling syntax changed

on:click → onclick. Component events use callback props instead of createEventDispatcher.

Replace on:event with onclick={handler}. Replace createEventDispatcher with $props() callbacks.
mediumSnippets replace slots

#snippet and @render replace <slot> for component composition.

Replace slot usage with {#snippet} blocks and {@render} tags.
Runes (fine-grained reactivity)$state, $derived, $effect, $propsSnippets (composable template fragments)Universal reactivity (works outside components)Better TypeScript support
let reactive declarations (in runes mode)on:event directive<slot> elementcreateEventDispatcher

Major mental model shift. Use the official migration script. 2-8 hours depending on app size. Runes mode is opt-in per component.

FastAPI

v0.100 → v0.115 · 2025-02
2 breaking4 new3 deprecated
highPydantic v1 support dropped

Pydantic v1 compatibility shim removed in 0.115. Must use Pydantic v2.

Migrate models to Pydantic v2: run `python -m bump-pydantic`. Main changes: @validator → @field_validator, class Config → model_config.
mediumResponse model handling

response_model_exclude_unset behavior changed slightly with Pydantic v2 serialization.

Test all response serialization. Check exclude_unset and exclude_none behavior.
Pydantic v2 full integration (10x faster validation)Annotated dependency injection stylelifespan context managers (replaces on_event)WebSocket improvements
@app.on_event() (use lifespan=)Pydantic v1 validators syntaxresponse_model with plain dict in some cases

Pydantic v2 migration is 80% of the work. Use bump-pydantic. 2-6 hours depending on model count.

Sentry SDK (@sentry/node)

v7 → v8 · 2024-06
3 breaking5 new3 deprecated
highSentry.init() must be called first

SDK initialization order is now strict. Must init before any imports that create spans.

Move Sentry.init() to the very first line of your app entry. Use --require sentry.js in Node.
mediumCustom integrations API changed

Integration class signature changed. setupOnce() removed, replaced with setup() and processEvent().

Update custom integrations to new interface. See migration guide for examples.
lowEnvelope-based transport only

Legacy JSON payload transport removed.

No action needed unless using custom transport.
OpenTelemetry native integrationAutomatic tracing for 30+ frameworks50% smaller bundlePerformance monitoring improvementsLogs capture (beta)
setupOnce() in integrationsSentry.configureScope()Hub.run() / makeMain()

Init order is critical and will break prod if missed. Review carefully. 1-3 hours.

Angular

v17 → v19 · 2025-02
3 breaking5 new3 deprecated
highSignal-based reactivity

Signals replace Zone.js-based change detection. New signal() and computed() primitives.

Adopt signals incrementally. Zone.js still works but will be removed in future versions.
mediumNew control flow syntax

@if, @for, @switch replace *ngIf, *ngFor, ngSwitch directives.

Run ng generate @angular/core:control-flow to auto-migrate templates.
mediumStandalone components default

Components are standalone by default. NgModules are optional.

Remove standalone: true (now default). Convert NgModules to standalone imports.
Signal-based inputs/outputsDeferrable views (@defer)Built-in control flowHydration improvementsView Transitions API
Zone.js (transitioning to signals)*ngIf/*ngFor directives (use @if/@for)NgModules (optional)

Biggest Angular modernization ever. Signals and new control flow make it feel like a new framework. 2-6 hours.

Remix

v1 → v2 · 2023-10
3 breaking4 new4 deprecated
highRoute convention v2

File-based routing changed. Dot-delimited flat routes instead of nested folders.

Use v2_routeConvention flag first, then move files to new convention.
mediumMeta API v2

meta() returns array of descriptors instead of object. Merge behavior changed.

Update meta exports to return arrays: [{ title: 'Page' }, { name: 'description', content: '...' }]
mediumError handling merge

CatchBoundary removed. ErrorBoundary handles both errors and responses.

Merge CatchBoundary into ErrorBoundary. Use isRouteErrorResponse() to distinguish.
Vite plugin (replaces custom compiler)Client-side routing stabilizedServer BundlesSPA mode
CatchBoundaryv1 route conventionmeta() object returnRemix compiler (use Vite)

Route convention and meta changes affect every route. Use the codemod. 2-4 hours.

pnpm

v8 → v9 · 2024-05
2 breaking4 new2 deprecated
mediumNode 18+ required

Dropped Node 16 support.

Upgrade Node.js to 18+.
lowLockfile v9 format

New lockfile format. Auto-migrated on install but older pnpm can't read it.

Run pnpm install to auto-migrate. Ensure all team members update pnpm.
Catalog workspace protocolImproved patchingBetter peer dependency handlingFaster resolution
Lockfile v6 formatNode 16 support

Mostly painless. Lockfile auto-migrates. Coordinate pnpm version across team. 15 min.

Storybook

v7 → v8 · 2024-03
3 breaking5 new4 deprecated
highstoriesOf API removed

Legacy storiesOf() API completely removed. Must use CSF (Component Story Format).

Convert storiesOf() to CSF3 format. Use the migration codemod.
mediumVite default builder

Webpack is no longer the default. Vite is now the default builder for all frameworks.

Remove explicit builder config if switching to Vite, or set builder: 'webpack5' to keep Webpack.
lowNode 18+ required

Dropped Node 16 support.

Upgrade Node.js.
Visual testing built-inComponent testingImproved controlsMobile viewport simulationRSC support (experimental)
storiesOf APIWebpack as default builderMDX v2 (must use v3)Node 16

storiesOf removal is the only hard part. If already on CSF, upgrade is smooth. 1-2 hours.

Vue.js

v2 → v3 · 2024-01
3 breaking5 new4 deprecated
highcreateApp() replaces new Vue()

Application creation API completely changed. No more global Vue instance.

Replace new Vue({}) with createApp(App).mount('#app'). Global plugins use app.use() instead of Vue.use().
mediumComposition API emphasis

Composition API (setup(), ref, reactive, computed) is the recommended approach. Options API still works.

Optional migration. New code should use Composition API. Existing Options API code continues to work.
mediumv-model breaking changes

v-model on components uses modelValue prop and update:modelValue event instead of value/input.

Update custom v-model components to use modelValue prop.
Composition APITeleportFragments (multiple root elements)Suspense (experimental)Script setup syntax
Filters (use computed/methods)Inline templates$on/$off/$once event busVue.set/Vue.delete

Major migration. Use the compatibility build (@vue/compat) for gradual migration. 4-16 hours depending on app size.

Turborepo

v1 → v2 · 2024-06
2 breaking4 new3 deprecated
mediumpipeline → tasks rename

turbo.json 'pipeline' key renamed to 'tasks'.

Rename pipeline to tasks in turbo.json. Run the codemod.
mediumStrict environment mode

Environment variables must be explicitly listed in env or globalEnv. Unlisted vars don't invalidate cache.

List all env vars used by each task in the env key of turbo.json.
Watch mode (turbo watch)Boundaries (package visibility)Improved task graph visualizationFaster cache restoration
pipeline key (use tasks)Loose env mode defaultglobalPassthrough

Rename pipeline to tasks, declare env vars explicitly. Use the codemod. 30-60 min.

Playwright

v1.40 → v1.50 · 2025-02
2 breaking5 new2 deprecated
lowSnapshot format v2

Snapshot comparison algorithm updated. May require regeneration.

Run npx playwright test --update-snapshots to regenerate.
mediumStrict mode default

Locators now throw if matching multiple elements by default.

Make locators more specific with .first(), .nth(), or more precise selectors.
Aria snapshots for accessibility testingClock API for time manipulationBox model assertionsImproved trace viewerTest tagging with @tag annotations
page.waitForTimeout() in favor of web-first assertionsLegacy selector engines

Incremental minor versions. Strict mode may break some tests. 30-60 min.

Gatsby

v4 → v5 · 2022-11
3 breaking4 new3 deprecated
mediumNode 18+ required

Dropped Node 14 and 16 support.

Upgrade Node.js to 18+.
mediumSlice API replaces some shared components

New Slice component model for shared layout sections. Changes how headers/footers are built.

Refactor shared layout components to use createSlice() in gatsby-node and <Slice> in templates.
lowGraphQL schema changes

Some internal schema types renamed.

Run gatsby build and fix any GraphQL query errors.
Partial Hydration (beta)Slice API for shared componentsScript component for 3rd party scriptsHead API stable
Node 14/16gatsby-plugin-react-helmet (use Head API)Old shared component patterns

Dead framework walking. Gatsby 5 shipped but Netlify abandoned it in 2024. Migrate to Astro or Next.js instead.

Ember.js

v4 → v5 · 2023-09
2 breaking3 new3 deprecated
lowDropped IE11 and legacy browser support

Build pipeline no longer targets legacy browsers.

No action if already targeting modern browsers.
mediumRemoved deprecated APIs from v4 cycle

All APIs deprecated during Ember 4.x are removed.

Fix all deprecation warnings in Ember 4.x before upgrading.
Template tag components (<template>)First-class TypeScript supportImproved routing
Classic component syntaxLegacy Ember.Object (use native classes)Mixins

Upgrade is easy if you fixed v4 deprecations. The real question is whether to keep using Ember at all — the ecosystem is shrinking.

Django

v4.2 → v5.1 · 2024-08
2 breaking4 new2 deprecated
mediumPython 3.10+ required

Dropped Python 3.8 and 3.9 support.

Upgrade Python to 3.10+.
lowFacet filters in admin

Admin list filters now show counts by default. Can impact performance on large tables.

Set show_facets = admin.ShowFacets.NEVER on problematic ModelAdmin classes.
GeneratedField for DB-computed columnsField groups in formsAsync signal handlersLoginRequiredMiddleware
Python 3.8/3.9Some undocumented internal APIs

Smooth upgrade path as always. Django is the gold standard for incremental, non-breaking releases. 30-60 min.

Ruby on Rails

v7.0 → v7.2 · 2024-08
2 breaking4 new2 deprecated
lowDevcontainer default

New apps generate .devcontainer/ config by default.

No action for existing apps. Delete .devcontainer/ if unwanted.
lowStricter default_url_options

URL generation strictness increased in some edge cases.

Ensure default_url_options is set in all environments.
Development containers built-inProgressive Web App (PWA) filesBetter browser version targetingYJIT improvements
bin/rake in favor of bin/rails for all tasksSome Active Storage configs

Rails upgrades remain painless. 7.0 → 7.2 is mostly additive. 15-30 min.

Laravel

v10 → v11 · 2024-03
2 breaking5 new3 deprecated
highMinimal app skeleton

App structure slimmed — no more Http/Kernel.php, Console/Kernel.php, or Exceptions/Handler.php. Bootstrap/app.php is the entry point.

Move customizations from Kernel classes to bootstrap/app.php using new fluent API.
mediumPHP 8.2+ required

Dropped PHP 8.1 support.

Upgrade PHP to 8.2+.
Slim application skeletonPer-second rate limitingHealth check endpointDumpable traitGraceful encryption key rotation
Http/Kernel.php patternConsole/Kernel.php patternException handler class

App skeleton change is jarring but the new structure is much cleaner. Existing code in Kernel classes must be moved. 1-2 hours.

NestJS

v9 → v10 · 2023-07
2 breaking4 new2 deprecated
lowNode 16+ required

Dropped Node 14 support.

Upgrade Node.js.
mediumSWC as default compiler

SWC replaces ts-node as the default development compiler for faster builds.

Install @swc/core and @swc/cli. Or set compilerOptions.builder: 'tsc' to keep old behavior.
SWC compiler (20x faster builds)Cache moduleCLI plugins improvementsEnhanced REPL
ts-node as default compilerSome RxJS v6 patterns

SWC switch is the main change. Build times drop dramatically. 30-60 min.

Expo SDK

v50 → v52 · 2025-01
2 breaking5 new3 deprecated
highNew Architecture default

React Native New Architecture (Fabric + TurboModules) is now the default. Some older native libraries may not be compatible.

Test all native modules. Check compatibility at reactnative.directory. Set newArchEnabled: false to opt out temporarily.
mediumexpo-router v4 breaking changes

Route groups and layout behavior changed. Static rendering improvements.

Review route group structures. Check layout components for changed behavior.
New Architecture defaultExpo DOM ComponentsReact 19 supportExpo Router v4 with static renderingFingerprint runtime version
Old Architecture as defaultexpo-app-loading (use expo-splash-screen)Classic build service

New Architecture is the big leap. Test thoroughly — some community packages lag behind. 2-4 hours plus dependency auditing.

Bun

v1.0 → v1.2 · 2025-01
2 breaking5 new1 deprecated
mediumNode.js compat behavior changes

Some Node.js compatibility behaviors changed to be more spec-compliant.

Test Node.js-dependent code paths. Check polyfill behavior for edge cases.
lowDefault tsconfig strictness

bun init creates stricter tsconfig by default.

No impact on existing projects.
Postgres/MySQL/SQLite built-in SQL clientS3 client built-inText-based lockfileExpress 5x faster on BunWindows stability improvements
bun:ffi experimental APIs (some stabilized, some removed)

Built-in database clients are the killer feature. Upgrade is smooth. 15-30 min.

TanStack Router

v0.x → v1.0 · 2024-07
2 breaking5 new2 deprecated
highRoute tree generation required

File-based routing with code generation is the primary mode. Manual route trees still work but changed.

Set up the TanStack Router Vite plugin for file-based routing, or update manual route tree to new API.
mediumSearch params validation

Search params now require explicit validation schemas (Zod, Valibot, etc).

Add validateSearch to all routes using search params.
Type-safe file-based routingBuilt-in search param validationRoute maskingDeferred data loadingSSR support
Manual route tree shorthandUnvalidated search params

1.0 stabilized the API after long beta. Type safety is the selling point. 1-2 hours for migration from 0.x.

Docker Compose

vV1 (docker-compose) → vV2 (docker compose) · 2023-07
2 breaking4 new3 deprecated
highBinary replacement

docker-compose (Python, hyphenated) replaced by docker compose (Go plugin, space-separated). V1 is EOL.

Replace all docker-compose commands with docker compose. Update CI scripts, Makefiles, and docs.
mediumDefault project name behavior

Project naming uses directory name differently. Container names may change.

Set COMPOSE_PROJECT_NAME explicitly or use -p flag if scripts depend on container names.
Watch mode (docker compose watch)Dry run modeFaster build with BuildKit defaultInclude directive for multi-file configs
docker-compose V1 binary (EOL)Compose file version field (now optional)Python-based CLI

Find-and-replace docker-compose → docker compose globally. Check CI/CD scripts. 30-60 min.

Terraform

v1.5 → v1.9 · 2024-09
2 breaking4 new3 deprecated
highBUSL license (not code but ecosystem)

License changed from MPL 2.0 to BUSL 1.1 in v1.6. Not a code breaking change but prohibits competing SaaS offerings.

Evaluate license implications. Consider OpenTofu fork if building competitive services.
lowRemoved deprecated backend configs

Some legacy backend configuration options removed.

Update backend config to current syntax.
Import blocks (declarative import)Check blocks for validationRemoved variable validationProvider-defined functions
MPL 2.0 license (replaced by BUSL)Some backend config optionsTerraform Cloud free tier changes

Code upgrade is easy. License change is the real breaking change — evaluate OpenTofu if you're a platform company.

Payload CMS

v2 → v3 · 2024-12
3 breaking5 new4 deprecated
highNext.js native (full rewrite)

Payload 3 runs as a Next.js plugin. Express backend is gone. Admin panel uses React Server Components.

Full migration required. Create new Next.js app with Payload plugin. Migrate collections and globals configs.
highConfig API changes

Collection and global config shapes changed. Hook signatures updated.

Update all collection configs to new format. Review hook parameters.
mediumDatabase adapter required

Must explicitly choose database adapter (Postgres via Drizzle, MongoDB, or SQLite).

Install @payloadcms/db-postgres (or mongodb/sqlite) and configure.
Next.js native (RSC admin panel)Live previewLexical rich text editor (replaces Slate)Database adapter patternDrizzle ORM under the hood
Express backendSlate editor (use Lexical)Webpack admin buildPayload standalone server

Essentially a new CMS. Full rewrite from Express to Next.js. Existing v2 projects need significant migration effort. 4-16 hours.

SolidStart

v0.3 → v1.0 · 2024-11
2 breaking5 new4 deprecated
highVinxi-based architecture

Complete rewrite based on Vinxi (Vite + Nitro). Old SolidStart API incompatible.

Rewrite app entry, routes, and server functions to new API. Follow the migration guide.
highServer functions API changed

'use server' directive replaces createServerAction$(). Entirely new RPC model.

Replace all $server functions with 'use server' pattern.
Vinxi-based (Vite + Nitro)'use server' functionsSingle-flight mutationsPreloadingType-safe API routes
createServerAction$()createServerData$()Old routing patternsPrevious server function model

Effectively a new framework. 0.3 → 1.0 is a full rewrite. Plan a fresh start rather than migration. 4-8 hours.

Prettier

v2 → v3 · 2023-07
2 breaking4 new3 deprecated
mediumTrailing commas default changed

trailingComma default changed from 'es5' to 'all'. Affects function parameters.

Set trailingComma: 'es5' in config to preserve old behavior, or accept the new default.
mediumESM plugin loading

Plugins must be ESM or provide ESM entry. Some community plugins need updates.

Update plugins to ESM-compatible versions.
ESM-firstMarkdown formatting improvementsTypeScript 5 supportImproved HTML formatting
CJS plugin loadingtrailingComma: 'es5' as defaultSome rarely-used options

Trailing comma change touches every file on first format. Run prettier --write once and commit. 15-30 min.

Redis

v7.0 → v7.4 · 2024-09
2 breaking4 new2 deprecated
highLicense change (not code)

Redis switched from BSD to dual RSALv2/SSPL license. Prohibits offering Redis as a managed service.

Evaluate license implications. Consider Valkey (Linux Foundation fork) or KeyDB for managed offerings.
lowSome command behavior changes

Minor changes to edge-case behavior in SORT, ACL commands.

Review release notes for specific commands you use heavily.
Hash field expirationPer-slot memory limits in clusterImproved ACL selectorsPerformance improvements
BSD license (replaced by RSALv2/SSPL)Some undocumented command behaviors

Code upgrade is trivial. License change is the real story — Valkey fork gained AWS/Google/Oracle backing. Choose your side.

Drizzle ORM

v0.38 → v0.40 · 2025-04
2 breaking4 new2 deprecated
lowSeeding API changes

drizzle-seed package API stabilized with minor method renames.

Update seed() call signatures per release notes.
lowType inference improvements

Some inferred types are stricter. TypeScript errors may surface in edge cases.

Fix TypeScript errors — usually missing null checks.
Policy-based RLS (Row Level Security) in schemaDrizzle Studio improvementsBetter SQLite WAL supportMySQL2 v3 compatibility
Legacy migrate() signatureOld policy format

Incremental release. RLS in schema is the headline feature. 15-30 min.

tRPC

v10 → v11 · 2024-11
3 breaking4 new3 deprecated
highLinks API rewrite

httpLink and wsLink now accept options object. The option format for retries and headers changed.

Update all link configurations in createTRPCClient(). Check terminating link options.
mediumMiddleware types changed

t.middleware() type signature updated. ctx is now typed more strictly.

Update custom middleware to match new signature.
mediumReact Query v5 required

@trpc/react-query v11 requires TanStack Query v5.

Upgrade @tanstack/react-query to v5 before upgrading tRPC.
FormData and File upload supportReact Server Functions adapterImproved error formattingBetter Next.js App Router integration
v10 link formathttpBatchLink option shorthandLegacy middleware ctx merge

Links migration is the hardest part. React Query v5 prerequisite adds work. 2-4 hours.

Better Auth

v0.8 → v1.0 · 2025-03
2 breaking5 new2 deprecated
mediumPlugin API stabilized

Plugin interface changed from beta to stable. Some hook signatures renamed.

Update custom plugins to use new hook names from the migration guide.
mediumSession strategy change

Database session strategy options restructured.

Update session configuration in auth.ts if using non-default session strategy.
Passkey support stableMulti-factor authentication pluginOrganization plugin stableAdmin plugin with user managementRate limiting built-in
Beta plugin hooksLegacy session options format

1.0 signals stability. Plugin API is the main migration. 1-2 hours for most apps.

TanStack Query

v4 → v5 · 2023-10
3 breaking5 new3 deprecated
highUnified query signature

useQuery(key, fn, options) overloads removed. Only object form: useQuery({ queryKey, queryFn, ...options }).

Run the official codemod: npx jscodeshift -t @tanstack/react-query/build/codemods/v5/remove-overloads/remove-overloads.cjs src/
mediumisLoading removed for disabled queries

Disabled queries no longer show isLoading: true. Use isPending instead.

Replace isLoading checks with isPending for disabled queries.
mediumonSuccess/onError callbacks removed from useQuery

Callbacks on queries caused user confusion and bugs. Removed in favor of useEffect.

Move onSuccess/onError to useEffect or use mutation callbacks instead.
Simplified query signatureImproved suspense modestreamedQuery for streaming datasharingObservers improvementNew devtools
Function/key overloads for useQuery/useMutationonSuccess/onError on useQueryisLoading for disabled queries

The codemod handles most of the migration. onSuccess/onError removal requires manual work. 1-3 hours.

Effect

v2.x → v3.0 · 2024-04
3 breaking4 new3 deprecated
highEffect.gen API change

Generator-based Effect.gen now uses function* instead of (function*). Adapters for generators changed.

Update Effect.gen(function* () { ... }) calls to new signature. Use the migration script.
highSchema moved to @effect/schema → effect/Schema

Schema functionality merged into the main effect package. Separate package deprecated.

Replace import from '@effect/schema' with import from 'effect/Schema'. Update package.json.
mediumLayer API simplification

Layer.mergeAll and some composition APIs renamed.

Update Layer composition calls to new names.
Schema merged into corePlatform package for HTTP/Node.js/BrowserEffect.fn for traced functionsImproved error messages with spans
@effect/schema packageOld Layer.mergeAll variantsEffect.gen adapter syntax

Major consolidation. Schema move affects all users. Use the migration script. 2-6 hours depending on codebase size.

Zod

v3 → v4 · 2025-03
3 breaking5 new2 deprecated
mediumz.string() email/url validation changed

Email and URL validation rules updated to be more RFC-compliant. Some previously valid inputs may now fail.

Test validation with your specific email/URL patterns. Adjust if needed.
mediumerror.issues structure changed

ZodIssue format updated. Some issue types renamed or restructured.

Update error handling code that reads issue.code or issue.path.
lowZodFirstPartyTypeKind enum changed

Internal type kind names changed. Affects code that checks schema.type.

Update any introspection code using internal type names.
3-4x faster parse performanceSmaller bundle (< 12KB)z.file() for File objectsBetter error message formattingLocalization support
z.string().email() loose patternsZodError.formErrors format (use z.prettifyError)

Performance wins make the upgrade worth it. Email validation change is the most likely to break things. Run your validation tests first. 30-60 min.

SvelteKit

v1 → v2 · 2024-01
3 breaking4 new2 deprecated
mediumSvelte 4 required

SvelteKit 2 requires Svelte 4 minimum. Svelte 5 runes are supported in SvelteKit 2.

Upgrade Svelte to v4. Then optionally opt in to Svelte 5 per component.
lowresolvePath renamed to resolve

resolvePath helper in hooks renamed to resolve.

Update handle hook to use resolve instead of resolvePath.
mediumredirect and error throws change

throw redirect() and throw error() behavior changed. Now returns instead of throws in some contexts.

Update load functions to use return redirect() in most cases.
Vite 5 supportShallow routingUniversal load functions stableImproved TypeScript types for routes
resolvePathThrowing redirect in non-server contexts

Mostly a cleanup release. redirect/error handling is the biggest change. 1-2 hours.

Payload CMS

v2 → v3 · 2024-12
3 breaking5 new4 deprecated
highExpress → Next.js plugin (full rewrite)

Payload 3 is a Next.js plugin. The standalone Express server is gone. Admin panel uses React Server Components.

Full migration required. Follow the official Payload 3 migration guide. Create a new Next.js project with Payload plugin.
highCollection and global config format changed

Hook signatures, field types, and config shape changed significantly.

Update every collection config to new format. Test each hook.
mediumSlate editor → Lexical

Rich text editor changed from Slate to Lexical. Stored content format is different.

Run the migration script to convert Slate content to Lexical format in your database.
Next.js native (RSC admin panel)Live previewLexical rich text editorDatabase adapter patternDrizzle ORM for SQL adapters
Express standalone serverSlate editorWebpack admin buildpayload.init() for server setup

Effectively a new CMS. v2 → v3 is a full rewrite migration. Budget 4-16 hours. The result is genuinely better but the path is rough.

Astro

v4 → v5 · 2024-12
3 breaking4 new2 deprecated
highContent Collections v2 (Content Layer)

File-based content collections now use the loader pattern. Config format changed.

Update content/config.ts to use glob() loader. Run: npx @astrojs/upgrade
mediumprerender renamed

export const prerender changed behavior with new rendering model.

Check static vs server rendering config per page.
lowNode 18+ required

Dropped Node 16 support.

Upgrade Node.js.
Content Layer API with custom loadersServer Islands (defer islands to after HTML)astro:env for typed environment variablesVite 6 integration
Legacy content collections without loaderOld prerender export pattern

Content Layer is the big migration. Use the upgrade codemod: npx @astrojs/upgrade. 1-2 hours.

OpenAI Node SDK

v3 → v4 · 2023-08
3 breaking4 new4 deprecated
highComplete API rewrite

The entire SDK was rewritten. openai.createChatCompletion() → openai.chat.completions.create(). All methods reorganized.

Replace all method calls with new namespaced API. No automated migration — manual updates required.
highConfiguration change

new Configuration() class removed. Pass options directly to new OpenAI({ apiKey }).

Replace new Configuration() + new OpenAIApi() with just new OpenAI({ apiKey: process.env.OPENAI_API_KEY }).
mediumStreaming API changed

Streaming now uses async iterables. Old callback-based streaming removed.

Replace streaming code with for await...of loop.
Namespaced API (openai.chat.completions, openai.embeddings, etc)Native streaming with async iterablesAutomatic retries with backoffTypeScript types improved significantly
Configuration classOpenAIApi classCallback-based streamingcreateCompletion() (use chat.completions.create)

Full rewrite — no shortcuts. Update every OpenAI call. 2-4 hours for most codebases.

Anthropic SDK

v0.x → v1.0 · 2025-02
2 breaking5 new2 deprecated
mediumModel name changes

claude-3-5-sonnet-20241022 → claude-sonnet-4-5, etc. Model naming convention changed.

Update model name strings. Use the model constants from the SDK if available.
lowBeta header handling

Beta features now require explicit header passing rather than option flags.

Add betas: ['...'] to client options for extended thinking, computer use, etc.
claude-opus-4, claude-sonnet-4-5 supportExtended thinking stableFiles APIPrompt caching stableTool choice improvements
Old claude-3-* model names (still work but use new names)Some beta flag formats

Mostly model name updates. Extended thinking and Files API require new code. 30-60 min.

Inngest SDK

v2 → v3 · 2024-08
2 breaking5 new2 deprecated
mediumstep.run() return type changed

step.run() now returns the step's return value directly without wrapping.

Remove .result or .output access from step.run() calls.
lowEvent name typing

Stricter event name typing with generics.

Update event schemas to use typed event definitions.
Parallel step executionDebounce built-inPriority queuesImproved Dev Server with replayAgentKit for AI agents
result/output wrappers on step.run()Old event schema format

Mostly additive. step.run() return type change is the only break. 30-60 min.

Expo SDK

v52 → v53 · 2025-04
2 breaking4 new2 deprecated
mediumReact Native 0.79 upgrade

Metro bundler improvements and some native module changes.

Update native module versions. Run expo install --fix.
mediumexpo-router v5 changes

Route parameter handling improved with stricter typing.

Update typed routes usage. Run expo-router types generation.
React Native 0.79Expo Router v5 stableDom Components improvementsexpo-modules-core v2
expo-router v4 patternsLegacy createNativeStackNavigator in expo-router

Standard SDK upgrade cadence. Use expo upgrade and fix what breaks. 1-2 hours.

Next.js Config

v14 config → v15 config · 2024-10
3 breaking3 new2 deprecated
lowexperimental.appDir removed

App Router is stable — the experimental flag is gone. Remove from config.

Remove experimental: { appDir: true } from next.config.js.
lowbundlePagesRouterDependencies added

New config option for Pages Router. Default changed.

Explicitly set bundlePagesRouterDependencies if you use Pages Router.
mediumserverExternalPackages replaces serverComponentsExternalPackages

Config key renamed.

Rename serverComponentsExternalPackages to serverExternalPackages in next.config.
Stable Turbopack config supportOptimized bundle splittingInstrumentation hook stable config
experimental.appDirserverComponentsExternalPackages (renamed)

Config-only changes. Find and replace the renamed keys. 15-30 min.

Coolify

v3 → v4 · 2024-01
2 breaking5 new2 deprecated
highComplete rewrite — not compatible with v3

Coolify 4 is a ground-up rewrite in Laravel + Livewire. v3 (Node.js) configs don't import.

Manual migration required. Export your resource configs from v3 (document them). Reinstall Coolify 4 and recreate resources.
highServer connection model changed

v4 uses SSH-based server management instead of the v3 agent.

Add your server via SSH in the v4 dashboard. Agent-based approach is gone.
Multi-server managementImproved Docker Compose supportPersistent storage managementOne-click services (Supabase, Plausible, etc)API for automation
Coolify v3 entire config formatAgent-based server management

Essentially a new product. Manually recreate everything. Plan 2-4 hours. The result is significantly better.

TanStack Query

v4 → v5 · 2023-10
4 breaking3 new2 deprecated
highuseQuery callbacks removed

onSuccess, onError, onSettled removed from useQuery (still on useMutation).

Move side effects to useEffect or to derived state. For tracking, hook into the queryClient cache.
lowcacheTime renamed to gcTime

Garbage collection time option renamed for clarity.

Find/replace cacheTime → gcTime, or run the codemod.
mediumSingle signature object form

Function-overload signatures removed. Always pass a single options object.

useQuery(['key'], fn, options) → useQuery({ queryKey, queryFn, ...options }). Codemod available.
mediumisLoading split

isLoading was renamed to isPending; isLoading now equals isPending && isFetching.

Audit isLoading usage — usually should be isPending now.
useSuspenseQuery / useSuspenseQueries / useSuspenseInfiniteQueryOptimistic updates via useMutation onMutate cleanerSmaller bundle, better TS inference
keepPreviousData (use placeholderData)Per-call onSuccess/onError on useQuery

Run the codemod, then chase remaining type errors. Most apps upgrade in 1-2 hours.

tRPC

v10 → v11 · 2025-03
3 breaking4 new2 deprecated
mediumTypeScript 5.7.2+ required

Older TS versions not supported.

Bump TypeScript to 5.7.2 or later.
highSubscriptions API rework

WebSocket subscriptions changed; SSE-based httpSubscriptionLink is the new recommended path.

If you use subscriptions, switch to httpSubscriptionLink unless you specifically need WS.
lowSome link APIs renamed

Several link package exports renamed for consistency.

Follow upgrade guide find/replace list.
TanStack Query v5 first-class supportFormData and non-JSON content via httpFormDataLinkImproved RSC integrationBetter inferred client types
createReactQueryHooks (use createTRPCReact)Old subscription API (still works in v11 with shim)

Quick migration if you don't use subscriptions or older link APIs. 1-3 hours.

Vite

v5 → v6 · 2024-11
3 breaking4 new2 deprecated
mediumNode 16/17 dropped

Vite 6 requires Node 18.x, 20.x, or 22.x.

Bump CI/runtime Node version.
lowSass modern API default

Default Sass API changed from 'legacy' to 'modern'.

If using Sass, set api: 'modern-compiler' explicitly or update to Sass-modern syntax.
mediumssrLoadModule deprecated path

Direct usage will move to the new Environment API in future versions.

Most apps unaffected. Library authors should plan migration to Environment API.
Environment API (opt-in)Rolldown bundler experimentalImproved CSS handlingBetter ESM exports analysis
Legacy Sass APISome old plugin hook signatures

One of the smoothest Vite majors. 30 min for most apps.

Drizzle ORM

v0.30 → v0.40 · 2025-03
2 breaking4 new1 deprecated
mediumSome relational query types narrowed

Type performance work tightened a few inferred types — may surface latent bugs.

Fix newly-flagged type errors. Usually they were real bugs hidden by the previous loose types.
lowPostgres array bug fixes

Several long-standing array column bugs fixed. Behavior change for edge cases.

Audit any code relying on the old buggy behavior of jsonb/array operations.
Relational queries v2 beta (faster compile times)drizzle-seed packageMCP server for AI toolingBetter migration generator
Some legacy schema helpers (warnings only)

Multiple minor versions accumulate. Read the changelog between your version and 0.40 — most bumps are safe but a few breaking patches snuck in.

Bun

v1.1 → v1.2 · 2025-01
1 breaking5 new1 deprecated
lowSome Node compat behaviors aligned

Bun 1.2 fixes several Node compatibility deltas. Code relying on old Bun-specific behavior may break.

Run your test suite. Diff failures usually point at the Node spec being followed.
Built-in S3 client (Bun.s3)Built-in Postgres client (Bun.sql)node:test compatibilityFaster bun install with better workspace handlingImproved hot reload
Some experimental Bun.serve options stabilized under new names

Largely additive. New built-in clients let you drop a few npm dependencies. Upgrade and run tests.

OpenAI Node SDK

v3 → v4 · 2023-08
3 breaking5 new3 deprecated
highFull API surface rewritten

Resource-based methods replace flat createX() functions. Configuration class removed.

Replace `new OpenAIApi(new Configuration({ apiKey }))` with `new OpenAI({ apiKey })`. Update all method calls (createChatCompletion → chat.completions.create).
mediumStreaming via async iterators

Old data event-based streaming replaced with for-await-of.

Rewrite stream consumers to use the new iterator API.
mediumErrors restructured

Error classes (APIError, RateLimitError, etc) replace generic axios errors.

Update catch blocks to handle the new error types.
First-class TypeScriptAuto-pagination helpersBuilt-in retries and timeoutsTool-use helpers (runTools)File and audio APIs
openai.ConfigurationOpenAIApi classFlat createX methods

Required upgrade — v3 effectively unmaintained. 2-5 hours for medium codebases.

Anthropic Python SDK

v0.30 → v0.40 · 2024-12
1 breaking4 new1 deprecated
lowSome beta header names normalized

Beta feature opt-ins moved to a unified extra_headers / betas helper.

Replace ad-hoc x-anthropic-beta headers with the SDK's typed `betas` parameter where possible.
Computer Use beta tools supportMessage Batches API helpersImproved streaming primitives (content block deltas)Better tool_use error surfaces
Older raw header-based beta opt-ins (still work, but typed API preferred)

Mostly additive. If you opt into Computer Use or Message Batches, upgrade. Otherwise routine.

Sentry SDK

v7 → v8 · 2024-05
3 breaking4 new2 deprecated
highHub/Scope model deprecated

Performance APIs moved from custom hub to OpenTelemetry-based primitives.

Replace Sentry.startTransaction() / .startChild() with Sentry.startSpan() / startSpanManual().
mediumIntegration imports renamed

Several integration class names changed to functions.

new BrowserTracing() → browserTracingIntegration(). Run the codemod.
lowAuto-instrumentation defaults expanded

More libraries auto-instrumented out of the box.

Verify your instrumentation list. Disable any duplicates.
OpenTelemetry-based performanceSmaller bundle on browserBetter Next.js, SvelteKit, Nuxt SDKsImproved cron/job monitoring helpers
Sentry.startTransactionClass-based integration constructors

Worth it for OTel alignment. 2-4 hours for typical apps with the Sentry codemod.

Expo SDK

v51 → v52 · 2024-11
3 breaking4 new2 deprecated
highNew Architecture default

React Native New Architecture (Fabric + TurboModules) enabled by default.

Audit native modules for New Architecture compat. Most popular modules already updated. Opt out with newArchEnabled: false if blocked.
mediumMinimum React Native 0.76

Bumped React Native baseline.

expo upgrade handles dep updates. Check custom native code for RN 0.76 changes.
lowSome Expo modules removed

Long-deprecated modules (expo-av camera variants, etc) removed.

Switch to recommended replacements (expo-camera, expo-audio, expo-video).
expo-audio and expo-video stableImproved EAS Build performanceExpo Router v4 with typed routesBetter metro config defaults
Several legacy media APIsOld Architecture (still supported, default flipped)

Run npx expo upgrade and fix what breaks. New Architecture is the big shift — test devices thoroughly.

NextAuth.js / Auth.js

v4 → v5 (beta) · 2024-04
3 breaking4 new2 deprecated
highRenamed to Auth.js, package paths changed

next-auth → still works for Next.js, but @auth/* packages for adapters.

Update package names. Adapter imports change: @next-auth/prisma-adapter → @auth/prisma-adapter.
mediumUniversal auth() helper

Single auth() function replaces getServerSession, useSession server-side, and middleware helper.

Refactor server-side session lookups to use auth(). Client useSession() unchanged.
mediumEdge-compatible config split

auth.config.ts must be edge-safe; database adapter loaded in non-edge file.

Split provider config (edge) from full instance with adapter (Node).
Edge runtime supportUniversal auth() helperCleaner provider configBetter TypeScript inference
getServerSessionwithAuth middleware wrapper

Beta for a long time but stable enough. Plan 3-6 hours for non-trivial apps.

Astro

v4 → v5 · 2024-12
3 breaking4 new2 deprecated
highContent Layer API replaces Content Collections v1

New loader-based content API. Old defineCollection schemas need updates.

Wrap collections with new loader() and refactor schema usage. Codemod helps.
mediumastro:env required for env vars in client

import.meta.env client-side use restricted; use astro:env schema.

Define schema in astro.config.mjs, import from astro:env.
mediumRemoved Astro.glob

Use import.meta.glob instead.

Find/replace Astro.glob → import.meta.glob with appropriate options.
Content Layer API (custom loaders)Server Islands (deferred dynamic pages)Vite 6 integrationBetter env handling
Content Collections v1 schema styleAstro.glob

Solid upgrade. Content Layer is genuinely better. 2-5 hours for content-heavy sites.

React

v18.3 → v19 · 2024-12
3 breaking6 new3 deprecated
mediumref as a regular prop

Function components now accept ref directly. forwardRef no longer needed.

Optional cleanup: remove forwardRef wrappers. forwardRef still works in v19.
lowRemoved legacy APIs

react-test-renderer deprecated; createFactory removed; some legacy strings removed.

Switch tests to @testing-library/react.
mediumStricter ref callback returns

Returning a value from a ref callback now triggers a warning unless it's a cleanup function.

Audit ref callbacks; ensure they return either nothing or a cleanup function.
use() hookActions and useActionStateServer Components stableDocument Metadata (<title>, <meta> in components)useOptimisticAsset preload helpers
forwardRef (still works)react-test-rendererPropTypes from React core

Smoother than React 18. 1-2 hours for most apps; longer if you depend on libs that don't yet support v19 peer.

Tailwind CSS

v3 → v4 · 2025-01
3 breaking5 new3 deprecated
highCSS-first configuration

tailwind.config.js replaced by @theme {} in CSS.

Run npx @tailwindcss/upgrade. Verify custom theme values in @theme.
mediumPostCSS plugin renamed

tailwindcss → @tailwindcss/postcss in postcss.config.

Update postcss.config.js plugin name.
mediumSeveral utilities renamed/removed

bg-opacity-* removed in favor of bg-color/opacity. flex-grow → grow, etc.

Run upgrade tool — it covers most renames.
Lightning CSS engine (10x+ faster)Container queries built-in (@container)3D transformsNative cascade layersColor-mix/oklch utilities
tailwind.config.js (use CSS @theme)Old PostCSS plugin nameMany opacity-prefix utilities

The upgrade tool is excellent. 1-3 hours for most apps. Performance win is real.

React Router

v6 → v7 · 2024-12
3 breaking5 new2 deprecated
highFramework mode replaces Remix

Remix is now React Router v7 framework mode. Remix package no longer published separately for new projects.

Existing Remix users follow the official remix-to-react-router-7 guide. Library-mode RR6 users can stay on library mode in v7 — no required changes.
mediumVite plugin replaces Remix compiler

Builds go through @react-router/dev with Vite plugin.

Replace remix.config.js with vite.config.ts + react-router plugin.
lowSome loader/action imports relocated

Type imports moved between packages.

Follow find/replace list in v7 upgrade guide.
Framework mode (file-based routing, SSR, loaders)Library mode preserved for SPAsType-safe params via generated typesSingle FetchPre-rendering
Remix as a separate packageRemix-specific config and CLI

Library-mode users: trivial. Remix users: 4-12 hours and a careful read of the migration guide.

Explore other areas