- #6284
f2dd173Thanks @kulesy! - fix(auth): Add "type": "module" to package.json to fix ES module loading
-
#6262
3a12a39Thanks @0xharkirat! - 🔒 Security: Update Next.js to 14.2.35 to address security vulnerabilities- Address CVE-2025-55184 (high): DoS via malicious HTTP request causing server to hang
- Address CVE-2025-67779 (high): Complete fix for CVE-2025-55184 DoS vulnerability
- Updated Next.js devDependency from 14.2.10/14.2.24 to 14.2.35
- See: https://nextjs.org/blog/security-update-2025-12-11
- #5744
98a61e2Thanks @Ben0189! - Upgrade Plate editor to v48 beta, integrating latest features and improvements.
- #5602
ab43169Thanks @wicksipedia! - fix naming of TinaCloud
- #5486
d7c5ec1Thanks @JackDevAU! - Update dependencies across packages
- #5351
0345852Thanks @JackDevAU! - Removesfetch-ponyfilldependency and use native fetch (node18+)
- #4843
4753c9bThanks @JackDevAU! - ⬆️ Update Minor & Patch Dependencies Versions
- #4804
d08053eThanks @dependabot! - ⬆️ Updates Typescript to v5.5, @types/node to v22.x, next.js to latest version 14.x, and removes node-fetch
- e58b951: update vulnerable packages so npm audit does not complain
- 957fa26: update to React 18
- 9076d09: update next js version from 12 to 14 in tinacms packages
- 0503072: update ts, remove rimraf, fix types
-
a65ca13f2: ## TinaCMS Self hosted Updates
- Deprecated:
onPut,onDelete, andlevelarguments increateDatabase. - Added:
databaseAdapterto replacelevel. - Added:
gitProviderto substituteonPutandonDelete. - New Package:
tinacms-gitprovider-github, exporting theGitHubProviderclass. - Interface Addition:
gitProvideradded to@tinacms/graphql. - Addition: Generated database client.
import { createDatabase, createLocalDatabase } from "@tinacms/datalayer"; import { MongodbLevel } from "mongodb-level"; import { GitHubProvider } from "tinacms-gitprovider-github"; const isLocal = process.env.TINA_PUBLIC_IS_LOCAL === "true"; export default isLocal ? createLocalDatabase() : createDatabase({ gitProvider: new GitHubProvider({ branch: process.env.GITHUB_BRANCH, owner: process.env.GITHUB_OWNER, repo: process.env.GITHUB_REPO, token: process.env.GITHUB_PERSONAL_ACCESS_TOKEN, }), databaseAdapter: new MongodbLevel<string, Record<string, any>>({ collectionName: "tinacms", dbName: "tinacms", mongoUri: process.env.MONGODB_URI, }), namespace: process.env.GITHUB_BRANCH, });
- GitHubProvider Usage: Replace
onPutandonDeletewithgitProvider, using the providedGitHubProviderfor GitHub.
const gitProvider = new GitHubProvider({ branch: process.env.GITHUB_BRANCH, owner: process.env.GITHUB_OWNER, repo: process.env.GITHUB_REPO, token: process.env.GITHUB_PERSONAL_ACCESS_TOKEN, });
- Custom Git Provider: Implement the
GitProviderinterface for different git providers.
If you are not using Github as your git provider, you can implement the
GitProviderinterface to use your own git provider.class CustomGitProvider implements GitProvider async onPut(key: string, value: string) // ... async onDelete(key: string) // ... const gitProvider = new CustomGitProvider();
- Renaming in Code: Change
leveltodatabaseAdapterfor clarity.
createDatabase({ - level: new MongodbLevel<string, Record<string, any>>(...), + databaseAdapter: new MongodbLevel<string, Record<string, any>>(...), })- Usage: Implement a local database with the
createLocalDatabasefunction.
import { createLocalDatabase } from "@tinacms/datalayer"; createLocalDatabase(port);
- Updated
database.{ts,js}File:
import { createDatabase, createLocalDatabase, GitHubProvider } from '@tinacms/datalayer'; import { MongodbLevel } from 'mongodb-level'; const isLocal = process.env.TINA_PUBLIC_IS_LOCAL === 'true'; export default isLocal ? createLocalDatabase() : createDatabase({ gitProvider: new GitHubProvider(...), databaseAdapter: new MongodbLevel<string, Record<string, any>>(...), });
- New:
authProviderindefineConfig. - Class:
AbstractAuthProviderfor extending new auth providers. - Clerk Auth Provider: New provider added.
- Renaming:
admin.authtoadmin.authHooks. - Deprecation:
admin.auth.
- Transition: From auth functions to
authProviderclass.
- Previous API:
defineConfig({ admin: { auth: { login() {}, logout() {}, //... }, }, //... });
- New API:
import { AbstractAuthProvider } from "tinacms"; class CustomAuthProvider extends AbstractAuthProvider { login() {} logout() {} //... } defineConfig({ authProvider: new CustomAuthProvider(), //... });
-
New: TinaNodeBackend is exported from
@tinacms/datalayer. This is used to host the TinaCMS backend in a single function. -
New:
LocalBackendAuthProvideris exported from@tinacms/datalayer. This is used to host the TinaCMS backend locally. -
New:
AuthJsBackendAuthProvideris exported fromtinacms-authjs. This is used to host the TinaCMS backend with AuthJS.
Now, instead of hosting the in /tina/api/gql.ts file, the entire TinaCMS backend (including auth) will be hosted in a single backend function.
/api/tina/[...routes].{ts,js}import { TinaNodeBackend, LocalBackendAuthProvider, } from "@tinacms/datalayer"; import { TinaAuthJSOptions, AuthJsBackendAuthProvider } from "tinacms-authjs"; import databaseClient from "../../../tina/__generated__/databaseClient"; const isLocal = process.env.TINA_PUBLIC_IS_LOCAL === "true"; const handler = TinaNodeBackend({ authProvider: isLocal ? LocalBackendAuthProvider() : AuthJsBackendAuthProvider({ authOptions: TinaAuthJSOptions({ databaseClient: databaseClient, secret: process.env.NEXTAUTH_SECRET, }), }), databaseClient, }); export default (req, res) => { // Modify the request here if you need to return handler(req, res); };
These changes are put in place to make self hosted TinaCMS easier to use and more flexible.
Please check out the docs for more information on self hosted TinaCMS.
- Deprecated:
- efd56e769: Remove license headers
- 4e2edde70: Use a fetch ponyfill in
@tinacms/auth
-
c1ac4bf10: Added a
onLoginCallback function that is called when the user logs in.EX:
import { defineConfig } from "tinacms"; export default defineConfig({ admin: { auth: { onLogin: () => { console.log("On Log in!"); }, }, }, /// ... });
-
958d10c82: Tina 1.0 Release
Make sure you have updated to th "iframe" path: https://tina.io/blog/upgrading-to-iframe/
- be40bfd71: Remove unnecessary media helper deps
- b369d7238: Update dependencies to fix vulnerabilities in external packages.
- 67e291e56: Add support for ES modules
- 138ceb8c4: Clean up dependencies
- 9b27192fe: Build packages with new scripting, which includes preliminary support for ES modules.
-
7f3c8c1a: # 🔧 Changes coming to TinaCMS ⚙️
👋 You may have noticed we've been hard at-work lately building out a more opinionated approach to TinaCMS. To that end, we've settled around a few key points we'd like to announce. To see the work in progress, check out the main branch, which will become the primary branch soon.
By nature, Tina relies heavily on React context, and the dependency mismatches from over-modularizing our toolkit has led to many bugs related to missing context. To fix this, we'll be consolidating nearly every package in the @tinacms scope to a single package called
@tinacms/toolkitWe'll also be rolling out esm support as it's now much easier to address build improvements
The
tinacmspackage now comes baked-in with APIs for working with the TinaCMS GraphQL API. Because@tinacms/toolkitnow encompasses everything you'd need to build your own CMS integration, we're repurposing thetinacmspackage to more accurately reflect the "batteries-included" approach.If you haven't been introduced, the GraphQL API is a Git-backed CMS which we'll be leaning into more in the future. With a generous free tier and direct syncing with Github its something we're really excited to push forward. Sign up for free here Note: tinacms still exports the same APIs, but we'll gradually start moving the backend-agnostic tools to @tinacms/toolkit.
The tina-graphql-gateway repo will be absorbed into this one. If you've been working with our GraphQL APIs you'll need to follow our migration guide.
We've had success with Yarn 2 and PNP in other monorepos, if you're a contributor you'll notice some updates to the DX, which should hopefully result in a smoother experience.
The
@tinacms/toolkitisn't going anywhere. And if you're using packages likereact-tinacms-strapior react-tinacms-githubwith success, that won't change much, they'll just be powered by@tinacms/toolkitunder the hood.We'll be bumping all packages to
0.50.0to reflect the changes. If you're using @tincams scoped packages those won't receive the upgrade. Unscoped packages likereact-tinacms-editorwill be upgraded, and should be bumped to 0.50.0 as well. When we move to1.0.0we'll be pushing internal APIs to@tinacms/toolkit, so that's the long-term location ofWe'll continue to make security patches, however major bug fixes will likely not see any updates. Keep in mind that
@tinacms/toolkitwill continue to be developed.
- Bump packages to reflect new changest capabilities