Kickstart a new CMS project
with your favorite technology
Storyblok is a Headless CMS that works with all modern frameworks and platforms so you are completely free to choose the best option for your project. Get started in a matter of minutes!
Integrate with your framework
Follow the documentation guide to learn how to fetch and render content, connect the Visual Editor, use a custom content model, and more.
-
Kickstart a project from your terminal
-
npm install -g storyblok
-
-
storyblok create
-
-
3. Recommended: start from a Blueprint
Blueprints streamline the process of deploying to Vercel or Netlify and connecting your project to the Visual Editor.
Watch the Blueprints overview or read the documentation -
-
4. Choose a plan for your space
The Starter plan is always free with no time limit and no credit card required. Try the Growth plans for access more team seats and enhanced features with a no-commitment 14-day free trial.
Storyblok and Nuxt
Helpful resources
-
Nuxt Technology Hub
Check out our technology hub to learn more about the combined power of Storyblok and Nuxt.
-
Storyblok Discord
Join our supportive community of Storyblok and Nuxt developers in the #nuxt-hub channel of our Discord server.
-
Official SDK
Learn how to make the most out of @storyblok/nuxt. Feel free to share your feature requests, issues, or code contributions.
-
Learning Hub
Comprehensive developer guides, API documentation, technology hubs and more.
-
Kickstart a new project
Copy the command below by clicking on it and run it in your terminal. Choose Nuxt as your technology, follow the steps, and you're ready to go!
-
-
-
-
-
-
npm i @storyblok/nuxt
-
- nuxt.config.js
export default defineNuxtConfig({ modules: [ [ '@storyblok/nuxt', { accessToken: '<your-access-token>', }, ], ], })
-
3. Fetching a Story
In
pages/index.vue
, fetch the home story of your Storyblok space.StoryblokComponent
will resolve and render all of your Storyblok components. -
- pages/index.vue
<script setup> const story = await useStoryblok('home', { version: 'draft' }); </script> <template> <StoryblokComponent v-if="story" :blok="story.content" /> </template>
-
4. Create Storyblok components
Create the counterparts to the components defined in your Storyblok space in
storyblok
. Again,StoryblokComponent
handles all of your nestable blocks automatically. The Storyblok Bridge relies on thev-editable
directive. -
- storyblok/page.vue
<template> <div v-editable="blok" class="px-4"> <StoryblokComponent v-for="blok in blok.body" :key="blok._uid" :blok="blok" /> </div> </template> <script setup> defineProps({ blok: Object }) </script>
-
-
Storyblok and React
Helpful resources
-
React Technology Hub
Check out our technology hub to learn more about the combined power of Storyblok and React.
-
Storyblok Discord
Join our supportive community of Storyblok and React developers in the #react-hub channel of our Discord server.
-
Official SDK
Learn how to make the most out of @storyblok/react. Feel free to share your feature requests, issues, or code contributions.
-
Learning Hub
Comprehensive developer guides, API documentation, technology hubs and more.
-
Kickstart a new project
Copy the command below by clicking on it and run it in your terminal. Choose React as your technology, follow the steps, and you’re ready to go!
-
-
-
-
-
-
npm i @storyblok/react
-
- index.js
import { storyblokInit, apiPlugin } from '@storyblok/react' import Page from './components/Page' import Grid from './components/Grid' import Feature from './components/Feature' import Teaser from './components/Teaser' storyblokInit({ accessToken: 'YOUR_PREVIEW_TOKEN', use: [apiPlugin], components: { page: Page, teaser: Teaser, feature: Feature, grid: Grid, }, })
-
3. Fetching a Story
In
App.jsx
, fetch the home story of your Storyblok space.StoryblokComponent
will resolve and render all of your Storyblok components. -
- App.jsx
import { useStoryblok, StoryblokComponent } from '@storyblok/react' function App() { let slug = window.location.pathname === '/' ? 'home' : window.location.pathname.replace('/', '') const story = useStoryblok(slug, { version: 'draft' }) if (!story || !story.content) { return <div>Loading...</div> } return <StoryblokComponent blok={story.content} /> } export default App
-
4. Create Storyblok components
Create the counterparts to the components defined in your Storyblok space in
src/components
. Again,StoryblokComponent
handles all of your nestable blocks automatically. The Storyblok Bridge relies onstoryblokEditable
. -
- components/Page.js
import { StoryblokComponent, storyblokEditable } from "@storyblok/react"; const Page = ({ blok }) => ( <main {...storyblokEditable(blok)}> {blok.body ? blok.body.map((blok) => ( <StoryblokComponent blok={blok} key={blok._uid} /> )) : null} </main> ); export default Page;
-
-
Storyblok and Vue
Helpful resources
-
Vue Technology Hub
Check out our technology hub to learn more about the combined power of Storyblok and Vue.
-
Storyblok Discord
Join our supportive community of Storyblok and Vue developers in the #vue-hub channel of our Discord server.
-
Official SDK
Learn how to make the most out of @storyblok/vue. Feel free to share your feature requests, issues, or code contributions.
-
Learning Hub
Comprehensive developer guides, API documentation, technology hubs and more.
-
Kickstart a new project
Copy the command below by clicking on it and run it in your terminal. Choose Vue as your technology, follow the steps, and you’re ready to go!
-
-
-
-
-
-
npm i @storyblok/vue
-
- src/main.js
import { createApp } from 'vue' import { StoryblokVue, apiPlugin } from '@storyblok/vue' import App from './App.vue' import Grid from './components/Grid.vue' import Page from './components/Page.vue' import Teaser from './components/Teaser.vue' import Feature from './components/Feature.vue' const app = createApp(App) app.use(StoryblokVue, { accessToken: '9I0NMaGJZQaJQ4Qzmm5cHwtt', use: [apiPlugin], }) app.component('Grid', Grid) app.component('Page', Page) app.component('Teaser', Teaser) app.component('Feature', Feature) app.mount('#app')
-
3. Fetching a Story
In
src/pages/Home.vue
, fetch the home story of your Storyblok space.StoryblokComponent
will resolve and render all of your Storyblok components. -
- src/pages/Home.vue
<script setup> import { useStoryblok } from '@storyblok/vue'; const story = await useStoryblok('home', { version: 'draft' }); </script> <template> <StoryblokComponent v-if="story" :blok="story.content" /> </template>
-
4. Create Storyblok components
Create the counterparts to the components defined in your Storyblok space in
src/components
. Again,StoryblokComponent
handles all of your nestable blocks automatically. The Storyblok Bridge relies on thev-editable
directive. -
- src/components/Page.vue
<script setup> defineProps({ blok: Object }) </script> <template> <div v-editable="blok" class="px-6"> <StoryblokComponent v-for="inblok in blok.body" :blok="inblok" :key="inblok._uid" /> </div> </template>
-
-
Storyblok and Astro
Helpful resources
-
Astro Technology Hub
Check out our technology hub to learn more about the combined power of Storyblok and Astro.
-
Storyblok Discord
Join our supportive community of Storyblok and Astro developers in the #astro-hub channel of our Discord server.
-
Official SDK
Learn how to make the most out of @storyblok/astro. Feel free to share your feature requests, issues, or code contributions.
-
Learning Hub
Comprehensive developer guides, API documentation, technology hubs and more.
-
Kickstart a new project
Copy the command below by clicking on it and run it in your terminal. Choose Astro as your technology, follow the steps, and you're ready to go!
-
-
-
-
-
-
npm i @storyblok/astro
-
- astro.config.mjs
import { defineConfig } from 'astro/config' import storyblok from '@storyblok/astro' export default defineConfig({ integrations: [ storyblok({ accessToken: '<your-access-token>', components: { page: 'storyblok/Page', feature: 'storyblok/Feature', grid: 'storyblok/Grid', teaser: 'storyblok/Teaser', }, }), ], })
-
3. Fetching a Story
In
src/pages/index.astro
, fetch the home story of your Storyblok space.StoryblokComponent
will resolve and render all of your Storyblok components. -
- src/pages/index.astro
--- import { useStoryblokApi } from "@storyblok/astro"; import StoryblokComponent from "@storyblok/astro/StoryblokComponent.astro"; const storyblokApi = useStoryblokApi(); const { data } = await storyblokApi.get("cdn/stories/home", { version: "draft", }); const story = data.story; --- <StoryblokComponent blok="{story.content}" />
-
4. Create Storyblok components
Create the counterparts to the components defined in your Storyblok space in
src/storyblok
. Again,StoryblokComponent
handles all of your nestable blocks automatically. The Storyblok Bridge relies onstoryblokEditable
. -
- src/storyblok/page.astro
--- import { storyblokEditable } from '@storyblok/astro'; import StoryblokComponent from '@storyblok/astro/StoryblokComponent.astro'; const { blok } = Astro.props --- <main {...storyblokEditable(blok)}> {blok.body?.map(blok => {return <StoryblokComponent blok={blok} />})} </main>
-
-
Storyblok and PHP
Helpful resources
-
PHP Technology Hub
Check out our technology hub to learn more about the combined power of Storyblok and PHP.
-
Storyblok Discord
Join our supportive community of Storyblok and PHP developers in the #php-hub channel of our Discord server.
-
Content Delivery API client
Learn how to make the most out of our Content Delivery API with the official Storyblok PHP client, co-created with SensioLabs, creators of Symfony.
-
Symfony Bundle
Use the official Storyblok Symfony bundle, also co-created with SensioLabs, to build your next Symfony project.
-
Management API client
The Storyblok Management API PHP client provides an easy way connect to your Storyblok space and manage your content.
-
Learning Hub
Comprehensive developer guides, API documentation, technology hubs and more.
-
Thanks to SensioLabs for the collaboration
SensioLabs, creators of Symfony, worked with us to bring our new Content Delivery API client and Symfony Bundle to life, providing first class support to our PHP ecosystem.
-
Integrate Storyblok in a PHP project
To start using PHP with our Content Delivery API, install the Storyblok PHP Client via Composer:
-
-
-
-
-
use Storyblok\Api\StoryblokClient; $accesstoken = '***********'; // Storyblok access token $client = new StoryblokClient( token: $accesstoken; );
-
-
use Storyblok\Api\StoriesApi; use Storyblok\Api\StoryblokClient; use Storyblok\Api\Domain\Value\Dto\Version; use Storyblok\Api\Request\StoryRequest; $accesstoken = '***********'; // Storyblok access token $client = new StoryblokClient( baseUri: 'https://api.storyblok.com', token: $accesstoken ); $storiesApi = new StoriesApi($client); $slug = 'home'; $response = $storiesApi->bySlug($slug, new StoryRequest( version: Version::Draft, // Specify draft version )); print_r($response->story);
-
Explore more
The Storyblok PHP Client allows you to do more with Storyblok's Content Delivery API:
- Retrieve translated content
- Filter stories
- Retrieve links (for sitemaps, for example)
- Retrieve datasources
-
-
Are you a Symfony user?
If you’re building a web or CLI application with Symfony, consider installing the Symfony bundle. This bundle leverages the
storyblok/php-content-api-client
, configuring the Storyblok client while providing a Symfony Profiler extension for easier debugging and monitoring of Storyblok API interactions and supporting webhook integrations. -
-
Easily Manage Storyblok Content Programmatically
To handle Storyblok content programmatically, you can use the Storyblok Management API client.
For example, uploading an image to the Storyblok Assets Library has never been easier! After installing the library via Composer, you can quickly integrate and start using it in your project.
-
-
composer require storyblok/php-management-api-client:dev-main
-
You can initialize the Management Client as follows:
-
-
use Storyblok\ManagementApi\ManagementApiClient; $client = new ManagementApiClient($storyblokPersonalAccessToken);
-
Once initialized, you can use the
AssetApi
class to upload an asset: -
-
use Storyblok\ManagementApi\Endpoints\AssetApi; $spaceId = 'spaceid'; $assetApi = new AssetApi($client, $spaceId); $assetCreated = $assetApi->upload('image.png')->data();
-
Storyblok and SvelteKit
Helpful resources
-
SvelteKit Technology Hub
Check out our technology hub to learn more about the combined power of Storyblok and SvelteKit.
-
Storyblok Discord
Join our supportive community of Storyblok and Svelte developers in the #more-framework channel of our Discord server.
-
Official SDK
Learn how to make the most out of @storyblok/svelte. Feel free to share your feature requests, issues, or code contributions.
-
Learning Hub
Comprehensive developer guides, API documentation, technology hubs and more.
-
Kickstart a new project
Copy the command below by clicking on it and run it in your terminal. Choose SvelteKit as your technology, follow the steps, and you're ready to go!
-
-
-
-
-
-
npm i @storyblok/svelte
-
- main.js
import App from './App.svelte' import { storyblokInit, apiPlugin } from '@storyblok/svelte' storyblokInit({ accessToken: '<your-access-token>', use: [apiPlugin], components: { page: Page, feature: Feature, grid: Grid, teaser: Teaser, }, })
-
3. Fetching a Story
In
src/routes/+page.js
, fetch the home story of your Storyblok space. The Storyblok Bridge is enabled insrc/routes/+page.svelte
.StoryblokComponent
resolves and renders all of your Storyblok components. -
- src/routes/+page.js
/** @type {import('./$types').PageLoad} */ export async function load({ parent }) { const { storyblokApi } = await parent() const dataStory = await storyblokApi.get('cdn/stories/home', { version: 'draft', }) return { story: dataStory.data.story, } }
- src/routes/+page.svelte
<script> import { onMount } from "svelte"; import { useStoryblokBridge, StoryblokComponent } from "@storyblok/svelte"; export let data; onMount(() => { if (data.story) { useStoryblokBridge(data.story.id, (newStory) => (data.story = newStory)); } }); </script> <div> {#if data.story} <StoryblokComponent blok={data.story.content} /> {/if} </div>
-
4. Create Storyblok components
Create the counterparts to the components defined in your Storyblok space. Again,
StoryblokComponent
handles all of your nestable blocks automatically. The Storyblok Bridge relies onstoryblokEditable
. -
- src/components/Page.svelte
<script> import { storyblokEditable, StoryblokComponent } from "@storyblok/svelte"; export let blok; </script> {#key blok} <div use:storyblokEditable={blok} class="px-6"> {#each blok.body as blok} <StoryblokComponent {blok} /> {/each} </div> {/key}
-
-
Storyblok and Remix
Helpful resources
-
Remix Technology Hub
Check out our technology hub to learn more about the combined power of Storyblok and Remix.
-
Storyblok Discord
Join our supportive community of Storyblok and Remix developers in the #more-framework channel of our Discord server.
-
Learning Hub
Comprehensive developer guides, API documentation, technology hubs and more.
-
Kickstart a new project
Copy the command below by clicking on it and run it in your terminal. Choose Remix as your technology, follow the steps, and you're ready to go!
-
-
-
-
-
-
npm i @storyblok/react
-
- app/root.jsx
import { storyblokInit, apiPlugin } from "@storyblok/react"; import Feature from "./components/Feature"; import Grid from "./components/Grid"; import Page from "./components/Page"; import Teaser from "./components/Teaser"; const components = { feature: Feature, grid: Grid, teaser: Teaser, page: Page, }; storyblokInit({ accessToken: "your-preview-token", use: [apiPlugin], components, });
-
3. Fetching Stories
In
app/routes/$slug.jsx
, you can dynamically fetch the stories of your Storyblok space.StoryblokComponent
will resolve and render all of your Storyblok components. -
- app/routes/$slug.jsx
import { json } from "@remix-run/node"; import { useLoaderData } from "@remix-run/react"; import { getStoryblokApi, useStoryblokState, StoryblokComponent, } from "@storyblok/react"; export const loader = async ({ params }) => { const slug = params.slug ?? "home"; let sbParams = { version: "draft", }; let { data } = await getStoryblokApi().get(`cdn/stories/${slug}`, sbParams); return json(data?.story); }; export default function Page() { let story = useLoaderData(); story = useStoryblokState(story); return <StoryblokComponent blok={story.content} />; }
-
4. Create Storyblok components
Create the counterparts to the components defined in your Storyblok space in
app/components
. Again,StoryblokComponent
handles all of your nestable blocks automatically. The Storyblok Bridge relies onstoryblokEditable
. -
- app/components/Page.jsx
import { storyblokEditable, StoryblokComponent } from "@storyblok/react"; const Page = ({ blok }) => ( <main {...storyblokEditable(blok)} key={blok._uid}> {blok.body.map((nestedBlok) => ( <StoryblokComponent blok={nestedBlok} key={nestedBlok._uid} /> ))} </main> ); export default Page;
-
-
Useful Resources
Create your free space.
The Starter plan is always free with no credit card required. Upgrade at any time for premium features.