jfastframework
Docs Español PyPI GitHub

v0.1.0a12 · alpha

Stop rebuilding the same backend.

One command: FastAPI, PostgreSQL, Redis, jobs, a Vue frontend and a reverse proxy. Wired together, containerised, migrating on boot. What you write is the part only you know.

$ pip install jfastframework
$ jfast start shop

✓ shop/        FastAPI · Postgres · Redis
✓ shop-web/    Vue 3 · Vite
✓ compose      one container per resource
✓ Caddyfile    TLS · one hostname
1command to a running stack
26plugins, each removable
4architectures per module
2,000test functions

Alpha. The maturity table says which parts are tested against real infrastructure and which are not.

It generates

FastAPI PostgreSQL pgvector Redis SQLAlchemy Alembic Vue 3 React Tailwind Docker Caddy

Before and after

The same feature, twice.

By hand

Wire the session. Decide where the query goes. Add a model, a router, a migration, a compose service. Find out in review that someone queried the database from a handler.

Here

jfast new module invoice — router, service, repository, schemas and a test, registered, under a contract that fails the build if the handler ever touches the database.

The design

Three ideas, and what each one costs.

01

Business logic first

The plumbing is a plugin list. The diff on a branch is the feature.

Trade-offYou inherit opinions, and they are enforced.

02

Agents cannot drift

Every rule is machine-checked, and every violation names the fix.

Trade-offWriting the contract is work.

03

Split when you know the seams

A modular monolith today; one command promotes a module to a service.

Trade-offA monolith on day one.

Guardrails

Vibe-code with a seatbelt.

Generating code fast is solved. Keeping it coherent after the fourth feature is not.

$ jfast contracts check

modules/payment/service.py:41: cross-module: module 'payment' imports module 'invoice'
  (two modules that need the same thing should share it: move it to shared/enums.py)

modules/billing/service.py:88: blocking-call: time.sleep stalls the event loop
  (every request on this worker waits; use await asyncio.sleep)

Modules stay separate

Two that import each other can never be split again.

No blocking calls

One time.sleep stalls every request on the worker.

A 201 means the row exists

The session commits before the response, and a race is a 409, not a lost write.

Who it is for

Whoever is writing it.

01

First backend

The generated module is a worked example you can read in five minutes.

02

Shipping features

Skip the plumbing; the checker catches the shortcut you took at 6pm.

03

Leading a team

The review is about the feature, because the structure is CI's job.

04

Driving agents

Rules an agent reads first and cannot quietly break.

Documentation

Start reading.

All documentation →

Write the rules. Not the plumbing.

Generate the stack in one command, and let CI keep it the shape you chose while a team — or an agent — works on it.