Get from a blank account to your first crash & event flowing into the dashboard in well under 5 minutes.
In a nutshell
- Create an account & organization
- Create your first app
- Generate an API token
- Install the SDK
- Initialize at app launch
- Track an event & a crash
Create an account
~30sCreate your first app
~20sFrom the dashboard, click Apps → New App. Pick a name and a platform (you can have one app per platform or a single cross-platform entry — your choice).
An “app” in GatiFlow corresponds to a single binary identity: one for iOS, one for Android. React Native / Flutter / MAUI projects usually register two apps and share their tokens.
Generate an API token
~15sGo to Settings → API Tokens, click Create token, scope it to the app you just made, and copy the value. It looks like:
mhub_c7b5d22e9b817c431c1898c88ef63489
Install the SDK
~1 minEvery SDK is published to its language's standard package registry — no manual builds, no git submodules. Pick your platform:
Android
JitPackAdd the JitPack repository once, then add the dependency.
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://jitpack.io") } // <- add this
}
}
// app/build.gradle.kts
dependencies {
implementation("com.github.dmsyudha:gatiflow-android:v1.0.0")
}iOS
Swift Package ManagerIn Xcode: File → Add Package Dependencies… and paste the URL below. Choose Up to Next Major Version from 1.0.0, then add the GatiFlow product to your app target.
https://github.com/dmsyudha/gatiflow-ios
React Native
npmnpm install @gatiflow/react-native # iOS only — link the native pod: cd ios && pod install
Flutter
pub.devflutter pub add gatiflow_flutter
Or add gatiflow_flutter: ^1.0.0 to your pubspec.yaml manually.
.NET MAUI
NuGetdotnet add package GatiFlow.Maui
Or in your .csproj: <PackageReference Include="GatiFlow.Maui" Version="1.*" />
Initialize at launch
~1 minCall start()as early as possible in your app's lifecycle so crashes during startup are still captured. One line per platform — copy, replace the token, done.
Android — in your Application class
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
GatiFlow.start(
app = this,
appToken = "mhub_YOUR_APP_TOKEN",
services = listOf(Crashes::class.java, Analytics::class.java),
)
}
}Don't forget to register your Application class in AndroidManifest.xml with android:name=".MyApp".
iOS — SwiftUI
Add your token as a String in Info.plist under the key GatiFlowAppToken, then:
import SwiftUI
import GatiFlow
@main
struct MyApp: App {
init() {
GatiFlow.shared.start() // reads GatiFlowAppToken from Info.plist
}
var body: some Scene { WindowGroup { ContentView() } }
}UIKit users: call the same GatiFlow.shared.start() from application(_:didFinishLaunchingWithOptions:).
React Native — top of App.tsx
import GatiFlow from "@gatiflow/react-native";
GatiFlow.start({
appToken: "mhub_YOUR_APP_TOKEN",
services: ["crashes", "analytics"],
});Flutter — in main()
import 'package:gatiflow_flutter/gatiflow_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await GatiFlow.start(
appToken: "mhub_YOUR_APP_TOKEN",
services: [GatiFlowService.crashes, GatiFlowService.analytics],
);
runApp(const MyApp());
}.NET MAUI — in MauiProgram.cs
using GatiFlow.Maui;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder()
.UseMauiApp<App>()
.UseGatiFlow("mhub_YOUR_APP_TOKEN");
return builder.Build();
}
}Track an event & a crash
~1 minNow prove the integration works. Fire a test event and a test crash.
Track an event
GatiFlow.analytics?.trackEvent("first_run", mapOf(
"platform" to "android",
"demo" to true,
))GatiFlow.shared.analytics?.trackEvent("first_run", properties: [
"platform": "ios",
"demo": true
])Trigger a test crash
// Don't ship this — just for verifying the dashboard end-to-end.
findViewById<Button>(R.id.crashBtn).setOnClickListener {
throw RuntimeException("Hello from GatiFlow!")
}Restart the app, then go back to the dashboard:Diagnostics for the crash,Analytics for the event. They should appear within seconds.