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 package provides development tools for Plain applications. The main command, plain dev, 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 can be installed with plain pre-commit --install.

Runs:

  • Custom commands defined in pyproject.toml at tool.plain.pre-commit.run
  • plain code check, if plain.code is installed
  • uv lock --locked, if using uv
  • plain preflight
  • plain migrate --check
  • plain makemigrations --dry-run --check
  • plain build
  • plain test

VS Code debugging

Debug Plain with VS Code

Since plain dev runs multiple processes at once, the regular pdb debuggers don't quite work.

Instead, we include microsoft/debugpy and provide debugging utilities to make it easier to use VS Code's debugger.

First, import and run the debug.attach() function:

class HomeView(TemplateView):
    template_name = "home.html"

    def get_template_context(self):
        context = super().get_template_context()

        # Make sure the debugger is attached (will need to be if runserver reloads)
        from plain.dev import debug; debug.attach()

        # Add a breakpoint (or use the gutter in VS Code to add one)
        breakpoint()

        return context

When you load the page, you'll see "Waiting for debugger to attach...".

You can then run the VS Code debugger and attach to an existing Python process, at localhost:5678.

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.49.1.tar.gz (27.5 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.49.1-py3-none-any.whl (36.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: plain_dev-0.49.1.tar.gz
  • Upload date:
  • Size: 27.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","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.49.1.tar.gz
Algorithm Hash digest
SHA256 84c9fc7b821c86b58e89a3fb71d47c8bb8b78f4c93a5d438571e7572b60171d3
MD5 f7fb7807c92ca19116526c4198e00802
BLAKE2b-256 ce7ed051f7e2acd03b6c0376e91586db203315b72826049c9a3bdcdf72ade0a4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: plain_dev-0.49.1-py3-none-any.whl
  • Upload date:
  • Size: 36.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","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.49.1-py3-none-any.whl
Algorithm Hash digest
SHA256 266a4bf3839d32995c8f823de4a4ab30e54a7b230fc28f4d34c76c7c153b0064
MD5 01e0669ef5c8c3a0b4017705ea57f9b7
BLAKE2b-256 aa565e861c96b1303465e08696dddfc53cd09cd3d39dac9e8b31d7baf774bf47

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