DEV Community

Alex Spinov
Alex Spinov

Posted on

Storyblok Has a Free Headless CMS — Visual Editing Meets API-First Content Management

Storyblok Has a Free Headless CMS — Visual Editing Meets API-First Content Management

Most headless CMS platforms give you an API but take away the visual editing experience. Storyblok gives you both — a powerful REST API AND a real-time visual editor where you can see changes as you make them.

Why Storyblok Stands Out

  • Visual Editor — drag-and-drop editing with real-time preview
  • REST API + GraphQL — fetch content programmatically
  • Component-based — build pages from reusable content blocks
  • Multi-language — built-in internationalization
  • Asset Manager — CDN-backed media storage with transformations

Free Tier (Community Plan)

  • 1 space
  • Unlimited content entries
  • 1 user
  • 25,000 API calls/month
  • Asset storage included
  • Visual editor included

Quick Start: Fetching Content

import StoryblokClient from 'storyblok-js-client';

const Storyblok = new StoryblokClient({
  accessToken: 'your-access-token'
});

// Get a single page
const { data } = await Storyblok.get('cdn/stories/home', {
  version: 'published'
});

console.log(data.story.content); // Your page content

// Get all blog posts
const { data: posts } = await Storyblok.get('cdn/stories', {
  starts_with: 'blog/',
  sort_by: 'first_published_at:desc',
  per_page: 10
});

posts.stories.forEach(post => {
  console.log(post.name, post.first_published_at);
});
Enter fullscreen mode Exit fullscreen mode

Component-Based Content

Storyblok's power is in components — reusable content blocks:

// Define components in your frontend
const components = {
  hero: ({ blok }) => (
    <section style={{ backgroundImage: `url(${blok.background_image})` }}>
      <h1>{blok.headline}</h1>
      <p>{blok.subheadline}</p>
      <a href={blok.cta_link}>{blok.cta_text}</a>
    </section>
  ),
  feature_grid: ({ blok }) => (
    <div className="grid">
      {blok.features.map(feature => (
        <div key={feature._uid}>
          <h3>{feature.title}</h3>
          <p>{feature.description}</p>
        </div>
      ))}
    </div>
  )
};

// Render dynamic pages
function Page({ story }) {
  return story.content.body.map(blok => {
    const Component = components[blok.component];
    return Component ? <Component blok={blok} key={blok._uid} /> : null;
  });
}
Enter fullscreen mode Exit fullscreen mode

Image Optimization

// Storyblok's image service transforms on the fly
const imageUrl = '//a.storyblok.com/f/12345/image.jpg';

// Resize to 800x600
const resized = `${imageUrl}/m/800x600`;

// WebP format with quality
const optimized = `${imageUrl}/m/800x0/filters:format(webp):quality(80)`;

// Face detection crop
const avatar = `${imageUrl}/m/200x200/filters:focal(500x300:600x400)`;
Enter fullscreen mode Exit fullscreen mode

The Bottom Line

Storyblok bridges the gap between developer-friendly APIs and editor-friendly visual tools. If your team needs both technical flexibility and a great editing experience, it's worth trying.


Need to extract content from competitor websites, monitor CMS changes, or build content migration tools? I build custom data solutions.

📧 Email me: spinov001@gmail.com
🔧 My tools: Apify Store

Top comments (0)