Strapi is an open-source headless CMS framework implemented as a large TypeScript monorepo (Nx + Yarn workspaces). In production it runs a Koa-based Node.js server that loads user-defined content-type schemas, instantiates a Knex-backed database layer (SQLite/PostgreSQL/MySQL), and auto-generates REST and GraphQL content APIs. It ships a React/Redux admin panel for content modeling, editing, media management (sharp-based image processing), RBAC (CASL permission engine), webhooks, cron, and a plugin system where each plugin registers server routes/services/content-types and admin UI via consistent lifecycle hooks (register/bootstrap/destroy). Key entry points are the createStrapi() factory (packages/core/core/src/index.ts), the strapi CLI (packages/core/strapi/bin/strapi.js), renderAdmin() (packages/core/strapi/src/admin.ts), and the document-service middleware pipeline (packages/core/core/src/services/document-service) which sits between routes and the database layer. Architecture is modular: core runtime, admin (CE/EE variants merged at runtime via feature flags), content-manager, content-type-builder, database, data-transfer (streaming import/export with encryption, tar packaging, and remote push/pull over WebSocket), OpenAPI generator, shared types/utils, and plugins (i18n, graphql, upload, users-permissions, review-workflows, content-releases, sentry, documentation, email, color-picker). The primary data flow is HTTP (REST/GraphQL) → controllers → document service middleware → entity service → database layer with subscriber-based lifecycle hooks; a parallel flow handles data-transfer streaming of entities, links, and assets between instances or to files. Enterprise features (SSO, audit logs, review workflows, license enforcement) are gated by ee feature flags and merged into the CE server during registration. Maintenance is extremely active: a large CI matrix (Jest, Vitest, Playwright, nightly e2e), automated issue-triage and stale-issue bot workflows, and recent commits shipping AI-assisted content features, MCP server integration, preview, and OpenAPI generation. Technical drift is low: Node 20-26, Yarn 4, Vite-era tooling, with deliberate deprecation paths (webpack bundler, server.globalProxy, admin.autoOpen) rather than abandoned code. Internal debts include the global global.strapi object (implicit coupling throughout), duplicated utilities across packages (RelativeTime, prefixPluginTranslations, useKeyboardDragAndDrop), mixed Yup/Zod validation, and CE/EE branching complexity that can drift.
Keystone 6 is a powerful, schema-driven headless CMS and application framework for Node.js. It allows developers to define their data model in TypeScript, from which it automatically generates a full GraphQL API, a Prisma ORM layer, and a beautiful React-based Admin UI. The framework excels in its extensibility, offering a rich document editor with custom component blocks, granular access control, flexible authentication strategies, and deep integration with modern frameworks like Next.js, Remix, and Astro. This monorepo contains the core packages, a comprehensive set of examples, and extensive integration tests. While the codebase is actively maintained and demonstrates high craftsmanship, its sheer size and explicit internal instability markers indicate a medium level of technical drift in some areas.
ApostropheCMS is a full-stack content management system built with Node.js, MongoDB, and Vue.js. It provides a modular architecture with extendable content types (pages, pieces, widgets), a rich admin UI with in-context editing, headless API support via Astro integration, and extensive internationalization and permission systems. The monorepo contains the core CMS package, CLI tools, database adapters, file storage abstraction, AI content generation helpers, import/export utilities, and many first-party modules for SEO, forms, events, and more. The codebase is large and well-tested, with a strong emphasis on security (prototype pollution guards, permission regression tests) and developer experience (scaffolding, OpenAPI generation). However, it shows signs of technical drift in some legacy packages and a complex build pipeline.
This repository powers the tina.io website: a marketing, blog, changelog, and documentation hub for TinaCMS (an open-source Git-backed headless CMS). Built with Next.js 14 (App Router), TypeScript, Tailwind CSS, and TinaCMS itself as the content management system, it dogfoods the product. Content is stored as JSON (structured pages with block-based templates) and MDX (blog posts with rich components). The site features internationalization (English/Chinese with automated translation workflows), Algolia search indexing, API routes for Mailchimp, SendGrid, GitHub, and YouTube integrations, OG image generation via Satori/resvg, visual regression testing with Playwright, and a comprehensive UI component library. The architecture is a standard Next.js monolith with a block-based page builder and a custom TinaCMS schema defining 12 content collections. While the codebase is well-organized and actively maintained, it exhibits some technical debt: mixed styling systems (styled-components and Tailwind), TypeScript strict mode disabled, and a large block template set that may become unwieldy. The i18n implementation relies on duplicated route trees, which a design document aims to refactor.