v0.3.0 Open Source

Production AI chat app.
Three commands.

Complete Flutter chat UI with auth, streaming, voice, and markdown. CLI-installed as source code you own. Zero boilerplate.

$ flai init
App name: Acme AI
Assistant: Aria
Theme: premium
$ flai add app_scaffold
Generated 83 files + main.dart
$ flutter run
AI Assistant
Claude Sonnet 4
Explain monads in simple terms
Think of a monad as a design pattern. It wraps a value in a context and gives you two operations: one to put a value in, and one to chain transformations that each return a new wrapped value.
+ Message...

From zero to running AI chat app. No boilerplate.

1

Configure

flai init asks for your app name, assistant name, and theme. Creates the core foundation in lib/flai/ with your branding baked in.

2

Generate

flai add app_scaffold installs 83 source files: auth, onboarding, chat with markdown and voice, sidebar with settings — plus a ready-to-run main.dart.

3

Connect & ship

flutter run and your app is live. When ready for production, flai connect rewrites your app to use real AI providers — zero manual wiring.

No black boxes. Generated components use standard Flutter primitives you already know.

lib/flai/components/chat_screen/chat_screen.dart
class FlaiChatScreen extends StatefulWidget {
  final ChatScreenController controller;
  final String? title;
  final String? subtitle;
  final Widget? emptyState;

  // ... your code. Edit anything.

  @override
  Widget build(BuildContext context) {
    final theme = FlaiTheme.of(context);
    return Column(
      children: [
        if (widget.showHeader) _buildHeader(theme),
        Expanded(
          child: ListView.builder(
            itemCount: messages.length,
            itemBuilder: (context, index) {
              return MessageBubble(
                message: messages[index],
              );
            },
          ),
        ),
        FlaiInputBar(onSend: _handleSend),
      ],
    );
  }
}

Traditional packages hide code behind versions. FlAI gives you the source.

Typical package
.dart_tool/
chat_package/ read-only
src/chat_screen.dart🔒
src/message_bubble.dart🔒
src/input_bar.dart🔒
Can't edit component internals
Breaking changes on update
Opaque dependency tree
Locked to package's design
vs
FlAI
lib/flai/ your code
components/chat_screen.dart
components/message_bubble.dart
components/input_bar.dart
core/theme/flai_theme.dart
Full source in your project
Update when you want
Zero runtime dependencies
Your brand, your rules

Drop-in implementations. Or write your own — it's one interface.

ai_provider.dart
abstract class AiProvider {
  Stream<ChatEvent> streamChat(
    ChatRequest request,
  );

  bool get supportsStreaming;
  bool get supportsToolUse;
  bool get supportsVision;
  bool get supportsThinking;
}