A Flutter-based Telegram bot admin panel for managing customer support conversations. Built with clean architecture, Drift (SQLite), and long-polling for real-time message handling.
This project was built through vibe coding — iterative, conversation-driven development using Claude Code by Anthropic. Architecture decisions, bug fixes, and feature implementations were developed collaboratively between the developer and Claude.
- Real-time incoming messages via Telegram long-polling
- Open queue and per-worker conversation management
- Internal notes, quick replies, and file/media sharing
- Bot token management with live connect/disconnect
- Dashboard with live stats (open chats, in progress, finished today, total messages)
- Multi-worker support with role-based access (Admin / Worker)
- Dark and light theme support
- Flutter SDK
- A Telegram bot token from @BotFather
Production:
flutter run --dart-define-from-file=config/production.jsonDevelopment:
flutter run --dart-define-from-file=config/development.json| Key | Description |
|---|---|
ENVIRONMENT | production or development |
DATABASE_NAME | SQLite database file name |
MAX_LAYOUT_WIDTH | Breakpoint (px) between mobile and desktop layouts |
ALPHA / BETA | Feature flags |
Config files are located in config/production.json and config/development.json.
Clean architecture with strict layer separation:
lib/ ├── main.dart └── src/ ├── common/ # shared database, router, utilities, widgets └── feature/ # one folder per feature └── <feature>/ ├── controller/ # business logic & state (StateController + freezed) ├── data/ # repository interfaces & implementations (Drift) ├── model/ # immutable domain models └── widget/ # UI (config widget, desktop/mobile layouts, data controllers) Dependency direction within a feature: widget → controller → data. Widgets never access repositories directly.
After adding or modifying Freezed classes or other annotated code, regenerate files with:
dart run build_runner build && dart format lib/