
A look at Nuxt Studio, the open-source visual CMS for Nuxt Content, how it works with Git, and when it's the right fit.
Reza Baar
July 22, 2026
If you build content sites with Nuxt Content, you've probably hit the same wall: developers are happy editing markdown in their editor, but non-technical teammates don't want to touch Git or markdown syntax. Nuxt Studio is the Nuxt team's answer. It's an open-source, self-hosted module that adds a visual editing interface directly on your production site, with every change committed back to Git. In this post, we'll look at what it is, how it works, and when it makes sense.
Nuxt Studio is a Git-based CMS for Nuxt Content websites. It gives content editors a Notion-like visual editor that runs on your live site. When they publish, the changes commit directly to your GitHub or GitLab repository, and your normal CI/CD pipeline rebuilds and deploys the site. Git stays the source of truth. There's no separate database and no external content service.
A key piece of context: Nuxt Studio used to be a hosted platform at nuxt.studio. As of early 2026, the Nuxt team released it as a free, open-source, self-hosted module under the MIT license, and the legacy hosted platform is being sunset. So when you read about "Nuxt Studio" today, it means the module you install in your own project, not a SaaS product.
Studio isn't a standalone CMS. It's a layer on top of Nuxt Content, which is the file-based content system that reads markdown, YAML, and JSON from your content/ directory. Content lives as files in your repo. Nuxt Content turns those files into a queryable data layer. Studio adds a visual interface for editing those same files.
This matters because it means your deployed site is unaffected by whether you use Studio or not. The content is just files in Git. Studio is one way to edit them; opening the files in VS Code is another. Both produce the same commits.
Studio requires Nuxt Content v3, which introduced SQL-based storage, collections, and a preview API specifically to support better Studio integration.
You add Studio as a module alongside Nuxt Content:
npx nuxi module add @nuxt/studio
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@nuxt/content', '@nuxt/studio'],
});
If you're migrating from the legacy hosted platform, the process is mostly: install the module, configure your authentication provider, and remove the old preview key from your Nuxt Content config. Because content always lived in Git, the migration doesn't touch your deployed content.
The editing experience is built around a few pieces, each aimed at a different kind of content.
The visual editor. This is the Notion-like part, built on TipTap. Editors write prose naturally, and Studio generates the correct MDC (Markdown Components) syntax behind the scenes. They can insert Vue components, edit component props through a visual interface, and drag-and-drop content blocks. A non-technical editor never sees raw markdown unless they want to.
Form-based frontmatter editing. Page metadata (the frontmatter at the top of a markdown file) is edited through auto-generated forms rather than raw YAML. The forms are generated from your Nuxt Content collection schema, so if your schema says a post has a title, publishedAt, and tags, the form shows exactly those fields with the right input types.
YAML and JSON editing. For structured data files, Studio generates forms the same way, so editors can manage small data files without hand-writing YAML or JSON.
A code editor. For editors who do want to touch the raw content, Studio includes a Monaco editor (the same editor that powers VS Code) for markdown with MDC, YAML, and JSON.
A media library. A centralized interface for managing files in your public directory: browse folders, upload files, and insert images directly into content.
The part that makes Studio genuinely useful is how it ties into your content schema. In Nuxt Content v3, you define collections with a schema:
// content.config.ts
import { defineContentConfig, defineCollection, z } from '@nuxt/content';
export default defineContentConfig({
collections: {
blog: defineCollection({
type: 'page',
source: 'blog/**/*.md',
schema: z.object({
title: z.string(),
description: z.string(),
publishedAt: z.date(),
tags: z.array(z.string()),
draft: z.boolean().default(false),
}),
}),
},
});
Studio reads this schema and generates editing forms from it automatically. The title becomes a text field, publishedAt becomes a date picker, tags becomes an array input, draft becomes a toggle. You define the shape of your content once, and both your app's type safety and Studio's editing UI come from it.
The publishing flow is what makes Studio a "Git-based" CMS rather than a traditional one:
Every content change is a Git commit, which means content has the same history, review, and rollback capabilities as code. If two editors change things at the same time, the second one to publish gets a merge conflict notification, handled through Git's normal model.
Studio secures access through OAuth. It supports GitHub, GitLab, and Google out of the box, and provides utilities for custom auth flows if you need password, SSO, or LDAP:
// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@nuxt/content', '@nuxt/studio'],
studio: {
// Configure your OAuth provider
auth: {
github: {
// OAuth app credentials
},
},
},
});
Access control leans on your Git provider. For GitHub, you can limit who can edit through organization membership or repository collaborator status. For GitLab, project member permissions. Custom auth implementations can enforce their own role-based rules.
Studio needs server-side rendering for its authentication route. That doesn't mean your whole site has to be SSR. You can pre-render your content pages and keep SSR only for the Studio route using hybrid rendering:
// nuxt.config.ts
export default defineNuxtConfig({
nitro: {
prerender: {
routes: ['/'],
crawlLinks: true,
},
},
});
This pre-renders your homepage and crawls linked pages to generate them statically, while the Studio route stays dynamic for authentication. It deploys to any platform that supports SSR: Vercel, Netlify, or a Node server.
Studio is a strong fit when you're already using Nuxt Content and you want non-technical teammates to edit content without learning Git. Documentation sites, blogs, marketing sites, and changelogs are the sweet spot. The Git-based model means content changes flow through the same review and deployment pipeline as code, which teams that value that workflow will appreciate. And being free and self-hosted removes cost and vendor-lock-in concerns.
It's less of a fit when you need things a Git-based CMS structurally doesn't do well. If you have thousands of content items with heavy relational structure, advanced media handling, or need content editors making changes hundreds of times a day with instant publish (no build step), a database-backed headless CMS may serve you better. Framework-agnostic tools like Tina CMS support larger-scale projects with more advanced media workflows, at the cost of the tight Nuxt integration Studio has. The framework specificity cuts both ways: deep integration with Nuxt, but it's Nuxt-only.
Nuxt Studio closes the gap between developers who are happy in markdown and editors who want a visual interface, without giving up the Git-based workflow that makes content reviewable and versioned. It's a layer on Nuxt Content, so your content stays as files and your deployment stays unchanged. If you're building content sites on Nuxt and need editor-friendly tooling, it's worth setting up.
I hope this post has been helpful. Happy coding!
Get the latest news and updates on developer certifications. Content is updated regularly, so please make sure to bookmark this page or sign up to get the latest content directly in your inbox.

Nuxt Studio and What It Is
A look at Nuxt Studio, the open-source visual CMS for Nuxt Content, how it works with Git, and when it's the right fit.
Reza Baar
Jul 22, 2026

JavaScript Generators: Writing Iterators With yield
JavaScript generators explained: write lazy iterators with yield, handle infinite sequences, and skip the protocol boilerplate.
Martin Ferret
Jul 21, 2026

Designing Loading UI in React
A practical guide to loading UI in React: Suspense boundaries, skeletons vs spinners, avoiding layout shift, and animating reveals.
Aurora Scharff
Jul 16, 2026