Taxonomy
Audited from github.com/shadcn-ui/taxonomy
An open-source Next.js 13 App Router reference app combining authentication, subscriptions, MDX docs, and a dashboard editor. Officially archived by its author.
- Language
- TypeScript
- Database
- PlanetScale
- Hosting
- Vercel
- License
- MIT
- Running for
- 2 years 4 months
- Team
- 1-5 people
Why this architecture
Built to demonstrate the App Router, server components, and Next.js 13 data fetching patterns in one realistic, full-featured codebase.
Tech stack by layer
9 technologies · audited Sep 17, 2026- Next.jsImplements the App Router across (auth), (dashboard), (docs), (editor) and (marketing) route groups in app/.
- ReactHydrates interactive UI (editor, dashboard, forms) inside the Next.js App Router.
- Tailwind CSSStyles marketing, docs, and dashboard shells via utility classes and a custom config.
- Radix UIProvides unstyled accessible primitives wrapped by the local components/ui kit.
- NextAuth.jsHandles GitHub and email sign-in via the Prisma adapter in lib/auth.ts.
- StripeImplements subscription billing and webhooks via lib/stripe.ts and lib/subscription.ts.
- PrismaModels Post and User in prisma/schema.prisma; generated client is used by lib/db.ts.
- PlanetScaleREADME lists PlanetScale as the MySQL-compatible target database; not directly verified in captured manifests.(inferred)
- VercelREADME and @vercel/og/@vercel/analytics dependencies suggest the app is designed to deploy on Vercel; no vercel.json is present in the captured tree.(inferred)
Taxonomy architecture diagram
Open SVGDiagram as text
- Browser (marketing · docs · dashboard) → Next.js App Router (5 route groups · app/): HTTPS
- Next.js App Router (5 route groups · app/) → NextAuth.js (GitHub · email sign-in): session
- Next.js App Router (5 route groups · app/) → Stripe billing (lib/stripe.ts · subscription.ts): plan checks
- Next.js App Router (5 route groups · app/) → Contentlayer (MDX to typed data): docs · blog
- Next.js App Router (5 route groups · app/) → Prisma Client (lib/db.ts · Post · User): posts
- NextAuth.js (GitHub · email sign-in) → Prisma Client (lib/db.ts · Post · User): adapter
- Contentlayer (MDX to typed data) → content/ MDX (blog · docs · guides): build time
- Prisma Client (lib/db.ts · Post · User) → MySQL (PlanetScale) (per README): SQL
- NextAuth.js (GitHub · email sign-in) → GitHub OAuth (sign-in): OAuth
- Stripe billing (lib/stripe.ts · subscription.ts) → Stripe (subscriptions): API
Key architectural decisions
6 decisions- 01
Single Next.js app hosts marketing, docs, dashboard, and auth route groups
The app/ directory splits routes into (auth), (dashboard), (docs), (editor), and (marketing) groups so each area can have its own layout while sharing the same Next.js 13 App Router build defined in app/layout.tsx.
- 02
Prisma is the single data-access layer, generated on every install
package.json runs
prisma generateas a postinstall script, and lib/db.ts exports a shared PrismaClient instance, making prisma/schema.prisma the sole source of truth for the Post and User models. - 03
Content lives in MDX files compiled by Contentlayer, not a CMS
content/blog, content/docs, content/guides, content/authors, and content/pages are MDX collections processed by contentlayer.config.js into typed data consumed by the (docs) and (marketing) route groups.
- 04
Radix UI primitives are wrapped into a local components/ui kit
More than two dozen @radix-ui/react-* packages are direct dependencies in package.json, composed into project-owned wrappers under components/ui rather than pulling in a pre-styled component library.
- 05
Billing runs through Stripe, config-driven from config/subscriptions.ts
lib/stripe.ts and lib/subscription.ts implement subscription status checks against plan definitions in config/subscriptions.ts, surfaced to users through components/billing-form.tsx.
- 06
Repository is officially archived and kept as a historical reference
The README states the project has been officially archived because Next.js has changed significantly since the App Router public preview, and points readers to the Vercel Templates directory for current starters instead.
How Taxonomy is built
How Taxonomy is structured
Taxonomy is a single Next.js application built to exercise the Next.js 13 App Router, React Server Components, and the broader app/ directory feature set in one realistic, full-stack codebase. Its README states plainly that the project originated as an experiment during the App Router's public preview and has since been officially archived by its author; the note recommends the Next.js Templates directory (opens in a new tab) for anyone starting a new project today rather than forking this one. Everything below reflects the code as it exists in the final, archived state at commit 298a885.
The app is not organized as a monorepo — it is one Next.js package (package.json name taxonomy) with Next.js 13.3.2, React 18, and TypeScript 4.7 as its core. Route groups under app/ — (auth), (dashboard), (docs), (editor), and (marketing) — let each area of the product own its own layout and loading UI while sharing one build. A parallel pages/api directory still exists alongside the newer app/api routes, reflecting the hybrid Pages Router/App Router period the project was built in.
Frontend
The UI layer combines React 18 function components with more than two dozen @radix-ui/react-* primitives (accordion, dialog, dropdown-menu, navigation-menu, popover, select, toast, tooltip, and more) as direct dependencies in package.json. Rather than adopting a pre-built component library, the project wraps these primitives into project-owned components under components/ui, alongside feature components like components/editor.tsx, components/shell.tsx, components/main-nav.tsx, and components/user-account-nav.tsx. Styling runs through Tailwind CSS (tailwind.config.js, postcss.config.js), with tailwindcss-animate for transitions and class-variance-authority plus clsx/tailwind-merge for variant composition. components/theme-provider.tsx and components/mode-toggle.tsx implement light/dark theming via next-themes.
The in-app content editor (components/editor.tsx) is built on @editorjs/editorjs with a set of official Editor.js plugins (@editorjs/code, @editorjs/header, @editorjs/list, @editorjs/table, etc.) wired through react-editor-js, letting the (editor) route group provide a block-based writing experience for docs and posts.
Backend & APIs
Authentication is handled by NextAuth.js (next-auth 4.22.1) configured in lib/auth.ts, using @next-auth/prisma-adapter to persist sessions and accounts through Prisma, with nodemailer and postmark available for email-based sign-in alongside GitHub OAuth. Route handlers live under both app/api (App Router conventions) and the legacy pages/api directory. middleware.ts at the project root applies Next.js middleware — most plausibly for route protection on the (dashboard) group, though its exact rules are not captured in these facts.
Subscription billing is implemented with the stripe SDK: lib/stripe.ts wraps the Stripe client, lib/subscription.ts checks a user's current plan status, and config/subscriptions.ts defines the available plans consumed by components/billing-form.tsx and components/user-account-nav.tsx. Environment variables (Stripe keys, database URL, OAuth secrets) are validated with @t3-oss/env-nextjs and zod, configured in env.mjs.
Data & persistence
Prisma (@prisma/client and prisma 4.13.x) is the sole ORM, with the schema and migrations under prisma/schema.prisma and prisma/migrations. package.json runs prisma generate automatically via a postinstall script, and lib/db.ts exports a shared PrismaClient instance used throughout the app rather than instantiating a new client per request — a common pattern to avoid exhausting connections in serverless environments. The README's feature list names PlanetScale as the reference database, but because the audited manifest set only captured package.json (not prisma/schema.prisma's contents), the specific datasource provider is not independently verified here; it is listed as inferred.
Build, test & deploy
The project uses pnpm (pnpm-lock.yaml) as its package manager. contentlayer.config.js drives a contentlayer build step that runs concurrently with next dev in development (concurrently "contentlayer dev" "next dev") and precedes next build in production ("build": "contentlayer build && next build"). Linting uses eslint-config-next plus eslint-plugin-tailwindcss; formatting uses Prettier with @ianvs/prettier-plugin-sort-imports and prettier-plugin-tailwindcss. Git hooks are managed by Husky (.husky/commit-msg, .husky/pre-commit) alongside @commitlint/cli for conventional commit enforcement. No CI workflow files are present in the captured tree (workflows: []), and no vercel.json was found, so deployment target is inferred from the README and the presence of @vercel/og (used for the Open Graph image route) and @vercel/analytics rather than confirmed configuration.
Self-hosting notes
The README's own "Running Locally" section is the closest thing to self-hosting guidance: install with pnpm install, copy .env.example to .env.local, then run pnpm dev. Because the repository is archived, there are no maintained deployment guides beyond this, and the README's "Known Issues" section lists several unresolved Next.js/Prisma interaction bugs (including a Prisma ENOENT error on serverless deploys) that a self-hoster should expect to encounter and work around.
What to copy (and what not to)
The route-group organization ((auth), (dashboard), (docs), (editor), (marketing)) is a clean, still-relevant pattern for structuring a Next.js App Router project that mixes public marketing pages, gated app pages, and static documentation in one codebase. The Contentlayer + MDX pipeline for typed blog/docs content is likewise a reasonable reference even years later. What not to copy directly: the specific dependency versions (Next.js 13.3.2-canary, Prisma 4.13, TypeScript 4.7) predate several breaking changes in each of those projects, and the README itself warns that the code "does not reflect current best practices" and "may contain deprecated APIs or patterns."
Sources & repo audit
Independent analysis of repository at github.com/shadcn-ui/taxonomy. Spotted an inaccuracy? Use the claim form to request a correction.
Show this stack on your README or website
[](https://stackitfast.com/project/taxonomy)Paste it into your README. It shows your current stack and links to this page.
Scaffold it with your agent
Paste this prompt into Claude Code, Cursor, Windsurf or AGY to start a project with Taxonomy's architecture.
- 1Copy the promptThe full markdown spec, with every layer and decision.
- 2Open your AI toolClaude Code, Cursor, Windsurf or Copilot, in a new repo.
- 3Paste and scaffoldUse it as the first instruction; review before you ship.
# MISSION: Scaffold "Taxonomy" Production Architecture
You are an expert Senior Staff Software Architect and Full-Stack Engineer. Your mission is to scaffold and implement a production-grade, highly reliable, and modular codebase following the proven architecture of **Taxonomy**.
---
## 1. PROJECT SPECIFICATIONS & BENCHMARK
- **Reference Architecture**: Taxonomy
- **What It Does**: An open-source Next.js 13 App Router reference app combining authentication, subscriptions, MDX docs, and a dashboard editor. Officially archived by its author.
- **Domain & Category**: Open-Source SaaS Template
- **Production Scale**: 1-5 people
- **Development Mode**: AI-AGENT
- **Architectural Rationale**: Built to demonstrate the App Router, server components, and Next.js 13 data fetching patterns in one realistic, full-featured codebase.
- **Live Website Reference**: https://tx.shadcn.com
- **Source Repository**: https://github.com/shadcn-ui/taxonomy
---
## 2. PRODUCTION TECH STACK
- **Full Stack Array**: Next.js, React, TypeScript, Prisma, NextAuth.js, Radix UI, Tailwind CSS, Stripe, Zod
- **Primary Language(s)**: TypeScript, MDX
- **License of the reference repo**: MIT
- **Frontend**: Next.js — Implements the App Router across (auth), (dashboard), (docs), (editor) and (marketing) route groups in app/.; React — Hydrates interactive UI (editor, dashboard, forms) inside the Next.js App Router.; Tailwind CSS — Styles marketing, docs, and dashboard shells via utility classes and a custom config.; Radix UI — Provides unstyled accessible primitives wrapped by the local components/ui kit.
- **Backend & APIs**: NextAuth.js — Handles GitHub and email sign-in via the Prisma adapter in lib/auth.ts.; Stripe — Implements subscription billing and webhooks via lib/stripe.ts and lib/subscription.ts.
- **Data & persistence**: Prisma — Models Post and User in prisma/schema.prisma; generated client is used by lib/db.ts.; PlanetScale — README lists PlanetScale as the MySQL-compatible target database; not directly verified in captured manifests.
- **Infrastructure & deploy**: Vercel — README and @vercel/og/@vercel/analytics dependencies suggest the app is designed to deploy on Vercel; no vercel.json is present in the captured tree.
---
## 3. KEY ARCHITECTURAL DECISIONS (audited from https://github.com/shadcn-ui/taxonomy @ 298a885)
1. **Single Next.js app hosts marketing, docs, dashboard, and auth route groups**: The app/ directory splits routes into (auth), (dashboard), (docs), (editor), and (marketing) groups so each area can have its own layout while sharing the same Next.js 13 App Router build defined in app/layout.tsx.
2. **Prisma is the single data-access layer, generated on every install**: package.json runs `prisma generate` as a postinstall script, and lib/db.ts exports a shared PrismaClient instance, making prisma/schema.prisma the sole source of truth for the Post and User models.
3. **Content lives in MDX files compiled by Contentlayer, not a CMS**: content/blog, content/docs, content/guides, content/authors, and content/pages are MDX collections processed by contentlayer.config.js into typed data consumed by the (docs) and (marketing) route groups.
4. **Radix UI primitives are wrapped into a local components/ui kit**: More than two dozen @radix-ui/react-* packages are direct dependencies in package.json, composed into project-owned wrappers under components/ui rather than pulling in a pre-styled component library.
5. **Billing runs through Stripe, config-driven from config/subscriptions.ts**: lib/stripe.ts and lib/subscription.ts implement subscription status checks against plan definitions in config/subscriptions.ts, surfaced to users through components/billing-form.tsx.
6. **Repository is officially archived and kept as a historical reference**: The README states the project has been officially archived because Next.js has changed significantly since the App Router public preview, and points readers to the Vercel Templates directory for current starters instead.
---
## 4. NON-NEGOTIABLE ARCHITECTURAL GUARDRAILS
1. **Monorepo & Modular Separation**:
- Structure as a Turborepo monorepo with strict package boundaries:
- `apps/web`: Application UI, routing, layouts, and server endpoints.
- `packages/ui`: Shared design tokens, CSS variables, and Radix UI primitive components.
- `packages/db`: Database schemas, client singleton, declarative migrations, and seed scripts.
- `packages/config`: Shared TypeScript, ESLint, and build configurations.
2. **Strict Type Safety & Zero `any` Policy**:
- Enable `strict: true`, `noImplicitAny: true`, and `strictNullChecks: true`.
- Validate ALL external inputs, API request bodies, and query parameters with **Zod** schemas before execution.
3. **Frontend & Rendering Guidelines**:
- Utilize Next.js 15 App Router: default to React Server Components (RSC) for data fetching. Handle mutations through Server Actions with Zod validation. Keep 'use client' directives restricted strictly to interactive leaf components.
4. **Design System & Aesthetics**:
- Keep every color, radius, shadow and font in a single token file (CSS variables) and consume tokens everywhere; never hardcode hex values in components.
- Prefer crisp 1px borders and one subtle shadow scale over blurry default shadows. Pair one sans-serif for body/headings with one monospace for tags, badges, metrics, and code.
5. **Data Layer & Reliability**:
- Write declarative schema definitions with foreign keys, composite indexes on queried filters, and automated timestamp triggers.
- Use connection pooling and prepared statements for serverless database execution.
---
## 5. STEP-BY-STEP SCAFFOLDING ROADMAP
- **Phase 1: Workspace & Root Config**: Initialize package manager, monorepo configuration (`turbo.json`, `tsconfig.base.json`, `package.json`).
- **Phase 2: Database Schema & Client**: Set up the data layer (Prisma, PlanetScale): client, connection pool, models, and migration scripts.
- **Phase 3: Design Tokens & UI Primitives**: Build accessible `Button`, `Input`, `Card`, `Badge`, and layout wrappers inside `packages/ui`.
- **Phase 4: Core Application Routes & Handlers**: Implement primary authentication, user session handling, and application routes.
- **Phase 5: Quality Assurance & Build Verification**: Run `tsc --noEmit`, ESLint, Prettier, and smoke test suites to ensure zero compilation or runtime errors.
---
## 6. EXECUTION INSTRUCTIONS
1. Review all specifications, architectural guardrails, and stack choices above.
2. Present the full monorepo directory tree structure.
3. Systematically generate the complete, production-ready codebase according to the 5-phase roadmap above — starting with the root workspace setup, followed by the database schema, UI design system package, and full-stack application routes until the repository is fully scaffolded and ready to run.Frequently asked about Taxonomy
What is Taxonomy (shadcn-ui) built with?
It is a Next.js 13 App Router application written in TypeScript, using Prisma for data access, NextAuth.js for authentication, Radix UI primitives, and Tailwind CSS for styling.
Does Taxonomy use a database, and which one?
It uses Prisma as its ORM against a MySQL-compatible database; the README describes the reference deployment as running on PlanetScale, though the exact datasource is not captured in this audit.
Is the Taxonomy repository still maintained?
No. The README states the project has been officially archived and will no longer receive updates, since Next.js has changed substantially since the App Router preview era it was built against.
How does Taxonomy handle billing and subscriptions?
Stripe powers subscriptions, with plan definitions in config/subscriptions.ts and webhook/status logic in lib/stripe.ts and lib/subscription.ts, surfaced through a billing form component.
Where does Taxonomy get its blog and docs content from?
From MDX files under content/blog, content/docs, content/guides, and content/authors, compiled at build time by Contentlayer via contentlayer.config.js rather than fetched from a CMS.
One email a month: new deep dives and stack trends
New source-audited architectures, head-to-head comparisons and the monthly stack report. No spam, unsubscribe anytime.
Similar architectures
- PapermarkAI-agentDocument Analytics SaaS · SoloShares TypeScript · Next.js · React
- TypebotAI-agentConversational Form Builder · SoloShares TypeScript · Next.js · React
- shadcn/uiHybridCopy-Paste UI Component Architecture · 1M+ MAUShares React · Tailwind CSS · Radix UI
- FormbricksAI-agentSurvey & Feedback SaaS · 2-5 peopleShares Next.js · TypeScript · Prisma
- Cal.comClassicScheduling SaaS · 6-20 peopleShares TypeScript · Next.js · React
- DocumensoAI-agentE-signature SaaS · 2-5 peopleShares React · TypeScript · Prisma