Skip to content

Commit bde6e1d

Browse files
larbishatinux
andauthored
docs(studio): new module alpha release (#3601)
Co-authored-by: Sébastien Chopin <[email protected]>
1 parent 7fa31a5 commit bde6e1d

33 files changed

+1024
-692
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Nuxt Content reads the `content/` directory in your project, parses `.md`, `.yml
1212

1313
- [📖 &nbsp;Read the documentation](https://content.nuxt.com)
1414
- [&nbsp;Intro video](https://www.youtube.com/watch?v=o9e12WbKrd8)
15-
- [✍️ &nbsp;Nuxt Studio](https://content.nuxt.com/studio)
15+
- [✍️ &nbsp;Nuxt Studio](https://content.nuxt.com/docs/studio/setup)
1616

1717
## Features
1818

docs/app/app.config.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,6 @@ export default defineAppConfig({
1010
secondary: 'sky',
1111
neutral: 'slate',
1212
},
13-
pageHero: {
14-
slots: {
15-
title: 'font-semibold sm:text-6xl',
16-
description: 'sm:text-lg text-(--ui-text-toned) max-w-5xl mx-auto',
17-
container: 'py-16 sm:py-20 lg:py-24',
18-
},
19-
},
2013
pageSection: {
2114
slots: {
2215
title: 'font-semibold lg:text-4xl',
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<template>
22
<UButton
33
v-if="$route.path == '/'"
4-
label="Open Studio"
4+
label="Open Legacy Studio"
5+
color="neutral"
6+
variant="subtle"
57
to="https://nuxt.studio"
68
size="sm"
79
class="hidden sm:inline-flex"
10+
target="_blank"
811
/>
912
</template>

docs/app/components/AppHeaderCenter.vue

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,16 @@ const links = computed(() => [
66
label: 'Documentation',
77
icon: 'i-lucide-book-open',
88
to: '/docs/getting-started',
9-
active: route.path.startsWith('/docs'),
9+
active: route.path.startsWith('/docs') && !route.path.startsWith('/docs/studio'),
1010
}, {
1111
label: 'Studio',
12+
badge: {
13+
label: 'alpha',
14+
color: 'primary',
15+
},
1216
icon: 'i-lucide-file-pen-line',
13-
children: [{
14-
icon: 'i-lucide-mouse-pointer-click',
15-
label: 'Features',
16-
description: 'Everything you need to edit your Nuxt Content project',
17-
to: '/studio',
18-
}, {
19-
label: 'Pricing',
20-
description: 'Free for personal use, paid plans for teams',
21-
icon: 'i-lucide-rocket',
22-
to: '/studio/pricing',
23-
}],
17+
to: '/docs/studio/setup',
18+
active: route.path.startsWith('/docs/studio'),
2419
}, {
2520
label: 'Templates',
2621
icon: 'i-lucide-layout-template',

docs/app/components/UInputCopy.vue

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<script setup lang="ts">
2+
defineProps({
3+
value: {
4+
type: String,
5+
required: true,
6+
},
7+
size: {
8+
type: String,
9+
default: 'lg',
10+
},
11+
})
12+
const { copy, copied } = useClipboard()
13+
</script>
14+
15+
<template>
16+
<label>
17+
<UInput
18+
:model-value="value"
19+
:size="size"
20+
disabled
21+
:ui="{ trailing: 'pe-1', root: 'w-[245px]' }"
22+
>
23+
<div
24+
class="absolute inset-0"
25+
:class="[copied ? 'cursor-default' : 'cursor-copy']"
26+
@click="copy(value)"
27+
/>
28+
<template #trailing>
29+
<UButton
30+
:icon="copied ? 'i-lucide-check' : 'i-lucide-copy'"
31+
color="neutral"
32+
variant="link"
33+
:padded="false"
34+
:ui="{ leadingIcon: 'size-4' }"
35+
:class="{ 'text-green-500 hover:text-green-500 dark:text-green-400 hover:dark:text-green-400': copied }"
36+
aria-label="copy button"
37+
@click="copy(value)"
38+
/>
39+
</template>
40+
</UInput>
41+
</label>
42+
</template>

docs/app/pages/templates/[slug].vue

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -86,25 +86,13 @@ const images = computed(() => template.value
8686
:to="template.demo"
8787
target="_blank"
8888
/>
89-
90-
<UDropdownMenu
91-
:items="[{
92-
label: 'Import on Studio',
93-
to: 'https://nuxt.studio/signin',
94-
target: '_blank',
95-
}, {
96-
label: 'Clone on GitHub',
97-
to: `https://github.com/${template.owner}/${template.name}/tree/${template.branch}`,
98-
target: '_blank',
99-
}]"
100-
>
101-
<UButton
102-
label="Use it"
103-
color="primary"
104-
variant="solid"
105-
trailing-icon="i-ph-arrow-right"
106-
/>
107-
</UDropdownMenu>
89+
<UButton
90+
label="Clone on GitHub"
91+
color="primary"
92+
variant="solid"
93+
:to="`https://github.com/${template.owner}/${template.name}/tree/${template.branch}`"
94+
trailing-icon="i-ph-arrow-right"
95+
/>
10896
</div>
10997
</template>
11098
</UPageHeader>
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
---
2+
title: Nuxt Studio Alpha Release
3+
authors:
4+
- name: Baptiste Leproux
5+
avatar:
6+
src: https://avatars.githubusercontent.com/u/7290030?v=4
7+
to: https://x.com/_larbish
8+
username: larbish
9+
- name: Ahad Birang
10+
avatar:
11+
src: https://avatars.githubusercontent.com/u/2047945?v=4
12+
to: https://x.com/farnabaz
13+
username: farnabaz
14+
- name: Sébastien Chopin
15+
avatar:
16+
src: https://avatars.githubusercontent.com/u/904724?v=4
17+
to: https://x.com/atinux
18+
username: atinux
19+
category: Release
20+
date: 2025-11-04T00:00:00.000Z
21+
description: Introducing the first alpha release of Nuxt Studio as a free, open-source Nuxt module. Edit your content in production with GitHub integration and real-time preview.
22+
draft: false
23+
image:
24+
src: /blog/nuxt-studio-module-alpha.png
25+
alt: Nuxt Studio Alpha Release
26+
---
27+
28+
When NuxtLabs joined Vercel, we promised to transform [nuxt.studio](https://nuxt.studio) from a hosted platform into a free, open-source module. Today, we're excited to announce the **first alpha release** of the Nuxt Studio module.
29+
30+
::u-button{to="https://github.com/nuxt-content/studio" icon="i-simple-icons-github" target="_blank" color="neutral" variant="subtle"}
31+
Discover the Nuxt Studio module on GitHub.
32+
::
33+
34+
You can now enable content editing directly in production, with real-time preview and GitHub integration, all from within your own Nuxt application.
35+
36+
:video{controls loop src="https://res.cloudinary.com/nuxt/video/upload/v1733494722/contentv3final_rc8bvu.mp4"}
37+
38+
::u-button{to="/admin?redirect=/blog/studio-module-alpha" icon="i-lucide-mouse-pointer-click" external color="neutral" class="mt-4"}
39+
Try editing this page
40+
::
41+
42+
## 🏠 From Hosted Platform to Self-Hosted Module
43+
44+
This milestone wouldn't have been possible without Vercel's support. Their backing allowed us to dedicate the resources needed to rebuild Studio as an open-source module.
45+
46+
### What's Different?
47+
48+
Originally provided as a hosted platform at [nuxt.studio](https://nuxt.studio), Studio is now a free and open-source Nuxt module that you can deploy alongside your Nuxt Content website.
49+
50+
This means content editors can manage and update content directly in production, on their website, without the need of local development tools or Git knowledge.
51+
52+
- **Self-hosted** — runs entirely on your infrastructure alongside your Nuxt app
53+
- **No external dependencies** — no APIs or third-party services required
54+
- **Free and open-source** — released under the MIT license
55+
- **Direct integration** — a simple GitHub OAuth app is needed to get started
56+
57+
The only trade-off is that Studio now requires a server-side route for authentication. While static generation remains supported with [Nuxt hybrid rendering](https://nuxt.com/docs/4.x/guide/concepts/rendering#hybrid-rendering), your site must be deployed on a platform that supports SSR.
58+
59+
## 📦 What's Shipped in Alpha
60+
61+
The alpha release focuses on **core infrastructure and stability** without risking any bugs introduced by the Visual editor. We're using Monaco editor to ensure all file operations and GitHub workflows are rock-solid before introducing visual editing.
62+
63+
**Monaco Code Editor** → IDE editing experience with syntax highlighting for Markdown, YAML, and JSON, including full MDC syntax support and split-screen diff viewer for conflicts.
64+
65+
**File Operations** → Complete CRUD operations for your `content/` directory. Create, edit, delete, rename, and move files with built-in draft management.
66+
67+
**Media Management** → Centralized library for assets in your `public/` directory with upload, organize, preview, and integrate capabilities.
68+
69+
**Git Integration** → Direct commits to GitHub via OAuth with conflict detection, author attribution, and custom commit messages.
70+
71+
**Real-time Preview** → Live preview of draft changes on your production website with instant updates and side-by-side editing.
72+
73+
## 🗺️ The Road Ahead
74+
75+
### Beta Release `Q4 2025`
76+
77+
Inspired from what we've built on [nuxt.studio](https://nuxt.studio), the beta phase will introduce the open-source visual editor, making Studio accessible to non-technical users:
78+
79+
- **Markdown Editor** — Notion-inspired experience for Markdown
80+
- **Form-based Editing** — Schema-based forms for Markdown frontmatter, YAML, and JSON files
81+
- **Vue Component Edition** — Visual interface for editing component props and slots
82+
- **Google OAuth** — Alternative authentication for non-GitHub users
83+
84+
### Stable Release `End of Year 2025`
85+
86+
Production-ready features, performance optimizations, and enhanced stability.
87+
88+
::warning
89+
At the end of year, the hosted platform will be sunset and the module will be the only way to edit your Nuxt Content website.
90+
::
91+
92+
### Beyond `2026`
93+
94+
AI-powered content suggestions, multiple git providers, and community-driven features.
95+
96+
## 🗄️ Storage Architecture
97+
98+
Studio uses a three-tier storage architecture to keep content synchronized between your browser and GitHub.
99+
100+
### Production Database `SQLite WASM`
101+
102+
When your Nuxt Content website loads, Nuxt Content v3 downloads a SQLite database dump from your server and initializes a local WASM database containing all content from your deployed branch. This database stays in sync with GitHub as long as your last deployment completed successfully. This is the production database updated by Studio when you edit content.
103+
104+
### Draft Storage `IndexedDB`
105+
106+
Studio maintains a separate draft layer using [unstorage](https://unstorage.unjs.io/) backed by IndexedDB. When you edit content, changes are stored as drafts locally in your browser. Each time Studio loads, these drafts are merged with the SQLite database to render a drafted version of your production site.
107+
108+
::note
109+
Drafts are stored only in your browser. They're not shared between editors or devices.
110+
::
111+
112+
### GitHub Repository `API Integration`
113+
114+
When you publish, Studio commits your draft changes directly to GitHub through the GitHub API. Your CI/CD pipeline then rebuilds and redeploys your site automatically. After deployment, you'll need to refresh to update your browser database with the latest content.
115+
116+
## 🔄 The Sync Flow
117+
118+
### Initial Load
119+
120+
::prose-steps{level="4"}
121+
#### Database Initialization
122+
123+
Nuxt Content downloads the SQLite database dump generated during the build process. :br
124+
This file contains all parsed content from your `content/` directory.
125+
126+
#### Draft Recovery
127+
128+
Studio checks IndexedDB for any existing drafts from previous sessions and loads them into the SQLite database.
129+
130+
#### Preview
131+
132+
Studio refreshes the site preview so you can view your latest drafts and edits directly on your production website.
133+
::
134+
135+
### Editing Content
136+
137+
::prose-steps{level="4"}
138+
#### Draft Modification
139+
140+
Changes are saved immediately in IndexedDB as draft items with a status of `created`, `modified`, or `deleted`.
141+
142+
#### Database Update
143+
144+
The local SQLite database is updated to include your draft content, allowing instant visual preview.
145+
146+
#### Conflict Detection
147+
148+
Studio compares your draft content against the latest version on GitHub to detect possible conflicts.
149+
150+
:::note
151+
**Conflicts can occur when:**
152+
153+
:br
154+
155+
- Someone pushes a commit that modifies the same file and its version is currently building.
156+
- A deployment fails or hasn’t completed, leaving the production out of date and unsync with GitHub.
157+
:::
158+
::
159+
160+
### Publishing Changes
161+
162+
::prose-steps{level="4"}
163+
#### Draft Collection
164+
165+
Studio gathers all draft items that contain changes.
166+
167+
#### GitHub Commit
168+
169+
Using the GitHub API, Studio creates a new commit with all updated files.
170+
171+
#### Deployment Trigger
172+
173+
Your CI/CD platform detects the commit and automatically rebuilds and redeploys your website.
174+
175+
#### Deployment Wait
176+
177+
After publication, Studio clears the local drafts and waits for the deployment to complete. :br
178+
During this time, a loading state is shown while the production SQLite database catches up with your latest commit.
179+
180+
:::warning
181+
Until your commit is deployed, Studio remains in a pending state where the production database is not yet up to date.
182+
:::
183+
::
184+
185+
## 🚀 Get Started Today
186+
187+
Install the module and configure your GitHub OAuth app to start editing content in production:
188+
189+
```bash
190+
npx nuxi module add nuxt-studio
191+
```
192+
193+
Check out the [setup guide](/docs/studio/setup) for complete installation and configuration instructions.
194+
195+
---
196+
197+
We're excited to see what you build with Nuxt Studio. Join the conversation on [GitHub Discussions](https://github.com/nuxt-content/studio/discussions) or [join our Discord](https://discord.gg/sBXDm6e8SP) to help shape the future of the module.

docs/content/docs/1.getting-started/1.index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ The new collections system provides automatic TypeScript types for all your data
4242

4343
### Nuxt Studio Integration :badge[Soon]{color="neutral"}
4444

45-
[Nuxt Studio](/docs/studio/setup) and v3 are designed to complement each other perfectly.. The [studio module](https://github.com/nuxtlabs/studio-module) is now integrated directly into Nuxt Content, creating an ideal environment where developers can focus on code while team members manage content through an intuitive interface.
45+
[Nuxt Studio](/docs/studio/setup) and v3 are designed to complement each other perfectly.. The [studio module](https://github.com/nuxt-content/studio) is creating an ideal environment where developers can focus on code while team members manage content through an intuitive interface.
4646

4747
---
4848

docs/content/docs/1.getting-started/3.configuration.md

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -500,25 +500,6 @@ export default defineNuxtConfig({
500500
```
501501
::
502502

503-
## `preview`
504-
505-
Enable `Preview API`
506-
507-
::prose-note
508-
This is needed to enable live preview on [Nuxt Studio](/studio).
509-
::
510-
511-
Value:
512-
513-
- `dev`: Enable in development mode
514-
- `api`: Activate the preview mode and set the `API` to be linked with.
515-
516-
```ts [Enable Studio]
517-
preview: {
518-
api: 'https://api.nuxt.studio',
519-
}
520-
```
521-
522503
## `experimental`
523504

524505
Experimental features that are not yet stable.

docs/content/docs/1.getting-started/4.migration.md

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,6 @@ The new API is backed by SQL and content queries happens within a specific colle
4949
- Due to SQL limitations, sort order now uses alphabetical order instead for numerical order. Check out the [Ordering Files](/docs/collections/types#ordering-files) section for more information.
5050
- Module options have changed from v2. Check out [configuration page](/docs/getting-started/configuration) for details.
5151

52-
### Nuxt Studio integration
53-
54-
- The [studio module](https://nuxt.studio) has been deprecated and a new generic `Preview API` has been implemented directly into Nuxt Content, you can remove the `@nuxthq/studio` package from your dependencies and from the `nuxt.config.ts` modules. Instead we just need to enable the preview mode in the Nuxt configuration file by binding the Studio API.
55-
56-
```ts [nuxt.config.ts]
57-
export default defineNuxtConfig({
58-
content: {
59-
preview: {
60-
api: 'https://api.nuxt.studio'
61-
}
62-
},
63-
})
64-
```
65-
66-
- In order to keep the [app config file](/docs/studio/config) updatable from Studio we just need to update the helper import of the `nuxt.schema.ts` file from `@nuxthq/studio/theme` to `@nuxt/content/preview`.
67-
6852
## Implement Document Driven mode in v3
6953

7054
Implementing document driven mode in Content v3 is quite easy. All you need is to create a catch-all page in Nuxt and fetch contents based on route path.

0 commit comments

Comments
 (0)