Production-ready Telegram bot framework with CLI scaffolding — powering bots with 1000s of users
boundless-aiogram is a battle-tested bot framework built on top of aiogram 3.x. It provides a complete project structure, CLI tools, and best practices out of the box — so you can focus on building features, not boilerplate.
2,000+ downloads and counting. Used in production bots serving thousands of users.
| Bot | Users | Monthly Activity |
|---|---|---|
| Smart English HR | 1,200+ | 100+ applications |
| Cake Bot | 200+ | Active daily |
| + More in production | — | — |
- 🛠️ CLI Scaffolding — Generate new bot projects instantly
- 📁 Production Structure — Organized handlers, database, utils, languages
- 🗄️ Database Layer — SQLAlchemy + Alembic migrations built-in
- 🌍 Multi-language — i18n support out of the box
- ⚙️ Core Module — Config and middleware ready to go
- 🧪 Test Setup — Testing structure included
- 📤 File Uploads — Upload handling utilities
pip install boundless-aiogram# Generate new project
boundless-aiogram init my-awesome-bot
# Navigate to project
cd my-awesome-bot
# Install dependencies
pip install -r requirements.txt
# Configure environment
cp .env.example .env
# Edit .env with your bot token
# Run migrations
alembic upgrade head
# Start your bot
python main.pyThat's it. You're ready to build.
my-awesome-bot/
│
├── bot/ # Bot handlers and logic
│ ├── handlers/ # Message & callback handlers
│ ├── keyboards/ # Inline & reply keyboards
│ ├── states/ # FSM states
│ └── filters/ # Custom filters
│
├── core/ # Core configuration
│ ├── config.py # Settings management
│ └── middleware.py # Bot middleware
│
├── database/ # Database layer
│ ├── models.py # SQLAlchemy models
│ ├── crud.py # CRUD operations
│ └── session.py # DB session management
│
├── languages/ # Internationalization
│ ├── en.py # English
│ ├── uz.py # Uzbek
│ └── ru.py # Russian
│
├── migrations/ # Alembic migrations
│ └── versions/ # Migration files
│
├── utils/ # Utility functions
│ └── helpers.py # Common helpers
│
├── tests/ # Test suite
│
├── main.py # Entry point
├── alembic.ini # Alembic config
├── requirements.txt # Dependencies
├── .env.example # Environment template
└── .gitignore # Git ignore
| Command | Description |
|---|---|
boundless-aiogram init <name> |
Create new bot project |
boundless-aiogram --version |
Show version |
boundless-aiogram --help |
Show help |
┌─────────────────────────────────────────────────┐
│ BOUNDLESS-AIOGRAM STRUCTURE │
├─────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ BOT │ │
│ │ Handlers • Keyboards • States │ │
│ └────────────────────┬────────────────────┘ │
│ │ │
│ ┌────────────────────▼────────────────────┐ │
│ │ CORE │ │
│ │ Config • Middleware │ │
│ └────────────────────┬────────────────────┘ │
│ │ │
│ ┌────────┬───────────┴───────────┬────────┐ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────┐ ┌────────┐ ┌───────────┐ ┌──────┐ │
│ │Utils │ │Database│ │ Languages │ │Tests │ │
│ │ │ │Alembic │ │ i18n │ │ │ │
│ └──────┘ └────────┘ └───────────┘ └──────┘ │
│ │
└─────────────────────────────────────────────────┘
from aiogram import Router
from aiogram.filters import Command
from aiogram.types import Message
router = Router()
@router.message(Command("start"))
async def cmd_start(message: Message):
await message.answer("Welcome! 🚀")from database.crud import create_user, get_user
from database.session import get_session
async def register_user(telegram_id: int, name: str):
async with get_session() as session:
user = await create_user(session, telegram_id, name)
return userfrom languages import get_text
async def greet(message: Message, lang: str = "en"):
text = get_text("welcome", lang)
await message.answer(text)from aiogram.fsm.state import State, StatesGroup
class RegistrationStates(StatesGroup):
first_name = State()
last_name = State()
phone = State()# Bot
BOT_TOKEN=your-bot-token-from-botfather
# Database
DATABASE_URL=postgresql://user:pass@localhost:5432/mybot
# Or SQLite:
# DATABASE_URL=sqlite:///bot.db
# Settings
ADMIN_IDS=123456789,987654321
DEFAULT_LANGUAGE=en
DEBUG=False# Create new migration
alembic revision --autogenerate -m "Add users table"
# Apply all migrations
alembic upgrade head
# Rollback one step
alembic downgrade -1
# View current version
alembic current# Run tests
pytest
# With coverage
pytest --cov=bot --cov=database[Unit]
Description=My Telegram Bot
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/path/to/my-bot
ExecStart=/path/to/venv/bin/python main.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetFROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "main.py"]| Feature | boundless-aiogram | Starting from scratch |
|---|---|---|
| Project setup | 1 command |
30+ minutes |
| Database layer | ✅ Included | Manual setup |
| Migrations | ✅ Alembic ready | Manual setup |
| Multi-language | ✅ Built-in | Manual setup |
| Best practices | ✅ Enforced | Hope for the best |
| Production tested | ✅ 1000s of users | Unknown |
- Fork the repository
- Create feature branch (
git checkout -b feature/NewFeature) - Commit changes (
git commit -m 'Add NewFeature') - Push to branch (
git push origin feature/NewFeature) - Open a Pull Request
MIT License - see LICENSE for details.
- Issues: GitHub Issues
- PyPI: pypi.org/project/boundless-aiogram
Stop writing boilerplate. Start building bots.