MIGRATE FROM
FORESTRY
Forestry.io shut down in April 2023. If you landed on TinaCMS and find it more complex than you need, md0 is a no-config git-based CMS that gets you back to editing content in minutes.
START MIGRATIONWHAT HAPPENED TO FORESTRY
Forestry.io was a widely-used git-based CMS that let teams edit markdown content stored in GitHub and GitLab repositories through a clean visual interface. Developers dropped a .forestry/ config folder into their repo, defined their content collections and field schemas there, and non-technical editors got a polished UI without ever touching the codebase. For teams running Gatsby, Next.js, Hugo, or Jekyll sites, it was often the lowest-friction way to hand off content editing.
In April 2023, Forestry shut down its service and directed users to TinaCMS, a different product built by the same team. TinaCMS is a capable CMS, but it works differently from Forestry in a meaningful way: it introduces a GraphQL content layer and requires a tina/ config folder (with a config.ts file) committed into your repository. Local content editing also requires running a local dev server via npx tinacms dev. For many teams, that added complexity is worthwhile. For others, it is more infrastructure than the job calls for.
This guide covers moving from Forestry directly to md0, and also covers moving from TinaCMS to md0 if you already made that intermediate hop. The steps are similar in both cases. The main difference is what you clean up from your repo at the end.
WHAT FORESTRY DID WELL, AND WHAT md0 KEEPS
Forestry's core strength was that it stayed out of your repository. The .forestry/ config folder held field definitions and sidebar settings, but it did not touch your markdown files, your frontmatter keys, or your build pipeline. Your SSG continued working exactly as before. Editors got a UI; developers kept full control of the content structure.
md0 takes the same approach. There is no config folder to add to your repo, no CLI to install, and no local server to run. You connect your GitHub repository through OAuth, define your collections and field schemas in md0's UI, and your markdown files stay exactly where they are. Every save in md0 writes a GitHub commit to your repo, the same commit that Forestry would have written.
The main addition md0 brings over Forestry is schema enforcement at the field level. Forestry defined fields for display purposes but did not prevent editors from leaving required fields blank or entering mismatched types. md0 adds optional validation rules (required fields, type checking, character limits) so content arrives at your build pipeline in the shape your templates expect.
One honest difference worth noting: TinaCMS has a real-time visual preview built into its editing UI. md0 does not have this. You edit frontmatter fields and markdown content in a structured form, not a live page preview. If that browser-preview workflow is a requirement for your team, TinaCMS may remain the better fit. If you want fast content editing without the overhead, md0 is designed for that.
WHAT CHANGES WHEN MOVING TO md0
The short answer: very little in your repository changes. Your markdown files stay in the same directory paths. Your frontmatter keys stay the same. Your SSG build process is not touched. Here is what does change:
Config folder removed from your repo
The .forestry/ directory (or tina/ if you are on TinaCMS) can be deleted. md0 stores collection definitions in its own cloud UI, not in your repository.
Frontmatter sidebar definitions move to md0's schema builder
The field definitions you had in Forestry's sidebar templates are recreated in md0's visual schema builder, with the same fields and same names. No changes to the actual frontmatter in your files.
Media management stays in your repo
Forestry uploaded media files to a configured media_dir in your GitHub repo. md0 does the same. Uploads commit directly to your repository at the path you specify.
No build pipeline changes
Nothing in your Next.js, Gatsby, Hugo, or Jekyll config needs to change. md0 writes standard commits; your existing CI/CD pipeline picks them up the same way it always did.
MIGRATION STEPS
Document your collection config
Open your Forestry sidebar settings (or your TinaCMS tina/config.ts file) and note every collection: its name, the folder path it targets, and all field definitions within it. A simple text file or spreadsheet works well here; you will reference this during step 4.
Note the folder paths for each collection
Forestry referenced folder paths like content/posts or content/pages. Write these down exactly. md0 uses the same GitHub folder paths to locate content items, so the path you enter in md0 must match your repo structure.
Connect your GitHub repo to md0
Go to cms.md0.io and sign in with GitHub. Authorize the md0 OAuth app and select your repository. md0 reads your repo structure and you will be in the editor within about two minutes. No config file is written to your repo at this step.
Create collections in md0
For each collection you documented in step 1, create a matching collection in md0. Set the folder path to match what Forestry used. Give it the same name if you want consistency, though the name in md0 is only for the UI and does not affect file paths.
Add schema fields
In each collection, open the schema builder and add fields that match your Forestry field definitions. Use the field type mapping table below to find the md0 equivalent for each Forestry type. The field name (which becomes the frontmatter key) must stay exactly the same as it was in Forestry. If it changes, your existing content files will have unrecognized fields.
Test with a real content item
Open an existing content item in md0. The frontmatter fields should populate from the existing file. Make a small edit and save. This triggers a GitHub commit. Check your repo to confirm the commit landed correctly and your CI/CD pipeline picks it up as expected.
Clean up the old config folder
Once you are satisfied with the migration, delete the .forestry/ directory from your repo (or the tina/ directory if you were on TinaCMS). This is optional but keeps your repo clean. If you are removing TinaCMS, also uninstall the @tinacms/* packages from your package.json.
Train your editors
md0 uses the same git-based mental model as Forestry: edit content, save, and a commit goes to GitHub. For most editors who used Forestry, the UI will feel immediately familiar. Point them to cms.md0.io and the existing GitHub connection will give them access.
FIELD TYPE MAPPING
Forestry field type on the left, md0 equivalent on the right. The frontmatter key name does not change. Only the UI field type in the schema builder is different.
textText (single line)textareaText (multiline)wysiwygRich text / MarkdowndatetimeDate/timefileFile uploadimageImage uploadtoggleToggleselectSelect (dropdown)listArrayfield_groupNested groupinclude(use nested collection or reference)COMING FROM TINACMS
If you moved from Forestry to TinaCMS and are now looking for a simpler path, the migration to md0 is straightforward. The key difference between TinaCMS and md0 at the repository level is the tina/ directory. TinaCMS requires this folder, which contains your schema definition in config.ts and tells TinaCMS what collections and fields exist. md0 does not require any files in your repo. Collection config lives entirely in md0's UI, which means your repository has fewer moving parts and no build-time dependency on a separate CMS config.
TinaCMS also requires running a local development server (npx tinacms dev) to edit content locally. md0 has no local server requirement. You edit through the hosted UI at cms.md0.io, and every save goes directly to GitHub. This removes a step from the local development workflow for teams that prefer editing through the cloud UI.
TinaCMS has a paid cloud hosting tier. md0 is free for public repositories.
To complete the TinaCMS-to-md0 migration: follow the same steps above, and in the final cleanup step, delete the tina/ directory and remove the @tinacms/cli and tinacms packages from package.json. If your build script runs tinacms build before the SSG build, remove that step as well.
WHAT STAYS THE SAME
The parts of your setup that actually run your site do not change.
Your markdown and MDX files
Content files remain unchanged. md0 reads and writes them in place and does not migrate, reformat, or rename your existing files.
Frontmatter keys
Field names in your frontmatter stay exactly as they are. Your templates reference the same keys they always did. No find-and-replace needed.
SSG build process
Next.js, Gatsby, Hugo, or Jekyll: your build pipeline reads the same files from the same paths. md0 commits look identical to a hand-written commit.
GitHub as source of truth
Your repository remains the canonical source of content. md0 is a UI layer on top of GitHub, not a separate database or content store.
Related
Still comparing? md0 CMS vs Forestry | All migration guides
START IN 10 MINUTES
Most Forestry migrations complete in under 10 minutes. Connect your repo, recreate your collections, and you are back to editing content.
MIGRATE NOW