AGENTS.mdClaude Code · Codex · Cursor · Copilot · Gemini CLI

You describe it.
Your agent ships it.

Enferno is a Flask framework your coding agent already understands: one way to do each thing, no build step, and checks it runs on its own work.

MIT licensed v13.2 since 2014
Start

Start with one prompt.

Open Claude Code, Codex or Cursor in an empty folder and paste this. Replace the last line with your app.

prompt
Set up github.com/level09/enferno in this folder and follow its AGENTS.md.
Then build: a customer portal where clients see their invoices.
Run checks.py when you're done and show me the result.

Already have an agent setup? Add the skill: npx skills add level09/enferno

What your agent will run
bash
git clone [email protected]:level09/enferno.git && cd enferno
./setup.sh                 # deps + .env with generated secrets (--full for Redis/Celery)
uv run flask create-db     # tables, migrations stamped
uv run flask install       # admin user
uv run flask run           # http://localhost:5000
Why Enferno

Built so agents get it right the first time.

Agents go wrong when a codebase has five ways to do one thing. Enferno has one, writes it down, and lets the agent check its own work.

The rules are written down

A 90-line AGENTS.md covers the stack, routes and hard rules. The enferno-dev skill holds the full code patterns.

  • ›AGENTS.md · stack, layout, routes, rules
  • ›.agents/skills/enferno-dev
  • ›.claude/skills → same skill
  • ›npx skills add level09/enferno

Agents check their own work

checks.py runs real code paths against your database. The agent runs it, reads it, fixes what broke.

$ uv run python checks.py
✓ App boots without errors
✓ Database connection works
✓ All blueprints register
✓ Critical routes exist
✓ Login and logout work
✓ All 8 checks passed

No build step

Vue 3, Vuetify and Tabler icons run straight in the browser. No webpack for the agent to fight.

<!-- no node_modules -->
<v-data-table
  :items="items">
</v-data-table>
// delimiters: ${ }

One command per job

Everything is a CLI call an agent can run and read.

  • $flask create-db
  • $flask db migrate -m "…"
  • $flask add-role -e … -r …
  • $ruff check --fix .

Complexity is opt-in

SQLite by default, so the first run needs no infrastructure. Add the rest when you decide.

sqlite · defaultpostgresredisceleryalembic

./setup.sh --full

Auth your agent doesn't have to write

Flask-Security-Too with TOTP 2FA, passkeys, recovery codes, Google and GitHub login, roles, and CSRF on every form and API call.

visitors anonymous [email protected]
auth_required
/dashboard/ → /login → 200 OK · role: admin

Production in one command

docker compose up --build brings up the full stack.

  • ●nginx · :80
  • ●website · app
  • ●postgres · redis
  • ●celery · worker
The loop

Prompt. Build. Check. Ship.

The same agent that writes the feature verifies it and gets it to production.

01

Prompt

Describe the feature in plain words. The agent reads AGENTS.md first.

"add invoices for clients"
02

Build

Model, migration, route and page, following the skill's patterns.

flask db migrate
03

Check

It runs the smoke checks and the linter, then fixes what broke.

python checks.py
04

Ship

Docker Compose, or a fresh Ubuntu VPS with Ignite.

docker compose up
Video

From setup to running in under 2 minutes.

What your agent writes

Plain Flask. Easy to review.

Factory pattern, blueprints and SQLAlchemy 2.x. Code you can read in a pull request.

enferno/portal/views.py

python
from flask import Blueprint, render_template
from flask_security import auth_required

portal = Blueprint("portal", __name__)


@portal.before_request
@auth_required("session")
def before_request():
    pass


@portal.route("/dashboard/")
def dashboard():
    return render_template("dashboard.html")

A page's Vue app

javascript
// ${ } delimiters keep {{ }} free for Jinja
const app = createApp({
  delimiters: config.delimiters,
  mixins: [layoutMixin],
  data: () => ({ items: [], total: 0 }),
  async mounted() {
    const { data } = await axios.get('/api/users')
    this.items = data.items
    this.total = data.total
  }
})
registerEnfernoComponents(app)
Python 3.11+Flask 3.1Vue 3Vuetify 3 SQLAlchemy 2.xAlembicSQLitePostgreSQL RedisCeleryDockeruv Flask-Security-TooTabler IconsNginx
FAQ

Common questions.

Any agent that reads AGENTS.md or agent skills: Claude Code, Codex, Cursor, Copilot and Gemini CLI. The skill lives in .agents/skills/, the shared location, and Claude Code sees it through .claude/skills.

Not necessarily. Your agent writes the Vue code following the project's patterns, and Enferno works with vanilla JavaScript too. Vue 3 and Vuetify are there when you want a rich component library.

Yes. It's plain Flask with a CLI. "What your agent will run" above lists the five commands to get running.

Absolutely. MIT license gives you complete freedom to build and sell commercial applications without any restrictions or attribution requirements.

Enferno provides production-ready defaults: authentication with 2FA, passkeys and OAuth, Alembic migrations, a Vue 3 admin with no build step, and Docker deployment. Redis, Celery and PostgreSQL are opt-in. It's the boilerplate you'd build anyway, already battle-tested.

Open source

Free forever.
Build without limits.

Full source, commercial use, no attribution required. Point your agent at it and ship.

$0/ MIT License
  • Full source code access
  • Commercial use allowed
  • Modify and redistribute
  • No attribution required
  • Community support
  • Regular updates