Skip to content
STACK IT FAST

Taxonomy

Curated OSSAI-agentOpen-Source SaaS Template1-5 people

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
Frontend & UI
  • 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.
Backend & APIs
  • 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.
Data & Persistence
  • 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)
Infrastructure & Deploy
  • 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 SVG
Taxonomy architecture diagramBrowser → Next.js App Router (HTTPS); Next.js App Router → NextAuth.js (session); Next.js App Router → Stripe billing (plan checks); Next.js App Router → Contentlayer (docs · blog); Next.js App Router → Prisma Client (posts); NextAuth.js → Prisma Client (adapter); Contentlayer → content/ MDX (build time); Prisma Client → MySQL (PlanetScale) (SQL); NextAuth.js → GitHub OAuth (OAuth); Stripe billing → Stripe (API)CLIENTSSERVICESWORKERS & JOBSDATA & STORAGEEXTERNALBrowsermarketing · docs · dashboardNextAuth.jsGitHub · email sign-inNext.js App Router5 route groups · app/Stripe billinglib/stripe.ts · subscription.tsPrisma Clientlib/db.ts · Post · UserContentlayerMDX to typed dataMySQL (PlanetScale)per READMEcontent/ MDXblog · docs · guidesGitHub OAuthsign-inStripesubscriptionssessionplan checksHTTPSdocs · blogpostsadapterbuild timeSQLOAuthAPI
How the main components of Taxonomy connect, drawn from the audited repository.
Diagram 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
  1. 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.

  2. 02

    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. 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.

  4. 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.

  5. 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.

  6. 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

Audited
Sep 17, 2026
Commit
298a885
License
MIT

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
Tech stack of Taxonomy
[![Tech stack of Taxonomy on STACK IT FAST](https://stackitfast.com/badge/taxonomy.svg)](https://stackitfast.com/project/taxonomy)

Paste it into your README. It shows your current stack and links to this page.

Use this stack

Scaffold it with your agent

Paste this prompt into Claude Code, Cursor, Windsurf or AGY to start a project with Taxonomy's architecture.

  1. 1Copy the promptThe full markdown spec, with every layer and decision.
  2. 2Open your AI toolClaude Code, Cursor, Windsurf or Copilot, in a new repo.
  3. 3Paste and scaffoldUse it as the first instruction; review before you ship.
use-this-stack.md · 60 lines · 6.8 KB
# 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.
Scaffolded something with this prompt?
Would you pick this stack for a open-source saas template project?

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.

use-this-stack.md