Get Started

v0.0.1

Mishka CMS is an open-source content management system built with Elixir, Phoenix and the Ash Framework. You build and edit pages in the browser, publish them without a redeploy, and run many websites from one install. This page says what the CMS is, helps you choose where to read next, and lists the six things it does.

What Mishka CMS is

Mishka CMS stores a site's pages, layouts, components, error pages, stylesheets and JS hooks as rows in PostgreSQL. You edit them in the admin dashboard, in the visual editor or as code. When you publish, the CMS compiles the change while it runs, so visitors get it without a deploy.

One install serves many sites. A site is a domain with its own pages, accounts and settings, and the CMS finds the site from the host name of each request. A master account belongs to no site, manages all of them, and signs in at /auth?master_user=true. See Sites, masters and global records.

The CMS ships with two extensions, Blog and Documentation. An extension adds admin screens, permission names, components and pages to a site, and it attaches to the CMS through plugins. See Extensions and plugins. To build an extension of your own, start with Draw an extension's pages in the site layout.

Pick a path

The docs hold four kinds of page. Choose by what you need to do now.

What it does

Six things carry most of the CMS. Each one links to the page that explains it.

A visual editor

The visual editor builds a page on a live canvas. You place sections and components, edit text in place and check each screen size. The editor keeps your work in a draft until you publish, and a code drawer opens the template behind the page. Start with Build a page in the visual editor.

An AI assistant

The editor has an Assistant tab that sends a request about the selected element to an AI model. The CMS ships no model, so until you connect one the tab says the Assistant is not available yet, and a request changes nothing. The edits of a connected model go through the same history as yours, so you can undo them. See Connect a model to the editor's Assistant.

Languages

Each site chooses the languages it publishes in and whether its addresses name them, as in /blog and /fa/blog. A page can answer several languages, either as one page per language or as one page whose path starts with /:lang, and the words of the interface go through t() so they translate too. See Translate a page and Languages and language editions.

Live updates

When you publish, the CMS compiles the page in the background. A visitor who has the page open gets the site's new stylesheet at once, and a This page was updated. banner with a Refresh button when the site's script changes. See How a page reaches visitors.

Access control

The CMS checks every action against permission names such as admin:dashboard:runtime:page. A wildcard covers a branch of names, the dashboard and the API count separately, and you can lock a page or a post to members. See How permissions work.

A JSON:API

Each site runs in one of three modes. Hybrid serves pages and a JSON:API, Phoenix Only serves pages, and API Only serves the JSON:API for a frontend of your own. See Headless or coupled.

Next steps