---
title: Next.js 16.1
description: Next.js 16.1 introduces Turbopack file system caching for development, a new bundle analyzer, and easier debugging in Node.js.
url: "https://nextjs.org/blog/next-16-1"
publishedAt: December 18th 2025
authors:
  - Luke Sandberg
  - Tim Neutkens
---


Next.js 16.1 focuses on faster development workflows and improved stability, with major updates to Turbopack and tooling.

- [**Turbopack File System Caching for `next dev` (stable)**](#turbopack-file-system-caching-for-next-dev): Improved compile times for `next dev` by default.
- [**Next.js Bundle Analyzer (experimental)**](#nextjs-bundle-analyzer-experimental): Optimize your code with our new interactive tool.
- [**Easier debugging**](#easier-debugging-with-next-dev---inspect): Debug your Next.js app with `next dev --inspect`.
- [**Transitive external dependencies**](#improved-handling-of-serverexternalpackages): Turbopack can automatically handle transitive external dependencies with no warnings.

## Upgrade Today

```bash filename="terminal"
# Use the automated upgrade CLI
npx @next/codemod@canary upgrade latest

# ...or upgrade manually
npm install next@latest react@latest react-dom@latest

# ...or start a new project
npx create-next-app@latest
```

## Turbopack File System Caching for `next dev`

Turbopack file system caching for `next dev` is now stable and on by default. Compiler artifacts are stored on disk, leading to significantly faster compile times when restarting your development server, especially in large projects.

<div
  className="not-prose my-8 rounded-lg border border-[var(--ds-gray-400)] overflow-hidden"
  role="figure"
  aria-label="Compile time comparison showing improvements with file system caching"
>
  <div className="py-0 pr-3 pl-4 rounded-t-md border-b border-[var(--ds-gray-400)] h-10 flex items-center bg-[var(--ds-background-200)]">
    <span className="text-sm font-medium text-[var(--ds-gray-1000)]">
      First route compile time
    </span>
  </div>
  <div className="p-4 flex flex-col gap-4 bg-[var(--ds-background-100)]">
    <div>
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">react.dev</span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~10× faster
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="react.dev compile times"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cold
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Cold start: 3.7 seconds"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">3.7s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">3.7s</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cached
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={10}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Cached: 380 milliseconds"
          >
            <div
              className="w-[10.3%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">380ms</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">380ms</span>
        </div>
      </div>
    </div>
    <div className="border-t border-[var(--ds-gray-400)] pt-4">
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">nextjs.org</span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~5× faster
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="nextjs.org compile times"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cold
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Cold start: 3.5 seconds"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">3.5s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">3.5s</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cached
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={20}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Cached: 700 milliseconds"
          >
            <div
              className="w-[20%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">700ms</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">700ms</span>
        </div>
      </div>
    </div>
    <div className="border-t border-[var(--ds-gray-400)] pt-4">
      <div className="flex justify-between items-baseline mb-2">
        <span className="text-sm text-[var(--ds-gray-1000)]">
          Large internal Vercel app
        </span>
        <span
          className="text-xs font-semibold"
          style={{ color: 'var(--ds-blue-700)' }}
        >
          ~14× faster
        </span>
      </div>
      <div
        className="flex flex-col gap-1.5"
        role="group"
        aria-label="Large Vercel app compile times"
      >
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cold
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={100}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Cold start: 15 seconds"
          >
            <div
              className="w-full bg-[var(--ds-gray-600)] rounded h-full"
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">15s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">15s</span>
        </div>
        <div className="flex items-center gap-3">
          <span className="text-xs text-[var(--ds-gray-900)] w-12 shrink-0">
            Cached
          </span>
          <div
            className="flex-1 bg-[var(--ds-gray-200)] rounded h-5 relative"
            role="progressbar"
            aria-valuenow={7}
            aria-valuemin={0}
            aria-valuemax={100}
            aria-label="Cached: 1.1 seconds"
          >
            <div
              className="w-[7.3%] rounded h-full"
              style={{ backgroundColor: 'var(--ds-blue-700)' }}
              aria-hidden="true"
            />
            <div className="absolute inset-0 flex items-center px-2">
              <span className="text-xs font-medium text-white sm:inline hidden">1.1s</span>
            </div>
          </div>
          <span className="text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right sm:hidden">1.1s</span>
        </div>
      </div>
    </div>
  </div>
</div>

Internal applications at Vercel have been dogfooding this for the past year. To learn more about how we built file system caching for Turbopack, watch [Luke Sandberg's talk at Next.js Conf](https://nextjs.org/conf/session/are-we-turbo-yet).

Following this release, we'll be stabilizing file system caching for `next build`. See our [documentation](https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopackFileSystemCache) for more information, and share your [feedback](https://github.com/vercel/next.js/discussions/87283) on the dedicated GitHub discussion.

## Next.js Bundle Analyzer (experimental)

Next.js 16.1 includes a new experimental [Bundle Analyzer](/docs/app/guides/package-bundling#nextjs-bundle-analyzer-experimental) that works with Turbopack. It makes it easier to optimize bundle sizes for both server and client code—helping improve Core Web Vitals, reduce lambda cold start times, and identify bloated dependencies.

```bash filename="terminal"
next experimental-analyze
```

Running the command launches an interactive UI to inspect production bundles, identify large modules, and see why they're included.

<Image
  href="https://turbopack-bundle-analyzer-demo.vercel.sh/"
  srcLight="/static/blog/next-16-1/bundle_analyzer_light.png"
  srcDark="/static/blog/next-16-1/bundle_analyzer_dark.png"
  width={1920}
  height={1080}
  caption="The Next.js Bundle Analyzer showing a treemap with TopNav.tsx selected, revealing its import chain."
/>

> **Try it yourself:** <a target="_blank" href="https://turbopack-bundle-analyzer-demo.vercel.sh/">Open the interactive Bundle Analyzer demo</a> to explore the module graph.

The Bundle Analyzer is deeply integrated into Next.js, allowing you to:

- Filter bundles by route
- View the full import chain showing why a module is included
- Trace imports across server-to-client component boundaries and dynamic imports
- View CSS and other imported asset sizes
- Switch between client and server views

The Bundle Analyzer is in early development and will be improved further in future releases. Share your feedback on the dedicated [GitHub discussion](https://github.com/vercel/next.js/discussions/86731).

## Easier Debugging with `next dev --inspect`

You can now enable the [Node.js debugger](https://nodejs.org/en/learn/getting-started/debugging) by passing `--inspect` to `next dev`. Previously this required passing `NODE_OPTIONS=--inspect` and would attach the inspector to all processes spawned by Next.js instead of only to the process running your code.

## Improved Handling of `serverExternalPackages`

Next.js allows you to keep dependencies unbundled using [`serverExternalPackages`](https://nextjs.org/docs/app/api-reference/config/next-config-js/serverExternalPackages). Previously, this only worked reliably for direct dependencies. If you used a library that internally depends on something like `sqlite`, and needed to externalize `sqlite`, you'd have to add it to your own `package.json`—even though it's not your direct dependency. This workaround leaked internal implementation details, created maintenance burden, and could lead to impossible version conflicts when multiple packages required different versions of the same dependency.

Next.js 16.1 fixes this for Turbopack, which now correctly resolves and externalizes transitive dependencies in `serverExternalPackages` without additional configuration.

## Other Updates

- **20MB smaller installs**: Next.js installs are about 20MB smaller thanks to simplifications in the Turbopack file system caching layer.
- **New `next upgrade` command**: A new [`next upgrade`](/docs/app/getting-started/upgrading#latest-version) command makes upgrading easier. Going forward, you can just run this to upgrade Next.js versions.
- **MCP `get_routes` tool**: The [Next.js DevTools MCP server](/docs/app/guides/mcp) now has a `get_routes` tool to get the full list of routes in your application.
- **`generateStaticParams` timing**: Time spent on [`generateStaticParams`](/docs/app/api-reference/functions/generate-static-params) is now logged as part of the timings shown for requests in development.
- **Build worker logging**: `next build` "Collecting page data" and "Generating static pages" now log the number of worker threads used.
- **Improved async import bundling**: Turbopack has improved bundling of async imports in dev to reduce the number of chunks produced, avoiding certain pathological but real-world cases.
- **Relative source map paths**: Turbopack now produces source maps with relative file paths for server-side code, improving compatibility with Node.js and other ecosystem tools.

## Feedback and Community

Share your feedback and help shape the future of Next.js:

- [GitHub Discussions](https://github.com/vercel/next.js/discussions)
- [GitHub Issues](https://github.com/vercel/next.js/issues)
- [Discord Community](https://nextjs.org/discord)

## Contributors

Next.js is the result of the combined work of over 3,700 individual developers. This release was brought to you by:

- The **Next.js** team: [Andrew](https://github.com/acdlite), [Hendrik](https://github.com/unstubbable), [Janka](https://github.com/lubieowoce), [Jiachi](https://github.com/huozhi), [Jimmy](https://github.com/feedthejim), [Jiwon](https://github.com/devjiwonchoi), [JJ](https://github.com/ijjk), [Josh](https://github.com/gnoff), [Jude](https://github.com/gaojude), [Sam](https://x.com/samselikoff), [Sebastian](https://github.com/sebmarkbage), [Sebbie](https://github.com/eps1lon), [Wyatt](https://github.com/wyattjoh), and [Zack](https://github.com/ztanner).
- The **Turbopack** team: [Benjamin](https://github.com/bgw), [Luke](https://github.com/lukesandberg), [Niklas](https://github.com/mischnic), [Tim](https://github.com/timneutkens), [Tobias](https://github.com/sokra), and [Will](https://github.com/wbinnssmith).
- The **Next.js Docs** team: [Delba](https://github.com/delbaoliveira), [Rich](https://github.com/molebox), [Ismael](https://github.com/ismaelrumzan), and [Joseph](https://github.com/icyJoseph).

Huge thanks to @kdy1, @eps1lon, @SyMind, @bgw, @swarnava, @devjiwonchoi, @ztanner, @ijjk, @huozhi, @icyJoseph, @acdlite, @unstubbable, @gnoff, @gusfune, @lukesandberg, @sokra, @hayes, @shuding, @wyattjoh, @marjan-ahmed, @timneutkens, @ajstrongdev, @zigang93, @mischnic, @Nayeem-XTREME, @hamirmahal, @eli0shin, @tessamero, @gaojude, @jamesdaniels, @georgesfarah, @timeyoutakeit, @sequencerr, @Strernd, @lucasadrianof, @wbinnssmith, @hamidreza-nateghi, @jokokoloko, @dijonmusters, @H01001000, @xusd320, @lubieowoce, @KaziMahbuburRahman, @zhiyanzhaijie, @feedthejim, @that-one-arab, @JamBalaya56562, @shrink, @florianliebig, @allenzhou101, @benmerckx, @ymc9, @Marukome0743, @pyrytakala, @danpeleg4, @gaearon, @styfle, @jhuleatt, @muhammadsyaddad, @roelvan, and @SukkaW for helping!