Learn

The Best Headless CMS for Vue

A developer-first CMS that plugs into any Vue 3 or Nuxt app. Fetch content via REST API, model anything, and deploy anywhere. Free to start.

generated-1775103123130.jpg

Why Vue Developers Need a Headless CMS

A headless CMS for Vue gives you exactly what Vue's reactivity model is designed for: structured, API-delivered content that flows cleanly into your components. No monolithic backend to fight. No content locked in a PHP template engine. Just data, delivered the way Vue expects it.

If you're building with Vue 3, Nuxt, or Vite, a traditional CMS creates friction at every step. Your content is coupled to a rendering engine you didn't choose, your editors are stuck in an interface built around HTML output, and your deployment pipeline has to work around a database you don't control.

A headless CMS separates those concerns entirely. Content lives in a structured API layer. Your Vue components consume it however they need to. Editors update copy without filing developer tickets. Builds are fast because your frontend is decoupled.

The practical benefits for Vue teams:

  • Clean separation of concerns. Content editors manage content. Developers manage components. Neither blocks the other.
  • Vue-native data flow. Fetch content into ref(), reactive(), or Pinia stores. Cosmic's API returns clean JSON that maps directly to your reactive state.
  • SSR and SSG support. Works with Nuxt's useAsyncData, useFetch, and asyncData patterns out of the box.
  • Deploy anywhere. Vercel, Netlify, Cloudflare, your own infrastructure. No backend CMS process to run.

How Cosmic Works with Vue

Cosmic provides a REST API and an official JavaScript SDK. There's no Vue-specific adapter required. The API returns JSON, and Vue knows exactly what to do with JSON.

Install the SDK

npm install @cosmicjs/sdk

Fetch Content in a Vue 3 Component

Here's a real, working example using the Composition API with Vue 3:

<script setup> import { ref, onMounted } from 'vue' import { createBucketClient } from '@cosmicjs/sdk' const cosmic = createBucketClient({ bucketSlug: import.meta.env.VITE_COSMIC_BUCKET_SLUG, readKey: import.meta.env.VITE_COSMIC_READ_KEY, }) const posts = ref([]) const loading = ref(true) onMounted(async () => { const { objects } = await cosmic.objects .find({ type: 'blog-posts' }) .props('id,title,slug,metadata') .limit(10) posts.value = objects loading.value = false }) </script> <template> <div> <p v-if="loading">Loading...</p> <ul v-else> <li v-for="post in posts" :key="post.id"> <a :href="`/blog/${post.slug}`">{{ post.title }}</a> </li> </ul> </div> </template>

Fetch Content in Nuxt 3 (SSR/SSG)

For Nuxt 3, use useAsyncData to fetch at the server level and benefit from Nuxt's built-in caching and hydration:

<!-- pages/blog/index.vue --> <script setup> import { createBucketClient } from '@cosmicjs/sdk' const cosmic = createBucketClient({ bucketSlug: useRuntimeConfig().public.cosmicBucketSlug, readKey: useRuntimeConfig().public.cosmicReadKey, }) const { data: posts } = await useAsyncData('blog-posts', () => cosmic.objects .find({ type: 'blog-posts' }) .props('id,title,slug,metadata') .limit(10) .then((res) => res.objects) ) </script> <template> <ul> <li v-for="post in posts" :key="post.id"> <NuxtLink :to="`/blog/${post.slug}`">{{ post.title }}</NuxtLink> </li> </ul> </template>

Using the REST API Directly

If you prefer not to use the SDK, the REST API works just as well with the native fetch:

// composables/useCosmic.js export async function fetchPosts() { const bucketSlug = import.meta.env.VITE_COSMIC_BUCKET_SLUG const readKey = import.meta.env.VITE_COSMIC_READ_KEY const res = await fetch( `https://api.cosmicjs.com/v3/buckets/${bucketSlug}/objects` + `?query={"type":"blog-posts"}` + `&read_key=${readKey}` + `&props=id,title,slug,metadata` + `&limit=10` ) const data = await res.json() return data.objects || [] }

Two environment variables. One API call. Your content is in your Vue component.


Key Features for Vue Developers

Flexible Content Modeling

Define your own content types and field structures without being locked into a rigid schema. Need a hero object with an image, a headline, and a CTA button? Build it. Need a product catalog with nested metadata and relational fields? Model it. Cosmic adapts to your data shape, not the other way around.

Content types map directly to the JSON your Vue components consume. If you change your model, your API response changes to match. No migrations, no downtime.

Media Management with imgix

Every image uploaded to Cosmic is automatically served through imgix, a best-in-class image CDN. Resize, crop, convert to WebP, and optimize at the URL level. No image processing pipeline to build or maintain.

// Optimized, responsive image in your Vue template const heroSrc = `${post.metadata.hero_image.imgix_url}?w=1200&auto=format`

API-First Architecture

Cosmic is API-first, not Vue-specific. That means it works equally well for your Vue web app, your Ionic mobile app, your Electron desktop app, or any other surface your team ships to. One content API, many frontends.

Environments

Cosmic gives you separate production and staging environments. Test content changes safely before they reach your live Vue app. Pairs perfectly with Nuxt's preview mode for a complete staging workflow.

Team Collaboration

Content editors, marketers, and developers can all work in the same CMS without stepping on each other. Role-based permissions keep the right people in the right places. Plans include between 2 and 10 seats, with additional users at $29/user/month.


What Teams Are Saying

"Cosmic is: us never having to ask a developer to change anything on the backend of our website."

Maximilian Wuhr, Co-Founder at FINN

FINN, the Munich-based automotive subscription platform, uses Cosmic to give their marketing team full content autonomy. Developers ship features. Editors ship content. No bottlenecks, no tickets, no waiting.

Other teams using Cosmic include Parque Explora, Plato, Tripwire Interactive, and Vuetify. Vuetify, one of the most widely used Vue UI libraries, runs on Cosmic.


Works with Every Vue Framework

Cosmic is framework-agnostic. If it renders Vue, it works with Cosmic:

  • Nuxt 3 (SSR, SSG, ISR, and hybrid rendering with useAsyncData and useFetch)
  • Vue 3 + Vite (client-side SPAs with Composition API)
  • Quasar (cross-platform Vue apps targeting web, mobile, and desktop)
  • Ionic Vue (mobile apps with Vue's reactivity model)
  • Astro with Vue islands (partial hydration for performance-focused sites)

No framework-specific adapters required. The REST API and SDK work everywhere JavaScript runs.

Building with a different stack? See our Next.js Headless CMS guide or our React Headless CMS guide for framework-specific patterns.


Pricing

Get started for free and scale as you grow:

PlanPriceSeats Included
Free$0/month2 users
BuilderStarting at $49/month3 users
TeamStarting at $299/month5 users
BusinessStarting at $499/month10 users
EnterpriseCustomCustom

Additional users are $29/user/month on any paid plan. No credit card required to start.


Get Started Today

Your Vue app deserves a CMS that works the way Vue does: reactive, clean, and API-driven. Cosmic gives you flexible content modeling, a fast REST API, and a visual editor your whole team can use without filing a ticket.

Start free on Cosmic or book a demo with our team.

Frequently asked questions
cosmic logo
cosmic logo

Start building today

No credit card required • Free forever