Sveltia CMS is a Git-based lightweight headless CMS under active development as a modern, powerful, quick replacement for Netlify CMS and Decap CMS. In some simple cases, migration is as easy as a single line of code change, although we are still working on improving compatibility.
The free, open source alternative/successor to Netlify/Decap CMS is now in public beta, turbocharged with great UX, performance, i18n support and so many more enhancements.
- Motivation
- Development status
- Differentiators
- Better UX
- Better performance
- Better productivity
- Better accessibility
- Better security
- Better installation
- Better configuration
- Better backend support
- Better i18n support
- Better collections
- Better content editing
- Better content preview
- Better data output
- Better widgets
- Better asset management
- Better customization
- Better localization
- Compatibility
- Getting started
- Tips & tricks
- Moving your site from Netlify to another hosting service
- Providing a JSON configuration file
- Providing multiple configuration files
- Working around an authentication error
- Working with a local Git repository
- Enabling local development in Brave
- Using a custom icon for a collection
- Adding dividers to the collection list
- Using a custom media folder for a collection
- Specifying default sort field and direction
- Including Hugo’s special index file in a folder collection
- Using keyboard shortcuts
- Using DeepL to translate entry fields
- Localizing entry slugs
- Disabling non-default locale content
- Using a random ID for an entry slug
- Configuring multiple media libraries
- Optimizing images for upload
- Disabling stock assets
- Editing data files with a top-level list
- Changing the input type of a DateTime field
- Rendering soft line breaks as hard line breaks in Markdown
- Controlling data output
- Disabling automatic deployments
- Setting up Content Security Policy
- Showing the CMS version
- Support & feedback
- Contributions
- Roadmap
- Trivia
- Related links
- Disclaimer
Sveltia CMS was born in November 2022, when the progress of Netlify CMS was stalled for more than six months. @kyoshino’s clients wanted to replace their Netlify CMS instances without much effort, mainly to get better internationalization (i18n) support.
To achieve radical improvements in UX, performance, i18n and other areas, it was ultimately decided to build an alternative from the ground up, while ensuring an easy migration path from the other. After proving the idea with a rapid Svelte prototype, development was accelerated to address their primary use cases. The new product has since been named Sveltia CMS and released as open source software to encourage wider adoption.
We loved the simple architecture of Netlify CMS that turned a Git repository into a database with a single page app served from a CDN plus a plain YAML config file. In support of the Jamstack concept, we wanted to revive it, modernize it, and take it to the next level.
Due to its unfortunate abandonment in early 2022, Netlify CMS spawned 3 successors:
- Static CMS: a community fork, initial commit made in September 2022 — discontinued in September 2024 after making meaningful improvements
- Sveltia CMS: not a fork but a complete rewrite or “total reboot”, started in November 2022, first appeared on GitHub in March 2023
- Decap CMS: a rebranded version, announced in February 2023 as the official successor with a Netlify agency partner taking ownership — mostly stagnant, with only occasional releases
Sveltia CMS is the only project that doesn’t inherit the complexity, technical debt, and numerous bugs of Netlify CMS, which was launched in 2015. Our product is better by design: We rebuilt the app from the ground up using a modern framework without looking at the predecessor’s code, while closely monitoring and analyzing their issue tracker. This lets us make hundreds of improvements without getting stuck in the old system.
While Sveltia CMS was created to replace legacy Netlify CMS instances, it can also be used as an alternative to other Netlify CMS successors. With its solid i18n support, we’re hoping our product will eventually be an appearing option for anyone looking for a free headless CMS.
- Making Sveltia CMS a viable, definitive successor to Netlify CMS
- Empowering SMBs and individuals who need a free, yet powerful, high-quality CMS solution
- Emerging as the leading open source offering in the Git-based CMS market
- Extending its capabilities as digital asset management (DAM) software
- Showcasing the power of Svelte and UX engineering
Sveltia CMS is currently in beta and version 1.0 (GA) is expected to ship in Q4 2025. Check our release notes and follow us on Bluesky for updates. See also our roadmap.
While we fix reported bugs as quickly as possible, usually within 24 hours, our overall progress may be slower than you think. The thing is, it’s not just a personal project of @kyoshino, but also a complicated system involving various kinds of activities that require considerable effort:
- Ensuring substantial compatibility with Netlify/Decap CMS
- Providing partial compatibility with Static CMS
- Tackling as many Netlify/Decap CMS issues as possible
- So far, 225+ issues, or 450+ if including duplicates, have been effectively solved in Sveltia CMS
- Target:
- 200 issues, or 400 if including duplicates, by GA — We did it! 🎉
- 400 issues, or 800 if including duplicates, in the future 💪
- or every single issue that’s relevant, fixable, and worth dealing with 🔥
- Issues include everything from feature requests to bug reports and issues closed as stale or without an effective solution, as well as discussions and stalled pull requests
- Many of the bugs, including the annoying crashes, have already been solved
- The remaining bugs are mostly related to unimplemented features
- Many of their top-voted features are on our table or already implemented in Sveltia CMS
- Solving our own issues
- Implementing our own enhancement ideas for every part of the product
- Responding to requests from the maintainer’s clients
- Making the code clean and maintainable
Netlify/Decap CMS users will definitely be pleased and surprised by the numerous improvements we have made, from the small to the large. Here’s what makes Sveltia CMS different. Look how serious we are!
Note: This lengthy section compares Sveltia CMS with both Netlify CMS and Decap CMS. Some of the listed bugs may have been fixed in the current version of Decap CMS.
- Created and actively maintained by an experienced UX engineer who loves code, design, marketing and problem solving. You can expect constant improvements to the user experience (UX) and developer experience (DX) across the platform.
- The maintainer tries to respond to bug reports as quickly as possible. While there are no guarantees, the typical turnaround time for a bug fix is less than 24 hours.
- Frequent releases deliver new features and enhancements to users faster. Most of our minor releases address one or more Netlify/Decap CMS issues, giving you even more reasons to switch from the legacy predecessor.
- Offers a modern, intuitive user interface that utilizes the full viewport,1 inspired in part by the Netlify CMS v3 prototype.23456
- Provides immersive dark mode.7 The UI theme follows the user’s system preference by default and can be changed in the application settings.
- Users can easily manage content on-the-go with mobile and tablet support.89
- For a smoother experience, we even go beyond responsive design with optimized navigation, view transitions, larger buttons, and other tweaks. However, there are still rough edges, and we are working to fully optimize the app for small screens and touch devices.
- If you’re already signed in on your desktop, open the Account menu in the top right corner of the CMS, click Sign In with Mobile, and scan the QR code for passwordless sign-in. Your settings will be automatically copied.
- Made with Svelte, not React, means we can spend more time on UX rather than tedious state management. It also allows us to avoid common fatal React application crashes.1011 Best of all, Svelte offers great performance.
- Other crashes in Netlify/Decap CMS are also irrelevant to us, making Sveltia CMS much more stable.121314
- We build our own UI component library, including custom dialogs, to ensure optimal usability without compromising accessibility.15161718192021
- Users can personalize the application with various settings, including appearance and language. Developer Mode can also be enabled.
- Never miss out on the latest features and bug fixes by being notified when an update to the CMS is available.22 Then update to the latest version with a single click.23
- Built completely from scratch with Svelte instead of forking React-based Netlify/Decap CMS. The app starts fast and stays fast with no virtual DOM overhead. Note that Svelte is a compiler and Sveltia CMS is framework-agnostic; it’s served as a vanilla JavaScript bundle.
- Small footprint: The bundle size is less than 500 KB when minified and brotlied, which is much lighter than Netlify CMS (1.5 MB), Decap CMS (1.5 MB) and Static CMS (2.6 MB).2425 This number is remarkable because even though some Netlify/Decap CMS features are omitted or unimplemented in Sveltia CMS, we have added a lot of new features. That’s the power of Svelte 5 + Vite.
- Uses the GraphQL API for GitHub and GitLab to quickly fetch content at once, so that entries and assets can be listed and searched instantly2627 (the useless
searchconfiguration option is therefore ignored). It also avoids the slowness and potential API rate limit violations caused by hundreds of requests with Relation fields.28 - Saving entries and assets to GitHub is also much faster thanks to the GraphQL mutation.
- The Gitea backend is also faster because it utilizes an efficient API method introduced in Gitea 1.24.
- Our local repository workflow utilizes the modern File System Access API to read and write files natively through the web browser, rather than using a slow, ad hoc REST API through a proxy server.
- Sorting, filtering and grouping of entries is done instantly without reloading the entire content.
- Uses caching, lazy loading and infinite scrolling techniques. A list of repository files is stored locally for faster startup and bandwidth savings.
- Thumbnails of assets, including videos and PDF files, are generated and cached for faster rendering of the Asset Library and other parts of the CMS.2930
- No typing lag on input fields, especially within nested lists and objects.31
- The entry preview doesn’t use an
<iframe>because it’s a performance overhead.32
- Developers can work with a local Git repository without any additional configuration or proxy server, resulting in a streamlined workflow and improved performance.33
- It also avoids a number of issues, including potential dependency corruption,34 a 30 MB file size limit,35 an unknown error with
publish_mode,36 and an unusedlogo_url.37 - When you delete an entry or an asset file, the empty folder that contains it is also deleted, so you don’t have to delete it manually.
- It also avoids a number of issues, including potential dependency corruption,34 a 30 MB file size limit,35 an unknown error with
- Provides a smoother user experience in the Content Editor:
- A local backup of an entry draft is automatically created without interruption by a confirmation dialog, which annoys users and can cause a page navigation problem if dismissed.38 The backup can then be reliably restored without unexpected overwriting.39
- Click once (the Save button) instead of twice (Publish > Publish now) to save an entry. Or just hit the
Ctrl+S(Windows/Linux) orCommand+S(macOS) key to save your time. - The editor closes automatically when an entry is saved. This behaviour can be changed in the application settings.
- Uploading files can be done with drag and drop.40
- Users can upload multiple files at once to the Asset Library.41
- Users can delete multiple entries and assets at once.
- Instant full-text search with results sorted by relevance helps you find entries faster.
- Some keyboard shortcuts are available for faster editing.
- Improved keyboard handling lets you efficiently navigate through UI elements using the Tab, Space, Enter and arrow keys.4243
- Comprehensive WAI-ARIA support enables users who rely on screen readers such as NVDA and VoiceOver.44 An announcement is read out when you navigate to another page.
- The rich text editor is built with Lexical, which is said to follow accessibility best practices. The Dragon NaturallySpeaking support is enabled.
- Ensures sufficient contrast between the foreground text and background colours.
- Enabled and disabled buttons can be clearly distinguished.45
- Links are underlined by default to make them easier to recognize. This behaviour can be changed in the Accessibility Settings if you prefer.
- Honours your operating system’s reduced motion and reduced transparency settings. Support for high contrast mode will be added later.
- Browser console logs for developers are readable in either light or dark mode.46
- We’ll continue to test and improve the application to meet WCAG 2.2.
- Avoids vulnerabilities in dependencies through constant updates, Dependabot alerts,
pnpm audit, and frequent releases, unlike Netlify/Decap CMS where a number of high severity vulnerabilities remain unpatched for a long time.47 - Our local repository workflow doesn’t require a proxy server, reducing an attack surface.34
- We have enabled npm package provenance.
- We have documented how to set up a Content Security Policy for the CMS to prevent any unexpected errors or otherwise insecure configuration.48
- The
unsafe-evalandunsafe-inlinekeywords are not needed in thescript-srcCSP directive.49 - The
same-originreferrer policy is automatically set with a<meta>tag. - Sveltia CMS has a secure context requirement that forces the site content, including the CMS configuration file, to be served over HTTPS.
- GitHub commits are automatically GPG-signed and marked as verified.50
- Sveltia CMS is built with Svelte, and we only publish compiled vanilla JavaScript bundles, so there are no React compatibility issues that might prevent developers from upgrading a project for many months.51 We haven’t actually integrated React for custom widgets and other features yet, but anyway, no dependencies will be installed when you install the app with npm.
- Sveltia CMS also won’t cause peer dependency conflicts due to legacy third-party React UI libraries.52 We build the app using our own Svelte UI component library to reduce reliance on third parties.
- Some servers and frameworks are known to remove the trailing slash from the CMS URL (
/admin) depending on the configuration. In such cases, the config file is loaded from a root-relative URL (/admin/config.yml) instead of a regular relative URL (./config.yml=/config.yml) that results in a 404 Not Found error.53 - The robots
metatag is automatically added to HTML to prevent the admin page from being indexed by search engines.54 Developers are still encouraged to manually add<meta name="robots" content="noindex">toindex.html, as not all crawlers support dynamically added tags. However, our solution should at least work with Google in case you forget to do so.
- Sveltia CMS supports a JSON configuration file that can be generated for bulk or complex collections.55
- Also supports multiple configuration files to allow developers to modularize the configuration.56
- Improved TypeScript support: We try to keep our type definitions for
CMS.init()and other methods complete, accurate, up-to-date and annotated.5758596061 This makes it easier to provide a site config object when manually initializing the CMS.
- Uses the GraphQL API where possible for better performance, as mentioned above. You don’t need to set the
use_graphqloption to enable it for GitHub and GitLab. - The Git branch name is automatically set to the repository’s default branch (
main,masteror whatever) if not specified in the configuration file, preventing data loading errors due to a hardcoded fallback tomaster.6263 If a branch name is specified, it works as expected.64 - It’s possible to disable automatic deployments by default or on demand to save costs and resources associated with CI/CD and to publish multiple changes at once.65
- The GitLab backend support comes with background service status checking, just like GitHub.
- Service status checks are performed frequently and an incident notification is displayed prominently.
- Users can quickly open the source file of an entry or asset in your repository using View on GitHub (or GitLab or Gitea) under the 3-dot menu when Developer Mode is enabled.
- We provide our own OAuth client for GitHub and GitLab.
- The GitLab backend supports Git LFS (documentation).66
- Users won’t get a 404 Not Found error when you sign in to the GitLab backend.67
- Our Gitea backend is high-performing because it retrieves multiple entries at once. It also supports Git LFS (documentation). Additionally, the backend won’t cause 400 Bad Request errors due to the presence of
DRAFT_MEDIA_FILESin file paths.68 - The OAuth access token is automatically renewed when using the GitLab or Gitea backend with PKCE authorization.69 Token renewal for other backend configurations will be implemented later.
- Features the all-new local repository workflow that boosts DX. See the productivity section above.
- Developers can select the local and remote backends while working on a local server.
- The Test backend saves entries and assets in the browser’s origin private file system (OPFS) so that changes are not discarded when the browser tab is closed or reloaded.70 The persistent storage support works with all modern browsers except Safari.
Sveltia CMS has been built with a multilingual architecture from the very beginning. You can expect unparalleled internationalization (i18n) support, as it’s required by clients of maintainer @kyoshino, who himself was a long-time Japanese localizer for Mozilla and currently lives in the most diverse city in the world where 150+ languages are spoken.
- Configuration
- The i18n limitations in Netlify/Decap CMS do not apply to Sveltia CMS:
- File collections support multiple files/folders i18n structures.71 To enable it, simply use the
{{locale}}template tag in thefilepath option, e.g.content/pages/about.{{locale}}.jsonorcontent/pages/{{locale}}/about.json. For backward compatibility, the globalstructureoption only applies to folder collections, and the default i18n structure for file collections remains single file. - The List and Object widgets support the
i18n: duplicatefield configuration so that changes made with these widgets are duplicated between locales.7273 Thei18nconfiguration can normally be used for the subfields.
- File collections support multiple files/folders i18n structures.71 To enable it, simply use the
- The new
multiple_folders_i18n_rooti18n structure allows to have locale folders below the project root:<locale>/<folder>/<slug>.<extension>.74 - The new
omit_default_locale_from_filenamei18n option allows to exclude the default locale from filenames. This option applies to entry collections with themultiple_filesi18n structure enabled, as well as to file collection items with thefilepath ending with.{{locale}}.<extension>, aiming to support Zola’s multilingual sites. (Discussion) - The
requiredfield option accepts an array of locale codes in addition to a boolean, making the field required for a subset of locales when i18n support is enabled. For example, if only English is required, you could writerequired: [en]. An empty array is equivalent torequired: false. - Entry-relative media folders can be used in conjunction with the
multiple_foldersi18n structure.75 - The
{{locale}}template tag can be used in thepreview_pathcollection option to provide site preview links for each language.76 - It’s possible to use a random UUID for an entry slug, which is a good option for locales that write in non-Latin characters.
- It’s possible to localize entry slugs while linking the localized files,77 thanks to the support for Hugo’s
translationKey.78 - When the
clean_accentsoption is enabled for entry slugs, certain characters, such as German umlauts, will be transliterated.79 - It’s possible to embed the locale code in an entry by using
widget: hiddenalong withdefault: '{{locale}}'.80 - The
value_fieldRelation field option can contain a locale prefix like{{locale}}/{{slug}}, which will be replaced with the current locale. It’s intended to support i18n in Astro. (Discussion)
- The i18n limitations in Netlify/Decap CMS do not apply to Sveltia CMS:
- User interface
- Eliminates UI confusion: The Preview Pane can be displayed without toggling i18n in the Content Editor. Both panes are scrollable. There is no condition where both panes are edited in the same language at the same time.
- Users can easily switch between locales while editing by clicking a button instead of a dropdown list when there are less than 5 locales.
- Language labels appear in human-readable display names instead of ISO 639 language codes because it’s not easy for everyone to recognize
DEas German,NLas Dutch,ZHas Chinese, and so on.
- Content editing
- Integrates DeepL to allow translation of text fields from another locale with one click. More translation services will be added in the future.
- The Content Editor supports RTL scripts such as Arabic, Hebrew and Persian.81
- It’s possible to disable non-default locale content.82
- Boolean, DateTime, List and Number fields in the entry preview are displayed in a localized format.
- Boolean fields are updated in real time between locales like other widgets to avoid confusion.83
- Relation fields with i18n enabled won’t trigger a change in the content draft status when you start editing an existing entry.84
- Solves problems with Chinese, Japanese and Korean (CJK) IME text input in the rich text editor for the Markdown widget.85
- Raises a validation error instead of failing silently if the
single_filestructure is used and a required field is not filled in any of the locales.86 - Fields in non-default locales are validated as expected.87
- No internal error is thrown when changing the locale.88
- Duplicating an entry duplicates all locale content, not just the default locale.89
- Copying Markdown from another locale using the menu works as expected.90
- Configuration
- Provides some new options, including:
icon: Choose a custom icon for each collection.91thumbnail: Specify the field name for a thumbnail displayed on the entry list, likethumbnail: featuredImage.92- A nested field can be specified using dot notation, e.g.
heroImage.src. - A wildcard in the field name is also supported, e.g.
images.*.src. - Multiple field names can be specified as an array for fallback purpose, e.g.
[thumbnail, cover]. - Occasionally, you may not have suitable images for thumbnails. For example, your images may have subtle differences or varied aspect ratios. In that case, you can disable the thumbnail with
thumbnail: []. - If this option is omitted, any non-nested, non-empty Image or File field will be used.93
- A nested field can be specified using dot notation, e.g.
limit: Specify the maximum number of entries that can be created in a folder collection.94divider: Add dividers to the collection list.
- Enhancements to the entry
filteroption for folder collections: - Enhancements to summary string transformations:
- Transformations can be used in more places than just the collection
summary:- The
slugandpreview_pathcollection options98 - The
summaryfield option for the List and Object widgets
- The
- The
defaulttransformation accepts a template tag like{{fields.slug | default('{{fields.title}}')}}, making it possible to fall back to a different field value. (Discussion) - The
datetransformation supports the time zone argument. The only available value isutc, which converts a date to UTC. This is useful if the specified DateTime field is local, but you want to force UTC in the entry slug, e.g.{{date | date('YYYYMMDD-HHmm', 'utc')}}. (Discussion) - The
datetransformation returns an empty string if an invalid date is given.99 - Multiple transformations can be chained like
{{title | upper | truncate(20)}}.
- Transformations can be used in more places than just the collection
- The collection
labeldefaults to thenamevalue according to the Decap CMS document, while Netlify/Decap CMS actually throws a configuration error if thelabeloption is omitted. - Nested fields (dot notation) can be used in the
pathoption for a folder collection, e.g.{{fields.state.name}}/{{slug}}.100 - Markdown is supported in the
descriptioncollection option.101 Bold, italic, strikethrough, code and links are allowed. - The collection
foldercan be an empty string (or.or/) if you want to store entries in the root folder. This supports a typical VitePress setup. - Each file in a file collection has the
formatandfrontmatter_delimiteroptions, which can be used to specify the file format, making it possible to haveyaml-frontmatter,toml-frontmatterandjson-frontmatterside by side.102
- Provides some new options, including:
- Entry slugs
- It’s possible to use a random UUID for an entry slug.
- Slug generation is fail-safe: If a slug cannot be determined from entry content, part of a random UUID is used instead of throwing an error or filling in with arbitrary string field values.103
- Users can edit entry slugs via the 3-dot menu in the Content Editor.104
- If a collection only has the Markdown
bodyfield, an entry slug will be generated from a header in thebody, if exists. This supports a typical VitePress setup. - Entry slug template tags support transformations just like summary string template tags.98
- Single quotes (apostrophes) in a slug will be replaced with
sanitize_replacement(default: hyphen) rather than being removed.105 - The maximum number of characters for an entry slug can be set with the new
slug_lengthcollection option to avoid deployment errors with Netlify or other platforms.106 - Setting the collection
pathdoesn’t affect the entry slugs stored with the Relation widget.107 - Entry slugs are localizable.77
- Entry listing
- Default sort field and direction can be specified.108
- Sorting entries by a DateTime field works as expected.109
- Entry grouping and sorting can work together. For example, it’s possible to group by year and then sort by year if configured properly.
- Index file inclusion allows users to edit Hugo’s special
_index.mdfile, including localized ones like_index.en.md, within a folder collection.110 If theindex_fileoption is not defined, these files will be hidden in a folder collection unless thepathoption is configured to end with_indexand theextensionismd.111 - A console error won’t be thrown when a collection doesn’t have the
titlefield.112 In that case, an entry summary will be generated from a header in the Markdownbodyfield, if exists, or from the entry slug, so the summary will never be an empty.113 This supports a typical VitePress and Docusaurus setup.114 - If there was an error while parsing an entry file, such as duplicate front matter keys, it won’t show up as a blank entry, and a clear error message will be displayed in the browser console.115
- A single file can be used for more than one item in a file collection.116
- User interface
- The collection list displays the number of items in each collection.
- Users can select multiple entries and delete them at once.
- In an entry summary, basic Markdown syntax used in the title, including bold, italic and code, are parsed as Markdown. HTML character references (entities) are also parsed properly.117
- If you update an entry field that appears in the collection’s
summary, such astitle, the entry list displays an updated summary after you save the entry.118 - Thumbnails of entries are displayed not only in the grid view but also in the list view, making it easier to navigate.
- If entries don’t have an Image field for thumbnails, the entry list will only be displayed in the list view, because it doesn’t make sense to show the grid view.119
- Assets stored in a collection media folder can be displayed next to the entries.
- The New Entry button won’t appear when a developer accidentally sets the
create: trueoption on a file collection because it’s useless.120 - The Delete Entry button won’t appear when a developer accidentally sets the
delete: trueoption on a file collection because the preconfigured files should not be deleted.
- Required fields, not optional fields, are marked for efficient data entry.
- Users can revert changes to all fields or a specific field.
- If you revert changes and there are no unsaved changes, the Save button is disabled as expected.121
- The new
readonlyfield option makes the field read-only. This is useful when adefaultvalue is provided and the field should not be editable by users.122 - Fields with validation errors are automatically expanded if they are part of nested, collapsed objects.123
- A full regular expression, including flags, can be used for the widget
patternoption.124 For example, if you want to allow 280 characters or less in a multiline text field, you could write/^.{0,280}$/s(but you can now use themaxlengthoption instead.) - A long validation error message is displayed in full, without being hidden behind the field label.125
- Any links to other entries will work as expected, with the Content Editor being updated for the other.126
- In the Boolean and Select widgets, you don’t have to update a value twice to re-enable the Save button after saving an entry.127
datacan be used as a field name without causing an error when saving the entry.128
- The Preview Pane comes with a minimal default style.129 It looks nice without a custom preview style or template.
- For better performance, the Preview Pane doesn’t use an
<iframe>.32 - The Preview Pane displays all fields, including each label, making it easier to see which fields are populated.
- Clicking a field in the Preview Pane focuses the corresponding field in the Edit Pane.130 It automatically expands when collapsed.
- This is equivalent to the (misleading) visual editing feature introduced in Decap CMS 3.6.0, but our click-to-highlight feature is enabled by default; you don’t need to opt in with the
editor.visualEditingcollection option. - Our implementation doesn’t cause a module import error131 or broken image previews.132
- This is equivalent to the (misleading) visual editing feature introduced in Decap CMS 3.6.0, but our click-to-highlight feature is enabled by default; you don’t need to opt in with the
- The Preview Pane doesn’t cause a scrolling issue.133
- The Preview Pane doesn’t crash with a Minified React error.134
- Provides better scroll synchronization between the panes when editing or previewing an entry.135
- Developers can hide the preview of a specific field using a new field option:
preview: false.136 - See below for widget-specific enhancements, including support for variable types137 and YouTube videos.
- Keys in generated JSON/TOML/YAML content are always sorted by the order of configured fields, making Git commits clean and consistent.138
- Netlify/Decap CMS often, but not always, omits optional and empty fields from the output.139 Sveltia CMS aims at complete and consistent data output — it always saves proper values, such as an empty string, an empty array or
null, instead of nothing (undefined), regardless of therequiredfield option.140141142143- In other words, in Sveltia CMS,
required: falsemakes data input optional, but doesn’t make data output optional. - To omit empty optional fields from data output, use
omit_empty_optional_fields: truein the data output options. This is useful if you have data type validations that expectundefined.144
- In other words, in Sveltia CMS,
- JSON/TOML/YAML data is saved with a new line at the end of the file to prevent unnecessary changes being made to the file.145
- Leading/trailing whitespaces in text-type field values are automatically removed when you save an entry.146
- YAML string folding (maximum line width) is disabled, mainly for framework compatibility.147
- A standard time is formatted as
HH:mm:ssinstead ofHH:mmfor framework compatibility. - DateTime field values in ISO 8601 format are stored in native date/time format instead of quoted strings when the data output is TOML.148
- Provides JSON/YAML format options as part of the data output options, including indentation and quotes.149150
- The
yaml_quotecollection option added in v0.5.10 is now deprecated and will be removed in v1.0.0.yaml_quote: trueis equivalent toquote: doublein the new YAML format options.
- The
Sveltia CMS supports all built-in widgets available in Netlify/Decap CMS except Map. We have made significant improvements to these widgets while adding some new ones. The remaining Map widget will be added soon, followed by support for custom widgets.
Note: The Date widget has been deprecated in Netlify CMS and removed from both Decap CMS and Sveltia CMS in favour of the DateTime widget, as noted in the Compatibility section.
- Boolean
- Code
- More than 300 languages are available, thanks to Prism’s extensive language support.
- The language switcher always appears in the user interface, so it’s easy to spot and change the selected language.
- Dynamic loading of language modes work as expected.151
- A Code field under a List field work as expected, saving both code and language.152
- Color
- The widget doesn’t cause scrolling issues.153
- The preview shows both the RGB(A) hex value and the
rgb()function notation.
- DateTime
- Hidden
- The
defaultvalue supports the following template tags:{{locale}}: The current locale code.80{{datetime}}: The current date/time in ISO 8601 format.156{{uuid}},{{uuid_short}}and{{uuid_shorter}}: A random UUID or its shorter version, just like the slug template tags.157
- The
defaultvalue is saved when you create a file collection item, not just a folder collection item.158
- The
- List
- It’s possible to edit data files with a top-level list using the new
rootoption.159 - The
minandmaxoptions can be used separately. You don’t need to specify both to use either option.160 - The Add Item button appears at the bottom of the list when the
add_to_topoption is nottrue, so you don’t have to scroll up each time to add new items. - A list item comes with a menu that allows users to duplicate the item, insert a new item above/below it, or remove it.161
- Users can expand or collapse the entire list, while the Expand All and Collapse All buttons allow you to expand or collapse all items in the list at once.162
- A required List field with no subfield or value is marked as invalid.163 No need to set the
minandmaxoptions for therequiredoption to work. - An optional List field with no subfield or value is saved as an empty array, rather than nothing.142
- An optional List field won’t populate an item by default when the subfield has the
defaultvalue.164 - A simple List field with no subfields is displayed as a multiline text field,165 where users can use spaces166 and commas167 for list items. A comma is no longer treated as a list delimiter.
- Users can preview variable types without having to register a preview template.137
- It’s possible to omit
fieldsin a variable type object.168 In that case, only thetypeKey(default:type) is saved in the output. - A collapsed List field will not display a programmatic summary like
List [ Map { "key": "value" } ]if thesummaryoption is not set.169
- It’s possible to edit data files with a top-level list using the new
- Markdown
- The rich text editor is built with the well-maintained Lexical framework, which solves various issues with a Slate-based editor in Netlify/Decap CMS,170 including fatal application crashes,171172173174 lost formatting when pasting,175 an extra line break when pasting,176 extra HTML comments when pasting,177 backslash injections,178 dropdown visibility,179 and text input difficulties with IME.85
- The default editor mode can be set by changing the order of the
modesoption.180 If you want to use the plain text editor by default, addmodes: [raw, rich_text]to the field configuration. - A Markdown field plays well with a variable type List field.181
- A combination of bold and italic doesn’t create a confusing 3-asterisk markup.182 In our editor, bold is 2 asterisks and italic is an underscore.
- The built-in
imagecomponent can be inserted with a single click. - The built-in
imagecomponent allows users to add, edit or remove a link on an image.183 To disable this feature, addlinked_images: falseto the Markdown field options. - It’s possible to paste/drop local/remote images into the rich text editor to insert them as expected. Note: Pasting multiple images is not supported in Firefox. In Netlify/Decap CMS, pasting an image may cause the application to crash.
- The built-in
code-blockcomponent is implemented just like a blockquote. You can simply convert a normal paragraph into a code block instead of adding a component. - Code in a code block in the editor can be copied as expected.184
- Language-annotated code block doesn’t trigger unsaved changes.185
- Soft line breaks are rendered as hard line breaks in the Preview Pane.
- Number
- If the
value_typeoption isint(default) orfloat, therequiredoption isfalse, and the value is not entered, the field will be saved asnullinstead of an empty string.143 Ifvalue_typeis anything else, the data type will remain a string.
- If the
- Object
- Sveltia CMS offers two ways to have conditional fields in a collection:186
- The Object widget supports variable types (the
typesandtypeKeyoptions) just like the List widget.187 - An optional Object field (
required: false) can be manually added or removed with a checkbox.188 If unadded or removed, the required subfields won’t trigger validation errors,189 and the field will be saved asnull.
- The Object widget supports variable types (the
- Sveltia CMS offers two ways to have conditional fields in a collection:186
- Relation
- Field options are displayed with no additional API requests.28 The confusing
options_lengthoption, which defaults to 20, is therefore ignored.190 slugcan be used forvalue_fieldto show all available options instead of just one in some situations.191- Template strings with a wildcard like
{{cities.*.name}}can also be used forvalue_field.192 display_fieldsis displayed in the Preview Pane instead ofvalue_field.- The redundant
search_fieldsoption is optional in Sveltia CMS, as it defaults todisplay_fields,value_fieldor the collection’sidentifier_field, which istitleby default. - The
value_fieldoption is also optional in Sveltia CMS, as it defaults to{{slug}}(entry slugs). - A new item created in a referenced collection is immediately available in the options.193
- A referenced DateTime field value is displayed in the specified format.194
- It’s possible to refer to a List field with the
fieldoption, which produces a single subfield but does not output the subfieldnamein the data, using thevalue_field: cities.*.namesyntax. (Discussion)
- Field options are displayed with no additional API requests.28 The confusing
- Select
- It’s possible to select an option with value
0.195 labelis displayed in the Preview Pane instead ofvalue.
- It’s possible to select an option with value
- String
- When a YouTube video URL is entered in a String field, it appears as an embedded video in the Preview Pane. Check your site’s CSP if the preview doesn’t work.
- When a regular URL is entered in a String field, it appears as a link that can be opened in a new browser tab.
- Supports the
typeoption that acceptsurloremailas a value, which will validate the value as a URL or email. - Supports the
prefixandsuffixstring options, which automatically prepend and/or append the developer-defined value to the user-input value, if it’s not empty.
- Boolean, Number and String
- Supports the
before_inputandafter_inputstring options, which allow developers to display custom labels before and/or after the input UI.196 Markdown is supported in the value.- Compatibility note: In Static CMS, these options are implemented as
prefixandsuffix, respectively, which have different meaning in Sveltia CMS.
- Compatibility note: In Static CMS, these options are implemented as
- Supports the
- File and Image
- Provides a reimagined all-in-one asset selection dialog for File and Image fields.197
- Entry, file, collection and global assets are listed on separate tabs for easy selection.198
- A new asset can be uploaded by dragging & dropping it into the dialog.40
- A URL can also be entered in the dialog.
- Integration with Pexels, Pixabay and Unsplash makes it easy to select and insert a free stock photo.199 More stock photo providers will be added in the future.
- Users can also simply drag and drop a file onto a File/Image field to attach it without having to open the Select File dialog.
- Large images automatically fit in the Preview Pane instead of being displayed at their original size, which can easily exceed the width of the pane.
- The new
acceptoption allows files to be filtered by a comma-separated list of unique file type specifiers, in the same way as the HTMLacceptattribute for<input type="file">.200- By default, the Image widget only accepts an AVIF, GIF, JPEG, PNG, WebP or SVG image. BMP, HEIC, JPEG XL, PSD, TIFF and other less common or non-standard files are excluded.201
- The File widget has no default restriction.
- If the
public_foldercontains{{slug}}and you’ve edited a slug field (e.g.title) of a new entry after uploading an asset, the updated slug will be used in the saved asset path.202 Other dynamic template tags such as{{filename}}will also be populated as expected.203 - The CMS prevents the same file from being uploaded twice. It compares the hashes and selects an existing asset instead.
- Provides a reimagined all-in-one asset selection dialog for File and Image fields.197
- List and Object
- The
summaryis displayed correctly when it refers to a Relation field204 or a simple List field. - The
summarytemplate tags support transformations, e.g.{{fields.date | date('YYYY-MM-DD')}}. - The
collapsedoption accepts the valueautoto automatically collapse the widget if any of its subfields are filled out. The same applies to theminimize_collapsedoption for the List widget.
- The
- Markdown, String and Text
- A required field containing only spaces or line breaks will result in a validation error, as if no characters were entered.
- Relation and Select
- If a dropdown list has options with long wrapping labels, they won’t overlap with the next option.205
- When there are 5 or fewer options, the UI automatically switches from a dropdown list to radio buttons (single-select) or checkboxes (multi-select) for faster data entry.206 This number can be changed with the
dropdown_thresholdoption for therelationandselectwidgets.
- String and Text
- Supports the
minlengthandmaxlengthoptions, which allow developers to specify the minimum and maximum number of characters required for input without having to write a custom regular expression with thepatternoption. A character counter is available when one of the options is given, and a user-friendly validation error is displayed if the condition is not met.
- Supports the
- Compute
- The experimental
computewidget allows to reference the value of other fields in the same collection, similar to thesummaryproperty for the List and Object widgets.207 Use thevalueproperty to define the value template, e.g.posts-{{fields.slug}}. (Example) - The
valueproperty also supports a value of{{index}}, which can hold the index of a list item. (Example)
- The experimental
- KeyValue (Dictionary)
- The new
keyvaluewidget allows users to add arbitrary key-value string pairs to a field.208 - While the implementation is compatible with Static CMS, we provide a more intuitive UI. You can press Enter to move focus or add a new row while editing, and the preview is displayed in a clean table.
- The new
- UUID
- In addition to generating UUIDs for entry slugs, Sveltia CMS supports the proposed
uuidwidget with the following properties:157prefix: A string to be prepended to the value. Default: an empty string.use_b32_encoding: Whether to encode the value with Base32. Default:false.read_only: Whether to make the field read-only. Default:true.
- In addition to generating UUIDs for entry slugs, Sveltia CMS supports the proposed
- A completely new, full-fledged Asset Library, built separately from the image selection dialog, makes it easy to manage all of your files, including images, videos and documents.209
- Navigate between the global media folder and collection media folders.210
- Preview image, audio, video, text and PDF files. Check your site’s CSP if the preview doesn’t work.
- Copy the public URL,211 file path, text data or image data of a selected asset to clipboard. The file path starts with
/as expected.212 - Edit plain text assets, including SVG images.
- Rename existing assets. If the asset is used in any entries, the File/Image fields will be automatically updated with a new file path.
- Replace existing assets.
- Download one or more selected assets at once.
- Delete one or more selected assets at once.
- Upload multiple assets at once, including files in nested folders, by browsing or dragging and dropping them into the library.41
- Sort or filter assets by name or file type.
- View asset details, including size, dimensions, commit author/date and a list of entries that use the selected asset.
- Enhancements to media libraries:
- Supports multiple media libraries with the new
media_librariesoption.213 - Default media library
- It comes with a built-in image optimizer. With a few lines of configuration, images selected by users for upload are automatically converted to WebP format for reduced size,214 and it’s also possible to specify a maximum width and/or height.215 SVG images can also be optimized.
- The
max_file_sizeoption for the File/Image widget can be defined within the globalmedia_libraryoption, usingdefaultas the library name. It applies to all File/Image entry fields, as well as direct uploads to the Asset Library. The option can also be part of the newmedia_librariesoption. - Unlike Netlify/Decap CMS, files are uploaded with their original names. Uppercase letters and spaces are not converted to lowercase letters and hyphens.216 If you want to slugify filenames according to the
slugoption, use theslugify_filenamedefault media library option.
- Other integrations
- Integrates stock photo providers, including Pexels, Pixabay and Unsplash.199 Developers can disable them if needed.
- More integration options, including Amazon S3 and Cloudflare R2/Images/Stream, would be added in the future.
- Supports multiple media libraries with the new
- The global
media_foldercan be an empty string (or.or/) if you want to store assets in the root folder. - PDF documents are displayed with a thumbnail image in both the Asset Library and the Select File dialog, making it easier to find the file you’re looking for.30
- Assets stored in an entry-relative media folder are displayed in the Asset Library.217
- These entry-relative assets are automatically deleted when the associated entry is deleted because these are not available for other entries.218 When you’re working with a local repository, the empty enclosing folder is also deleted.
- Hidden files (dot files) don’t appear in the Asset Library.219
- Users can add assets using the Quick Add button in the upper right corner of the application.
- The application renders within the dimensions of a custom mount element, if exists.220
- A custom logo defined with the
logo_urlproperty is displayed on the global application header and the browser tab (favicon).221 A smaller logo is also correctly positioned on the authentication page.222 CMS.registerCustomFormat()supports async parser/formatter functions.223- The component definition for
CMS.registerEditorComponent()accepts theiconproperty. Developers can specify a Material Symbols icon name just like custom collection icons.
- The application UI locale is automatically selected based on the preferred language set with the browser.224 Users can also change the locale in the application settings. Therefore, the
localeconfiguration option is ignored andCMS.registerLocale()is not required. - The List widget’s
labelandlabel_singularare not converted to lowercase, which is especially problematic in German, where all nouns are capitalized.225 - Long menu item labels, especially in non-English locales, don’t overflow the dropdown container.226
We are trying to make Sveltia CMS compatible with Netlify/Decap CMS where possible, so that more users can seamlessly switch to our modern alternative. It’s ready to be used as a drop-in replacement for Netlify/Decap CMS in some casual use case scenarios with a single line of code update.
However, 100% feature parity is not planned, and some features are still missing or will not be added due to performance, deprecation and other factors. Look at the compatibility info below to see if you can migrate now or in the near future.
- Azure and Bitbucket backends: For performance reasons. We’ll support these platforms if their APIs improve to allow the CMS to fetch multiple entries at once.
- Git Gateway backend: Also for performance reasons. Git Gateway has not been actively maintained since Netlify CMS was abandoned, and it’s known to be slow and prone to rate limit violations. We plan to develop a GraphQL-based high-performance alternative in the future.
- Netlify Identity Widget: It’s not useful without Git Gateway, and the Netlify Identity service itself is now deprecated. We plan to develop an alternative solution with role support in the future, most likely using Cloudflare Workers and Auth.js.
- The deprecated client-side implicit grant for the GitLab backend: It has already been removed from GitLab 15.0. Use the client-side PKCE authorization instead.
- The deprecated Netlify Large Media service: Consider other storage providers.
- Deprecated camel case configuration options: Use snake case instead, according to the current Decap CMS document.
- Collection:
sortableFields - DateTime widget:
dateFormat,timeFormat,pickerUtc - Markdown widget:
editorComponents - Number widget:
valueType - Relation widget:
displayFields,searchFields,valueField - Note: Some other camel case options, including Color widget options, are not deprecated.
- Collection:
- The deprecated Date widget: It was removed from Decap CMS 3.0 and Sveltia CMS 0.10. Use the DateTime widget with the
time_format: falseoption instead. - Some date/time format tokens: Decap CMS 3.1.1 replaced Moment.js with Day.js, and Sveltia CMS will follow suit soon. Since Day.js tokens are not 100% compatible with Moment.js tokens, this could be a breaking change in certain cases.
- The theme and keymap inline settings for the Code widget, along with support for some languages: We use the Prism-powered code block functionality in Lexical instead of CodeMirror. Prism may be replaced by Shiki in the future.
- Remark plugins for the Markdown widget: Not compatible with our Lexical-based rich text editor.
- An absolute URL in the
public_folderoption: Such configuration is not recommended, as stated in the Netlify/Decap CMS document. - Performance-related options: Sveltia CMS has drastically improved performance with GraphQL enabled by default, so these are no longer relevant:
- Global:
search - Backend:
use_graphql - Relation widget:
options_length
- Global:
- The global
localeoption andCMS.registerLocale()method: Sveltia CMS automatically detects the user’s preferred language and changes the UI locale as mentioned above. - Undocumented methods exposed on the
CMSobject: This includes custom backends and custom media libraries, if any. We may support these features in the future, but our implementation would likely be incompatible with Netlify/Decap CMS. - Any other undocumented options/features. Exceptions apply.
These Netlify/Decap CMS features are not yet implemented in Sveltia CMS. We are working hard to add them before the 1.0 release due Q4 2025. Check the release notes and Bluesky for updates.
- Comprehensive site config validation
- Localization other than English and Japanese
- Forgejo backend (#381)
- Cloudinary and Uploadcare media libraries (#4)
- Field-specific media folders (beta) for the File and Image widgets
- Map widget
- Custom widgets
- Custom editor components: Support for preview, Object/List widgets, and the
defaultfield option - Custom previews (#51)
- Event hooks (#167)
Due to the complexity, we have decided to defer the following features to the 2.0 release. Netlify/Decap CMS has a number of open issues with the collaboration and beta features — we want to implement them the right way.
Found a compatibility issue or other missing feature? Let us know. Bear in mind that undocumented behaviour can easily be overlooked.
Sveltia CMS provides partial compatibility with Static CMS, a now-defunct fork of Netlify CMS. This README will be updated as our development progresses.
- Configuration options
- Static CMS made some breaking changes to view filters/groups, List widget, etc. while Sveltia CMS follows Netlify/Decap CMS, so you should review your configuration carefully.
- The
defaultoption for sortable fields is implemented in Sveltia CMS. - Directory navigation in the Asset Library is partially supported in Sveltia CMS. If you define collection-specific
media_folders, these folders will be displayed in the Asset Library and Select File/Image dialog. Display of subfolders within a configured folder will be implemented before GA. We don’t plan to support thefolder_supportanddisplay_in_navigationoptions formedia_library; subfolders will be displayed with no configuration. (#301) - The
logo_linkglobal option will not be supported. Usedisplay_urlorsite_urlinstead. - The
yamlglobal option will not be supported, as Sveltia CMS doesn’t expose the underlyingyamllibrary options for forward compatibility reasons. However, we do have some data output options, including YAML indentation and quotes.
- I18n support
- The
enforce_required_non_defaulti18n option will not be supported. Sveitia CMS enforces required fields in all locales by default. However, thesave_all_localesorinitial_localesi18n option allows users to disable non-default locales if needed. Developers can also specify a subset of locales with therequiredfield option, e.g.required: [en].
- The
- Widgets
- The date/time format options for the DateTime widget are incompatible since Static CMS switched to date-fns while Sveltia CMS continues to use Moment.js (and will soon switch to Day.js). Update your formats accordingly.
- The KeyValue widget is implemented in Sveltia CMS with the same options.
- The UUID widget is also implemented, but with different options.
- The
prefixandsuffixoptions for the Boolean, Number and String widgets are implemented asbefore_inputandafter_inputin Sveltia CMS, respectively. Ourprefixandsuffixoptions for the String widget are literally a prefix and suffix to the value. - The
multipleoption for the File and Image widgets will be implemented in Sveltia CMS before GA. (#10)
- Customization
CMS.registerIcon()will not be supported, as Sveltia CMS includes the Material Symbols font for custom collection icons that doesn’t require manual registration.
While Sveltia CMS is built with Svelte, the application is framework-agnostic. It’s a small, compiled, vanilla JavaScript bundle that manages content in a Git repository directly via an API. It doesn’t interact with the framework that builds your site.
You can use the CMS with any framework or static site generator (SSG) that loads static files during the build process. This includes Astro, Eleventy, Hugo, Jekyll, Next.js, SvelteKit, VitePress, and more.
We have added support for features and file structures used in certain frameworks and i18n libraries, such as index file inclusion and slug localization for Hugo, i18n support for Astro and Zola, and some enhancements for VitePress. Let us know if your framework has specific requirements.
- The GitLab backend requires GitLab 16.3 or later.
- The Gitea backend requires Gitea 1.24 or later. It’s not compatible with Forgejo at this time due to API differences. Support for Forgejo is tracked in #381. The default origin of the
base_urlandapi_rootbackend options is set tohttps://gitea.com(public free service) instead ofhttps://try.gitea.io(test instance).
Sveitia CMS works with all modern browsers, but there are a few limitations because it utilizes some new web technologies:
- The local repository workflow requires a Chromium-based browser, including Chrome, Edge and Brave.
- Safari: The Test backend doesn’t save changes locally; image optimization is slower than in other browsers.
- Firefox Extended Support Release (ESR) and its derivatives, including Tor Browser and Mullvad Browser, are not officially supported, although they may still work.
- Sveltia CMS requires a secure context, meaning it only works with HTTPS,
localhostor127.0.0.1URLs. If you’re running a remote server yourself and the content is served over HTTP, get a TLS certificate from Let’s Encrypt.
Currently, Sveltia CMS is primarily intended for existing Netlify/Decap CMS users. If you don’t have it yet, follow their documentation to add it to your site and create a configuration file first. Skip the Choosing a Backend page and choose the GitHub, GitLab or Gitea backend instead. Then migrate to Sveltia CMS as described below.
Or try one of the starter kits for popular frameworks created by community members:
- Astro
- Eleventy (11ty)
- Hugo
The Netlify/Decap CMS website has more templates and examples. You can probably use one of them and switch to Sveltia CMS. (Note: These third-party resources are not necessarily reviewed by the Sveltia CMS team.)
Unfortunately, we are unable to provide free installation and setup support at this time. As the product evolves, we’ll provide a built-in configuration editor, comprehensive documentation and official starter kits to make it easier for everyone to get started with Sveltia CMS.
Have a look at the compatibility info above first. If you’re already using Netlify/Decap CMS with the GitHub, GitLab or Gitea backend and don’t have any unsupported features like custom widgets or nested collections, migrating to Sveltia CMS is super easy — it works as a drop-in replacement.
Open /admin/index.html locally with an editor like VS Code and replace the CMS <script> tag with the new one:
<script src="https://unpkg.com/@sveltia/cms/dist/sveltia-cms.js"></script>From Netlify CMS:
-<script src="https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>
+<script src="https://unpkg.com/@sveltia/cms/dist/sveltia-cms.js"></script>From Decap CMS:
-<script src="https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js"></script>
+<script src="https://unpkg.com/@sveltia/cms/dist/sveltia-cms.js"></script>Next, let’s test Sveltia CMS on your local machine. If everything looks good, push the change to your repository.
You can now open https://[hostname]/admin/ as usual to start editing. There is even no authentication process if you’re already signed in with GitHub or GitLab on Netlify/Decap CMS because Sveltia CMS uses your auth token stored in the browser. Simple enough!
Sveltia CMS does not support the Git Gateway backend due to performance limitations. If you don’t care about user management with Netlify Identity, you can use the GitHub or GitLab backend instead. Make sure you install an OAuth client on GitHub or GitLab in addition to updating your configuration file. As noted in the document, Netlify is still able to facilitate the auth flow.
To allow multiple users to edit content, simply invite people to your GitHub repository with the write role assigned.
Once you have migrated from the Git Gateway and Netlify Identity combo, you can remove the Netlify Identity Widget script tag from your HTML:
-<script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>If you want to stay with Netlify Identity, unfortunately you can’t migrate to Sveltia CMS right now. We plan to develop an alternative to Git Gateway and Netlify Identity Widget in the future.
For advanced users, we have also made the bundle available as an npm package. You can install it by running npm i @sveltia/cms or pnpm add @sveltia/cms on your project. The manual initialization flow with the init method is the same as for Netlify/Decap CMS.
Updating Sveltia CMS is transparent, unless you include a specific version in the <script> source URL or use the npm package. Whenever you (re)load the CMS, the latest version will be served via UNPKG. The CMS also periodically checks for updates and notifies you when a new version is available. After the product reaches GA, you could use a semantic version range (^1.0.0) like Netlify/Decap CMS.
If you’ve chosen to install with npm, updating the package is your responsibility. We recommend using ncu or a service like Dependabot to keep dependencies up to date, otherwise you’ll miss important bug fixes and new features.
You can host your Sveltia CMS-managed site anywhere, such as Cloudflare Pages or GitHub Pages. But moving away from Netlify means you can no longer sign in with GitHub or GitLab via Netlify. Instead, you can use our own OAuth client, which can be easily deployed to Cloudflare Workers, or any other 3rd party client made for Netlify/Decap CMS.
Sveltia CMS supports a configuration file written in the JSON format in addition to the standard YAML format. This allows developers to programmatically generate the CMS configuration to enable bulk or complex collections. To do this, simply add a <link> tag to your HTML, just like a custom YAML config link, but with the type application/json:
<link href="path/to/config.json" type="application/json" rel="cms-config-url" />Alternatively, you can manually initialize the CMS with a JavaScript configuration object.
With Sveltia CMS, developers can modularize the site configuration. Just provide multiple config links and the CMS will automatically merge them in the order of <link> tag appearance. It’s possible to use YAML, JSON or both.
<link href="/admin/config.yml" type="application/yaml" rel="cms-config-url" />
<link href="/admin/collections/authors.yml" type="application/yaml" rel="cms-config-url" />
<link href="/admin/collections/pages.yml" type="application/yaml" rel="cms-config-url" />
<link href="/admin/collections/posts.yml" type="application/yaml" rel="cms-config-url" />Both standard application/yaml and non-standard text/yaml are acceptable for the YAML config link type.
Limitation: YAML anchors, aliases and merge keys only work if they are in the same file, as files are merged with the deepmerge library after being parsed as separate JavaScript objects.
If you get an “Authentication Aborted” error when trying to sign in to GitHub, GitLab or Gitea using the authorization code flow, you may need to check your site’s Cross-Origin-Opener-Policy. The COOP header is not widely used, but it’s known to break the OAuth flow with a popup window. If that’s your case, changing same-origin to same-origin-allow-popups solves the problem. (Discussion)
Sveltia CMS has simplified the local repository workflow by removing the need for additional configuration (the local_backend property) and a proxy server (netlify-cms-proxy-server or decap-server), thanks to the File System Access API available in some modern browsers.
Here are the workflow steps and tips:
- Make sure you have configured the GitHub, GitLab or Gitea backend.
- The Git Gateway backend mentioned in the Netlify/Decap CMS local Git repository document is not supported in Sveltia CMS, so
name: git-gatewaywon’t work. Usegithub,gitlaborgiteafor thenamealong with therepodefinition. If you haven’t determined your repository name yet, just use a tentative name.
- The Git Gateway backend mentioned in the Netlify/Decap CMS local Git repository document is not supported in Sveltia CMS, so
- Launch the local development server for your frontend framework, typically with
npm run devorpnpm dev. - Open
http://localhost:[port]/admin/index.htmlwith Chrome or Edge.- The port number varies by framework. Check the terminal output from the previous step.
- The
127.0.0.1addresses can also be used instead oflocalhost. - If your CMS instance is not located under
/admin/, use the appropriate path. - Other Chromium-based browsers may also work. Brave user? See below.
- Click “Work with Local Repository” and select the project’s root directory once prompted.
- If you get an error saying “not a repository root directory”, make sure you’ve turned the folder into a repository with either a CUI (
git init) or GUI, and the hidden.gitfolder exists. - If you’re using Windows Subsystem for Linux (WSL), you may get an error saying “Can’t open this folder because it contains system files.” This is due to a limitation in the browser, and you can try some workarounds mentioned in this issue and this thread.
- If you get an error saying “not a repository root directory”, make sure you’ve turned the folder into a repository with either a CUI (
- Edit your content using the CMS. All changes are made to local files.
- Open the dev site at
http://localhost:[port]/to check the rendered pages.- Depending on your framework, you may need to manually rebuild your site to reflect the changes you have made.
- Use
git diffor a GUI like GitHub Desktop to see if the produced changes look good. - Commit and push the changes if satisfied, or discard them if you’re just testing.
Note that, as with Netlify/Decap CMS, the local repository support in Sveltia CMS doesn’t perform any Git operations. You’ll have to manually fetch, pull, commit and push all changes using a Git client. In the future, we’ll figure out if there’s a way to commit in a browser, because the proxy server actually has the undocumented, experimental git mode that creates commits to a local repository.227 (Discussion)
You will also need to reload the CMS after making changes to the configuration file or retrieving remote updates. We plan to eliminate this manual work with the newly available File System Observer API.
If you have migrated from Netlify/Decap CMS and are happy with the local repository workflow of Sveltia CMS, you can remove the local_backend property from your configuration and uninstall the proxy server. If you have configured a custom port number with the .env file, you can remove it as well.
In the Brave browser, you must enable the File System Access API with an experiment flag to take advantage of the local repository workflow.
- Open
brave://flags/#file-system-access-apiin a new browser tab. - Click Default (Disabled) next to File System Access API and select Enabled.
- Relaunch the browser.
You can specify an icon for each collection for easy identification in the collection list. You don’t need to install a custom icon set because the Material Symbols font file is already loaded for the application UI. Just pick one of the 2,500+ icons:
- Visit the Material Symbols page on Google Fonts.
- Browse and select an icon, and copy the icon name that appears at the bottom of the right pane.
- Add it to one of your collection definitions in
config.ymlas the newiconproperty, like the example below. - Repeat the same steps for all the collections if desired.
- Commit and push the changes to your Git repository.
- Reload Sveltia CMS once the updated config file is deployed.
fields:
- name: tags
label: Tags
icon: sell # or any icon name
create: true
folder: content/tagsSveltia CMS allows developers to add dividers to the collection list to distinguish different types of collections. To do this, insert a fake collection with the divider: true option along with a random, unique name. In VS Code, you may get a validation error if config.yml is treated as a “Netlify YAML config” file. You can work around this by adding an empty files list as well:
collections:
- name: products
...
- divider: true
name: d1 # d2, d3, etc. Should be unique for each divider
files: []
- name: pages
...This is actually not new in Sveltia CMS but rather an undocumented feature in Netlify/Decap CMS.228 You can specify media and public folders for each collection that override the global media folder. Well, it’s documented, but that’s probably not what you want.
Rather, if you’d like to add all the media files for a collection in one single folder, specify both media_folder and public_folder instead of leaving them empty. The trick is to use a project relative path starting with a slash for media_folder like the example below. You can try this with Netlify/Decap CMS first if you prefer.
media_folder: static/media # leading slash is optional
public_folder: /media
collections:
- name: products
label: Products
folder: content/products
media_folder: /static/media/products # make sure to append a slash
public_folder: /media/productsIn Sveltia CMS, those collection media folders are displayed prominently for easier asset management. We recommend setting media_folder and public_folder for each collection if it contains one or more File/Image fields.
Sveltia CMS has extended the sortable_fields collection option to allow developers to define the field name and direction to be used for sorting entries by default. Our implementation is compatible with Static CMS. This is especially useful if you want to show entries sorted by date from new to old:
collections:
- name: posts
sortable_fields:
fields: [title, published_date, author]
default:
field: published_date
direction: descending # default: ascendingFor backward compatibility with Netlify/Decap CMS, sortable_fields with a field list (an array) will continue to work.
For backward compatibility with Static CMS, the direction option accepts title case values: Ascending and Descending. However, None is not supported and has the same effect as ascending.
Before this feature, Hugo’s special _index.md file was hidden in a folder collection, and you had to create a file collection to manage the file, since it usually comes with a different set of fields than regular entry fields. Now, with the new index_file option, you can add the index file to the corresponding folder collection, above regular entries, for easier editing:
collections:
- name: posts
label: Blog posts
folder: content/posts
fields: # Fields for regular entries
...
index_file:
name: _index # File name, required
fields: # Fields for the index file. If omitted, regular entry fields are used
...
editor:
preview: false # Hide the preview pane if neededNote that the special index file is placed right under the folder, regardless of the collection’s path option. For example, if the path is {{year}}/{{slug}}, a regular entry would be saved as content/posts/2025/title.md, but the index file remains at content/posts/_index.md.
- View the Content Library:
Alt+1 - View the Asset Library:
Alt+2 - Search for entries and assets:
Ctrl+F(Windows/Linux) orCommand+F(macOS) - Create a new entry:
Ctrl+E(Windows/Linux) orCommand+E(macOS) - Save an entry:
Ctrl+S(Windows/Linux) orCommand+S(macOS) - Cancel entry editing:
Escape
Standard keyboard shortcuts are also available in the Markdown editor, including Ctrl+B/Command+B for bold text, Ctrl+I/Command+I for italics, and Tab to indent a list item.
Sveltia CMS comes with a handy DeepL integration so that you can translate any text field from another locale without leaving the Content Editor. To enable the high quality, AI-powered, quick translation feature:
- Update your configuration file to enable the i18n support with multiple locales.
- Sign up for DeepL API and copy your Authentication Key from DeepL’s Account page.
- Open an entry in Sveltia CMS.
- Click on the Translation button on the pane header or each field, right next to the 3-dot menu.
- Paste your key when prompted.
- The field(s) will be automatically translated.
Note that the Translation button on the pane header only translates empty fields, while in-field Translation buttons override any filled text.
If you have upgraded to DeepL API Pro, provide your new Authentication Key:
- Click the Account button in the upper right corner, then click Settings.
- Select the Contents tab.
- Replace your free API key ending with
:fxwith the new paid API key in the DeepL API Authentication Key field. - Close the Settings dialog.
In Sveltia CMS, it’s possible to localize entry slugs (filenames) if the i18n structure is multiple_files or multiple_folders. All you need is the localize filter for slug template tags:
i18n:
structure: multiple_folders
locales: [en, fr]
slug:
encoding: ascii
clean_accents: true
collections:
- name: posts
label: Blog posts
create: true
folder: content/posts
slug: '{{title | localize}}' # This does the trick
format: yaml
i18n: true
fields:
- name: title
label: Title
widget: string
i18n: trueWith this configuration, an entry is saved with localized filenames, while the default locale’s slug is stored in each file as an extra translationKey property, which is used in Hugo’s multilingual support. Sveltia CMS and Hugo read this property to link localized files.
content/posts/en/my-trip-to-new-york.yamltranslationKey: my-trip-to-new-york title: My trip to New York
content/posts/fr/mon-voyage-a-new-york.yamltranslationKey: my-trip-to-new-york title: Mon voyage à New York
You can customize the property name and value for a different framework or i18n library by adding the canonical_slug option to your top-level or collection-level i18n configuration. The example below is for @astrolicious/i18n, which requires a locale prefix in the value (discussion):
i18n:
canonical_slug:
key: defaultLocaleVersion # default: translationKey
value: 'en/{{slug}}' # default: {{slug}}For Jekyll, you may want to use the ref property:
i18n:
canonical_slug:
key: refYou can disable output of content in selected non-default locales by adding the save_all_locales property to the top-level or collection-level i18n configuration. Then you’ll find “Disable (locale name)” in the three-dot menu in the top right corner of the Content Editor. This is useful if the translation isn’t ready yet, but you want to publish the default locale content first.
With the following configuration, you can disable the French and/or German translation while writing in English.
i18n:
structure: multiple_files
locales: [en, fr, de]
default_locale: en
save_all_locales: false # default: trueAlternatively, developers can specify locales to be enabled by default when users create a new entry draft, using the new initial_locales option, which accepts a locale list, default (default locale only) or all (all locales). The default locale is always enabled, even if it’s excluded from initial_locales. When this option is used, save_all_locales is deemed false.
The following example disables German by default, but users can manually enable it if needed. Users can also disable French, which is enabled by default.
i18n:
structure: multiple_files
locales: [en, fr, de]
default_locale: en
initial_locales: [en, fr]By default, the slug for a new entry file will be generated based on the entry’s title field. Or, you can specify the collection’s slug option to use the file creation date or other fields. While the behaviour is generally acceptable and SEO-friendly, it’s not useful if the title might change later or if it contains non-Latin characters like Chinese. In Sveltia CMS, you can easily generate a random UUID for a slug without a custom widget!
It’s simple — just specify {{uuid}} (full UUID v4), {{uuid_short}} (last 12 characters only) or {{uuid_shorter}} (first 8 characters only) in the slug option. The results would look like 4fc0917c-8aea-4ad5-a476-392bdcf3b642, 392bdcf3b642 and 4fc0917c, respectively.
collections:
- name: members
label: Members
slug: '{{uuid_short}}' # or {{uuid}} or {{uuid_shorter}}The traditional media_library option allows developers to configure only one media library:
media_library:
name: default
config:
max_file_size: 1024000Sveltia CMS has added support for multiple media libraries with the new media_libraries option so you can mix up the default media library (your repository), Cloudinary and Uploadcare. The new option can be used as a global option as well as a File/Image field option.
media_libraries:
default:
config:
max_file_size: 1024000 # default: Infinity
slugify_filename: true # default: false
transformations:
# See the next section
cloudinary:
config:
cloud_name: YOUR_CLOUD_NAME
api_key: YOUR_API_KEY
output_filename_only: true
uploadcare:
config:
publicKey: YOUR_PUBLIC_KEY
settings:
autoFilename: true
defaultOperations: '/resize/800x600/'Note: Cloudinary and Uploadcare are not yet supported in Sveltia CMS.
Ever wanted to prevent end-users from adding huge images to your repository? The built-in image optimizer in Sveltia CMS makes developers’ lives easier with a simple configuration like this:
media_libraries:
default:
config:
transformations:
raster_image: # original format
format: webp # new format, only `webp` is supported
quality: 85 # default: 85
width: 2048 # default: original size
height: 2048 # default: original size
svg:
optimize: trueThen, whenever a user selects images to upload, those images are automatically optimized, all within the browser. Raster images such as JPEG and PNG are converted to WebP format and resized if necessary. SVG images are minified using the SVGO library.
In case you’re not aware, WebP offers better compression than conventional formats and is now widely supported across major browsers. So there is no reason not to use WebP on the web.
- As noted above, the
media_librariesoption can be global at the root level ofconfig.yml, which applies to both entry fields and the Asset Library, or field-specific for the File/Image widgets. raster_imageapplies to any supported raster image format:avif,bmp,gif,jpeg,pngandwebp. If you like, you can use a specific format as key instead ofraster_image.- The
widthandheightoptions are the maximum width and height, respectively. If an image is larger than the specified dimension, it will be scaled down. Smaller images will not be resized. - File processing is a bit slow on Safari because native WebP encoding is not supported and the jSquash library is used instead.
- AVIF conversion is not supported because no browser has native AVIF encoding support (Chromium won’t fix it) and the third-party library (and AVIF encoding in general) is very slow.
- This feature is not intended for creating image variants in different formats and sizes. It should be done with a framework during the build process.
- We may add more transformation options in the future.
The Select File/Image dialog includes some stock photo providers for convenience, but sometimes these may be irrelevant. Developers can hide them with the following configuration:
media_libraries:
stock_assets:
providers: []Sveltia CMS allows you to edit and save a list at the top-level of a data file, without a field name. All you need to do is create a single List field with the new root option set to true. The configuration below reproduces this Jekyll data file example:
collections:
- name: data
label: Data Files
files:
- name: members
label: Member List
file: _data/members.yml
fields:
- name: members
label: Members
label_singular: Member
widget: list
root: true # This does the trick
fields:
- name: name
label: Name
- name: github
label: GitHub accountNote: The root option is ignored if the collection or collection file contains multiple fields. You can still have subfields under the List field.
It may be worth mentioning this topic here because the current Decap CMS doc about the DateTime widget is unclear. By default, a DateTime field lets users pick both date and time, but developers can change the input type if needed.
Use time_format: false to hide the time picker and make the input date only:
- label: Start Date
name: startDate
widget: datetime
time_format: falseUse date_format: false to hide the date picker and make the input time only:
- label: Start Time
name: startTime
widget: datetime
date_format: falseWe understand that this configuration may be a bit confusing, but it’s necessary to maintain backward compatibility with Netlify CMS. We plan to improve the widget options and introduce new input types: month and week.
This tip is not really specific to Sveltia CMS, but some developers have asked the maintainer about it:
In the Markdown editor, pressing Shift+Enter inserts a soft line break (\n). We can’t change the behaviour to add a hard line break (<br>) — it’s a limitation of the underlying Lexical framework. However, if you look at the preview, you may notice that soft line breaks are rendered as hard line breaks. That’s because the preview is using the Marked library with the breaks option enabled, which mimics how comments are rendered on GitHub.
Chances are the Markdown parser you use for your frontend can do the same:
- markdown-it (used in Eleventy and VitePress) also has the
breaksoption - remarkable also has the
breaksoption - Showdown has the
simpleLineBreaksoption - goldmark (used in Hugo) has the
html.WithHardWrapsoption - kramdown (used in Jekyll) has the
hard_wrapoption with the GFM parser - remark (used in Astro) offers a plugin
- micromark clarifies it doesn’t have such an option and recommends alternatives
Sveltia CMS supports some data output options, including JSON/YAML formatting preferences, at the root level of the configuration file. The default options are listed below:
output:
omit_empty_optional_fields: false
encode_file_path: false # true to URL-encode file paths for File/Image fields
json:
indent_style: space # or tab
indent_size: 2
yaml:
quote: none # or single or double
indent_size: 2You may already have a CI/CD tool set up on your Git repository to automatically deploy changes to production. Occasionally, you make a lot of changes to your content to quickly reach the CI/CD provider’s (free) build limits, or you just don’t want to see builds triggered for every single small change.
With Sveltia CMS, you can disable automatic deployments by default and manually trigger deployments at your convenience. This is done by adding the [skip ci] prefix to commit messages, the convention supported by GitHub Actions, GitLab CI/CD, CircleCI, Travis CI, Netlify, Cloudflare Pages and others. Here are the steps to use it:
- Add the new
automatic_deploymentsproperty to yourbackendconfiguration with a value offalse:backend: name: github repo: owner/repo branch: main automatic_deployments: false
- Commit and deploy the change to the config file and reload the CMS.
- Now, whenever you save an entry or asset,
[skip ci]is automatically added to each commit message. However, deletions are always committed without the prefix to avoid unexpected data retention on your site. - If you want to deploy a new or updated entry, as well as any other unpublished entries and assets, click an arrow next to the Save button in the Content Editor, then select Save and Publish. This will trigger CI/CD by omitting
[skip ci].
If you set automatic_deployments to true, the behaviour is reversed. CI/CD will be triggered by default, while you have an option to Save without Publishing that adds [skip ci] only to the associated commit.
Gotcha: Unpublished entries and assets are not drafts. Once committed to your repository, those changes can be deployed any time another commit is pushed without [skip ci], or when a manual deployment is triggered.
If the automatic_deployments property is defined, you can manually trigger a deployment by clicking the Publish Changes button on the application header. To use this feature:
- GitHub Actions:
- Without any configuration, Publish Changes will trigger a
repository_dispatchevent with thesveltia-cms-publishevent type. Update your build workflow to receive this event:on: push: branches: [$default-branch] repository_dispatch: types: [sveltia-cms-publish]
- Without any configuration, Publish Changes will trigger a
- Other CI/CD providers:
- Select Settings under the Account button in the top right corner of the CMS.
- Select the Advanced tab.
- Enter the deploy hook URL for your provider, e.g. Netlify or Cloudflare Pages.
- Configure the CSP if necessary. See below.
If your site adopts Content Security Policy (CSP), use the following policy for Sveltia CMS, or some features may not work.
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
img-src 'self' blob: data:;
media-src blob:;
frame-src blob:;
script-src 'self' https://unpkg.com;
connect-src 'self' blob: data: https://unpkg.com;
(UNPKG is used not only to download the CMS script bundle, but also to check for the latest version and retrieve additional dependencies such as PDF.js and Prism language definitions)
Then, add the following origins depending on your Git backend and enabled integrations.
- GitHub: (If you’re running a GitHub Enterprise Server, you’ll also need to add the origin to these directives.)
img-srchttps://*.githubusercontent.comconnect-srchttps://api.github.com https://www.githubstatus.com
- GitLab: (If you’re running a self-hosted instance, you’ll also need to add the origin to these directives.)
img-srchttps://gitlab.com https://secure.gravatar.comconnect-srchttps://gitlab.com https://status-api.hostedstatus.com
- Gitea: (If you’re running a self-hosted instance, use the origin instead.)
img-srchttps://gitea.comconnect-srchttps://gitea.com
- Pexels:
img-srchttps://images.pexels.comconnect-srchttps://images.pexels.com https://api.pexels.com
- Pixabay:
img-srchttps://pixabay.comconnect-srchttps://pixabay.com
- Unsplash:
img-srchttps://images.unsplash.comconnect-srchttps://images.unsplash.com https://api.unsplash.com
- DeepL API Free:
connect-srchttps://api-free.deepl.com
- DeepL API Pro:
connect-srchttps://api.deepl.com
- YouTube:
frame-srchttps://www.youtube-nocookie.com
If you choose to disable automatic deployments and have configured a webhook URL, you may need to add the origin to the connect-src directive. For example,
- Netlify:
connect-srchttps://api.netlify.com
- Cloudflare Pages
connect-srchttps://api.cloudflare.com
If you have image field(s) and expect that images will be inserted as URLs, you may want to allow any source using a wildcard instead of specifying individual origins:
img-src 'self' blob: data: https://*;
- Click on your avatar in the top right corner of the application to open the Account menu.
- Click Settings.
- Click the Advanced tab.
- Enable Developer Mode.
- Close the Settings dialog.
A Release Notes link will now appear under the Account menu with the current application version.
While we don’t have dedicated developer/user support resources, you can post quick questions on the Discussions page of our GitHub repository. Feedback is also welcome, but please check the Compatibility and Roadmap sections of this README before starting a new discussion — your idea may already be covered.
Join us on Discord or ping us on Bluesky for a casual chat.
As described throughout this README, Sveltia CMS is being built as a replacement for Netlify/Decap CMS. At this point, we assume that most developers and users are moving from the other product. We are happy to help you migrate, but we cannot help you set up Sveltia CMS from scratch through our free support channels.
Planning to build a website with Sveltia CMS? Looking for professional support? Maintainer @kyoshino is available for hire depending on your needs. Feel free to reach out!
See Contributing to Sveltia CMS. Bug reports are highly encouraged!
Due Q4 2025
- Enhanced compatibility with Netlify/Decap CMS
- Tackling some more Netlify/Decap CMS issues
- Accessibility audit
- Localization
- Developer documentation (implementation guide)
- Marketing site
- Live demo site
- Implementing some deferred Netlify/Decap CMS features
- Tackling even more Netlify/Decap CMS issues
- End-user documentation
- Contributor documentation
- Tackling many of the remaining Netlify/Decap CMS issues, including MDX support,229 manual entry sorting,230 config editor,231 singletons,232 and other top-voted features (some of them may be included in v2.0)
- Exploring features that require server-side implementation, including user management (Netlify Identity alternative), roles,233 commits without a Git service account (Git Gateway alternative), post locking (like WordPress)234 and scheduled posts235
- More integration options: stock photos, stock videos, cloud storage providers, translation services, maps, analytics tools, etc.
- AI integrations for image generation, content writing, translation, etc.
- Search enhancements
- Advanced digital asset management (DAM) features, including image editing and tagging236
- Marketplace for custom widgets, etc.
- VS Code extension for
config.ymlschema validation - Official starter templates for the most popular frameworks, including SvelteKit and Next.js
- and so much more!
- The original version of Netlify CMS was built with Ember before being rewritten in React. And now we are completely rewriting it in Svelte. So this is effectively the second time the application has gone through a framework migration.
- Our local repository workflow shares implementation with the Test backend, as both utilize the File System API, allowing us to reduce maintenance costs. The seamless local workflow is critical not only for improved DX, but also for our rapid application development.
- Introducing Sveltia CMS: a short technical presentation by @kyoshino during the This Week in Svelte online meetup on March 31, 2023 — recording & slides
- LogRocket Blog – 9 best Git-based CMS platforms for your next project
- Jamstack – Headless CMS
- Hugo – Front-end interfaces
- Made with Svelte
This software is provided “as is” without any express or implied warranty. We are not obligated to provide any support for the application. This product is not affiliated with or endorsed by Netlify, Decap CMS or any other integrated services. All product names, logos, and brands are the property of their respective owners.
Footnotes
-
Netlify/Decap CMS #441, #1277, #1339, #2500, #2833, #2984, #3852, #7083 ↩
-
Netlify/Decap CMS #5656, #5837, #5972, #6476, #6516, #6930, #6965, #7080, #7105, #7106, #7119, #7176, #7194, #7244, #7278, #7301, #7342, #7348, #7354, #7376, #7408, #7412, #7413, #7422, #7427, #7434, #7438, #7454, #7464, #7471, #7485, #7499, #7515 — These
removeChildcrashes are common in React apps, likely caused by a browser extension or Google Translate. ↩ -
Netlify/Decap CMS #4961, #4979, #5545, #5778, #6279, #6464, #6810, #6922, #7118, #7293 — A comment on one of the issues says the crash was due to Google Translate. Sveltia CMS has turned off Google Translate on the admin page. ↩
-
Netlify/Decap CMS #5815, #6522, #6532, #6588, #6617, #6640, #6663, #6695, #6697, #6764, #6765, #6835, #6983, #7205, #7450, #7453 ↩
-
Netlify/Decap CMS #2673, #5315, #6499, #6544, #6551, #6679, #6773, #6883, #7363, #7365 — This problem occurs every time a new major version of React is released. ↩
-
Netlify/Decap CMS #332, #683, #999, #1456, #4175, #4818, #5688, #6828, #6829, #6862, #7023 ↩
-
Netlify/Decap CMS #7281 — The issue was closed, but the attached PR is not yet merged. ↩
-
Netlify/Decap CMS #1347, #1559, #4629, #4837, #6287, #6826 — Decap CMS 3.0 updated the Slate editor in an attempt to fix the problems, but the IME issues remain unresolved when using a mobile/tablet browser. ↩ ↩2
-
Netlify/Decap CMS #2368, #3454, #3585, #3651, #3885, #3962, #4037, #4143, #6585, #6664, #6665, #6739, #7243, #7379, #7469 ↩
-
Netlify/Decap CMS #756 — The Expand All and Collapse All buttons cannot be found in the current version of Decap CMS. ↩
-
Netlify/Decap CMS #6905 — We use Lexical created by Facebook (Meta). ↩
-
Netlify/Decap CMS #6999, #7000, #7001, #7152, #7220, #7283, #7316, #7429, #7465, #7500 ↩
-
Netlify/Decap CMS #6993, #7123, #7127, #7128, #7237, #7251, #7361, #7391, #7393, #7470, #7475, #7480, #7503, #7504 ↩
-
Netlify/Decap CMS #2019 — Rather than relying on a third-party library, we built our own asset browser that integrates more seamlessly with the rest of the CMS. ↩
-
Netlify/Decap CMS #13 — The issue appears to have been closed without a fix being available. ↩






