sveltia / sveltia-cms

Alternative to Netlify/Decap CMS. Fast, lightweight, Git-based headless CMS. Modern UX, first-class i18n support, open source & free. Made with Svelte.
MIT License
949 stars 49 forks source link
asset-management cms content-management content-management-system dark-mode decap-cms deepl-api git-based-cms github-api headless-cms jamstack netlify-cms pexels-api pixabay-api static-site-generator stock-photos svelte sveltekit sveltia-cms unsplash-api

Sveltia CMS

Sveltia CMS is a Git-based lightweight headless CMS under active development as a modern, 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 to Netlify/Decap CMS is now in public beta, turbocharged with great UX, performance, i18n support and many more enhancements.

Screenshot: Open Source Git-based Headless CMS

Screenshot: Fast and Lightweight; Modern UX with Dark Mode

Screenshot: Stock Photo Integration with Pexels, Pixabay and Unsplash

Screenshot: All-New Asset Library; First Class I18n Support with DeepL

Screenshot: Works with Remote (GitHub, GitLab) and Local Repositories; Single Line Migration from Netlify/Decap CMS (depending on your current setup); Sveltia CMS

Table of contents

Motivation

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 decided to build an alternative from the ground up, while ensuring an easy migration path from the other. After proving the concept 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.

Our advantage

Due to its unfortunate abandonment, Netlify CMS spawned 3 successors:

Sveltia CMS is the only project that doesn’t inherit the complexity, technical debt and miscellaneous bugs of Netlify CMS, which was launched back in 2015. We are confident that our decision to rebuild the application from scratch was the right one, as proven by the hundreds of improvements we have already made.

While Sveltia CMS is specifically designed to replace legacy Netlify CMS instances, it also aims to serve as a substitute for the other Netlify CMS successors. We hope that, especially with the robust i18n support, our product will eventually become an attractive choice for anyone looking for a free headless CMS.

Our goals

Development status

Sveltia CMS is currently in beta and version 1.0 is expected to ship in early 2025, in time for the 10th anniversary of Netlify CMS development. Check our release notes 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 involves different kinds of activities that require considerable effort:

140 Netlify/Decap CMS Issues Solved in Sveltia CMS

Differentiators

We are working hard to create a significantly better alternative to Netlify CMS and Decap CMS by improving everything. Here’s what makes Sveltia CMS different. Look how serious we are!

Better UX

Better performance

Better productivity

Better accessibility

Better security

Better configuration

Better backend support

Better i18n support

Sveltia CMS has been built with a multilingual architecture from the very beginning. You can expect first-class 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 a multicultural city where 150+ languages are spoken.

Better collections

Better content editing

Better data output

Better widgets

New widgets

Better asset management

Better customization

Better localization

Compatibility

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.

Features not to be implemented

Current limitations

These limitations are expected to be resolved before or shortly after GA:

Feature Status in Sveltia CMS
Backends The Test backend needed for our demo site is not yet added. We’ll see if Azure DevOps can also be supported.
Configuration Comprehensive config validation is not yet implemented.
Localization The application UI is only available in English and Japanese at this time.
Media Libraries Cloudinary and Uploadcare are not yet supported.
Workflow Editorial Workflow and Open Authoring are not yet supported and will be implemented after the 1.0 release.
Collections Nested Collections (beta) are not yet supported and will be implemented after the 1.0 release.
Widgets Custom widgets are not yet supported. See the table below for other limitations.
Customizations Custom previews and event subscriptions are not yet supported.
Widget Status in Sveltia CMS
Code Not yet supported.
DateTime The date_format and time_format options with Moment.js tokens are not yet supported. Note that Decap CMS 3.1.1 replaced Moment.js with Day.js, and Decap CMS 3.3.0 made other changes to the widget behaviour; we’ll follow these changes where it makes sense.
File/Image Field-specific media folders and media library options are not yet supported other than media_library.config.max_file_size for the default media library.
Map Not yet supported.
Markdown Editor components, including built-in image and code-block as well as custom components, are not yet supported.

Other notes

Getting started

New users

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. Make sure you choose the GitHub or GitLab backend (and ignore the Choosing a Backend page). Then migrate to Sveltia CMS as described below.

As the product evolves, we’ll implement a built-in configuration editor and provide comprehensive documentation to make it easier for everyone to get started with Sveltia CMS.

Here are some starter kits for popular frameworks created by community members. More to follow!

Alternatively, you can probably use one of the Netlify/Decap CMS templates and make a quick migration to Sveltia CMS.

Migration

Have a look at the compatibility info above first. If you’re already using Netlify/Decap CMS with the GitHub or GitLab 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. Edit /admin/index.html to replace the CMS <script> tag, and push the change to your repository. Your new <script> tag is:

<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>

That’s it! You can open https://[hostname]/admin/ as before to start editing. There is even no authentication process if you’ve already been signed in with GitHub or GitLab on Netlify/Decap CMS because Sveltia CMS uses your auth token stored in the browser. Simple enough!

That said, we strongly recommend testing your new Sveltia CMS instance first on your local machine. See below for how.

Migrating from Git Gateway backend

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 a high-performance Git Gateway alternative with Netlify Identity support in the future.

Installing with npm

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.

Updates

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.

Tips & tricks

Moving your site from Netlify to another hosting service

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.

Providing a JSON configuration file

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="https://github.com/sveltia/sveltia-cms/blob/main/path/to/config.json" type="application/json" rel="cms-config-url" />

Alternatively, you can manually initialize the CMS with a JavaScript configuration object.

Working around an authentication error

If you get an “Authentication Aborted” error when trying to sign in to GitHub or GitLab 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)

Working with a local Git repository

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.

Basically there are only two differences from Netlify/Decap CMS: you don’t need to run the proxy server, and you need to select your project folder in the browser instead. Here are the detailed steps:

  1. Make sure you have configured the GitHub or GitLab backend.
    • Please note that the Git Gateway backend mentioned in the Netlify/Decap CMS local Git repository document is not supported in Sveltia CMS, so name: git-gateway won’t work. You’ll need either name: github or name: gitlab along with the repo definition. If you haven’t determined your repository name yet, just use a tentative name.
  2. Launch the local development server for your frontend framework, typically with npm run dev or pnpm dev.
  3. Open http://localhost:[port]/admin/index.html with Chrome or Edge.
    • The port number varies by framework. Check the terminal output from the previous step.
    • The 127.0.0.1 addresses can also be used instead of localhost.
    • If your CMS instance is not located under /admin/, use the appropriate path.
    • Other Chromium-based browsers may also work. Brave user? See below.
  4. 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 .git folder 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.
  5. Make some changes to your content on Sveltia CMS.
  6. See if the produced changes look good using git diff or a GUI like GitHub Desktop.
  7. Open the dev site at http://localhost:[port]/ to check the rendered pages.
  8. Commit and push the changes if satisfied, or discard them if you’re just testing.

Keep in mind 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 do this in a browser, because netlify-cms-proxy-server actually has the undocumented, experimental git mode that allows developers to create commits to a local repository[^131].

Also, at this point, you have to reload the CMS to see the latest content after retrieving remote updates. This manual work will hopefully be unnecessary once the proposed FileSystemObserver API, which is being implemented in Chromium behind a flag, becomes available.

If you have migrated from Netlify/Decap CMS and are happy with the local 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.

Enabling local development in Brave

In the Brave browser, you must enable the File System Access API with an experiment flag to take advantage of local development.

  1. Open brave://flags/#file-system-access-api in a new browser tab.
  2. Click Default (Disabled) next to File System Access API and select Enabled.
  3. Relaunch the browser.

Using a custom icon for a collection

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:

  1. Visit the Material Symbols page on Google Fonts.
  2. Search and select an icon, and copy the icon name displayed on the right panel.
  3. Add it to one of your collection definitions in config.yml as the new icon property, like the example below.
  4. Repeat the same steps for all the collections if desired.
  5. Commit and push the changes to your Git repository.
  6. Reload Sveltia CMS once the updated config file is deployed.
   - name: tags
     label: Tags
+    icon: sell
     create: true
     folder: data/tags/

Adding dividers to the collection list

Sveltia 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
    ...

Using a custom media folder for a collection

This is actually not new in Sveltia CMS but rather an undocumented feature in Netlify/Decap CMS[^4]. 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 an absolute path for media_folder like the example below. You can try this with Netlify/Decap CMS first if you prefer.

 media_folder: static/media
 public_folder: /media

 collections:
   - name: products
     label: Products
     create: true
     folder: data/products/
+    media_folder: /static/media/products # start with a slash
+    public_folder: /media/products

In 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.

Using keyboard shortcuts

Using DeepL to translate entry fields

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:

  1. Update your configuration file to enable the i18n support with multiple locales.
  2. Sign up for DeepL API and copy your Authentication Key from DeepL’s Account page.
  3. Open an entry in Sveltia CMS.
  4. Click on the Translation button on the pane header or each field, right next to the 3-dot menu.
  5. Paste your key when prompted.
  6. 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:

  1. Click the Account button in the upper right corner, then click Settings.
  2. Select the Language tab.
  3. Paste your key to the DeepL API Authentication Key field.
  4. Close the Settings dialog.

Localizing entry slugs

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: data/posts/
    slug: '{{title | localize}}' # This does the trick
    format: yaml
    i18n: true
    fields:
      - name: title
        label: Title
        widget: string
        i18n: true

With 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.

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: ref

Disabling non-default locale content

You 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

Using a random ID for an entry slug

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.

   - name: members
     label: Members
     create: true
     folder: data/members/
+    slug: '{{uuid_short}}'

Editing data files with a top-level list

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: List of Members
        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 account

Note: The root option is ignored if the collection or collection file contains multiple fields. You can still have subfields under the List field.

Disabling automatic deployments

You 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:

  1. Add the new automatic_deployments property to your backend configuration with a value of false:
    backend:
      name: github
      repo: owner/repo
      branch: main
    +  automatic_deployments: false
  2. Commit and deploy the change to the config file and reload the CMS.
  3. 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.
  4. 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:

Setting up Content Security Policy

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)

Then, add the following origins depending on your Git backend and enabled integrations.

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,

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://*;

Support & feedback

While we don’t have dedicated developer/user support resources, quick questions and feedback are welcome on the Discussions page of this GitHub repository. We also have a Discord channel for casual chat.

Looking to build a website with Sveltia CMS? Maintainer @kyoshino is available for hire depending on your requirements. Feel free to reach out!

Contributions

See Contributing to Sveltia CMS.

Roadmap

Before the 1.0 release

After the 1.0 release

Related links

As seen on

Disclaimer

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.

[^1]: Netlify/Decap CMS #2557

[^2]: Netlify/Decap CMS #3267

[^3]: Netlify/Decap CMS #1040

[^4]: Netlify/Decap CMS #3671

[^5]: Netlify/Decap CMS #1032

[^6]: Netlify/Decap CMS #3240

[^7]: Netlify/Decap CMS #4386

[^8]: Netlify/Decap CMS #2579

[^9]: Netlify/Decap CMS #3505, #4211, #5439

[^10]: Netlify/Decap CMS #341, #1167

[^11]: Netlify/Decap CMS #1382, #6994

[^12]: Netlify/Decap CMS #1975, #3712

[^13]: Netlify/Decap CMS #5112, #5653

[^14]: Netlify/Decap CMS #4635, #5920, #6410, #6827, #6924

[^15]: Netlify/Decap CMS #6932

[^16]: Netlify/Decap CMS #2103, #7302

[^17]: Netlify/Decap CMS #1333

[^18]: Netlify/Decap CMS #441

[^19]: Netlify/Decap CMS #5910

[^20]: Netlify/Decap CMS #4563

[^21]: Netlify/Decap CMS #4781

[^22]: Netlify/Decap CMS #3615, #4069, #5097, #6642

[^23]: Netlify/Decap CMS #2

[^24]: Netlify/Decap CMS #6831

[^25]: Netlify/Decap CMS #526, #6987

[^26]: Netlify/Decap CMS #3285, #7030, #7067, #7217

[^27]: Netlify/Decap CMS #5617

[^28]: Netlify/Decap CMS #2677, #6836

[^29]: Netlify/Decap CMS #4783

[^30]: Netlify/Decap CMS #565, #6733

[^31]: Netlify/Decap CMS #1045

[^32]: Netlify/Decap CMS #302, #5549

[^33]: Netlify/Decap CMS #542, #6513, #7295

[^34]: Netlify/Decap CMS #2138, #5932

[^35]: Netlify/Decap CMS #7086

[^36]: Netlify/Decap CMS #6325

[^37]: Netlify/Decap CMS #1481

[^38]: Netlify/Decap CMS #1984

[^39]: Netlify/Decap CMS #946

[^40]: Netlify/Decap CMS #5630

[^41]: Netlify/Decap CMS #7011

[^42]: Netlify/Decap CMS #2307

[^43]: Netlify/Decap CMS #4387, #5381

[^44]: Netlify/Decap CMS #2613

[^45]: Netlify/Decap CMS #1424

[^46]: Netlify/Decap CMS #4726

[^47]: Netlify/Decap CMS #2370, #5596

[^48]: Netlify/Decap CMS #5569, #6754

[^49]: Netlify/Decap CMS #5752

[^50]: Netlify/Decap CMS #4646, #7167

[^51]: Netlify/Decap CMS #6731

[^52]: Netlify/Decap CMS #6970, #7147

[^53]: Netlify/Decap CMS #512, #5673, #6707

[^54]: Netlify/Decap CMS #1347, #4629, #6287, #6826 — Decap 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.

[^55]: Netlify/Decap CMS #4480, #6353

[^56]: Netlify/Decap CMS #6515

[^57]: Netlify/Decap CMS #328

[^58]: Netlify/Decap CMS #5125

[^59]: Netlify/Decap CMS #1654

[^60]: Netlify/Decap CMS #386

[^61]: Netlify/Decap CMS #1489, #5838

[^62]: Netlify/Decap CMS #7192

[^63]: Netlify/Decap CMS #4877

[^64]: Netlify/Decap CMS #3853

[^65]: Netlify/Decap CMS #6034

[^66]: Netlify/Decap CMS #3353

[^67]: Netlify/Decap CMS #7077

[^68]: Netlify/Decap CMS #6978

[^69]: Netlify/Decap CMS #4350

[^70]: Netlify/Decap CMS #6482

[^71]: Netlify/Decap CMS #6999, #7000, #7001, #7152, #7220, #7283, #7316

[^72]: Netlify/Decap CMS #7047

[^73]: Netlify/Decap CMS #6993, #7123, #7127, #7128, #7237, #7251

[^74]: Netlify/Decap CMS #4209

[^75]: Netlify/Decap CMS #5472

[^76]: Netlify/Decap CMS #4738

[^77]: Netlify/Decap CMS #3415, #6565

[^78]: Netlify/Decap CMS #2294, #3046, #4363

[^79]: Netlify/Decap CMS #5726

[^80]: Netlify/Decap CMS #5493, #6600

[^81]: Netlify/Decap CMS #4645

[^82]: Netlify/Decap CMS #6500

[^83]: Netlify/Decap CMS #6508

[^84]: Netlify/Decap CMS #7142, #7276

[^85]: Netlify/Decap CMS #5055, #5470, #6989

[^86]: Netlify/Decap CMS #5253, #6759, #6901

[^87]: Netlify/Decap CMS #5280

[^88]: Netlify/Decap CMS #1267

[^89]: Netlify/Decap CMS #4255

[^90]: Netlify/Decap CMS #725

[^91]: Netlify/Decap CMS #4954

[^92]: Netlify/Decap CMS #1466

[^93]: Netlify/Decap CMS #1000

[^94]: Netlify/Decap CMS #5487

[^95]: Netlify/Decap CMS #4417

[^96]: Netlify/Decap CMS #962

[^97]: Netlify/Decap CMS #4288

[^98]: Netlify/Decap CMS #3856

[^99]: Netlify/Decap CMS #1685

[^100]: Netlify/Decap CMS #4147

[^101]: Netlify/Decap CMS #5969

[^102]: Netlify/Decap CMS #1270

[^103]: Netlify/Decap CMS #6307

[^104]: Netlify/Decap CMS #6819

[^105]: Netlify/Decap CMS #5701

[^106]: Netlify/Decap CMS #2822

[^107]: Netlify/Decap CMS #332, #683, #999, #1456, #4175, #4818, #5688, #6828, #6829, #6862, #7023

[^108]: Netlify/Decap CMS #6879

[^109]: Netlify/Decap CMS #7197

[^110]: Netlify/Decap CMS #4637

[^111]: Netlify/Decap CMS #7190, #7218

[^112]: Netlify/Decap CMS #5815, #6522, #6532, #6588, #6617, #6640, #6663, #6695, #6697, #6764, #6765, #6835, #6983, #7205

[^113]: Netlify/Decap CMS #5656, #5837, #5972, #6476, #6516, #6930, #6965, #7080, #7105, #7106, #7119, #7176, #7194, #7244, #7301 — These removeChild crashes are common in React apps and seem to be caused by a browser extension or Google Translate.

[^114]: Netlify/Decap CMS #5029, #5048

[^115]: Netlify/Decap CMS #7172

[^116]: Netlify/Decap CMS #3431

[^117]: Netlify/Decap CMS #3562, #6215

[^118]: Netlify/Decap CMS #7267

[^119]: Netlify/Decap CMS #5640, #6444

[^120]: Netlify/Decap CMS #2727, #4884

[^121]: Netlify/Decap CMS #7262

[^122]: Netlify/Decap CMS #1776, #2064, #7158, #7259

[^123]: Netlify/Decap CMS #5489

[^124]: Netlify/Decap CMS #991, #4488, #7233

[^125]: Netlify/Decap CMS #475

[^126]: Netlify/Decap CMS #7279

[^127]: Netlify/Decap CMS #4518

[^128]: Netlify/Decap CMS #7092

[^129]: 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.

[^130]: Netlify/Decap CMS #6571

[^131]: Netlify/Decap CMS #4429

[^132]: Netlify/Decap CMS #6816

[^133]: Netlify/Decap CMS #445

[^134]: Netlify/Decap CMS #5548

[^135]: Netlify/Decap CMS #2133

[^136]: Netlify/Decap CMS #7085

[^137]: Netlify/Decap CMS #4092

[^138]: Netlify/Decap CMS #4841

[^139]: Netlify/Decap CMS #6202

[^140]: Netlify/Decap CMS #5444

[^141]: Netlify/Decap CMS #3723, #6990

[^142]: Netlify/Decap CMS #7124

[^143]: Netlify/Decap CMS #1341

[^144]: Netlify/Decap CMS #3284

[^145]: Netlify/Decap CMS #4733

[^146]: Netlify/Decap CMS #2524

[^147]: Netlify/Decap CMS #3583

[^148]: Netlify/Decap CMS #531, #1282, #1877

[^149]: Netlify/Decap CMS #13 — The issue appears to have been closed without a fix being available.

[^150]: Netlify/Decap CMS #7319