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').
| Tool | Version | Notes |
|---|---|---|
| Flutter SDK | >=3.38.1 | Latest stable channel recommended |
| Dart SDK | >=3.11.0 <4.0.0 | Bundled with Flutter 3.38+ |
| Java | 17 | Required for Android Gradle |
| Android SDK | min 21 | Android 5.0+ |
| iOS Deployment Target | 15.0 | Required by the Firebase SDK |
| Xcode | 15+ | 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:
Open Android Studio or VS Code and select the project root directory.
Open the integrated terminal and fetch all dependencies:
flutter pub get
Connect a physical device or start an emulator, then run the app:
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.
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.
<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.
<key>CFBundleDisplayName</key>
<string>Tooly AI</string>
App Icon
Generate and replace launcher icons across platforms from a single high-resolution square image.
Design a square artwork at 1024 × 1024 px. Avoid transparency — solid backgrounds render best across home screens.
Visit appicon.co, upload your image, select both iPhone and Android, then download the ZIP.
Android icon resources path: Replace all mipmap-* directories under:
iOS AppIcon set path: Replace the entire contents of:
ios/Runner/Assets.xcassets/AppIcon.appiconset/In-app asset reference path: Replace the icon image asset at:
assets/images/app_icon.pngThis 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.
Splash Logo
The animated splash screen uses a combination of Lottie animations and static branding assets.
Static asset path: assets/images/app_icon.png
Splash Lottie asset path: assets/lottie/splash.json
Splash screen logic file path: lib/features/splash/presentation/pages/splash_screen.dart
When replacing asset files in assets/images/ or assets/lottie/, maintain the exact same filename or update the constants in lib/src/utils/constants/m_images.dart.
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 {
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.
{
"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`:
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
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/
{
"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.
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
Go to the Firebase Console, create a new project, and register both an Android and iOS app with your package identifier.
Android configuration file path: Download google-services.json and place it at:
iOS configuration file path: Download GoogleService-Info.plist and place it at:
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.
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
// 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
<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
<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
// 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 ID | Coins Credited | Default Package Tier |
|---|---|---|
starter | 100 | Starter Pack |
basic | 525 | Basic Pack |
popular | 1,100 | Popular Pack |
premium | 2,800 | Premium Pack |
ultimate | 5,750 | Ultimate Pack |
class PurchasesConfig {
static const Map<String, int> packageCoinsMap = {
'starter': 100,
'basic': 525,
'popular': 1100,
'premium': 2800,
'ultimate': 5750,
};
}
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).
Adjust coin reward ratios in lib/services/purchases_service.dart to suit your pricing model.
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
appNamein 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
flutter build appbundle --release
Output file path: build/app/outputs/bundle/release/app-release.aab
iOS Archive & IPA Build Command
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:
- Google Play Store: Deploying Flutter to Android
- Apple App Store: Deploying Flutter to iOS
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.