The FlogFlow mascot
Get started
Installation and usage guide — 5 minutes, copy and paste flog_flow ^0.5.0 · pub.dev
Step 0 / Common to every path

Install and get your token

1

Install the package

It's published on pub.dev/packages/flog_flow. It works on Android, iOS, macOS, Windows, and Linux.

flutter pub add flog_flow
2

Create your account and your project

Sign in with Google (10 seconds, no card), press Create project and copy the flw_… token shown under its name. That token identifies your app: it's the only thing you need to paste into your code.

Just want to try it out? Jump straight to local mode: it needs no account and no token.
Path A / Logs — recommended to start

Logs in 1 init + 1 line per log

No session recording, minimal weight. Initialize once and log from anywhere in your code.

1

Initialize in your main()

import 'package:flog_flow/flog_flow.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await FlogLogs.init(
    projectToken: 'flw_YOUR_TOKEN_HERE',
    service: 'my-app',
    env: 'prod',
    version: '1.0.0',
    captureCrashes: true,  // automatic emergency on every crash
  );

  runApp(const MyApp());
}
2

Log wherever you need to

// logname identifies the module emitting the log (auth, payments, http…)
FlogLogs.info('session started', logname: 'auth',
    attributes: {'userId': 'u_123'});

FlogLogs.warn('token about to expire', logname: 'auth');

FlogLogs.error('payment declined', logname: 'payments',
    error: e, stackTrace: st,
    screenshot: true,   // attaches a screenshot (optional)
    attributes: {'orderId': 'o_9', 'amount': 25.5});
That's it. Logs are sent in batches (every 10 s or 50 logs), they flush when the app goes to the background and, if there was no network, they're re-sent on the next launch. Crashes emit emergency with a stack trace immediately.
Using screenshot: true? The screenshot needs your app wrapped in FlogFlogScope (the 2 lines from path B, step 1): MaterialApp(builder: (context, child) => FlogFlogScope(child: child!)). Without the scope, the log arrives with no image and the SDK warns you in the console.
3

See them in the dashboard

Go to your project → the Logs tab: filters by level and logname, full-text search, stack traces, attributes, screenshots, and volume per hour. Tip: set global attributes after login with FlogLogs.setGlobalAttribute('userId', id).

Dashboard Logs tab: levels, logname, version and message for each log
Path B / Session Replay

Record the whole journey

Screens, numbered taps, navigation, and errors — uploaded automatically and replayable in the viewer straight from the dashboard.

1

Wrap your app (2 lines)

MaterialApp(
  // observes navigation between screens
  navigatorObservers: [FlogFlow.instance.navigatorObserver],
  // captures taps + screenshots
  builder: (context, child) => FlogFlogScope(child: child!),
  home: const HomePage(),
);
With go_router: pass the observer in GoRouter(observers: [...]). With GetX: GetMaterialApp forwards navigatorObservers just the same.
2

Start with your token

await FlogCloud.start(
  projectToken: 'flw_YOUR_TOKEN_HERE',
  encryptionPassphrase: 'PROJECT-PASSPHRASE', // everything travels encrypted
  appName: 'MyApp',
  appVersion: '1.0.0',
);
A single call wires everything up: recording, re-sending pending sessions, and automatic upload when going to background, on close, or on a crash. Use the same passphrase you set when creating the project so the dashboard can replay sessions with one click.
3

Replay the sessions

Dashboard → Sessions tab → View flow button: wireflow of the journey, step-by-step replay with a timeline, and every error with its stack trace and screenshot. Nothing to download.

Session viewer: journey map with screens, numbered taps and navigation
Path C / Local mode — free, no account

Try it without signing up

Record on your device, export an encrypted .flowx file, and open it in the web viewer. Ideal for getting to know the library before creating an account.

1

Record and export

// same MaterialApp wiring as in Replay (observer + scope)

await FlogFlow.instance.start(
  appName: 'MyApp',
  config: const CaptureConfig(encryptionPassphrase: 'MY-PASSPHRASE'),
);

// ...use your app as usual...

final file = await FlogFlow.instance.export(); // → .flowx file
await FlogFlow.instance.stop();
2

Open it in the viewer

Open the web viewer, drop in your .flowx and enter your passphrase. You can also look at a sample session without recording anything.

Web viewer: drop your .flowx file, type your passphrase and replay the session
Extra / Best practices

Quick tips

Mask sensitive data

Wrap cards, passwords, or PII with RedactedZone(child: …): they're blacked out in captures without changing your UI.

Don't compile the passphrase into the binary

In production, fetch the encryptionPassphrase from your backend or remote config instead of leaving it in the code.

Replay only when there was an error

With recordOnErrorOnly: true you record everything but only keep the session if an error occurred. Perfect for leaving it always on.

Your own server

Self-hosting? Pass endpoint: 'https://your-server.com' to FlogCloud.start / FlogLogs.init. From the Android emulator, your localhost is http://10.0.2.2:8787.

Identify the user

After login: FlogLogs.setGlobalAttribute('userId', id) and/or userId: in start(). Careful with PII.

Capture the network

If you use Dio: dio.interceptors.add(FlogDioInterceptor()) and captureNetwork: true. By default it stores neither headers nor bodies.

Create my account and token → View on pub.dev Questions? The full API and CaptureConfig reference lives in the package README.