omiid
homenotebookai usage

Upgrading my blog to Next 15

April 05, 2025 · Updated on August 09, 2026

A Next.js middleware vulnerability finally pushed me to upgrade my blog to Next 15. I had planned to wait until I actually needed React 19 or Tailwind v4, since Next 15 came with quite a few breaking changes.

I write short, practical notes like this one. Get the next one by email:

Unsubscribe anytime.

@next/codemod and the Tailwind CLI do most of the migration

The upgrade took less work than I expected. @next/codemod automates most of the migration:

npx @next/codemod@canary upgrade latest

Next 15.2.4 lists React 19 in its peer dependencies, so the codemod bumps react and react-dom for you.

Next, I upgraded Tailwind. They also provide a CLI to handle the transition:

npx @tailwindcss/upgrade

The Turbopack warning came from a webpack fallback

After this, I started seeing turbopack errors in dev mode:

⚠ Webpack is configured while Turbopack is not, which may cause problems.
⚠ See instructions if you need to configure Turbopack:
  https://nextjs.org/docs/app/api-reference/next-config-js/turbo

The issue was caused by forcing a crypto fallback via webpack, which isn’t needed with Turbopack. Removing the webpack config cleared the warning.

@vercel/style-guide 6.0.0 caps its eslint peer dependency below Next 15

I then upgraded the rest of my dependencies. Everything went fine, except for one:

 WARN  Issues with peer dependencies found
└─┬ @vercel/style-guide 6.0.0
  └── ✕ unmet peer @next/eslint-plugin-next@">=12.3.0 <15.0.0-0": found 15.2.4

@vercel/style-guide 6.0.0 pins its eslint peer dependency to @next/eslint-plugin-next@>=12.3.0 <15.0.0-0, and Next 15.2.4 installs 15.2.4. The package is deprecated and hasn’t been updated for Next 15. I removed it and replaced it with eslint-config-next.

So far, everything seems to be working just fine.

tl;dr

  • A recent Next.js security flaw prompted me to upgrade to v15.
  • Used @next/codemod and @tailwindcss/upgrade for quick migrations.
  • Replaced deprecated @vercel/style-guide with eslint-config-next.

Join My Newsletter

Occasional notes on software, tools, and things I learn. No spam.

Unsubscribe anytime.

Continue Reading
  • Tuning Postgres and pgvector: the three knobs that matter08-18-2026 · Most pgvector performance problems come down to three settings. This post shows how to read an ANN query plan and tune ef_search, shared_buffers, and work_mem in the right order.
  • HNSW vs IVFFlat: choosing and building your pgvector index08-14-2026 · Past a few hundred thousand rows, an exact scan stops being fast enough. Here is how to pick between HNSW and IVFFlat and build the index without locking the table.
  • Vector search relevance: chunking, metadata, and the 0.81 problem08-11-2026 · Most bad vector search results come from one of three failure modes: chunking, modality mismatch, or a confused model. Each one has a specific diagnostic and a specific fix.
  • pgvector setup: your first multimodal query in TypeScript08-03-2026 · One Postgres table can hold text and screenshot embeddings in the same vector column. This post sets up the schema, the Voyage embedding call, and the first query that returns both.
  • Vector search in Postgres: the mental model behind pgvector08-02-2026 · A first similarity query that returns results is not a finished search feature. This post explains what an embedding is, why one Postgres column can hold text and images, and where an untuned index starts returning wrong results.