> For the complete documentation index, see [llms.txt](https://docs.frase.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.frase.io/integrations/cms-publishing/frase-cms.md).

# Frase CMS

Launch a fast, search-ready blog that Frase hosts for you, and publish to it straight from the editor. No plugins, servers, or copy-pasting.

{% hint style="info" %}
Frase CMS is included with every Frase plan. Already have a blog on WordPress, Webflow, Sanity, or Wix? Connect that instead from **Settings → Integrations.**
{% endhint %}

## Choose where your blog lives

Pick a hosting mode based on how much setup you want to do. You can start on a subdomain and switch later.

| Hosting mode       | Your blog's address | Best for                                                           | Setup time       |
| ------------------ | ------------------- | ------------------------------------------------------------------ | ---------------- |
| **Subdomain**      | `blog.yoursite.com` | Getting live fast and testing a content strategy                   | About 1 minute   |
| **Custom domain**  | `yourblog.com`      | A standalone blog on a domain you own                              | About 5 minutes  |
| **Subdirectory**   | `yoursite.com/blog` | The most SEO value, since posts build your main domain's authority | About 15 minutes |
| **Headless (API)** | Your own frontend   | Developers who want to render posts in their own site              | Varies           |

## Set up your blog

{% stepper %}
{% step %}

### Open Settings

Go to *Publish* section of the left sidebar, and click **Frase CMS → Settings**.

<figure><img src="https://2722506614-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPjiB67jRcrUcXcskiWhp%2Fuploads%2FmXVZmZemh01Fdb1iBoGe%2Fimage.png?alt=media&amp;token=493b0df2-3e73-438f-8bde-3f541ea34ec0" alt="Frase CMS settings"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Choose your hosting mode&#x20;

Head to the *Setup* tab, and follow the steps below based on where your blog lives:

* **Subdomain:** enter the subdomain you want. Your blog is ready right away.
* **Custom domain:** enter your domain and add the DNS records Frase shows you. Frase handles the SSL certificate for you.
* **Subdirectory:** follow *Host your blog at yoursite.com/blog* below.
* **Headless (API):** see *Use Frase CMS headlessly* below.
  {% endstep %}

{% step %}

### Adjust your theme

Frase themes your blog from the colors, fonts, and logo in your [Brand Hub](https://docs.frase.io/feature-reference/brand-hub).&#x20;

On the *Theme* tab, click **Use brand defaults**, then click **Preview** and switch to edit mode to fine-tune spacing, corners, borders, shadows, and card colors.
{% endstep %}

{% step %}

### Connect Google Search Console&#x20;

Frase needs [Google Search Console](/integrations/connectors/google-search-console.md) to show how your posts rank and to suggest what to fix or write next. You can still publish without it.
{% endstep %}
{% endstepper %}

### Host your blog at yoursite.com/blog

{% hint style="warning" %}
Subdirectory mode needs a Frase CMS Basic or Pro plan.
{% endhint %}

{% stepper %}
{% step %}

#### Upgrade your Frase CMS plan

Go to *Settings → Billing & Usage → Frase CMS*.
{% endstep %}

{% step %}

#### Turn on subdirectory mode&#x20;

Done in your Frase CMS settings. The default path is `/blog`.
{% endstep %}

{% step %}

#### Verify your domain&#x20;

Use the DNS records Frase provides.
{% endstep %}

{% step %}

#### Add a redirect rule on your site host

Add this one line to your host's redirects file (for example, a `_redirects` file), using your Frase CMS subdomain:

```
/blog/* https://<your-frasecms-subdomain>/blog/:splat 200
```

Your posts now appear at `yoursite.com/blog/<post>`. No code changes or site rebuilds needed.
{% endstep %}
{% endstepper %}

## Publish and update posts

{% stepper %}
{% step %}

### Click Publish in the article editor and choose Frase CMS

Publish live, or save as a draft to review first. You can also ask the [Frase Agent](https://docs.frase.io/automations/meet-the-frase-agent) something like *"Publish my article to the blog."*

<div align="left"><figure><img src="https://2722506614-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPjiB67jRcrUcXcskiWhp%2Fuploads%2F7uHoK2yRDHZZcJRBeal0%2Fimage.png?alt=media&amp;token=48d0d258-3cc4-48cc-8a13-4d9705bc6c51" alt="Publish menu in the Frase editor"><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}

### Pick a content type, author, category, and tags

Posts publish as blog posts by default. To publish alternatives, reviews, FAQs, or other types, enable them first in [Site Taxonomy](https://docs.frase.io/core-workflows/publish-content-to-your-cms#set-content-types-with-site-taxonomy). Add authors on the *Authors* tab of your Frase CMS settings.
{% endstep %}

{% step %}

### Schedule it for later *(optional)*

Drop the article on the [Content Calendar](https://docs.frase.io/automations/content-calendar) and Frase publishes it on that date.
{% endstep %}
{% endstepper %}

{% hint style="success" %}
To update a live post, edit it in the same editor and publish again.&#x20;
{% endhint %}

## Approve posts before they go live

If your team wants a second set of eyes, submissions wait in the **Review queue** until someone clears them.

{% stepper %}
{% step %}

### Go to the Review Queue

Open *Frase CMS* in the left sidebar and go to the Review queue.
{% endstep %}

{% step %}

### Open a pending item

You'll see its assigned reviewer, how long it's been waiting, and any content rule warnings.
{% endstep %}

{% step %}

### Choose an action

* **Approve** publishes the post as submitted.
* **Edit & Approve** lets you make changes first.
* **Reject** sends it back without publishing.
* **Reassign Authors** changes who's credited on the post.
  {% endstep %}
  {% endstepper %}

{% hint style="success" %}
Approved posts publish to whichever CMS your site uses. Once an item is approved or rejected, it's locked, and every action is saved with who did it and when.&#x20;
{% endhint %}

{% hint style="info" %}
Filter the queue by *Pending*, *Approved*, *Edited & Approved*, *Rejected*, or *Withdrawn*.
{% endhint %}

## See how posts perform

Open **Frase CMS** in the left sidebar to see page views, engagement, and trends for each post. Clicks, impressions, and rankings show up once Search Console is connected.

<figure><img src="https://2722506614-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPjiB67jRcrUcXcskiWhp%2Fuploads%2FvCCVFKH6ncZaLgLN72ND%2Fimage.png?alt=media&amp;token=281944f3-9a4f-486d-a505-5b4178f73290" alt="Frase CMS performance analytics"><figcaption></figcaption></figure>

## What Else Frase CMS handles&#x20;

You don't need plugins for any of this. It's on by default.

* **SEO basics:** meta tags, Open Graph tags, XML sitemaps, RSS feeds, clean URLs, and automatic 301 redirects when you change a slug.
* **Speed:** a global CDN, automatic image optimization, and WebP conversion.
* **Images that don't break:** images from other sites are copied into Frase's storage when you publish.

{% hint style="info" %}
**Need a headless CMS?** Choose **Headless (API)** on the *Setup* tab, then generate a delivery token to pull posts into your own frontend. Developers can also publish, import, and manage posts through the [Frase API and MCP](/integrations/api-and-mcp.md).
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.frase.io/integrations/cms-publishing/frase-cms.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
