{"repo":"level09/enferno","free":true,"listed":false,"github":"https://github.com/level09/enferno","clone":"git clone https://github.com/level09/enferno.git","description":"Modern Flask framework with zero-config frontend (Vue 3 + Vuetify 3),    production-ready auth (2FA, passkeys, OAuth), and AI-native development.    No webpack, no node_modules,  just Python","language":"CSS","stars":569,"topics":["celery","css","docker","flask","hackathon","postgresql","python","redis","saas","saas-boilerplate","sqlalchemy","sqlite","vue","vuetify","webframework"],"license":"MIT","category":"saas_starter","readme_excerpt":"# Enferno 🔥\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n**[Live Demo](https://demo.enferno.io/)** · **[Tutorials](https://github.com/level09/enferno/wiki)** · **[Docs](https://docs.enferno.io)** · **Stop configuring. Start shipping.**\n\n~~Webpack~~ ~~Vite~~ ~~node_modules~~ ~~npm install~~ — Just Python.\n\n```bash\ngit clone git@github.com:level09/enferno.git && cd enferno\n./setup.sh                    # Installs deps + generates secure .env\nuv run flask create-db        # Setup database\nuv run flask install          # Create admin user\nuv run flask run              # → http://localhost:5000\n```\n\n\nhttps://github.com/user-attachments/assets/a87bfad2-45dc-4d94-bdf1-0448dfea8084\n\n\n\nWhy Enferno?\n===========\n- **Zero build step** - Vue 3 + Vuetify 3 run directly in browser. Delete your `node_modules`\n- **Auth that works** - 2FA, WebAuthn, OAuth (Google/GitHub) — not a tutorial, actual production code\n- **SQLite by default** - Deploy anywhere. ~~Managed database~~ not required\n- **AI-native** - Ships with Claude Code & Cursor rules. Your AI already knows the codebase\n- **Complexity is opt-in** - Redis, Celery, PostgreSQL when *you* decide, not when the framework demands\n\n> **Want payments?** → **[ReadyKit](https://readykit.dev)** adds Stripe, multi-tenancy, teams on top of Enferno\n\nWhat's Included\n---------------\n- **Frontend**: Vue 3, Vuetify 3, Axios - no build tools needed\n- **Auth**: Login, registration, password recovery, session management\n- **2FA**: TOTP authenticator apps (Google Authenticator, Authy, 1Password)\n- **WebAuthn**: Passkeys and hardware security keys (YubiKey, Touch ID)\n- **Recovery codes**: Backup codes for account recovery\n- **OAuth**: Google and GitHub login\n- **Database**: SQLAlchemy ORM with Alembic migrations\n- **Patterns**: Data tables, dialogs, notifications - ready to use\n\n### UI Features\n\n- **Collapsible sidebar** - Nested navigation groups with smooth expand/collapse animations\n- **Dark mode** - Theme toggle with localStorage persistence, auto-detects system preference\n- **Tabler Icons** - 5000+ icons via CDN, no build step\n- **Ember color palette** - Fire-inspired theme matching the Enferno brand\n- **Polish included** - Card hover effects, smooth scrollbars, styled data tables\n\nRequirements: Python 3.11+ and [uv](https://docs.astral.sh/uv/)\n\n### Background Tasks\n\nWhen you need Celery for async jobs:\n\n```bash\nuv sync --extra full        # Adds Redis + Celery\n# Set REDIS_URL, CELERY_BROKER_URL in .env\n```\n\n### Database Migrations\n\nSchema changes are managed with Alembic (Flask-Migrate). Autogenerate drafts the\nmigration; always review and edit it before applying:\n\n```bash\nuv run flask db migrate -m \"add status to user\"   # Draft from model changes\n# Review migrations/versions/<revision>.py, adjust as needed\nuv run flask db upgrade                           # Apply\n```\n\nFresh databases: `uv run flask create-db` builds the full schema and stamps it\nautomatically. Databases created before migrations existed: run\n`uv run flask db stamp head` once, then use the workflow above.\n\n### Sanity Checks\n\nNo pytest ceremony - just real code paths:\n\n```bash\nuv run python checks.py     # Run before deploying\n```\n\n### Docker\n\nFull production stack with one command:\n\n```bash\ndocker compose up --build   # Redis, PostgreSQL, Nginx, Celery\n```\n\n### VPS Deploy\n\nOne command to deploy on any Ubuntu VPS (Hetzner, DigitalOcean, etc.):\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/level09/ignite/main/ignite.sh | sudo DOMAIN=your-domain.com bash\n```\n\nHandles Caddy (auto SSL), Python 3.13, Redis, systemd services. See [Ignite](https://github.com/level09/ignite).\n\nConfiguration\n------------\n\nEnvironment variables (`.env`):\n\n```bash\nSECRET_KEY=your_secret_key\nFLASK_APP=run.py\nFLASK_DEBUG=1                    # 0 in production\n\n# PostgreSQL (optional - SQLite works by default)\n# SQLALCHEMY_DATABASE_URI=postgresql://user:pass@localhost/dbname\n\n# Background tasks (optional)\n# REDIS_URL=redis://localhost:6379/1\n# CELERY_BROKER_URL=redis://localhost:6379/2\n```\n\nDocumentation: [docs.enferno.io](https://docs.enferno.io)\n\nLooking for async?\n------------------\nCheck out **[STK](https://stk.dev)** — same philosophy, built on Quart (async Flask) with native WebSockets.\n\nLicense\n-------\nMIT\n\n","default_branch":"master","files":129,"tree":[".claude/skills/enferno-dev/SKILL.md",".claude/skills/enferno-dev/references/patterns.md",".dockerignore",".env-sample",".env.tmp",".github/FUNDING.yml",".github/workflows/checks.yml",".gitignore",".pre-commit-config.yaml",".readthedocs.yml",".windsurfrules","AGENTS.md","CHANGELOG.md","Dockerfile","LICENSE","README.md","checks.py","docker-compose.yml","docs/authentication.mdx","docs/cursor-rules.mdx","docs/deployment.mdx","docs/development.mdx","docs/docs.json","docs/favicon.svg","docs/getting-started.mdx","docs/introduction.mdx","docs/logo/dark.svg","docs/logo/light.svg","docs/requirements.txt","docs/roles-management.jpg","docs/users-management.jpg","enferno/__init__.py","enferno/app.py","enferno/commands.py","enferno/extensions.py","enferno/portal/views.py","enferno/public/__init__.py","enferno/public/models.py","enferno/public/views.py","enferno/settings.py","enferno/static/css/app.css","enferno/static/css/layout.css","enferno/static/css/vuetify.min.css","enferno/static/img/auth-bg.webp","enferno/static/img/enferno.svg","enferno/static/img/favicon.ico","enferno/static/js/axios.min.js","enferno/static/js/components/NotificationDropdown.js","enferno/static/js/components/ThemeSwitcher.js","enferno/static/js/components/TransitionExpand.js","enferno/static/js/components/VerticalNavGroup.js","enferno/static/js/components/VerticalNavLink.js","enferno/static/js/components/VerticalNavSectionTitle.js","enferno/static/js/components/index.js","enferno/static/js/config.js","enferno/static/js/navigation.js","enferno/static/js/vue.min.js","enferno/static/js/vuetify.min.js","enferno/static/mdi/.github/ISSUE_TEMPLATE.md","enferno/static/mdi/css/materialdesignicons.css","enferno/static/mdi/css/materialdesignicons.css.map","enferno/static/mdi/css/materialdesignicons.min.css","enferno/static/mdi/css/materialdesignicons.min.css.map","enferno/static/mdi/fonts/materialdesignicons-webfont.eot","enferno/static/mdi/fonts/materialdesignicons-webfont.ttf","enferno/static/mdi/fonts/materialdesignicons-webfont.woff","enferno/static/mdi/fonts/materialdesignicons-webfont.woff2","enferno/static/robots.txt","enferno/tasks/__init__.py","enferno/templates/401.html","enferno/templates/404.html","enferno/templates/500.html","enferno/templates/auth_layout.html","enferno/templates/cms/activities.html","enferno/templates/cms/roles.html","enferno/templates/cms/users.html","enferno/templates/core/api.jinja2","enferno/templates/core/dashboard.jinja2","enferno/templates/core/model.jinja2","enferno/templates/dashboard.html","enferno/templates/index.html","enferno/templates/layout.html","enferno/templates/login-layout.html","enferno/templates/security/_macros.html","enferno/templates/security/_messages.html","enferno/templates/security/change_password.html","enferno/templates/security/confirm_email.html","enferno/templates/security/email/change_notice.html","enferno/templates/security/email/change_notice.txt","enferno/templates/security/email/confirmation_instructions.html","enferno/templates/security/email/confirmation_instructions.txt","enferno/templates/security/email/login_instructions.html","enferno/templates/security/email/login_instructions.txt","enferno/templates/security/email/reset_instructions.html","enferno/templates/security/email/reset_instructions.txt","enferno/templates/security/email/reset_notice.html","enferno/templates/security/email/reset_notice.txt","enferno/templates/security/email/welcome.html","enferno/templates/security/email/welcome.txt","enferno/templates/security/forgot_password.html","enferno/templates/security/login_user.html","enferno/templates/security/mf_recovery.html","enferno/templates/security/mf_recovery_codes.html","enferno/templates/security/register_user.html","enferno/templates/security/reset_password.html","enferno/templates/security/send_confirmation.html","enferno/templates/security/send_login.html","enferno/templates/security/two_factor_select.html","enferno/templates/security/two_factor_setup.html","enferno/templates/security/two_factor_verify_code.html","enferno/templates/security/wan_register.html","enferno/templates/security/wan_signin.html","enferno/templates/security/wan_verify.html","enferno/user/__init__.py","enferno/user/forms.py","enferno/user/models.py","enferno/user/views.py","enferno/utils/base.py","migrations/README","migrations/alembic.ini","migrations/env.py","migrations/script.py.mako","migrations/versions/55417e664888_baseline.py","nginx/enferno.conf","nginx/nginx.conf","pyproject.toml","run.py","setup.sh","uv.lock"],"storefront":"/r/level09","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/level09/enferno/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}