A web framework for code that agents maintain. The right path is free fall.
Project description
Curvature
The right path is free fall.
A web framework for code that agents maintain. Server-rendered Python, components as typed functions, real links and real forms, one small boost script for the single-page feel — and a gate that makes the maintainable path the only path that builds.
Curvature's design center is the maintainer nobody watches: the coding
agent in its forty-third session, at 2 a.m., doing whatever the shape of
the code suggests. Frameworks built for humans enforce their discipline
through culture. Curvature's discipline is machine-checked — every
invariant in SPEC.md names the check that enforces it, and
violations are reported by curvature check as anomalies — regions where the geometry failed to steer.
The canonical documentation is AGENTS.md; this README is
the courtesy translation. The argument for all of it is the
MANIFESTO.
The shape of it
from curvature import Element, Props, redirect, respond
from curvature import html as h
class LapProps(Props):
title: str
done: bool
def lap(props: LapProps) -> Element:
return h.li(props.title, class_="lap done" if props.done else "lap", id="lap")
- Components are functions of frozen, closed pydantic props. The UI is just Python: typed by pyright, measured by coverage, tested by pytest without a browser in sight.
- The app works with JavaScript off. Reads render full pages; writes are POST → redirect → GET through real forms. Your test suite drives it with httpx — which executes no JS — so the degraded path is the tested path, permanently.
- curvature.js (the only script, held under a 150-line ratcheted ceiling) boosts working links and forms into fragment swaps. Same route, same render, one header of difference. Every failure path is real navigation.
- The ratchet only tightens. File ceilings fall, the coverage floor
rises, and
curvature ratchetis the only hand on the mechanism. The 10,000-line file is never written because week two's gate refuses the sediment while the split is still cheap.
Start from nothing
One prerequisite, one line (uv):
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Then:
uvx curvature new app pitstop # no venv, no Python even — uv brings it
cd pitstop
./gate.sh # green before you write a line
./run.sh # http://127.0.0.1:8000
Only have pip? pip install curvature && python -m curvature new app pitstop
— the python -m form dodges PATH entirely; the poured README carries
the rest of the old ritual.
Onboarding an agent takes zero steps: the scaffold poured AGENTS.md, the gate, and one example component as the pattern. Point your agent at the directory and ask for a feature — the repo is the prompt.
The demo
PyPI ships the framework; the repo ships Pit Board, the demo:
git clone https://github.com/siliconsociety/Curvature && cd Curvature
uv sync && ./gate.sh
uv run uvicorn demo.app:app --reload # Pit Board
Then turn JavaScript off and use it again. Nothing changes. That is the whole point.
Status
Day one (2026-07-11). The contract, runtime, gate, and demo are real and self-hosting — this repo passes its own gate. The spec is versioned and arguable; argue by issue.
MIT. Built by Robert Sharp, with Claude Fable 5 on its last day on the subscription — read the manifesto and you'll see why that detail belongs in a README.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file curvature-0.2.0.tar.gz.
File metadata
- Download URL: curvature-0.2.0.tar.gz
- Upload date:
- Size: 36.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a3b5460a182d0d8895b0bc4ece0cf2c5eda9bd66136f0394e5423c836308518
|
|
| MD5 |
014c82fd95a63ea543aa6835cdd070a2
|
|
| BLAKE2b-256 |
2f2c1936391cca7f0ea64371cffcc8c56fab9b227eddf5753585a3e7af61cabf
|
File details
Details for the file curvature-0.2.0-py3-none-any.whl.
File metadata
- Download URL: curvature-0.2.0-py3-none-any.whl
- Upload date:
- Size: 53.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52a831edc2e46fa1c058603e3eca3dd5124b04f6170a5309ad02ef6853557e69
|
|
| MD5 |
c2d3934155748748f357b44820f97f8a
|
|
| BLAKE2b-256 |
117175b6b3a9de20e70270123d2ba28cc33842459ee880576bdd4ee09b7c27bb
|