Skip to main content

Koriander CMS

Koriander CMS combines static site generation like Hugo and a dynamic CMS experience like Ghost into one application.

Koriander is early stage and powers the author's personal blog at https://www.justus.pw. Read more about Koriander.

Try Koriander CMS

Here's how you can try Koriander CMS on your computer.

First, ensure that your computer can run the pipx. Learn how to install pipx.

Once pipx runs on your computer, install Koriander by typing the following command in your terminal.

pipx install koriander

When the installation finishes, your terminal should print the following:

[…]
  These apps are now globally available
    - koriander
done! ✨ 🌟 ✨

Run the following command in a new directory:

koriander

This should print a start up log and give you a log in link:

Log in with the following link:

http://localhost:8321/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, koriander, koriander_user, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  …
Log in with the following link:

http://localhost:8321/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/

…
WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/6.0/howto/deployment/

Open the http://localhost:8321/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/ in your browser. You should now see the Koriander CMS.

koriander-magic-login

When you first run the Koriander CMS, you should see a welcome message saying Koriander installed successfully.

Try editing the welcome page by following the Edit page link.

Edit the current page by following the Edit page link in the top menu.

When you finish editing your page, render your entire Koriander CMS website with the render command:

koriander render

When you run koriander render in a terminal, it should print the following:

Writing static files to public/static...

157 static files copied to '/private/var/folders/k8/jnlz0xdn5jd48zttf3ktv7200000gn/T/tmp.BWupFFLrzH/public/static', 461 post-processed, 25 skipped due to conflict.
Static files collected to public/static
Seeding 0 redirect address(es)...
Seeding 6 URL(s) from sitemap.xml...
Rendered 404.html
Page has markdown body, but no summary, index.html
200 /index.html (from seed)
200 /robots.txt (from seed)
/Users/debian/.local/pipx/venvs/koriander/lib/python3.13/site-packages/koriander/views.py:221: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'koriander.models.Tag'> QuerySet.
  paginator = Paginator(
200 /tags/index.html (from /sitemap.xml)
200 /index.xml (from /sitemap.xml)
200 /index.atom (from /sitemap.xml)
200 /index.atom.xml (from /sitemap.xml)
200 /redirects.json (from /sitemap.xml)
Crawled 7 page(s).
Render complete. Output in: public

koriander render outputs your site in a public directory.

You can upload this site directory to a static site host like GitHub Pages, Cloudflare, or Netlify.

Develop

Here's what you need to develop develop and maintain Koriander CMS.

Requirements

First, make sure that you've installed the following programs on your computer

Verify that uv works by running uv --version in your terminal. On the author's computer, this prints the folllowing:

uv 0.11.19 (aarch64-apple-darwin)

Verify that direnv works by running direnv --version in your terminal. On the author's computer, this prints the following:

2.37.1

Install packages

You're now ready to install all PyPI packages that Koriander CMS needs. Install the packages with the following command:

uv sync

Enable direnv

Enable direnv for this directory with the following command:

direnv allow

When direnv allow runs, it prints the following:

direnv: loading ~/projects/koriander/dev/.envrc
direnv: export +PWCMS_DEBUG +PWCMS_SECRET_KEY ~XPC_SERVICE_NAME

Migrate the development database

Create and migrate your development database with migrate command:

uv run src/koriander/manage.py migrate

This prints something similar to this:

You've enabled Django debug mode
System check identified some issues:

WARNINGS:
koriander.Page: (models.W047) SQLite does not support unique constraints with nulls distinct.
	HINT: A constraint won't be created. Silence this warning if you don't care about it.
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, koriander, koriander_user, sessions
[…]

Start the development server with the following command:

uv run src/koriander/manage.py runserver

When the server starts, it prints the following:

You've enabled Django debug mode
You've enabled Django debug mode
Watching for file changes with StatReloader
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
June 28, 2026 - 06:23:49
Django version 6.0.4, using settings 'koriander.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/6.0/howto/deployment/

Test code

Use the following command to run all tests:

bin/test.sh

Format code

Use the following command to format your code:

bin/format.sh

Migrate database

Use this command to migrate your database:

uv run src/koriander/manage.py migrate

Create new migration files

When you change Koriander CMS models, run this command to make a corresponding migration file:

uv run src/koriander/manage.py migrate --update

Add a new syntax to CodeMirror

Perform the following steps to add a new syntax to the CodeMirror editor in codemirror/editor.mjs.

  1. Find the syntax library name. Example: @codemirror/lang-css
  2. Install and save the syntax library:
    npm --prefix codemirror install --save @codemirror/lang-css
    
  3. Import the syntax library in codemirror/editor.mjs:
     export * from "codemirror";
     export { html } from "@codemirror/lang-html";
     export { json } from "@codemirror/lang-json";
    +export { css } from "@codemirror/lang-css";
    
  4. Rebuild CodeMirror:
    bin/build-third-party-dependencies
    
  5. Add the new syntax to src/koriander/static/codemirror/codemirror_widget.js:
     if (syntax === "html") {
       extensions.push(CM.html());
     } else if (syntax === "json") {
       extensions.push(CM.json());
    +} else if (syntax === "css") {
    +  extensions.push(CM.css());
     } else if (syntax === undefined) {
       console.warn("No syntax defined for CodeMirror widget", textarea);
     } else {
       console.warn(
         `Unrecognized syntax ${syntax} defined for CodeMirror widget`,
         textarea,
       );
     }
    

Configuration variables

See the docs/configuration.md document for information on what environment variables you can pass to Koriander.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

koriander-0.8.4.tar.gz (1.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

koriander-0.8.4-py3-none-any.whl (1.3 MB view details)

Uploaded Python 3

File details

Details for the file koriander-0.8.4.tar.gz.

File metadata

  • Download URL: koriander-0.8.4.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for koriander-0.8.4.tar.gz
Algorithm Hash digest
SHA256 bafbdc28a01e976107b7a1553ec63708de71ea8f1385144905a132c9af8fbd23
MD5 9277abfdc930fbfb06e600c809dca34b
BLAKE2b-256 7911406e8fb8e0d9bbdb5fd4bd7faa7f3d03f231700718a5863ef9afdaf1446d

See more details on using hashes here.

File details

Details for the file koriander-0.8.4-py3-none-any.whl.

File metadata

  • Download URL: koriander-0.8.4-py3-none-any.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for koriander-0.8.4-py3-none-any.whl
Algorithm Hash digest
SHA256 91b490824ae8d4853181d4a92eca1e082cac6a1db02083a3675fa4cbf585e92f
MD5 e67546d7c772ed886d354a0e65d03032
BLAKE2b-256 3daed904f0a38ae0c8febb41e4eeb9a03f75cd25320d8effef64c805259aafae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page