flutter_archx

pub package License: MIT

A CLI that scaffolds production-ready Flutter projects with clean architecture — and asks you what you actually need first.

Pick a preset or hand-pick your screens, then pick a theme color. The routing files, pubspec.yaml, navigation drawer, and theme are all generated from that selection, so you never start by deleting code you didn't want.

Then keep using it: add feature scaffolds new screens and wires their routes in for you.

Installation

dart pub global activate flutter_archx

Commands

Command What it does
flutter-arch create Scaffold a new project (interactive by default)
flutter-arch add feature <name> Add a screen to an existing project and register its route

create

flutter-arch create

Walks you through seven steps and shows a summary before writing anything:

▸ Step 1 — Project name
? Project name: my_app

▸ Step 2 — Organization
? Organization (reverse domain): (com.mycompany)

▸ Step 3 — Description
? Project description: (A new Flutter project built with enterprise architecture.)

▸ Step 4 — Template preset
? Which preset do you want to start from?
❯ ◉  Starter      Splash, onboarding, auth, home, profile, settings
  ◯  Minimal      Splash + Home only
  ◯  Enterprise   Everything: starter + tab shell + CRUD module + tooling
  ◯  Custom       Choose features and add-ons yourself

▸ Step 5 — Features        (Custom only — space to toggle, Enter to confirm)
▸ Step 6 — Add-ons         (Custom only)

▸ Step 7 — Theme color
? Which theme color should the app use?
❯ ◉  Monochrome   #111111   Black and white on a pure white background
  ◯  Blue         #2563eb   Blue with a violet secondary
  ◯  Indigo       #4f46e5   Deep indigo
  ◯  Custom…                Enter your own hex code

▸ Step 8 — Extras          git init? pub get?

── Summary ─────────────────────────────
  Project       my_app
  Organization  com.mycompany
  Preset        Starter
  Initial route /splash
  Features (8)  Splash Screen, Onboarding Slides, Login, ...
  Add-ons (3)   Theme Switcher, Offline Banner, Project Documentation
  Theme color   Monochrome (#111111)
────────────────────────────────────────
? Create this project? (Y/n)

Your organization and theme color are remembered in ~/.flutter_archx.json and pre-fill the prompts next time. Unattended runs ignore them and stay deterministic.

Non-interactive

Any flag you pass skips its question. --yes skips all of them.

# Starter preset, no questions asked
flutter-arch create my_app --yes

# A specific preset
flutter-arch create my_app --preset enterprise --org com.mycompany --yes

# Exactly the screens you want
flutter-arch create my_app --features splash,login,home --add-ons theme_switcher --yes

# Your brand color instead of the default black and white
flutter-arch create my_app --color teal --yes
flutter-arch create my_app --color "#0f766e" --yes

# See every valid id
flutter-arch create --list

Options

Option Description Default
--org, -o Organization identifier (reverse domain) com.example
--description, -d Project description (auto)
--preset, -p minimal, starter, enterprise, custom starter
--features, -f Comma-separated feature ids, or all from preset
--add-ons, -a Comma-separated add-on ids, all, or none from preset
--color, -c Palette name or hex code (see Theme colors) mono
--list Print every preset, feature, add-on, and theme color, then exit
--yes, -y Skip all prompts false
--no-git Skip git init (git runs)
--no-pub-get Skip flutter pub get (pub get runs)

Presets

Preset Contains
minimal Splash + Home
starter Splash, onboarding, login, register, forgot password, home, profile, settings
enterprise Everything: starter + tab shell + notifications + CRUD module + all add-ons
custom Hand-pick features and add-ons

Features

Id Screen
splash Branded launch screen that routes based on auth state
onboarding Swipeable intro pages, shown only on first launch
login Email and password sign-in with validation
register Account creation form with password confirmation
forgot_password Password reset request with success state
home Landing screen with pull-to-refresh and summary cards
main_shell Bottom-navigation shell hosting your selected tabs
notifications Notification inbox with read/unread state
profile User profile with editable fields and sign-out
settings Theme mode, language, and notification preferences
crud Full module: list, search, pagination, detail, create/edit, delete

Dependencies are resolved for you — picking register pulls in login, and picking main_shell pulls in home.

Add-ons

Id What you get
theme_switcher Light/dark toggle persisted across restarts
localization GetX translations with English + Arabic (RTL) samples
connectivity Global connectivity listener with a no-internet banner
image_cache Cached network image widget with shimmer placeholders
flavors main_dev / main_staging / main_prod + VS Code launch configs
tests Validator, repository, and mocktail-based controller tests
ci GitHub Actions running format, analyze, and test
docs README.md and docs/ARCHITECTURE.md for the generated project

Theme colors

--color sets the palette written into lib/app/theme/app_colors.dart. The default is mono — black on a pure white background, inverting to white on near-black in dark mode.

Id Primary Look
mono #111111 Black and white on a pure white background (default)
blue #2563eb Blue with a violet secondary (the pre-2.1 default)
indigo #4f46e5 Deep indigo
teal #0d9488 Calm blue-green
green #16a34a Fresh green
purple #7c3aed Vivid violet
orange #ea580c Warm orange
red #dc2626 Bold red

Any hex code works too — --color "#0f766e", --color 0f766e, or the shorthand --color "#4af". Tints, shades, the 50–900 swatch, a hue-rotated secondary, and readable button foregrounds are all derived from it.

Only the brand colors change. success, warning, error, and info stay colorful in every palette, because a red error reads faster than a brand-tinted one. Everything lands in plain Color constants, so editing the palette by hand afterwards stays a one-file job.

add feature

Adding a screen normally means creating five files and hand-editing app_routes.dart and app_pages.dart. This does all of it:

cd my_app
flutter-arch add feature reports
🧩 Adding feature "reports" to my_app

✓ lib/features/reports (5 files)
✓ Route /reports registered in app_routes.dart and app_pages.dart

   Navigate to it with:
   Get.toNamed(AppRoutes.reports);

What it creates and edits:

lib/features/reports/
├── bindings/reports_binding.dart      created
├── controllers/reports_controller.dart created
├── views/reports_view.dart             created
├── models/                             created
└── widgets/                            created

lib/app/routes/app_routes.dart          + static const String reports = '/reports';
lib/app/routes/app_pages.dart           + imports and the GetPage entry

Names are normalised for you — flutter-arch add feature "Audit Log" produces the folder audit_log, the route /audit-log, and the class AuditLogView.

Imports are inserted in alphabetical order so directives_ordering stays quiet. If the routing files have been restructured and the anchors can't be found, they are left untouched and the exact snippet to paste is printed instead.

Options

Option Description Default
--no-route Create the files only, skip route registration (route is registered)
--path Route path to register, e.g. --path /admin/reports /<feature-name>

Generated architecture

lib/
├── main.dart              # calls bootstrap(Flavor.dev)
├── bootstrap.dart         # single startup path for every entry point
├── app/
│   ├── app.dart
│   ├── routes/            # generated from your selection — no dead routes
│   ├── bindings/
│   ├── config/            # environment, flavors, runtime config
│   └── theme/             # colors, typography, dimensions
├── core/
│   ├── constants/  enums/  errors/  exceptions/
│   ├── extensions/  helpers/  utils/  validators/
│   ├── network/           # Dio client, interceptors, endpoints
│   ├── storage/           # secure + local storage wrappers
│   └── services/          # auth, logging, notifications
├── data/                  # models, datasources, repository impls
├── domain/                # entities, repository contracts, usecases
├── features/              # one folder per selected screen
└── shared/                # widgets, components, dialogs, layouts

Each feature folder follows the same shape:

lib/features/<name>/
├── bindings/      # registers the controller with GetX
├── controllers/   # state and behaviour (GetxController)
├── models/        # feature-local data shapes
├── views/         # screens (GetView<Controller>)
└── widgets/       # widgets used only by this feature

Stack

  • GetX — state management, routing, dependency injection
  • Dio — HTTP client with auth, retry, and logging interceptors
  • GetStorage + FlutterSecureStorage — local and secure persistence
  • Clean Architecture — app, core, data, domain, features, shared

Requirements

  • Dart SDK >=3.5.0
  • Flutter SDK installed and available in PATH

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

License

MIT License — see LICENSE for details.

Libraries

flutter_archx
flutter_archx — Enterprise Flutter Architecture CLI