The full-stack Python framework
designed for humans and agents.
A fork of Django that has gone way, way too far.
Why Plain?
Explicit, typed, and predictable. What's good for humans is good for AI.
2
3
4
5
6
7
8
9
10
11
from plain import models
from plain.models import types
from plain.passwords.models import PasswordField
@models.register_model
class User(models.Model):
email: str = types.EmailField()
password: str = PasswordField()
display_name: str = types.CharField(max_length=100)
is_admin: bool = types.BooleanField(default=False)
created_at: datetime = types.DateTimeField(auto_now_add=True)
2
3
4
5
6
7
8
9
10
11
from plain.urls import Router, path
from . import views
class UsersRouter(Router):
namespace = "users"
urls = [
path(
"<int:pk>/",
views.UserDetail,
),
]
2
3
4
5
6
7
8
9
10
from plain.views import DetailView
from .models import User
class UserDetail(DetailView):
template_name = "users/detail.html"
def get_object(self):
return User.query.get(
pk=self.url_kwargs["pk"],
)
from plain import models
from plain.models import types
from plain.passwords.models import PasswordField
@models.register_model
class User(models.Model):
email: str = types.EmailField()
password: str = PasswordField()
display_name: str = types.CharField(max_length=100)
is_admin: bool = types.BooleanField(default=False)
created_at: datetime = types.DateTimeField(auto_now_add=True)
from plain.urls import Router, path
from . import views
class UsersRouter(Router):
namespace = "users"
urls = [
path(
"<int:pk>/",
views.UserDetail,
),
]
from plain.views import DetailView
from .models import User
class UserDetail(DetailView):
template_name = "users/detail.html"
def get_object(self):
return User.query.get(
pk=self.url_kwargs["pk"],
)
Agent tooling
Rules, docs, skills, and CLI — four layers your agent uses to write correct code.
Always-on guardrails. Loaded before the agent writes a single line.
Full framework docs, on demand. Ask for everything or just one section.
End-to-end workflows triggered by slash commands.
Verify correctness and auto-fix formatting in one step.
29 packages, one framework
Auth, ORM, background jobs, admin, email, and more — all first-party, all with agent-friendly docs built in.
Foundation
Backend
Frontend
Development
Production
20 years of Django
with a fresh take on what's next
Plain is a fork of Django, driven by ongoing development at PullApprove. No backwards compatibility to maintain means we can break things, iterate fast, and build for the agentic era without compromise.