bloomBUILD•SHIP•BLOOM
Building Blocks Background

Opinionated Architecture.
File-based Routing & Signals for Flutter.

Stop arguing over directory structures and state packages. Bloom brings Next.js-style file-system routing, signals reactivity, dependency injection, and automated code generation to Flutter.

AST_GENERATOR

File-System Routing

Next.js-style directory structure mapping directly to type-safe go_router definitions automatically on file save.

Automatic URL parameter binding (@PathParam)
Group routes with parentheses `(auth)/login.dart`
Nested layout inheritance via `_layout.dart`
bloom-playground.dart
AOT_SAFE
// lib/app/routes/products/[id].dart
@RoutePage()
class ProductPage extends BloomPage {
  @PathParam('id')
  final String productId;

  ProductPage({required this.productId});

  @override
  Widget build(BuildContext context) {
    return Watch((_) => Text('Product ID: $productId'));
  }
}

Thin Boot Sequence & Dependency Injection

Bloom handles environment initialization, DI container registration, and app lifecycle prior to `runApp()`.

Interactive Boot & DI Execution Pipeline

Click run to simulate Bloom’s sub-40ms boot sequence before Flutter mounts runApp().

4ms
1. Load bloom.yaml
Parsing environment vars, channels & logging levels
12ms
2. Register DI Singletons
Injecting AuthService, ApiClient & StorageService
8ms
3. Attach Signals Router
Compiling AST route table and state dependencies
16ms
4. Execute runApp(MyApp())
Mounting Flutter root widget with Impeller 60fps
Execution Log ConsoleTOTAL: 40ms
✔[BOOT] Environment initialized: production (bloom.yaml)
✔[DI] Containers registered: AuthService, ApiClient, StorageService
✔[ROUTER] 14 typed routes compiled over go_router
✔[RUN_APP] Flutter Engine running cleanly on metal graphics thread

Fine-Grained Reactivity with Signals

Say goodbye to verbose state containers. Signals track dependencies automatically, rebuilding only the exact widgets reading their value.

Live 60FPS Signals Reactivity Simulator

Click to update signal state and observe sub-millisecond targeted widget rebuilds.

CounterController (Signal Memory)REBUILD_TIME: 0.2ms
final count = signal(5);5
computed(() => count % 2 == 0)FALSE (Odd)
Total Widget Rebuilds Triggered: 1
Flutter Widget Tree Impeller 60FPS
Scaffold (No Rebuild)
Column (No Rebuild)
Watch((context) => Text('Count: 5'))REBUILT

Only the Watch() widget is rebuilt when count.value mutates. The parent Scaffold and Column remain completely untouched.

Declarative Data Fetching with Bloom Query

Manage server state, caching, refetching, and pagination out of the box with zero boilerplate.

Interactive Bloom Query & Cache Sandbox

Test automatic background refetching, focus revalidation, and optimistic mutations.

Query Cache Key: ['user', 42]STATUS: FRESH
User Profile #42Cached
User PreferencesCached
Security TokensCached
staleTime: 5m  ·  gcTime: 24h  ·  retry: 3
Cache Lifecycle EventMEMORY_ACTIVE
Query initialized with 5m staleTime
⚡️ Mutations render on device immediately, auto-reverting if the remote API network call rejects.

Zero-Boilerplate Routing Engine

Directory structure *is* your routing tree. Group routes, protect layouts with guards, and capture dynamic URL parameters seamlessly.

Interactive File-System Routing Visualizer

Click files in the directory tree to inspect automatically mapped go_router definitions.

📁 lib / app / routes /
MAPPED ROUTE PATH/
ROUTE GUARDNone (Public)
index.dartAUTO_COMPILED
// lib/app/routes/index.dart
@RoutePage()
class HomeView extends BloomView<HomeController> {
  @override
  Widget build(BuildContext context) => Scaffold(body: HomeHero());
}
ion>

Signals Reactive State

Fine-grained state updates with zero `setState` or verbose Bloc boilerplate. Rebuilds only the exact widgets reading the signal.

CLI Code Generation

Generates route tables, typed navigation extensions, and data models automatically on file save.

Nested Layouts

Persist sidebars, bottom navigation, and search bars across route changes without losing component state.