TinaCloud is a hosted datalayer for TinaCMS. TinaCloud is the easiest way to use TinaCMS in production. It provides a hosted GraphQL endpoint for your content, Git integration, user management, editorial workflow features and more. It also grants authorization for other users (content creators, editors, marketers, etc) to login and edit their site without needing to grant direct access to the repository in GitHub. TinaCMS can be self-hosted or used independently of TinaCloud as well.
For more information, see TinaCloud Overview.
TinaCMS supports the latest LTS version of Node. We currently support v18, v20, and v22 of Node.
When comparing TinaCloud with self-hosting Tina, there are specific features unique to TinaCloud. These include:
In TinaCloud, there's a Git backed media feature. This integrates media into the Tina Media Manager and commits it directly to the Git repository. However, this functionality is not present in self-hosted Tina.
The reason for its absence is due to the process involving media uploads. When using the media manager in TinaCloud, images are uploaded to TinaCloud servers and distributed via a CDN. This ensures that images are accessible through the Tina Media Manager, as they require a URL for accessibility. Without this, images won't appear in the Media Manager until the site is rebuilt.
TinaCloud allows for changing the content branch at runtime, a feature managed through URL modification. However, in self-hosted Tina, changing branches is restricted to the build phase only.
This limitation means that commands like:
client.queries.page({ relativePath: 'home.mdx' }, { branch: 'main' })
are not functional in a self-hosted Tina setup.
The self-hosted backend does not currently have endpoints to support search functionality.
By default when using TinaCloud, the author on Git commits is the TinaCloud GitHub app. Some users prefer to know who made the change.
For this use case, it is possible to co-author Git commits in order to attribute the commit to an additional user. This can be enabled per-user in the TinaCloud account settings.
By default, the name and email of the co-author is configured according to your TinaCloud account, but they can be set to any valid name and email address.
Follow these steps to set it up:
Enable co-authoring
Note: The co-author email is publicly viewable on GitHub. If you want to hide your email, GitHub provides an anonymous email address for each user. You can find your anonymous email address in the GitHub email settings. This email address can then be configured in TinaCloud as the co-author.
A database is essential when using markdown with TinaCMS because the Data Layer, which serves Markdown and JSON files, relies on a database to perform various content management functions. While the Markdown files are the primary source of your content, the database acts as a cache to enable advanced features like search, pagination, and cross-referencing between files. It also provides an API, allowing content fetching akin to traditional headless CMS operations. Initially, TinaCMS's Data Layer operates unnoticed during local development and is managed by TinaCloud in production. With the introduction of self-hosted options, users can now opt for more control and customization, integrating their own authentication systems and hosting. The entire TinaCMS, including its Data Layer, is open-source, allowing for community-driven enhancements and support.
When developers are developing locally, it's often convenient to load/save content from their local filesystem rather than connecting to the content on TinaCloud.
When in local-mode, you will not need to login to enter edit-mode.
Note: Local-mode is meant for developing locally, and will not work when your site is hosted on production. When in local-mode, Tina tries to hit http://localhost:4001
, which isn't available at runtime on your production site (and neither is the underlying filesystem content).
Once you are ready to host your site in production and put editing behind authentication, you can self-host the CMS backend yourself or you can use TinaCloud's hosted backend.
Whether you're self-hosting Tina or using TinaCloud, Tina's Content API authenticates directly with GitHub removing the need for users to create GitHub accounts. Any changes that are saved by your editors will be committed to the configured branch in your GitHub repository.
Currently, yes, the first Git provider that TinaCloud integrates with is GitHub. Other Git providers may be available in the future.
It does! TinaCloud can work with sites inside monorepos by specifying the path to your tina
folder in your Project configuration.
If your repo is not a monorepo, there's no need to do any configuration. We'll expect your tina
folder at the root of your repo.
Here's an example monorepo structure that works with TinaCloud:
/projects/site-a/projects/site-b/projects/site-c
See Path To Tina for more information.
When a user logs in from your site, we will pop open a login window. When login is complete, we will attempt to send a message back to the main window.
The most common reasons for this issue are:
Make sure to includehttps
in the Site URL eg: https://forestry.io or if you are testing locally, it might be something likehttp://localhost:3000
There is a known limitation where Tinacms doesn't load assets correctly when the admin is deployed to a sub-path: (https://jamespohalloran.github.io/my-site-root/admin/
for example). To resolve the issue, in your Tina config file, set the build.basePath
property to value of the sub-path (e.g. my-site-root
).
This error means that the TinaCMS admin HTML file failed to load the JavaScript bundle. This generally happens for a few reasons:
When you run tinacms dev
locally, Tina will generate a development admin/index.html file, which loads its assets from localhost. For production, this file should be built in CI using tinacms build
. If a developer manually removes the admin/index.html file from their .gitignore
, they may run into this issue.
Unable to find record 'tina/__generated__/_graphql.json'
error?TinaCloud's GraphQL API returns this error when it cannot find a file in your GitHub repository. This may occur under the following circumstances:
tina
folder (and __generated__
subfolder) is not in your GitHub repository remote..gitignore
file excluding it.tina
folder.tina
folder.https://content.tinajs.io/content/{tina_client_id}/github/{branch}
where {tina_client_id}
matches the Client ID on the Project in TinaCloud and {branch}
is a valid branch.The local GraphQL schema doesn't match the remote GraphQL schema.
errors?If you are getting this error in your build logs, it means that the tina/tina-lock.json
in your deployed site doesn't match the version that is in TinaCloud.
To resolve it, make sure you have latest versions of @tinacms/cli
and tinacms
in your project, and then run the dev command locally. Commit any changes to the tina/tina-lock.json
and push those to the git repository linked in TinaCloud.
If you are getting this error when access the TinaCMS interface, it can be caused by a mismatch between the version of tinacms
and @tinacms/cli
on the project. Update both dependencies to the latest versions and run the dev command locally. Commit any changes to the tina/tina-lock.json
and push those to the git repository linked in TinaCloud.
If you receive an error like The specified branch, 'my-branch-name', has not been indexed by TinaCloud
, try the following._createMdxContent
tina/config.ts
. Note, that this value may be set as an environment variable in your CI build process.tina/tina-lock.json
file in that branch, commit the change, and push it to GitHub. This will initiate indexing for the branch and (after a few minutes) the error should be resolved.There was a problem saving your document
errors?When using TinaCloud without Editorial Workflow, you need to ensure that the TinaCloud App is able to commit to the selected branch of the repository.
If it cannot, you will see an error of the following form:
Tina caught an error while updating the page:Error: Unable to fetch, errors:Error in PUT for src/pages/some-page.md
Video: Bypassing GitHub branch protection with TinaCMS (3min)
Generally this happens when there is branch protection on your main branch and TinaCloud is unable to bypass it. Until July 2024, the TinaCloud GitHub app had admin rights to repositories which allowed it to bypass these rules for most repositories.
To fix this issue, either:
Invalid or undefined branch
errors?The current branch that Tina is using is invalid or undefined. Double check that the correct branch is selected and it does in fact exist.
You can view the branches that have been indexed by TinaCloud by visiting https://app.tina.io/projects/<your-project-id>/configuration
.
tina directory not pushed to git
errors?Everything in the tina
directory (except the __generated__
folder) needs to be pushed up to the git repository. Be sure to add it to your git repository (and make sure you don't have it listed in a .gitignore
). Also make sure that the branch you're trying to use has the tina
directory and is up to date.
API URL is misformatted
errors?The ContentAPI URL isn't formatted correctly. See here for information on how the URL should be formatted.
Make sure your API URL isn't set to point at your local GraphQL server when in production. You should be pointing to the ContentAPI.
If you are working locally, make sure your GraphQL server is running. See here for more information.
Double check you aren't trying to access a document that doesn't exist.
Last Edited: July 31, 2024
© TinaCMS 2019–2024