Metadata-Version: 2.3
Name: koriander
Version: 0.2.0
Summary: Koriander CMS gives you the web-based workflow of WordPress and combines it with the static site sleakness of Hugo
Requires-Dist: bleach>=6.3.0
Requires-Dist: django>=6.0.4
Requires-Dist: gunicorn>=25.3.0
Requires-Dist: honcho>=2.0.0
Requires-Dist: markdown>=3.10.2
Requires-Dist: pillow>=12.2.0
Requires-Dist: pygments>=2.20.0
Requires-Dist: whitenoise>=6.12.0
Requires-Dist: lark[interegular]>=1.3.1
Requires-Dist: pyparsing>=3.3.0
Requires-Dist: pyyaml>=6.0.3
Requires-Dist: xdg-base-dirs>=6.0.2
Requires-Python: >=3.12
Description-Content-Type: text/markdown

<!-- SPDX-License-Identifier: AGPL-3.0-or-later
     SPDX-FileCopyrightText: 2026 JWP Consulting GK -->
# 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](https://www.justus.pw/posts/2026-06-19-creating-koriander.html).

## 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](https://pipx.pypa.io/stable/how-to/install-pipx/).

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

```bash
pipx install git+ssh://git@codeberg.org/jwpconsulting/koriander.git
```

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

```
⣷ installing koriander from spec 'git+ssh://git@codeberg.org/jwpconsulting/koriander.git'  installed package koriander 0.1.0, installed using Python 3.13.12
  These apps are now globally available
    - koriander
done! ✨ 🌟 ✨
```

Run the following `koriander serve` command in a new directory:

```bash
koriander serve
```

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

```
Log in with the following link:

http://localhost:8000/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:8000/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:8000/dev-login/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/` in your browser. You should now see the Koriander CMS.

![koriander-magic-login](docs/koriander-magic-login.png)

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.](docs/koriander-edit-root-page.png)

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:

```bash
koriander render
```

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

```
Writing static files to scraped_site/static...

157 static files copied to '/private/var/folders/k8/jnlz0xdn5jd48zttf3ktv7200000gn/T/tmp.BWupFFLrzH/scraped_site/static', 461 post-processed, 25 skipped due to conflict.
Static files collected to scraped_site/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: scraped_site
```

`koriander render` outputs your site in a `scraped_site` directory.

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

## Develop

Install everything:

```bash
uv sync
```

Test everything:

```bash
bin/test.sh
```

Format code:

```bash
bin/format.sh
```

Render:

```bash
uv run koriander render; python -m http.server -d scraped_site
```

Live preview:

```bash
uv run koriander serve
```
