--- title: Introduction position: 0 --- # Introduction Netlify CMS is a Content Management System for static sites, allowing collaborators to create, edit, review, and publish content without writing code or dealing with version control. It brings the ease of WordPress-style editing to the simplicity and speed of static sites. At its core, Netlify CMS is an open-source React app that acts as a wrapper for the Git workflow, using the GitHub API. This provides many advantages, including: * **Fast, web-based UI:** with rich-text editing, real-time preview, and drag-and-drop media uploads. * **Platform agnostic:** works with most static site generators. * **Easy installation:** add two files to your site and hook up the backend by including in your build process or linking to our CDN. * **Modern authentication:** using GitHub and JSON web tokens. * **Flexible content types:** specify an unlimited number of content types with custom fields. * **Fully extensible:** create custom-styled previews, UI widgets, and editor plugins. # Core Concepts ## The Admin Interface The admin interface is a single-page app with the entry point stored in a static `/admin` folder you add to the root of your site. You can include it with a simple `index.html` file that loads the necessary CSS and JS files from a CDN: ``` html Content Manager ``` The JS is also available via npm and can be integrated into your regular build process. ### Editorial Workflow Netlify CMS has an optional [editorial workflow](/docs/editorial-workflow) that translates common Git commands into familiar language in a simple UI: Actions in Netlify UI ... | Perform these Git actions --- | --- Save draft | Commits to a new branch, and opens a pull request Edit draft | Pushes another commit to the draft branch/pull request Approve and publish draft | Merges pull request and deletes branch ## Configuration All configuration is handled in a single `config.yml` file, also stored in the `/admin` folder. A simple version might look like this: ``` yaml backend: name: github repo: owner/repo # Path to your Github repository branch: master # Branch to update (master by default) media_folder: "img/uploads" # Folder where user uploaded files should go collections: # A list of collections the CMS should be able to edit - name: "post" # Used in routes, e.g., /admin/collections/:slug/edit label: "Post" # Used in the UI, e.g., "New Post" folder: "_posts" # The path to the folder where the documents are stored create: true # Allow users to create new documents in this collection fields: # The fields each document in this collection have - {label: "Title", name: "title", widget: "string", tagname: "h1"} - {label: "Body", name: "body", widget: "markdown"} - {label: "Foo", name: "foo", widget: "foo"} - {label: "Publish Date", name: "date", widget: "datetime"} ``` ### Backend Because Netlify CMS is a wrapper for the GitHub API, the "backend" is a repo stored on GitHub. *(Using a different Git host? File a [feature request](https://github.com/netlify/netlify-cms/issues), or [help us add it](https://github.com/netlify/netlify-cms/blob/master/CONTRIBUTING.md)!)* For authentication, you can connect to GitHub using Netlify’s [Authentication Provider feature](https://www.netlify.com/docs/authentication-providers), or you can roll your own. ### Collections All content managed by Netlify CMS is organized in Collections (groups of files), such as: * blog posts * portfolio samples * product listings * podcast episodes You point to where the files are stored, and specify the fields that define them. The `body` field typically stores the main text of a file, while any other fields are included at the top of the document in the front matter. They can be required, optional, or hidden, and can have preset defaults. ### Widgets Widgets define the data type and interface for entry fields. Netlify CMS comes with several built-in [widgets](/docs/widgets). ## Customization Netlify CMS exposes a `window.CMS` global object that you can use to register custom widgets, previews, and editor plugins. The available methods are: * `registerPreviewStyle`: register a custom stylesheet to match the editor preview pane to your site style. * `registerPreviewTemplate`: registers a template to determine how fields are displayed in the preview, customizable for each collection. * `registerWidget`: registers a custom widget. * `registerEditorComponent`: adds a block component to the Markdown editor.