Library / SDK
shuding/nextra avatar
shuding/nextra

Nextra: a Next.js docs framework held together by pnpm pins and patches

Simple, powerful and flexible site generation framework with everything you love from Next.js.

13,954 stars1,406 forksTypeScriptMIT

At a glance

What is it?
Nextra is a TypeScript site generation framework for Next.js, shipped as three MIT packages from a Turborepo monorepo. Its own build depends on five pnpm overrides, three patched dependencies and a Corepack-pinned package manager, none of which travel to the people who install it.
Who is it for?
Nextra suits teams already on Next.js who want a documentation or blog site and who will read the monorepo build scripts before changing anything. Check the override pins and the three patched packages against your own dependency tree first, because neither travels with the published packages.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 106 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • shuding/nextra13,954 ★ · +25
Star history
Repository2026-09-222026-11-14
shuding/nextra13.9k14k

25 Stars in the last 53 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

Installing the repository triggers a full build before you reach a prompt

The root `package.json` is marked private and names `pnpm build` as its postinstall script. That one line changes what installing the monorepo means. `pnpm install` does not stop at fetching and linking packages: it finishes by building every package under `packages/` through Turborepo. A contributor on a machine with a mismatched toolchain gets a compile error during a step that reads like dependency resolution, and the natural first reaction, clearing the pnpm store or the lockfile, will not touch the cause. Two sibling scripts encode the same assumption. `build:all` drops the filter that `build` applies, so it also covers the examples and the documentation site, and `clean` shells out once per package to remove `dist`, `.next` and `.turbo`.

Three dev scripts exclude the docs workspace by name

Alongside the package-level `dev` script, four more dev scripts exist, and three of them filter the docs workspace out on purpose. `dev:theme-docs` runs the dev task for `example-docs...` while excluding `docs`, `dev:theme-blog` repeats that for `example-blog...`, and `dev:theme-i18n` does it again for `swr-site...`. Only `dev:website` points the other way, running the dev task for `docs...` with nothing excluded. The consequence for a contributor is concrete: starting the docs example will not also start the documentation website.

Instant re-render stops at the package boundary

Editing an example is not the same as editing a package, and the README draws that line explicitly. It tells you to start the docs example with `pnpm --filter example-docs dev`, and that any change under `example/docs` re-renders instantly. Two sentences later it says that updating the core or theme packages requires a rebuild, or watch mode for both Nextra and the theme in separate terminals. So the fast feedback loop has a hard edge that falls exactly where the workspace package boundary sits. Every build and watch command it gives is package-scoped rather than app-scoped, such as:

code
pnpm --filter nextra build

Watch mode is `pnpm --filter nextra dev`, and the docs theme has its own `pnpm --filter nextra-theme-docs build`. The README gives no combined command, although the root `build` script builds every package under `packages/` together.

Five pnpm overrides pin versions your installed copy will not inherit

The root `package.json` carries a `pnpm` block whose `overrides` map pins five transitive packages for the entire workspace: postcss at 8.5.6, lightningcss at 1.30.1, esbuild at 0.25.8, vite at 6.3.5 and next at 16.0.10. Read that as a statement about the repository rather than about what consumers get. An application installing `nextra` resolves its own copy of Next.js and does not inherit these pins, so a defect that will not reproduce against `example/docs` can be a version difference rather than a code difference. The vite and esbuild pins matter most, because those are the bundlers the build chain leans on, and forcing them from the root means local runs never exercise the range a downstream project resolves on its own.

Three packages are patched in place, and the patches do not ship

Three dependencies are patched from the repository's own `patches/` directory: `[email protected]`, `@changesets/[email protected]` and `tsup`. Two entries name an exact version, while the `tsup` entry carries no version. The quieter consequence is the second one. These patches fix tooling the repository uses to build itself, and they are not part of the published `nextra` packages. A consumer can install the framework, hit the same unpatched defect, and find no patch file to apply. Read `patches/` before trusting the lockfile.

Corepack and a pinned pnpm version gate every build command

Building anything starts with the package manager, and the repository names it in the `packageManager` field as `[email protected]`. The first documented step is `corepack enable`, with `npm install -g corepack@latest` offered as the fallback when that command is unavailable. The second is `pnpm install`. Two failure modes follow. A pnpm installed globally by some other route, sitting earlier on your PATH than Corepack's shim, wins over the pin and turns the declared version into a comment. And because the postinstall build runs during that install, a Node version outside what `.node-version` asks for surfaces as a failure at the install step rather than at the compile step, where the error would at least name the file. The workspace layer is not optional here.

Four example sites ship, and the documentation walks through one

The repository carries four examples: `examples/blog`, `examples/custom-theme`, `examples/docs` and `examples/swr-site`. The README walks through exactly one of them. It explains starting `examples/docs` and nothing more, which leaves `custom-theme`, the single example that would show how far the theme interface can be pushed, entirely unmentioned. It also leaves `swr-site` unmentioned, even though the dev scripts reference it by name under `dev:theme-i18n`. The consequence is that the documented happy path is the one most projects will resemble. Building a custom theme means reading the theme package source, and adding internationalization means reading an example nobody introduces and whose name implies a client-side data-fetching library this repository never mentions.

Every package released 4.6.1 while the branch kept moving

Three packages release under a single version number: nextra 4.6.1, nextra-theme-docs 4.6.1 and nextra-theme-blog 4.6.1, all published on 2025-12-04. The repository's last push is dated 2026-07-31, and that gap is the first thing to settle before depending on it. Pinning to 4.6.1 means building roughly eight months older code than the branch tip, while tracking the branch means running a version string no release ever claimed. Versioning runs through changesets, with `version` applying pending entries and `release` publishing them. The repository also defines `test` and `types:check` as turbo tasks, and the README documents neither one, so there is no stated way to verify a change locally before opening a pull request.

Editorial conclusion

Nextra suits teams already on Next.js who want a documentation or blog site and who will read the monorepo build scripts before changing anything. Check the override pins and the three patched packages against your own dependency tree first, because neither travels with the published packages. Anyone expecting a standalone install command outside a pnpm workspace will find none documented in the README.

Frequently asked questions

What does Nextra do?

Nextra is a site generation framework built on Next.js, published under the MIT license as the nextra package with companion packages nextra-theme-docs and nextra-theme-blog. Its documentation lives at https://nextra.site.

how to install nextra

The README covers installing the repository for development rather than adding Nextra to an application: enable Corepack, run pnpm install, then build a package with pnpm --filter nextra build. Application setup is not documented there, and the page points to https://nextra.site.

how to use nextra

To work against a local site, start the docs example with pnpm --filter example-docs dev, where changes under examples/docs re-render instantly. Editing the core or theme packages needs a rebuild, or watch mode for Nextra and the theme in separate terminals.

what is nextra

At the repository level, Nextra is a private TypeScript monorepo named nextra-monorepo that uses PNPM Workspaces and Turborepo, pinned to [email protected]. It ships four example sites: blog, custom-theme, docs and swr-site.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. shuding/nextra on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/shuding-nextra.svg)](https://hysenlabs.com/projects/shuding-nextra)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/shuding-nextra.svg)](https://hysenlabs.com/projects/shuding-nextra)

Was this useful?