TinaCMS

An open-source, Git-backed headless CMS that gives editors a live visual editing UI over Markdown, MDX, JSON, and YAML content while developers keep everything in version control.

13.8K stars
752 forks
Apache License 2.0
TypeScript

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
92 /100 Excellent
Development Activity 100
Maintenance 100
Community 68
Maturity 60
Momentum 40

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
74 /100 Good
Architecture 80
Code Quality 82
Innovation 68
Learning Curve 65

Dependency Health

Score based on the health, technical quality, freshness, and vulnerability profile of runtime dependencies. How we score it →
59 /100 Fair
Library Repo Health 59
Library Technical Quality 78
Version Staleness 60
Vulnerabilities 34
Dependency Footprint 40

TinaCMS is a headless content management system built around the idea that content should live in your Git repository, not a proprietary database. It reads and writes Markdown, MDX, JSON, and YAML files directly, exposes them through a generated GraphQL API, and layers an optional live-preview visual editor on top so non-technical editors can change content without touching code or learning Git.

The project is a pnpm/Turborepo monorepo: the core tinacms package handles the editing UI and client, @tinacms/cli scaffolds schemas and runs the local GraphQL server, @tinacms/graphql and @tinacms/schema-tools generate the content API from your schema definition, and a set of storage adapters (next-tinacms-s3, -azure, -cloudinary, -dos) plug in media handling for different backends. Auth integrations for Clerk and Auth.js, plus a GitHub content-provider package, round out the pieces needed for a production editing workflow.

TinaCMS is fully usable self-hosted and free — the open-core model reserves its hosted collaboration layer, TinaCloud, for teams that want managed content APIs, role-based access, and an editorial workflow without running their own GraphQL server.

What You Get

  • A generated GraphQL API over your existing Markdown, MDX, JSON, and YAML content files
  • An optional live visual editing UI that writes changes back to your Git repository as commits
  • A CLI (@tinacms/cli) that scaffolds schemas, runs a local dev GraphQL server, and builds the admin UI
  • Storage adapters for S3, Azure, Cloudinary, and DigitalOcean Spaces, plus Auth.js/Clerk auth integrations

Common Use Cases

  • Giving marketing or content teams a visual editor for a Next.js or Astro site’s Markdown content without exposing them to Git
  • Migrating off a proprietary headless CMS while keeping content in version control instead of a vendor’s database
  • Adding structured, schema-validated content editing to an existing static site generator setup
  • Running a fully self-hosted content workflow with no dependency on a hosted CMS API

Under The Hood

Architecture TinaCMS is organized as a pnpm/Turborepo monorepo where packages/tinacms provides the editing UI and toolkit, packages/@tinacms/cli owns schema scaffolding and the local GraphQL dev server, and packages/@tinacms/graphql + schema-tools handle turning a user-defined schema into a queryable API over the filesystem. Storage and auth are pulled in as separate adapter packages (next-tinacms-s3/azure/cloudinary/dos, tinacms-authjs, tinacms-clerk) rather than baked into the core, so swapping a media backend or auth provider doesn’t touch the editing engine itself. The tinacms-gitprovider-github package isolates the Git-write path, which matters since committing editor changes back to a repo is the core mechanic the rest of the system depends on.

Tech Stack TypeScript throughout, built with Turborepo and pnpm workspaces, tested with Vitest and Playwright for end-to-end coverage, and distributed as scoped npm packages under tinacms and @tinacms/*. The CLI generates a GraphQL schema and server from user-authored content models, and the framework integrates natively with Next.js (with an Astro adapter package as well) rather than being framework-agnostic from day one.

Code Quality Over 200 test files were found across the packages, with CI running build, test, and lint stages on every push to main — a meaningfully more tested codebase than most self-hosted CMS alternatives its size, consistent with its multi-year, actively maintained history.

What Makes It Unique Most headless CMS products store content in their own database and require an API call to read it back; TinaCMS instead keeps content as plain Markdown/MDX/JSON/YAML files in your Git repo and generates the GraphQL layer on top of that, so the CMS and the git history stay the same source of truth — editors get a visual UI, but every change is still a commit.

Self-Hosting

Licensing Model Apache-2.0 licensed — the core CMS, GraphQL layer, and editing UI are fully open source and self-hostable with no license key.

Self-Hosting Restrictions None for the core editing and content-API functionality. What’s gated is the hosted companion product, TinaCloud — a separate managed service (not required to use TinaCMS itself).

Enterprise Features TinaCloud plans (per tina.io/pricing) add: more editor seats, additional roles, an editorial review workflow, AI-assisted editing features, a management API, SSO, and GitHub Enterprise support at the top Enterprise tier — none of which are required to run TinaCMS self-hosted.

Cloud vs Self-Hosted Self-hosted TinaCMS gives you the full editor and content API; TinaCloud adds a managed backend, multi-user roles, and editorial workflow on top instead of you running your own GraphQL server and auth.

License Key Required No, for self-hosted use. TinaCloud is a separate subscription product.

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers