
Developer Experience Starts with Documentation
A look at how Storyblok’s documentation sets the tone for a positive developer experience
Storyblok Architect ~ Optimizely Most Valued Professional (OMVP) ~ CMS and Commerce certified
Contact MeWhen moving a customer from one CMS to another, developers often find themselves repeating the same tedious setup work—cataloging content types, recreating fields, aligning validators, and wiring up relationships. These manual steps are time-consuming, error-prone, and inconsistent across environments.
To reduce the amount of repetitive developer effort required, I’ve created a cross-platform CLI that helps teams migrate from Optimizely to Storyblok. We’re rolling this out in phases: Phase 1 focuses on migrating content types (component schemas), while future phases will extend to content (entries) migration and beyond.
Pulls content type definitions from Optimizely (Content Definitions API).
Saves them as a standardized JSON snapshot
Pushes those schemas into Storyblok as components/fields.
Safe to re‑run: only creates/updates what’s different.
Requires .NET 9 (dotnet --info
).
Pre‑release
dotnet tool install -g cms2storyblok --prerelease
If the command isn’t found: add the global tools path to your PATH
.
macOS/Linux:
~/.dotnet/tools
Windows:
%USERPROFILE%\.dotnet\tools
macOS/Linux (zsh/bash)
export OPTI_BASE_URL="https://<your-opti-host>/api"
cms2storyblok optimizely-schema \
--base-url "$OPTI_BASE_URL"
Windows (PowerShell)
$env:OPTI_BASE_URL = "https://<your-opti-host>/api"
cms2storyblok optimizely-schema `
--base-url $env:OPTI_BASE_URL `
./schemas/OptimizelySchema_20250911_114501.json
.
macOS/Linux (zsh/bash)
export STORYBLOK_MANAGEMENT_TOKEN="<your-storyblok-token>"
export STORYBLOK_SPACE_ID="<your-space-id>"
cms2storyblok schema:push \
--input ./schemas/OptimizelySchema_20250911_114501.json \
--space "$STORYBLOK_SPACE_ID" \
--token "$STORYBLOK_MANAGEMENT_TOKEN"
Windows (PowerShell)
Tip: add --dry-run
to preview changes without writing.
Content migration: export entries from Optimizely and import as Storyblok stories.
Assets: fetch/upload referenced media.
Validators & constraints: map required/regex/min/max where possible.
Transforms: field‑level shaping (e.g., rich‑text conversions, reference normalization).
If you want to try the CLI or have edge cases, I’d love feedback. Phase 2 (content migration) is up next.
A look at how Storyblok’s documentation sets the tone for a positive developer experience
Discover how a well-structured CMS can cut publishing time, reduce rework, and make future changes e
A practical guide to how Storyblok handles draft and published content, with examples of API usage a