Skip to main content

A single command that runs everything you need for local development.

Project description

plain.dev

A single command that runs everything you need for local development.

Plain dev command example

Overview

The plain dev command starts everything you need for local development with a single command:

plain dev

This will:

  • Run preflight checks
  • Execute pending migrations
  • Start your development server with auto-reload
  • Build and watch CSS with Tailwind (if installed)
  • Start required services (like databases)
  • Run any custom processes you've defined

Commands

plain dev

The plain dev command does several things:

  • Sets PLAIN_CSRF_TRUSTED_ORIGINS to localhost by default
  • Runs plain preflight to check for any issues
  • Executes any pending model migrations
  • Starts gunicorn with --reload
  • Serves HTTPS on port 8443 by default (uses the next free port if 8443 is taken and no port is specified)
  • Runs plain tailwind build --watch, if plain.tailwind is installed
  • Any custom process defined in pyproject.toml at tool.plain.dev.run
  • Necessary services (ex. Postgres) defined in pyproject.toml at tool.plain.dev.services

Services

Use services to define databases or other processes that your app needs to be functional. The services will be started automatically in plain dev, but also in plain pre-commit (so preflight and tests have a database).

Ultimately, how you run your development database is up to you. But a recommended starting point is to use Docker:

# pyproject.toml
[tool.plain.dev.services]
postgres = {cmd = "docker run --name app-postgres --rm -p 54321:5432 -v $(pwd)/.plain/dev/pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=postgres postgres:15 postgres"}

Custom processes

Unlike services, custom processes are only run during plain dev. This is a good place to run something like ngrok or a Plain job worker, which you might need to use your local site, but don't need running for executing tests, for example.

# pyproject.toml
[tool.plain.dev.run]
    ngrok = {command = "ngrok http $PORT"}

plain dev services

Starts your services by themselves. Logs are stored in .plain/dev/logs/services/.

plain dev logs

Show output from recent plain dev runs.

Logs are stored in .plain/dev/logs/run/.

plain dev logs        # print last log
plain dev logs -f     # follow the latest log
plain dev logs --pid 1234
plain dev logs --path

plain pre-commit

A built-in pre-commit hook that you can install with plain pre-commit --install.

Runs:

  • uv lock --check, if using uv
  • plain check (custom commands, code linting, preflight, migrations, tests)
  • plain build

Custom commands can be defined in pyproject.toml at tool.plain.check.run and will run as part of plain check:

[tool.plain.check.run]
my-check = {cmd = "echo 'running my check'"}

Settings

Setting Default Env var
DEV_REQUESTS_IGNORE_PATHS ["/favicon.ico"] -
DEV_REQUESTS_MAX 50 -

See default_settings.py for more details.

FAQs

How do I stop the development server?

You can stop the development server by pressing Ctrl+C in the terminal, or by running plain dev --stop if it was started in the background.

Can I run the server on a different port?

Yes, use the --port or -p option: plain dev --port 8000. If you don't specify a port, it will use 8443 or the next available port.

How do I run the server in the background?

Use plain dev --start to run the server in the background. You can then use plain dev --stop to stop it.

What's the difference between services and custom processes?

Services are processes that your app needs to function (like a database). They run during plain dev and also during plain pre-commit. Custom processes only run during plain dev and are typically for development conveniences like ngrok or a job worker.

Why am I seeing deprecation warnings?

The development server is configured to show DeprecationWarning and PendingDeprecationWarning messages so you can catch deprecated code before it breaks in future versions. You can override this by setting your own PYTHONWARNINGS environment variable.

Installation

Install the plain.dev package from PyPI:

uv add plain.dev --dev

Note: The plain.dev package does not need to be added to INSTALLED_PACKAGES.

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

plain_dev-0.58.2.tar.gz (28.0 kB view details)

Uploaded Source

Built Distribution

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

plain_dev-0.58.2-py3-none-any.whl (36.6 kB view details)

Uploaded Python 3

File details

Details for the file plain_dev-0.58.2.tar.gz.

File metadata

  • Download URL: plain_dev-0.58.2.tar.gz
  • Upload date:
  • Size: 28.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plain_dev-0.58.2.tar.gz
Algorithm Hash digest
SHA256 2fccc9fc00867af2635eb253dbb25269ac36acbe2df6f536004416d011165db7
MD5 8f1413773ed9e0ac5323c478879a3b6b
BLAKE2b-256 3f2a92cd36ff290f808a1742820050c7b5ade95793dd44acbd324fdc42675f09

See more details on using hashes here.

File details

Details for the file plain_dev-0.58.2-py3-none-any.whl.

File metadata

  • Download URL: plain_dev-0.58.2-py3-none-any.whl
  • Upload date:
  • Size: 36.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for plain_dev-0.58.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7c98461e992890add0085325ad271e2525934c201970331cbb41e4df0ab84ac9
MD5 a724bac726c6f3a3354cb9a721df00fb
BLAKE2b-256 89b513cad28fd671114666b53397c9c49098647522c32fc60237bae8c19a6e22

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