Documentation

Tooly AI v1.0.1

A complete guide to setting up, customizing, and publishing your AI-powered multi-tool Flutter application — from first run to store submission.

Tooly AI is a production-ready Flutter app featuring 15+ AI-powered tools including a chat assistant, image generator, OCR image-to-text converter, AI math solver, grammar checker, PDF maker & summarizer, code generator, multi-language translator, email composer, and more. All configuration lives in a small set of centralized files, so you can rebrand and launch quickly.

What's included: Multi-provider AI with automatic fallback (Gemini, Groq, Cohere, Hugging Face, OpenAI, Grok), Firebase Auth, AdMob, a coin-based IAP system, 15 languages, and dark/light theme support.

The app follows a clean BLoC architecture with feature-based modules and utility tool views. Feature-based tools live in lib/features/ and specialized tools live in lib/src/presentation/view/pages/tools/, making it straightforward to add, modify, or remove tools.

Requirements

Verify your local environment before starting. The app supports modern Flutter stable channels (configured in pubspec.yaml as sdk: '>=3.11.0 <4.0.0' and flutter: '>=3.38.1').

ToolVersionNotes
Flutter SDK>=3.38.1Latest stable channel recommended
Dart SDK>=3.11.0 <4.0.0Bundled with Flutter 3.38+
Java17Required for Android Gradle
Android SDKmin 21Android 5.0+
iOS Deployment Target15.0Required by the Firebase SDK
Xcode15+For iOS builds

SDK constraints are configured in pubspec.yaml. Run flutter doctor in your terminal to verify all toolchain requirements are satisfied before proceeding.

Installation

After extracting the project source code, open the root directory in your favorite editor:

1

Open Android Studio or VS Code and select the project root directory.

2

Open the integrated terminal and fetch all dependencies:

pubspec.yaml
flutter pub get
3

Connect a physical device or start an emulator, then run the app:

Terminal
flutter run

The app requires a valid android/app/google-services.json (Android) and ios/Runner/GoogleService-Info.plist (iOS) to start Firebase services. See the Firebase Setup section before running for the first time.

App Name

The app name must be updated across three key locations: a central Dart string constant file, the Android manifest, and the iOS configuration plist.

1. Dart Constant

File path: lib/src/utils/constants/m_strings.dart

This is the primary app name string used in appbars, titles, and dialogs across the Dart codebase.

lib/src/utils/constants/m_strings.dart
class MyStrings {
  static const String appName = 'Tooly AI'; // ← Update your app name here
}

2. Android Label

File path: android/app/src/main/AndroidManifest.xml

Update the android:label attribute on the <application> element to change the title under the launcher icon on Android devices.

android/app/src/main/AndroidManifest.xml
<application
    android:label="Tooly AI"
    android:name="${applicationName}"
    android:icon="@mipmap/ic_launcher">

3. iOS Display Name

File path: ios/Runner/Info.plist

Find the CFBundleDisplayName key and replace the string value beneath it.

ios/Runner/Info.plist
<key>CFBundleDisplayName</key>
<string>Tooly AI</string>

App Icon

Generate and replace launcher icons across platforms from a single high-resolution square image.

1

Design a square artwork at 1024 × 1024 px. Avoid transparency — solid backgrounds render best across home screens.

2

Visit appicon.co, upload your image, select both iPhone and Android, then download the ZIP.

3

Android icon resources path: Replace all mipmap-* directories under:

android/app/src/main/res/
4

iOS AppIcon set path: Replace the entire contents of:

ios/Runner/Assets.xcassets/AppIcon.appiconset/
5

In-app asset reference path: Replace the icon image asset at:

assets/images/app_icon.png

This path is referenced in lib/src/utils/constants/m_images.dart as MyImage.appIcon.

Alternatively, configure the flutter_launcher_icons package in pubspec.yaml to automate icon generation.

Package Name

Prior to submitting your app to Google Play or Apple App Store, update the default package identifier to a domain name you control.

Android — build.gradle & Manifest

Gradle configuration file path: android/app/build.gradle

android/app/build.gradle
android {
    namespace = "com.vertexstation.toolyai" // ← Update your package namespace

    defaultConfig {
        applicationId = "com.vertexstation.toolyai" // ← Update your Application ID
    }
}

Android manifest file path: android/app/src/main/AndroidManifest.xml

Also update the package attribute on the root <manifest> element (if present) so it matches your applicationId.

iOS — Xcode Project Configuration

iOS Xcode workspace file path: ios/Runner.xcworkspace

Open ios/Runner.xcworkspace in Xcode, select Runner under Targets, go to Signing & Capabilities, and edit the Bundle Identifier.

To safely rename package declarations across all native folders automatically, use the change_app_package_name package via terminal command: dart run change_app_package_name:main com.yourcompany.yourapp.

App Strings

Tooly AI supports 15 languages out of the box. All localized text strings reside in JSON dictionary files inside assets/language/. The English file serves as the master translation key reference.

Translation assets directory path: assets/language/

Supported locale files: en.json, ar.json, bn.json, de.json, es.json, fr.json, hi.json, id.json, ja.json, pt.json, ru.json, tr.json, ur.json, vi.json, zh.json.

assets/language/en.json
{
  "app_name": "Tooly AI",
  "smart_ai_toolkit": "Smart AI Toolkit",
  "ask_me_anything": "Ask Me Anything",
  "generate_any_image": "Generate Any Image",
  "code_generator": "Code Generator"
}

Core String Constants

File path: lib/src/utils/constants/m_strings.dart

Initial strings that load before the localization cubit initializes are configured in `MyStrings`:

lib/src/utils/constants/m_strings.dart
class MyStrings {
  static const String appName = 'Tooly AI';
  static const String baseUrl = 'https://api.openai.com/v1';
}

Localization helper files path: lib/core/localization/app_localizations.dart and lib/core/localization/localization_cubit.dart.

Brand Colors

The app palette is controlled by color token definitions in lib/src/utils/constants/m_colors.dart. Updating colorPrimary modifies action buttons, gradient overlays, active navigation icons, and highlighted borders across both light and dark themes.

Primary colors file path: lib/src/utils/constants/m_colors.dart

lib/src/utils/constants/m_colors.dart
class MyColor {
  // ── Primary Brand Palette ─────────────────────────────────
  static const Color colorPrimary         = Color(0xFF1d4ed8); // Main blue
  static const Color colorPrimaryLight    = Color(0xFF3b82f6); // Light blue
  static const Color colorPrimaryDark     = Color(0xFF1e40af); // Dark blue
  static const Color colorPrimaryVeryDark = Color(0xFF1e3a8a);

  // ── Theme Gradient Tokens ─────────────────────────────────
  static const List<Color> primaryGradient = [
    Color(0xFF1d4ed8), Color(0xFF3b82f6), Color(0xFF60a5fa),
  ];
}

Theme configuration file paths:

  • Light Theme: lib/src/config/themes/light_theme.dart
  • Dark Theme: lib/src/config/themes/dark_theme.dart
  • Custom Components & Utility Themes: lib/src/config/themes/custom_theme.dart & lib/src/config/themes/m_theme_util.dart
  • Theme State Cubit: lib/core/theme/theme_cubit.dart

Onboarding

The onboarding slideshow introduces users to the app features. The slide content is fully localized and driven by keys in the language JSON file, while visual animations use Lottie files.

Onboarding UI Page file path: lib/features/splash/presentation/pages/on_boarding_screen.dart

Onboarding Cubit file path: lib/features/splash/presentation/cubit/onboarding_cubit.dart

Onboarding Repository file path: lib/features/splash/data/repositories/splash_repository_impl.dart

Lottie asset directory path: assets/lottie/

assets/language/en.json
{
  "smart_ai_toolkit": "Smart AI Toolkit",
  "smart_ai_toolkit_desc": "Access multiple AI tools in one powerful workspace.",
  "ask_me_anything": "Ask Me Anything",
  "you_would_like": "Chat, summarize, translate, and solve instantly."
}

AI Tools & Features

Tooly AI bundles 15+ standalone AI features. Every tool is cleanly separated into its own page view and state cubit for easy maintenance and expansion.

AI Chat Assistant
Conversational assistant with history & context.
lib/features/chat/presentation/pages/chat_screen.dart
AI Code Generator
Generates & formats code across languages.
lib/features/code_generation/presentation/pages/code_generation_screen.dart
AI Image Generator
Generates images from prompt text.
lib/src/presentation/view/pages/image_screen/image_generate_screen.dart
Multi-Language Translator
Real-time text translation engine.
lib/features/translation/presentation/pages/g_translator_screen.dart
OCR Image to Text
Extracts readable text from image files.
lib/src/presentation/view/pages/tools/image_to_text_screen.dart
Image Describer
Analyzes image contents & generates captions.
lib/src/presentation/view/pages/tools/image_describer_screen.dart
AI Math Solver
Solves equations & math problems with steps.
lib/src/presentation/view/pages/tools/ai_math_solver_screen.dart
Grammar Checker
Corrects grammar, style, and tone.
lib/src/presentation/view/pages/tools/grammar_checker_screen.dart
AI Email Composer
Drafts professional emails & replies.
lib/features/email_maker/presentation/pages/email_maker_screen.dart
PDF Maker & Converter
Creates PDFs & extracts content from documents.
lib/src/presentation/view/pages/tools/pdf_maker_screen.dart
PDF Summarizer
Summarizes long PDF documents into key points.
lib/src/presentation/view/pages/tools/pdf_summarizer_screen.dart
Compress & Convert PDF
PDF compression & Word-to-PDF conversion.
lib/src/presentation/view/pages/tools/compress_pdf_screen.dart
Audio & Video Summarizer
Transcribes audio/video files to text summaries.
lib/src/presentation/view/pages/tools/audio_summarizer_screen.dart
Website Summarizer
Fetches and summarizes webpage content.
lib/src/presentation/view/pages/tools/website_summarizer_screen.dart
Personal AI Notes
Smart note taking with AI enhancement.
lib/src/presentation/view/pages/personal_note/personal_note.dart
Social Media Suite
Hashtag generator & social post composer.
lib/features/social_media/presentation/pages/social_media_screen.dart
Personal Writing & Advice
CV maker, birthday messages & advice.
lib/features/personal_advice/presentation/pages/personal_advice.dart
Script Writer
Generates video and story scripts.
lib/features/script_writing/presentation/pages/script_writer_screen.dart

Firebase Setup

Firebase powers user authentication (Google Sign-In) and Cloud Firestore for sync and coin balance management. Firebase is required for sign-in and coin sync, so connect your own Firebase project following the steps below. The “Continue as guest” button simply opens the app without signing in.

Firebase Service implementation file path: lib/services/firebase_service.dart

Auth Cubit file path: lib/features/auth/presentation/cubit/auth_cubit.dart

Login UI Screen file path: lib/src/presentation/view/pages/auth/login_screen.dart

1

Go to the Firebase Console, create a new project, and register both an Android and iOS app with your package identifier.

2

Android configuration file path: Download google-services.json and place it at:

android/app/google-services.json
3

iOS configuration file path: Download GoogleService-Info.plist and place it at:

ios/Runner/GoogleService-Info.plist
4

In the Firebase Console, go to Authentication → Sign-in method, enable Google Sign-In. Register your app's SHA-1 and SHA-256 fingerprints for Android Google Sign-In.

5

Enable Cloud Firestore and Realtime Database in your Firebase project console.

AI API Keys

Tooly AI implements a resilient multi-provider fallback engine. If the primary provider (Google Gemini) encounters rate limits or errors, the request automatically fails over to Groq, Hugging Face, Cohere, OpenAI, or Grok.

API Key Manager file path: lib/services/api_key_manager.dart

Unified AI Service file path: lib/services/unified_ai_service.dart

Generative AI Service file path: lib/services/gen_ai_service.dart

User API Settings Screen file path: lib/src/presentation/view/pages/settings/api_settings_screen.dart

Google Gemini
Primary AI provider
Primary
Groq
Llama / Mixtral models
Free tier
Hugging Face
Open-source models
Fallback
Cohere
Command models
Fallback
OpenAI
GPT-4 / GPT-3.5 models
Fallback
Grok / xAI
xAI Grok models
Fallback
lib/services/api_key_manager.dart
// The app ships with NO API keys. Add yours in the app under
// Settings → API Settings, or add them here:
static final List<ApiKeyConfig> _geminiKeys = [
  ApiKeyConfig(
    key: "YOUR_GEMINI_API_KEY",
    provider: ApiProvider.googleGemini,
    tier: ApiTier.free,
    isActive: true,
  ),
];

// Fallback providers (empty by default, same format as above)
static final List<ApiKeyConfig> _groqKeys        = [];
static final List<ApiKeyConfig> _huggingFaceKeys = [];
static final List<ApiKeyConfig> _cohereKeys      = [];
static final List<ApiKeyConfig> _openaiKeys      = [];
static final List<ApiKeyConfig> _grokKeys        = [];

End users can also input personal API keys on device in Settings → API Keys (lib/src/presentation/view/pages/settings/api_settings_screen.dart). Custom keys take execution precedence over app defaults.

Architecture & Core Services

Tooly AI is architected using GetIt service locator dependency injection, BLoC state management, and modular service utilities.

1. Application Entry Point

File path: lib/main.dart

Initializes Firebase, GetIt DI, In-App Purchases, AI Key Managers, and AdMob before binding global BLoC providers.

2. Dependency Injection Locator

File path: lib/core/di/injection_container.dart

Registers singletons for SharedPreferences, repositories, and factory instances for all Cubits.

3. Route Helper & Navigation

File path: lib/src/config/routes/route_helper.dart

Central route table mapping route constants to screen widgets (splash, onboarding, dashboard, home, login, apiSettings).

4. Dashboard & Start Screen

File path: lib/src/presentation/view/pages/dashboard/start_screen.dart

Main navigation shell hosting bottom navigation tabs, tool drawer, and quick feature access.

AdMob Integration

The app supports Banner, Interstitial, and Rewarded video ads powered by Google Mobile Ads SDK. Replace default IDs across three configuration files before launching.

Step 1 — Android App ID

Android manifest file path: android/app/src/main/AndroidManifest.xml

android/app/src/main/AndroidManifest.xml
<meta-data
    android:name="com.google.android.gms.ads.APPLICATION_ID"
    android:value="ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX"/>

Step 2 — iOS App ID

iOS plist configuration file path: ios/Runner/Info.plist

ios/Runner/Info.plist
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX</string>

Step 3 — Dart Ad Unit IDs

Ad service manager file path: lib/services/ad_manager.dart

Banner Ad Widget file path: lib/src/presentation/view/component/banner_ad_widget.dart

lib/services/ad_manager.dart
// Google's official TEST ad unit IDs. Replace with your own before publishing.
static const String bannerAdUnitId       = 'ca-app-pub-3940256099942544/6300978111';
static const String interstitialAdUnitId = 'ca-app-pub-3940256099942544/1033173712';
static const String rewardedAdUnitId     = 'ca-app-pub-3940256099942544/5224354917';

The project ships with Google's official test app and ad unit IDs, so it is safe to run as-is. Replace all of them (manifest, Info.plist and the three IDs above) with your own AdMob IDs only for your final release build. Clicking your own live ads during testing can get your AdMob account suspended for invalid activity.

In-App Purchases

Tooly AI includes a coin credit monetization system using the Flutter in_app_purchase plugin. Users buy coin packs that are credited directly to their Firebase user account balance.

In-App Purchase Service file path: lib/services/purchases_service.dart

Recharge Coin Screen UI file path: lib/features/recharge_coin/presentation/pages/recharge_coin_screen.dart

Checkout Screen UI file path: lib/features/recharge_coin/presentation/pages/checkout_screen.dart

Product IDCoins CreditedDefault Package Tier
starter100Starter Pack
basic525Basic Pack
popular1,100Popular Pack
premium2,800Premium Pack
ultimate5,750Ultimate Pack
lib/services/purchases_service.dart
class PurchasesConfig {
  static const Map<String, int> packageCoinsMap = {
    'starter': 100,
    'basic': 525,
    'popular': 1100,
    'premium': 2800,
    'ultimate': 5750,
  };
}
1

Configure matching consumable product IDs (starter, basic, popular, premium, ultimate) in Google Play Console (Monetize → In-app products) and App Store Connect (In-App Purchases → Consumables).

2

Adjust coin reward ratios in lib/services/purchases_service.dart to suit your pricing model.

3

Test purchase transactions with Play Console License Testers and App Store Sandbox accounts.

Submission

Once all branding, API keys, Firebase services, and ad configurations are verified on physical test devices, build production binaries for app store upload.

Pre-Submission Checklist

  • Updated appName in lib/src/utils/constants/m_strings.dart
  • Updated label & package ID in android/app/src/main/AndroidManifest.xml and android/app/build.gradle
  • Updated display name & bundle ID in ios/Runner/Info.plist
  • Replaced icons in android/app/src/main/res/ and ios/Runner/Assets.xcassets/AppIcon.appiconset/
  • Added production android/app/google-services.json and ios/Runner/GoogleService-Info.plist
  • Added your AI API keys (Settings → API Settings, or lib/services/api_key_manager.dart)
  • Replaced the test AdMob IDs with your own in lib/services/ad_manager.dart, AndroidManifest.xml and Info.plist
  • Created your own release keystore and android/key.properties (see the Flutter Android deployment guide linked below)
  • Registered Consumable IAP Product IDs in Play Store & App Store Connect

Android App Bundle (.aab) Build Command

Terminal
flutter build appbundle --release

Output file path: build/app/outputs/bundle/release/app-release.aab

iOS Archive & IPA Build Command

Terminal
flutter build ipa --release

Output file path: build/ios/archive/Runner.xcarchive or build/ios/ipa/

For complete app signing and publishing instructions, refer to official Flutter documentation:

Support

Need assistance or have technical inquiries? Reach out to our engineering support team.

Support Email: vertexstation@gmail.com

Please include your item purchase code, a detailed description of the issue, and terminal error logs when contacting support.