Git-backed Markdown, MDX and YAML with a GraphQL layer
TinaCMS is a headless CMS whose content stays in files: it reads and writes the Markdown, MDX, JSON or YAML files sitting in the site's Git repository. You declare collections in tina/config.ts, and Tina derives a GraphQL API and matching TypeScript types from them. The editor lives at the site's /admin route.
During development, tinacms dev runs that GraphQL server locally and edits land straight in the repository's files. In production, something has to receive the edits and commit them: TinaCloud, the vendor's hosted service, or a backend you run yourself.
Strapi and StudioCMS go the other way and keep content in a database. The open source headless CMS comparison sets out what each of them requires.
Every save lands as a commit
- Every save is a commit: history, diffs and rollbacks go through the Git tools you already use. TinaCloud and the self-hosted backend both index the files in a database, which the docs call "more of an ephemeral cache", so the repo stays the source of truth.
- Types derived from the schema: the generated GraphQL client returns typed data, and a single query can follow references between documents (
post.author.firstName). - Visual editing in React and Astro: editors click fields in the rendered page, through the
useTinahook in React or the@tinacms/astropackage, which needs no React and, outside statically built pages, serves visitors the same HTML as a Tina-free site. Astro is the starter the docs recommend for new projects.
GitHub-only cloud backend, or three modules to self-host
TinaCloud hosts the production backend, and only for GitHub. The service provides the GraphQL endpoint, the file index, user management and the commits. The FAQ names GitHub as the only Git provider it integrates with so far. The free plan covers two users. Past that, each project is billed yearly: $290 for three users (Team), $490 for five (Team Plus), $2,990 for twenty (Business). SSO sits in the Enterprise plan, priced on request.
Pull request review is a paid feature. With Editorial Workflow, a save no longer goes straight to the protected branch: TinaCloud opens a branch and a draft pull request instead. The pricing page lists it from Team Plus upwards.
Dropping TinaCloud means assembling three modules. The self-hosted backend is a single Node.js API function, deployed to a serverless platform such as Vercel or Netlify. It combines an auth provider (Auth.js, Clerk or your own), a database adapter (Vercel KV or MongoDB, the two official ones) and a Git provider. Only the GitHub provider ships: for any other forge, you write your own against the GitProvider interface.
Self-hosting loses three features. The FAQ lists Git-backed media, which TinaCloud serves through its CDN; switching branches at runtime, which is fixed at build time instead; and search. Media then goes to an external provider, and the repo publishes packages for S3, DigitalOcean Spaces, Cloudinary and Azure.
A v4 is being built in the same repository. The README in packages/v4 puts v3 in "support mode", bug fixes only, and announces v4 under a new npm name, @tinacms/tinacms, not yet on the registry as of October 7, 2026. The v4 deprecation list includes @tinacms/datalayer: a self-hosted backend that calls it directly will have to move to a Level adapter (MongoDB, SQLite or Upstash Redis).
Breaking changes ship through the companion packages. The tinacms package has published 39 releases since January 2026, up to 3.14.3 on October 7. @tinacms/cli shipped two majors in under three weeks: 3.0.0 (September 14) changes the type of rich-text fields and breaks TypeScript code that relied on any, and 4.0.0 (October 1) removes the Forestry migration.
