Skip to main content

A web framework for code that agents maintain. The right path is free fall.

Project description

Curvature

The right path is free fall.

gate PyPI Python Coverage floor License

A web framework for code that agents maintain. Live, dynamic web apps in pure Python — single-page feel, pages that update themselves in real time, zero JavaScript app code — and a gate that makes the maintainable path the only path that builds. (Not a static-site generator: state lives on the server, and open pages stay current over a live stream.)

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.
  • Pages keep themselves current. Live (SSE) pushes updates into every open browser — the demo's roadmap redraws when anyone ships a card — with zero app JavaScript.
  • 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 ratchet is 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 --timeout-graceful-shutdown 1   # 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


Download files

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

Source Distribution

curvature-0.2.3.tar.gz (47.1 kB view details)

Uploaded Source

Built Distribution

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

curvature-0.2.3-py3-none-any.whl (69.3 kB view details)

Uploaded Python 3

File details

Details for the file curvature-0.2.3.tar.gz.

File metadata

  • Download URL: curvature-0.2.3.tar.gz
  • Upload date:
  • Size: 47.1 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

Hashes for curvature-0.2.3.tar.gz
Algorithm Hash digest
SHA256 5e789e9649c77a04a4993a125664426c157eff671d5b52688bcc8cbe464ffc7d
MD5 187f1ae4b3134c793f3d010ea33aba38
BLAKE2b-256 73732f129e7b1fe9c1ec3535176843584f284e6c2c5c486410292458d6ee6b3a

See more details on using hashes here.

File details

Details for the file curvature-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: curvature-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 69.3 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

Hashes for curvature-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 bf2a11d5fff11926831cd6dc9054b0736dea0988a1b3de299d09cf1f766019df
MD5 63aef94d3b0f4b0443ae0b310cd57148
BLAKE2b-256 a22c1b28e220a7e201a2c20ca7403749b5b4d8570ab88f68d78b3ab9a8930ba4

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