Metadata-Version: 2.4
Name: proper
Version: 0.9.0
Summary: A python web framework for people who read their code
Author-email: Juan Pablo Scaletti <juanpablo@jpscaletti.com>
License-Expression: MIT
Project-URL: homepage, https://ProperProject.org/
Project-URL: repository, https://github.com/jpsca/proper
Project-URL: documentation, https://properproject.org/docs/
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Web Environment
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Typing :: Typed
Requires-Python: >=3.13
Description-Content-Type: text/markdown
Requires-Dist: babel>=2.17.0
Requires-Dist: formidable>=0.19
Requires-Dist: hecto>=2.0.3
Requires-Dist: huey~=2.5.2
Requires-Dist: inflection>=0.5.1
Requires-Dist: isort~=5.0
Requires-Dist: itsdangerous~=1.1
Requires-Dist: jx>=0.11.0
Requires-Dist: markupsafe>=2.0
Requires-Dist: passlib~=1.7
Requires-Dist: peewee~=3.15
Requires-Dist: peewee-migrate<2,>=1.12.1
Requires-Dist: proper-cli~=1.2
Requires-Dist: python-dateutil~=2.9.0
Requires-Dist: python-multipart>=0.0.22
Requires-Dist: traceback-with-variables~=2.0.4
Requires-Dist: types-peewee~=3.17.7.20241017
Requires-Dist: uvicorn>=0.41.0
Requires-Dist: tzdata>=2025.3

<h1><img src="https://properproject.org/proper.svg" height="48" />
Proper Web Framework</h1>

Proper is a new Python web framework. Not another Flask clone, it's a Ruby-on-Rails clone :P.

More seriously: it isn't a clone, but it is heavily influenced by Rails in the ways that matter. Very opinionated, generator-heavy, focused on REST and server-rendered HTML, built around a fixed project structure, and packed with hardcoded batteries. You *can* swap pieces if you must, but the assumption is that you won't.

The one thing Proper does very differently: **sync above, async below**. The runtime is ASGI (you need it for performance and WebSockets), but the code you write is _synchronous_. No `async`/`await` confetti scattered across code that doesn't need concurrency.


## Quick start

Requires [uv](https://docs.astral.sh/uv/getting-started/installation/).

```bash
uvx proper_new myapp
cd myapp
proper g resource Post title:str body:text
proper server
```

That's a working CRUD app with model, controller, views, routes, migrations, and tests.

Full (human-shaped) docs at [properproject.org/docs](https://properproject.org/docs).


## Why not X?

**Why not Flask?** - Absolute freedom means absolute chaos.

**Why not Django?** - Django gives you the pieces and expects you to assemble them; Proper assembles them and gives you direction.

**Why not FastAPI?** - FastAPI is awesome, but has the opposite shape: It's all about APIs and async-first, while Proper is server-rendered and sync-first. Building a React SPA on top of a JSON backend? You might want to use it. Building HTML for humans? Try Proper.

**Why Peewee instead of SQLAlchemy?** - Smaller surface area, more readable, and ActiveRecord-style scopes fit it cleanly. SQLAlchemy is excellent but not something I want to read every day.

**Why Jx instead of Jinja?** - Server-rendered Python components with typed props and slots. See the [Jx docs](https://properproject.org/docs/jx_components/) for the case.


## Built with AI agents in mind

Proper ships with an official skill: [properproject.org/skill.zip](https://properproject.org/skill.zip). Drop it in `~/.claude/skills/` and your agent will scaffold and edit your app the _Proper_ way (pun intended).

This isn't just an extra. Hard conventions are exactly what makes AI output legible to humans: fewer tokens to understand a project, fewer surprises in generated code, and less effort reviewing it.


## What's in the box

- **Peewee ORM** with migrations, query helpers, and connection handling
- **Forms** — declarative, validated, ORM-integrated, with rendering helpers
- **Jx components** — server-rendered Python components, typed props, slots
- **Caching** — fragment, action, and low-level, on SQLite or Redis
- **Background tasks** via Huey, with retries, schedules, and cron syntax
- **Authentication** — sessions, password resets, rate limiting, pwned-password checks
- **File storage** — disk and S3 adapters, signed URLs, image variants
- **i18n** — locale-aware routing, translations, pluralization, date formats
- **Email** — templated transactional mail, SMTP and console mailers
- **WebSockets** — channels, broadcasts, presence


## For the press release

> Proper is the Python web framework I built for myself after fifteen years in the trade, once I understood that hard conventions do not lock you in — they free you to focus on what's important.

(It also works for the back cover of my future biography by Walter Isaacson).


## Status

This is 0.9, I'll call it 1.0 when I've found more bugs. Bug reports and contributions are very welcome. File them at [github.com/jpsca/proper/issues](https://github.com/jpsca/proper/issues).


## Community

- [Discord](https://discord.gg/aWVP3F4abD)


## License

Code: [MIT](https://github.com/jpsca/proper/blob/main/MIT-LICENSE). Documentation: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/).

Made by [Juan-Pablo Scaletti](https://github.com/jpsca) in Lima, Perú.
