Build large Flask apps without losing your sanity.
Auth, admin panel, modular architecture — all the batteries, none of the boilerplate.
📖 Docs • 💬 Discord • 🎯 Contribute • 🐦 Twitter
Your Flask app works. Until it doesn't.
You start with a single app.py. Then you add auth. Then an admin panel. Then a few blueprints. Suddenly you have 5,000 lines and no idea where anything lives. You think about Django — but you chose Flask for a reason.
Shopyo is the answer. It gives you the modular architecture, auth, admin dashboard, CLI scaffolding, and project structure that Flask is missing — in one pip install.
pip install shopyo
shopyo new myapp
cd myapp && shopyo initialise && flask run --debug
# → Working app with auth, admin panel, and dashboard at localhost:5000
Featured on Python Weekly issue 436 and presented at EuroPython 2023.
Why Shopyo?
| Instead of this... | You get this |
|---|---|
| Wiring up Flask-Login, Flask-Admin, Flask-Migrate, Flask-WTF, and 5 other extensions separately | One pip install with everything working together |
| Manually registering blueprints and hoping you didn't miss one | Auto-discovery: drop a module in modules/ and it just works |
| Googling "how to structure a large Flask app" for the 10th time | A proven architecture that scales from day one |
| Configuring static files differently for dev and prod | Zero-friction assets: one url_for() call works everywhere |
| Writing the same user management UI for every project | Built-in admin dashboard and user management |
Features
- 🔐 Auth built-in — Login, registration, password reset, email confirmation, API tokens, rate limiting, password complexity, roles, and an events system. Drop-in, no wiring required.
- 📦 2-level modularity — Organize features as modules and group them into boxes. Add, remove, or replace parts without touching the rest of your app.
- 🖥️ Admin dashboard — User management, settings, and a customizable admin panel. Works out of the box, fully hackable.
- 🪜 CLI scaffolding —
shopyo newcreates a project.shopyo startappcreates a module.shopyo startboxcreates a box. No boilerplate to write. - 🌅 Zero-friction assets — Use standard Flask
url_for('static', ...)in development and production. Transparent static shadowing handles the rest. - ⚛️ i18n ready — Internationalization setup included.
- 🎨 Theme system — Front-end and back-end theming with pluggable CSS themes.
- 🔧 Production-ready — Session hardening, CSRF protection, environment-enforced secrets, rate limiting, multi-platform CI/CD, 75%+ test coverage.
- 🔑 Policy-based authorization — Role-based access control with fine-grained permissions, grant/revoke semantics, and a
requiredecorator for protecting views. - 🔄 Persistent login — Optional "remember me" functionality with configurable cookie duration.
- 📝 Customizable auth pages — Override login and registration templates via config without touching package internals.
- 🧩 Modular packages — Auth, dashboard, page, i18n, settings, theme, and appadmin extracted as independent packages with URL override support.
- ⚡ Modern UI — Tailwind CSS, AlpineJS, and FontAwesome 6.5.1 bundled locally for offline reliability.
- 🖊️ Rich text editing — Quill editor integrated for a lightweight writing experience.
- 🎯 Demo scaffolding —
shopyo new --democreates a project pre-loaded with demo apps.
Quick start
pip install shopyo
shopyo new blog
cd blog
shopyo initialise
flask run --debug
Open http://localhost:5000/dashboard — credentials: admin@domain.com / pass.
You can also run
shopyo newinside an existing directory to scaffold Shopyo in place. Note:shopyo new .does not work — the project name must be alphanumeric. Useshopyo new(no argument) instead to create the project in the current directory.
What does "modular" mean?
Every feature in Shopyo is a module. Modules are self-contained Flask blueprints with their own models, views, forms, templates, and static assets.
myproject/
├── modules/
│ ├── www/ # Homepage, public routes
│ ├── blog/ # Blog module (you create this)
│ ├── analytics/ # Analytics module (you create this)
│ └── box__billing/ # Box: group of related modules
│ ├── subscriptions/
│ └── invoices/
├── config.py
├── app.py
└── requirements.txt
Add a module by dropping a folder into modules/. Shopyo auto-discovers and registers it. No blueprint registration, no configuration files to update.
Who uses Shopyo?
| Site | Description |
|---|---|
| Maurilearn.com | Elearning platform |
| Linkolearn.com | Learn by links |
| FlaskCon.com | Conference software |
Built something with Shopyo? Let us know and we'll add you to the list.
Why not Django?
Django is excellent for Django-shaped problems. But if you want:
- Flask's flexibility (swap SQLAlchemy for Peewee, Jinja for Mako)
- A flat project structure (no nested
proj/proj) - Granular modularity (modules and boxes, not Django "apps")
- Zero boilerplate (auto-discovery, no manual registration)
...then Shopyo gives you Django's batteries without Django's constraints.
Why not plain Flask?
Flask is perfect for small projects. As you grow, you need:
- A project architecture that doesn't collapse at 10k lines
- Auth that works out of the box (not 6 extensions you wire up yourself)
- An admin panel that isn't an afterthought
- CLI commands for scaffolding, not copy-paste from Stack Overflow
Shopyo gives you all of this while keeping 100% Flask compatibility. Every Shopyo project is still a Flask project.
First time contributing?
We have a 100% first-timers friendly policy. Check out the testimonials.
"One of the best onboarding experiences I've had. Learned a lot too." — Ramon from Codesee.io
👉 Get started contributing 👉 Join the Discord
License
MIT — see LICENSE.
Contact
Release files for shopyo 4.18.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| shopyo-4.18.2.tar.gz | 5.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| shopyo-4.18.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:11.0 MB
Release files / shopyo-4.18.2.tar.gz
| Download URL | shopyo-4.18.2.tar.gz |
|---|---|
| Size | 5.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
35bc58fc14ef02eeda3d8fb97a3e1595428c3f67148010a320e485e38e8e97fc
|
|
BLAKE2b-256 checksum How to use checksums |
a1e51ad269e0becdc521a4cdd0942e896281f87c8a5595ed863885afbf254d58
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|
Release files / shopyo-4.18.2-py3-none-any.whl
| Download URL | shopyo-4.18.2-py3-none-any.whl |
|---|---|
| Size | 5.5 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f78f1b054a6ea7fe159e6cb656711c7ff8e17861f9766d5b549d6cc59eebde45
|
|
BLAKE2b-256 checksum How to use checksums |
255775d7681484b02a33190d06d02b57940e6d1dfeabdcd6f96e89b29f66f152
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.15
|