CodeVetter
← All unpacks
CodeVetter · Repo Unpack evidence

strapi/strapi

Scanned commit 93476f908c dated 2026-10-02 — last upstream commit. Generated by codevetter 1.15.0 on 2026-10-02.

github.com/strapi/strapi ↗ · 3998 files · 17.6 MB · scan capped

Open-source headless CMS, self-hosted or Cloud you're in control.

Deep analysis by cli:codex via the codex CLI on 2026-10-02 (528s) — every claim below links to its cited source files. Source inspection; upstream code and tests were not executed.

Overview

Strapi is a headless CMS for developers building content APIs and editors managing structured content through a React admin application. At commit 93476f908c08d6d3d5215c06483829e3c6da1b32, its Node/Koa runtime assembles content models, plugins, authentication strategies, and database services through a central Strapi container. Its distinctive persistence model separates document identity from locale and draft/published rows, with the Document Service coordinating components, relations, transactions, and publication events. This brief reflects bounded source inspection, including startup, REST creation, authentication, publication, and media persistence flows.

System map

The runtime centers on a Strapi dependency container, with a CLI entrypoint and separate HTTP/admin application boundaries. Content persistence passes through the Document Service into a Knex-backed database package. Plugins and providers assemble application capabilities, while Nx coordinates package builds and checks. Architecture diagrams and contributor documentation are separately built artifacts.

Feature catalog

The inspected surfaces support model-driven APIs, browser editing, publication/localization, identity management, and media operations. Optional GraphQL and licensed editorial capabilities extend the base CMS. CLI commands cover application operation and data movement, while MCP provides a separate authenticated automation surface. These eight capability groups describe the inspected implementation; the bounded inventory is not an exhaustive screen or route catalog.

Data flow

HTTP data crosses authentication and policy boundaries before controller validation and sanitization. The Document Service translates document parameters into locale/status-specific database operations and owns transaction coordination. Media bytes, metadata, session state, and event payloads have distinct persistence/output boundaries. Browser state and MCP transport responses follow separate paths from ordinary REST response handling.

Behavior traces

The following traces were followed by reading implementations in execution order. Startup proceeds through registration, database synchronization, middleware/routing setup, and listening. REST creation continues through sanitization, document transforms, entry creation, and relation persistence. Authentication branches into legacy or refresh issuance, while publishing and uploading cross additional state boundaries.

Testing signals

Tests and CI were inspected, not executed; test existence does not establish a passing result. Jest remains central, with separate Vitest projects and Playwright browser suites. Inspected API tests assert persisted document behavior, while authentication unit tests use mocked database/session dependencies. CI configuration shows conditional execution, multiple runtime/database targets, and explicit browser-coverage limitations; no comprehensive coverage measurement was performed.

Risk map

These are source observations and explicitly labeled hypotheses, not confirmed vulnerabilities. Startup and publication are persistence hotspots because they synchronize schemas or replace related rows. Authentication and MCP rely on different enforcement paths, and upload provider operations cross a storage boundary outside database transactions. Configuration compatibility, global state, and CI conditions require focused review when changing these areas.

Extension points

Extensions are intended to enter through factories, plugin contracts, registries, and lifecycle hooks. Backend and browser plugins have separate registration interfaces. Document middleware, provider capabilities, GraphQL extension configuration, and MCP definitions offer additional integration boundaries. Several APIs enforce registration timing or preserve default behavior through explicit fallback logic.

Contributor handoff

Use this brief as an anchored navigation aid for the pinned commit, then inspect the owning package and tests before changing behavior. Tests and CI were inspected, not executed; the inventory and coverage assessment are bounded. Preserve transaction, authorization, provider, and license boundaries, and distinguish current implementation from historical contributor descriptions. This investigation authorized public-source reads only and performed no repository execution or edits.

Languages

LanguageFilesShare of source
TypeScript442883%
JavaScript91317%
JSON776docs/config
Markdown214docs/config
YAML53docs/config
Shell70%
HTML3docs/config
CSS1docs/config

Start reading here

Probable source entrypoint: packages/ — inferred from the directory tree and manifest, not the upstream docs.

Source roots

packages/ (2443 files)

Repository structure

Top-level pathFiles
packages/2443
tests/742
examples/318
docs/177
.github/117
templates/68
scripts/37
architecture/36

Docs found: AGENTS.mdCLAUDE.mdCONTRIBUTING.mdREADME.mddocs/README.mddocs/agents/domain.mddocs/agents/issue-tracker.mddocs/agents/triage-labels.mddocs/docs/docs/00-intro.mddocs/docs/docs/01-core/admin/00-intro.md

Package

package.json — strapi, 80 declared dependencies.

@babel/core@babel/eslint-parser@babel/preset-react@commitlint/cli@commitlint/config-conventional@commitlint/prompt-cli@nx/js@playwright/test@rollup/plugin-commonjs@rollup/plugin-dynamic-import-vars@rollup/plugin-image@rollup/plugin-json

CI & config entrypoints

Structural health signals

Average score 8.5/10 across 96 analyzed source files; 6 hotspots surfaced.

These are deterministic review leads — size, churn, and structural signals — not proof of a bug in this project.

Recent history