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.6Kstars
727forks
Apache License 2.0
TypeScript

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

No spam. Unsubscribe anytime.

Join 750+ subscribers
No spam. Unsubscribe anytime.

Search