Skip to main content

⚡ Larz

New in 1.1 — TOTP 2FA, social login (Google/GitHub), file uploads, a marketplace payout ledger, four more payment providers (Square, Razorpay, Mollie, Coinbase Commerce), and a first-class test client. See the changelog. PyPI Python License: MIT Zero dependencies

The money-native web framework.

pip install larz

Larz is a small, from-scratch, dependency-free Python web framework where payments, paywalls, subscriptions, trials, and usage-metering are first-class primitives — not something you bolt on with three libraries and a weekend.

Flask makes routes easy. Django makes data easy. Larz makes getting paid easy.

from larz import Larz
import larz.money as money

app = Larz(secret="change-me")
money.enable(app)                          # payments on. Zero keys in dev.

@app.paid("$9/mo", trial_days=7)           # subscription with a free trial
@app.get("/pro/report")
def report(req):
    return "<h1>Pro report for %s</h1>" % req.subject

@app.metered("$0.02/call")                 # per-call billing from prepaid credit
@app.post("/api/summarize")
def summarize(req):
    return {"summary": run(req.json()["text"])}

app.run()

A request to /pro/report from someone who hasn't paid is automatically sent through checkout (or given their free trial); when they come back, they're served. A request to /api/summarize with no credit gets a clean 402. You never write if user.is_paid.

Batteries included — all pure stdlib

Area What you get
Money @app.paid · @app.metered · @app.plan · subscriptions, renewals, cancel + dunning · free trials · coupons · credit packs · invoices/receipts · customer portal (/larz/account) · entitlement events · /larz/admin revenue dashboard
Providers Mock · Stripe · Paddle · Lemon Squeezy · Paystack · PayPal · GemVault · Dodo · Crypto — all via stdlib urllib, no SDKs. Add your own in ~40 lines.
Auth larz.auth — users, scrypt passwords, @app.login_required, req.user, API keys (@app.api_key_required, plan-gated), RBAC (@app.require_role), email-verify + password-reset tokens
API tooling @app.validate(schema) · auto OpenAPI (/openapi.json + /docs) · paginate() · a webhooks framework (sign, deliver, retry)
ORM larz.models — relationships (ForeignKey), field types (datetime/json/decimal…), query operators (views__gt, title__like), pagination, hooks, transactions, auto-migrations
Admin larz.admin — an auto-generated CRUD admin panel over your models
Ops larz.ops@app.cache · background jobs (@app.job) · cron scheduler (@app.schedule) · email (SMTP) · .env config · /healthz + /metrics
Templating {{ }} / {% for %} / {% if %} · inheritance ({% extends %}/{% block %}) · filters (`
Core WSGI engine · typed routing · signed-cookie sessions · blueprints · static files · debug pages
Security · SEO · CLI Rate limiting, bot filter, CSRF, CORS · auto sitemap/robots + OpenGraph + IndexNow · larz new / run / routes

Why

Every other framework treats money as an afterthought — the thing you wire up last, badly, copy-pasted from a payments tutorial. But for indie hackers, solopreneurs, and anyone shipping a product to make a living, monetization isn't the afterthought — it's the point. Larz puts it in the core.

Use it for

  • Paid / metered APIs — AI wrappers, data APIs (@app.metered per call)
  • Content paywalls — reports, courses, paid newsletters (@app.paid)
  • Digital products — one-off unlocks and downloads
  • Micro-SaaS — a free tier + a Pro plan with a trial (@app.plan)

Design principles

  • Zero dependencies. Pure Python standard library — sqlite3, urllib, wsgiref. Runs anywhere python3 runs, including constrained boxes and phones.
  • Provider-agnostic. The framework never hard-codes a processor. Implement create_checkout + parse_webhook and any processor drops in.
  • Portable by default. No modern-SQLite assumptions, no C extensions.

Run the demos (no API keys)

python3 examples/paid_app.py     # the essentials: paid + metered routes
python3 examples/saas_app.py     # a full mini-SaaS: plans, trials, credits,
                                 # templates, ORM, dashboard, security

Then open http://127.0.0.1:8000/ and click through. Visit /larz/admin?token=admin123 on the SaaS demo to see the revenue dashboard.

Test

python3 tests/test_core.py       # 15 — routing, sessions, paywall, metering
python3 tests/test_features.py   # 43 — money, providers, templating, security
python3 tests/test_v1.py         # 52 — ORM, auth, API, admin, ops, billing

110 checks, no pytest required.

Scaffold a new app

python3 -m larz new myapp
cd myapp && python3 -m larz run

Status

v1.0.0 — real and tested, but not yet production-hardened (WSGI dev server, in-memory rate limiting, MockProvider is dev-only). Roadmap: ASGI/async core, production server recipe, dunning/renewal reminders, richer analytics, a hosted docs site at larzos.com/larz.

License

MIT.

Download files

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

Source Distribution

larz-1.1.0.tar.gz (63.4 kB view details)

Uploaded Source

Built Distribution

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

larz-1.1.0-py3-none-any.whl (56.4 kB view details)

Uploaded Python 3

File details

Details for the file larz-1.1.0.tar.gz.

File metadata

  • Download URL: larz-1.1.0.tar.gz
  • Upload date:
  • Size: 63.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for larz-1.1.0.tar.gz
Algorithm Hash digest
SHA256 cdff95521e4dcb32bca878b7d50b7ab12d83a04829c2dc72706f81df680dc36b
MD5 6b466d893e65e7be0beffbe5e68fe165
BLAKE2b-256 a2a613e70c9129743f7389609378bae1d1b9de3400776f70d694d29271334375

See more details on using hashes here.

Provenance

The following attestation bundles were made for larz-1.1.0.tar.gz:

Publisher: publish.yml on larz-scripter/larz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file larz-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: larz-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 56.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for larz-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9853c7318ac2c171b46e9b544d21d1a87e2c7be160a2cffbbd9d92b3861a1e27
MD5 e968d8a7db1d18ff062994192c373de0
BLAKE2b-256 8582ad2a3ea0be112975933a969e52751938b21d7656673027ce328b66ccb261

See more details on using hashes here.

Provenance

The following attestation bundles were made for larz-1.1.0-py3-none-any.whl:

Publisher: publish.yml on larz-scripter/larz

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

2.2.1

2 files

2.2.0

2 files

2.1.0

2 files

2.0.0

2 files

1.3.0

2 files

1.2.0

2 files

This release

1.1.0 This release

2 files

1.0.1

2 files

1.0.0

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page