Working with a specific static site generator? Customize CloudCannon's documentation to suit your SSG.
Select your preferred SSG
Showing docs
{
selected_name = 'Astro';
selected_icon = '/documentation/static/ssgs/astro.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-astro" aria-label="Astro" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Astro', 'icon': '/documentation/static/ssgs/astro.svg'})" x-show="selected_name !== 'Astro'">
Astro
{
selected_name = 'Bridgetown';
selected_icon = '/documentation/static/ssgs/bridgetown.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-bridgetown" aria-label="Bridgetown" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Bridgetown', 'icon': '/documentation/static/ssgs/bridgetown.svg'})" x-show="selected_name !== 'Bridgetown'">
Bridgetown
{
selected_name = 'Docusaurus';
selected_icon = '/documentation/static/ssgs/docusaurus.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-docusaurus" aria-label="Docusaurus" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Docusaurus', 'icon': '/documentation/static/ssgs/docusaurus.svg'})" x-show="selected_name !== 'Docusaurus'">
Docusaurus
{
selected_name = 'Eleventy';
selected_icon = '/documentation/static/ssgs/eleventy.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-eleventy" aria-label="Eleventy" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Eleventy', 'icon': '/documentation/static/ssgs/eleventy.svg'})" x-show="selected_name !== 'Eleventy'">
Eleventy
{
selected_name = 'Gatsby';
selected_icon = '/documentation/static/ssgs/gatsby.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-gatsby" aria-label="Gatsby" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Gatsby', 'icon': '/documentation/static/ssgs/gatsby.svg'})" x-show="selected_name !== 'Gatsby'">
Gatsby
{
selected_name = 'Hugo';
selected_icon = '/documentation/static/ssgs/hugo.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-hugo" aria-label="Hugo" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Hugo', 'icon': '/documentation/static/ssgs/hugo.svg'})" x-show="selected_name !== 'Hugo'">
Hugo
{
selected_name = 'Jekyll';
selected_icon = '/documentation/static/ssgs/jekyll.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-jekyll" aria-label="Jekyll" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Jekyll', 'icon': '/documentation/static/ssgs/jekyll.svg'})" x-show="selected_name !== 'Jekyll'">
Jekyll
{
selected_name = 'Lume';
selected_icon = '/documentation/static/ssgs/lume.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-lume" aria-label="Lume" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Lume', 'icon': '/documentation/static/ssgs/lume.svg'})" x-show="selected_name !== 'Lume'">
Lume
{
selected_name = 'MkDocs';
selected_icon = '/documentation/static/ssgs/mkdocs.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-mkdocs" aria-label="MkDocs" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'MkDocs', 'icon': '/documentation/static/ssgs/mkdocs.svg'})" x-show="selected_name !== 'MkDocs'">
MkDocs
{
selected_name = 'Next.js';
selected_icon = '/documentation/static/ssgs/nextjs.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-nextjs" aria-label="Next.js" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Next.js', 'icon': '/documentation/static/ssgs/nextjs.svg'})" x-show="selected_name !== 'Next.js'">
Next.js
{
selected_name = 'Nuxt';
selected_icon = '/documentation/static/ssgs/nuxtjs.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-nuxt" aria-label="Nuxt" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Nuxt', 'icon': '/documentation/static/ssgs/nuxtjs.svg'})" x-show="selected_name !== 'Nuxt'">
Nuxt
{
selected_name = 'Static';
selected_icon = '/documentation/static/ssgs/statik.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-static" aria-label="Static" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Static', 'icon': '/documentation/static/ssgs/statik.svg'})" x-show="selected_name !== 'Static'">
Static
{
selected_name = 'SvelteKit';
selected_icon = '/documentation/static/ssgs/sveltekit.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-sveltekit" aria-label="SvelteKit" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'SvelteKit', 'icon': '/documentation/static/ssgs/sveltekit.svg'})" x-show="selected_name !== 'SvelteKit'">
SvelteKit
{
selected_name = 'Custom';
selected_icon = '/documentation/static/ssgs/custom.svg';
$store.conditionals.select('ssg-name', selected_name);
$store.conditionals.select('ssg-icon', selected_icon);
open = false;
$dispatch('ssgchange');
}" aria-controls="docs-ssg-selector-other" aria-label="Custom" aria-selected="false" class="c-docs-ssg-selector__item" role="tab" x-init="$store.conditionals.registerValue('ssg', {'name': 'Custom', 'icon': '/documentation/static/ssgs/custom.svg'})" x-show="selected_name !== 'Custom'">
Custom
Great! We'll show you documentation relevant to . You can change this any time using the dropdown in the navigation bar.
How you configure previews in CloudCannon has changed. We recommend updating, but the previous configuration will continue to work . There’s now a consolidated key called preview
that encompasses our previous keys:
text_key
text
subtext_key
subtext
icon_key
icon
image_key
image
image_size
preview_image
description
As our configuration has grown, many of these keys were used inconsistently across different locations. We now offer a single option called preview that contains each of these options in a cascading process.
You can now define more than one option value for each preview option. Each option value is processed in order until a data value is found.
This is used in a number of places so far:
Hugo Shortcodes (Snippets)
Snippet Picker
Structures inside Array inputs
Structure Picker
Select-style inputs
Object inputs
Non-structure items inside Array inputs
Here are a number of examples to show the difference before and after migrating.
Changing how collection items look in the collection file list:
cloudcannon.config.yml (legacy)
collections_config :
posts :
text_key : heading
subtext_key : author
icon : event_available
image_key : thumbnail
image_size : contain
YAML JSON JavaScript
collections_config :
posts :
icon : event_available
preview :
text_key :
- key : heading
subtext_key :
- key : author
icon : event_available
image :
- key : thumbnail
{
"collections_config" : {
"posts" : {
"icon" : "event_available" ,
"preview" : {
"text_key" : [
{
"key" : "heading"
}
] ,
"subtext_key" : [
{
"key" : "author"
}
] ,
"icon" : "event_available" ,
"image" : [
{
"key" : "thumbnail"
}
]
}
}
}
}
module. exports = {
collections_config : {
posts : {
icon : "event_available" ,
preview : {
text_key : [
{
key : "heading"
}
] ,
subtext_key : [
{
key : "author"
}
] ,
icon : "event_available" ,
image : [
{
key : "thumbnail"
}
]
}
}
}
} ;
Changing how a collection item with a schema appears in the collection file list:
cloudcannon.config.yml (legacy)
collections_config :
posts :
schemas :
default :
path : schemas/post.md
news :
path : schemas/news- post.md
text_key : heading
icon : newspaper
image_key : cover_image
image_size : cover
YAML JSON JavaScript
collections_config :
posts :
schemas :
default :
path : schemas/post.md
news :
path : schemas/news- post.md
preview :
text :
- key : heading
icon : newspaper
gallery :
image :
- key : cover_image
fit : cover
{
"collections_config" : {
"posts" : {
"schemas" : {
"default" : {
"path" : "schemas/post.md"
} ,
"news" : {
"path" : "schemas/news-post.md" ,
"preview" : {
"text" : [
{
"key" : "heading"
}
] ,
"icon" : "newspaper" ,
"gallery" : {
"image" : [
{
"key" : "cover_image"
}
] ,
"fit" : "cover"
}
}
}
}
}
}
}
module. exports = {
collections_config : {
posts : {
schemas : {
default : {
path : "schemas/post.md"
} ,
news : {
path : "schemas/news-post.md" ,
preview : {
text : [
{
key : "heading"
}
] ,
icon : "newspaper" ,
gallery : {
image : [
{
key : "cover_image"
}
] ,
fit : "cover"
}
}
}
}
}
}
} ;
Changing how an object input appears in the Data Editor before opening:
cloudcannon.config.yml (legacy)
seo :
title : About us
description : A longer description of the page that is all about us.
image : /uploads/seo- cover.png
_inputs :
seo :
text_key : title
subtext_key : description
icon : search
image_key : image
YAML JSON JavaScript
seo :
title : About us
description : A longer description of the page that is all about us.
image : /uploads/seo- cover.png
_inputs :
seo :
preview :
text :
- key : title
subtext :
- key : description
icon : search
image :
- key : image
{
"seo" : {
"title" : "About us" ,
"description" : "A longer description of the page that is all about us." ,
"image" : "/uploads/seo-cover.png"
} ,
"_inputs" : {
"seo" : {
"preview" : {
"text" : [
{
"key" : "title"
}
] ,
"subtext" : [
{
"key" : "description"
}
] ,
"icon" : "search" ,
"image" : [
{
"key" : "image"
}
]
}
}
}
}
module. exports = {
seo : {
title : "About us" ,
description : "A longer description of the page that is all about us." ,
image : "/uploads/seo-cover.png"
} ,
_inputs : {
seo : {
preview : {
text : [
{
key : "title"
}
] ,
subtext : [
{
key : "description"
}
] ,
icon : "search" ,
image : [
{
key : "image"
}
]
}
}
}
} ;
Changing how a non-structure item within an array input appears in the Data Editor before opening:
cloudcannon.config.yml (legacy)
quotes :
- message : Great product!
author : Jane
image : /uploads/jane.png
- message : Highly recommended.
author : John
image : /uploads/john.png
_inputs :
quotes :
text_key : message
subtext_key : author
icon : format_quote
image_key : image
YAML JSON JavaScript
quotes :
- message : Great product!
author : Jane
image : /uploads/jane.png
- message : Highly recommended.
author : John
image : /uploads/john.png
_inputs :
quotes :
preview :
text :
- key : message
subtext :
- key : author
icon : format_quote
image :
- key : image
{
"quotes" : [
{
"message" : "Great product!" ,
"author" : "Jane" ,
"image" : "/uploads/jane.png"
} ,
{
"message" : "Highly recommended." ,
"author" : "John" ,
"image" : "/uploads/john.png"
}
] ,
"_inputs" : {
"quotes" : {
"preview" : {
"text" : [
{
"key" : "message"
}
] ,
"subtext" : [
{
"key" : "author"
}
] ,
"icon" : "format_quote" ,
"image" : [
{
"key" : "image"
}
]
}
}
}
}
module. exports = {
quotes : [
{
message : "Great product!" ,
author : "Jane" ,
image : "/uploads/jane.png"
} ,
{
message : "Highly recommended." ,
author : "John" ,
image : "/uploads/john.png"
}
] ,
_inputs : {
quotes : {
preview : {
text : [
{
key : "message"
}
] ,
subtext : [
{
key : "author"
}
] ,
icon : "format_quote" ,
image : [
{
key : "image"
}
]
}
}
}
} ;
Changing how a structure item appears when choosing a new one to add in the Data Editor:
cloudcannon.config.yml (legacy)
_structures :
gallery :
style : modal
values :
- label : Image
description : Full width image
preview_image : https: //example.com/image- screenshot.png
image : /path/to/image.png
icon : image
text_key : caption
subtext_key : image
image_key : image
image_size : cover
tags :
- Media
- Asset
value :
image : /uploads/placeholder.png
caption :
- label : External link
icon : link
tags :
- Media
value :
url :
title :
YAML JSON JavaScript
_structures :
gallery :
style : modal
values :
- label : Image
icon : image
tags :
- Media
- Asset
value :
image : /uploads/placeholder.png
caption :
preview :
text :
- key : caption
icon : image
subtext :
- key : image
- Full width image
gallery :
image :
- key : image
- /path/to/image.png
fit : cover
picker_preview :
gallery :
image : https: //example.com/image- screenshot.png
- label : External link
icon : link
tags :
- Media
value :
url :
title :
{
"_structures" : {
"gallery" : {
"style" : "modal" ,
"values" : [
{
"label" : "Image" ,
"icon" : "image" ,
"tags" : [
"Media" ,
"Asset"
] ,
"value" : {
"image" : "/uploads/placeholder.png" ,
"caption" : null
} ,
"preview" : {
"text" : [
{
"key" : "caption"
}
] ,
"icon" : "image" ,
"subtext" : [
{
"key" : "image"
} ,
"Full width image"
] ,
"gallery" : {
"image" : [
{
"key" : "image"
} ,
"/path/to/image.png"
] ,
"fit" : "cover"
}
} ,
"picker_preview" : {
"gallery" : {
"image" : "https://example.com/image-screenshot.png"
}
}
} ,
{
"label" : "External link" ,
"icon" : "link" ,
"tags" : [
"Media"
] ,
"value" : {
"url" : null ,
"title" : null
}
}
]
}
}
}
module. exports = {
_structures : {
gallery : {
style : "modal" ,
values : [
{
label : "Image" ,
icon : "image" ,
tags : [
"Media" ,
"Asset"
] ,
value : {
image : "/uploads/placeholder.png" ,
caption : null
} ,
preview : {
text : [
{
key : "caption"
}
] ,
icon : "image" ,
subtext : [
{
key : "image"
} ,
"Full width image"
] ,
gallery : {
image : [
{
key : "image"
} ,
"/path/to/image.png"
] ,
fit : "cover"
}
} ,
picker_preview : {
gallery : {
image : "https://example.com/image-screenshot.png"
}
}
} ,
{
label : "External link" ,
icon : "link" ,
tags : [
"Media"
] ,
value : {
url : null ,
title : null
}
}
]
}
}
} ;