KeystoneJS vs TinaCMS

KeystoneJS and TinaCMS are both open-source headless CMS options for developers, but they store and edit content very differently. KeystoneJS (MIT-licensed,…

Best for KeystoneJS: KeystoneJS suits developers building data-driven applications who want a database-backed GraphQL API and auto-generated admin UI, with zero licensing cost regardless of team size.
Best for TinaCMS: TinaCMS suits teams publishing Markdown/MDX content via static site generators like Next.js, Astro, Hugo, or Jekyll who want non-technical editors to make visual, in-context edits that commit directly to Git.

At a Glance

 KeystoneJSTinaCMS
Primary categoryCMSCMS
RatingNot documentedNot documented
Pricing modelOpen Sourcefreemium
Starting priceFreeFree (self-hosted); TinaCloud from $24/month
Free planNot documentedYes
Free trialNot documentedNot documented
PlatformsWebWeb
Team collaborationNot documentedNot documented
AI featuresNot documentedNot documented
Public APIYesYes

Key Differences

Content Storage Model

KeystoneJS: KeystoneJS persists content in a database, with schema migrations handled automatically via Prisma.

TinaCMS: TinaCMS stores content directly in a Git repository as Markdown, MDX, JSON, or YAML, preserving full version history.

Database-backed content suits complex relational data; Git-backed content suits version-controlled static sites.

Editing Experience

KeystoneJS: KeystoneJS auto-generates a customizable admin UI with a rich text WYSIWYG editor from your schema.

TinaCMS: TinaCMS offers visual, in-context editing where authors edit live pages directly, with changes synced back to Git.

In-context editing lets non-technical authors see exactly what they're publishing as they edit.

Pricing Model

KeystoneJS: KeystoneJS is entirely free and open source under MIT, with no pricing plans at all.

TinaCMS: TinaCMS is freemium: Tina Cloud is free for 2 users, then Team is $24/month, Team Plus (with editorial workflow) is $41/month, Business is $249/month, and Enterprise is custom.

Total cost scales differently as a team grows past the free tier.

Auto-Generated API

KeystoneJS: KeystoneJS generates a full GraphQL API with pagination, sorting, filtering, and CRUD operations from your schema.

TinaCMS: TinaCMS auto-generates a GraphQL API that lets any frontend query and mutate Git-backed content.

Both offer schema-driven GraphQL, but query against different underlying stores (database vs. Git files).

Maintainer & Governance

KeystoneJS: KeystoneJS is maintained by Thinkmill, an Australian consultancy, since the project's first commit in 2013, with 250+ contributors.

TinaCMS: TinaCMS was originally launched by Forestry.io and has been maintained by SSW, an Australian software consultancy, since SSW acquired the project in 2024.

Project maintainership affects long-term update cadence and roadmap direction.

Feature-by-Feature

Content Model & Editing

FeatureKeystoneJSTinaCMS
Content storage backendAvailableAvailable
Visual, in-context editingUnavailableAvailable
Auto-generated admin UIAvailableNot documented
Full version history via GitNot documentedAvailable

API & Developer Experience

FeatureKeystoneJSTinaCMS
Auto-generated GraphQL APIAvailableAvailable
Self-hostable backend without vendor cloudAvailableAvailable
Documented framework integrationsNot documentedAvailable
Field/operation-level access controlAvailableAvailable

Pricing & Support

FeatureKeystoneJSTinaCMS
Free tier / free to useAvailableAvailable
Paid editorial workflowNot documentedAvailable
Custom Enterprise supportAvailableAvailable

Pricing Compared

Starting price reflects the lowest paid tier, not the full cost for every team size or usage level.

KeystoneJS

Open Source — Free N/A

TinaCMS

Free — $0 forever
Team — $24/month monthly (or $290/year)
Team Plus — $41/month monthly (or $490/year)
Business — $249/month monthly (or $2,990/year)
Enterprise — Custom contact sales

Pros & Cons

KeystoneJS

Pros

  • Completely free, open-source, self-hosted with no licensing fees
  • GraphQL API and admin UI generated automatically from schema
  • Strong TypeScript support and Prisma-based migrations
  • Fine-grained, code-defined access control
  • Backed by an experienced consultancy (Thinkmill) with enterprise delivery history

Cons

  • No official managed hosting offering from the Keystone project
  • Requires Node.js and database operational expertise to self-host
  • Smaller ecosystem and plugin marketplace than Strapi or WordPress
  • GraphQL-first design has a learning curve for teams used to REST
  • Migration from older Keystone (v5/Express/MongoDB) versions requires significant rework

TinaCMS

Pros

  • Content stays in the team's own Git repository rather than a proprietary vendor database, avoiding lock-in
  • True inline visual editing gives non-technical editors a comfortable, WYSIWYG-like experience
  • Free self-hosted option with no user limits for teams comfortable managing their own infrastructure
  • Strong fit for JAMstack and static-site workflows already using Next.js or Gatsby
  • Editorial workflow and role-based access make it viable for larger content teams via TinaCloud

Cons

  • Primarily built for React-based frameworks, so it is a weaker fit for non-React stacks
  • Requires developer setup to define the content schema before non-technical editors can use it
  • Free TinaCloud tier is capped at two users, so most real teams need a paid plan
  • Git-based content model has a learning curve for editors unfamiliar with version control concepts
  • Recent ownership change following the SSW acquisition introduces some uncertainty about the open-source project's long-term roadmap

Use Cases

Choose KeystoneJS: KeystoneJS suits developers building data-driven applications who want a database-backed GraphQL API and auto-generated admin UI, with zero licensing cost regardless of team size.
Choose TinaCMS: TinaCMS suits teams publishing Markdown/MDX content via static site generators like Next.js, Astro, Hugo, or Jekyll who want non-technical editors to make visual, in-context edits that commit directly to Git.
Need both: There's no typical scenario for combining them on one project since both are alternative headless CMS backends for the same content layer. A larger organization might run KeystoneJS for an internal data-driven app and TinaCMS for its Git-based marketing blog, but that's operating two separate systems rather than integrating them.

KeystoneJS

  • Custom application backends — Development teams use KeystoneJS to build backends for web and mobile applications with a generated GraphQL API.
  • Content-driven websites — Teams build static and dynamic marketing sites and blogs powered by Keystone's content model and admin UI.
  • Multi-channel content distribution — Organizations use Keystone's GraphQL API to distribute content across web, mobile and other channels from one source.

TinaCMS

  • JAMstack marketing sites with a Git-based workflow — Development teams building marketing or documentation sites on Next.js or Gatsby use TinaCMS to let content editors update copy without needing to write Markdown by hand or use a separate database-backed CMS.
  • Documentation sites with reviewable content changes — Teams maintaining developer documentation use TinaCMS's Git-backed storage so content edits go through the same pull-request review process as code changes.
  • Agencies building client-editable static sites — Agencies use TinaCMS and TinaCloud to hand off statically generated sites to clients who need to edit copy and images themselves without touching code or a GitHub account.

Frequently Asked Questions

How does content storage differ between KeystoneJS and TinaCMS?

KeystoneJS stores content in a database, with migrations handled automatically via Prisma. TinaCMS stores content directly in your Git repository as Markdown, MDX, JSON, or YAML, giving full version history.

Is KeystoneJS free while TinaCMS is not?

KeystoneJS is entirely free under the MIT license with no pricing plans. TinaCMS is freemium: Tina Cloud is free for 2 users, with paid Team plans starting at $24/month for more users and features.

Which offers visual, in-context editing?

TinaCMS offers visual, in-context editing where authors edit live pages with changes synced to Git. KeystoneJS instead provides an auto-generated, form-based admin UI with a rich text editor.

Do both generate a GraphQL API automatically?

Yes. Both KeystoneJS and TinaCMS auto-generate a GraphQL API from your schema or content structure, though they query different underlying stores (database vs. Git).

Who maintains each project today?

KeystoneJS is maintained by Thinkmill, an Australian consultancy, since 2013. TinaCMS was originally built by Forestry.io and has been maintained by SSW, another Australian software consultancy, since SSW acquired the project in 2024.

Can either be self-hosted without paying for a cloud service?

Yes. KeystoneJS is fully self-hostable under its MIT license. TinaCMS's Apache-2.0 backend can also be self-hosted on any Express-compatible platform as an alternative to the hosted Tina Cloud service.

Read the full KeystoneJS review · Read the full TinaCMS review