Plain is headed towards 1.0! Subscribe for development updates →

CLI

The plain CLI and how to add your own commands to it.

Commands are written using Click (one of Plain's few dependencies), which has been one of those most popular CLI frameworks in Python for a long time.

Built-in commands

plain build

Compile static assets (used in the deploy/production process).

Automatically runs plain tailwind build if plain.tailwind is installed.

plain create

Create a new local package.

plain preflight

Run preflight checks to ensure your app is ready to run.

plain run

Run a Python script in the context of your app.

plain setting

View the runtime value of a named setting.

plain shell

Open a Python shell with the Plain loaded.

To auto-load models or run other code at shell launch, create an app/shell.py and it will be imported automatically.

# app/shell.py
from app.organizations.models import Organization

__all__ = [
    "Organization",
]

plain urls

List all the URL patterns in your app.

plain utils generate-secret-key

Generate a new secret key for your app, to be used in settings.SECRET_KEY.

Adding commands

The register_cli decorator can be used to add your own commands to the plain CLI.

import click
from plain.cli import register_cli


@register_cli("example-subgroup-name")
@click.group()
def cli():
    """Custom example commands"""
    pass

@cli.command()
def example_command():
    click.echo("An example command!")

Then you can run the command with plain.

$ plain example-subgroup-name example-command
An example command!

Technically you can register a CLI from anywhere, but typically you will do it in either app/cli.py or a package's <pkg>/cli.py, as those modules will be autoloaded by Plain.