Infobits Flutter SDK

pub package Flutter Platform License: BSD-3-Clause

A privacy-focused, comprehensive analytics, logging, error tracking, and performance monitoring SDK for Flutter applications. Infobits provides powerful insights while respecting user privacy - no user identification, no session tracking, just actionable aggregate data.

Features

  • 📊 Privacy-Focused Analytics - Track events and conversions without user identification
  • 📝 Advanced Logging - Multi-level logging with local and remote storage
  • 🐛 Error Tracking - Comprehensive error capture with stack traces and breadcrumbs
  • ⚡ Performance Monitoring - Built-in benchmarking and performance tracking
  • 🔄 Offline Support - Queue events and logs for later transmission
  • 🎯 Crash Reporting - Automatic crash detection and reporting
  • 🏗️ Developer Friendly - Simple API, great documentation, and testing utilities

Quick Start

Installation

Add infobits to your pubspec.yaml:

flutter pub add infobits

Basic Setup

The simplest way to get started is using runWithInfobits:

import 'package:infobits/infobits.dart';

void main() {
  runWithInfobits(
    app: MyApp(),
    apiKey: 'your-api-key',     // Optional - for remote logging
    domain: 'your-app.com',      // Required with API key
    debug: true,                 // Enable debug mode
  );
}

Alternative Setup

For more control over initialization:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await Infobits.initialize(
    apiKey: 'your-api-key',        // Optional
    domain: 'your-app.com',
    analyticsEnabled: true,
    loggingEnabled: true,
    loggingOptions: LoggingOptions.development(),
  );
  
  runApp(MyApp());
}

Local-Only Mode

Infobits works perfectly without an API key for local development:

void main() {
  runWithInfobits(app: MyApp());
  // All logging will work locally in console
}

Usage

Analytics

Track custom events with properties:

// Track simple events
InfobitsAnalytics.instance.trackEvent('button_clicked');

// Track events with properties
InfobitsAnalytics.instance.trackEvent(
  'purchase_completed',
  properties: {
    'amount': 99.99,
    'currency': 'USD',
    'items': ['item1', 'item2'],
  },
);

// Track revenue
InfobitsAnalytics.instance.trackRevenue(
  99.99,
  currency: 'USD',
  properties: {
    'product': 'Premium Plan',
    'payment_method': 'credit_card',
  },
);

// Track conversions
InfobitsAnalytics.instance.trackConversion(
  'signup',
  properties: {
    'source': 'organic',
    'plan': 'free',
  },
);

Automatically track screen views:

MaterialApp(
  navigatorObservers: [
    InfobitsAnalyticsObserver(),
  ],
  // ...
);

Or manually track views:

InfobitsAnalytics.instance.startView('/home');
// ... when leaving the view
InfobitsAnalytics.instance.endView('/home');

Logging

Multiple log levels for different scenarios:

// Simple logging
Logger.debug('User clicked button');
Logger.info('Payment processed successfully');
Logger.warn('API rate limit approaching');
Logger.error('Failed to load user data');

// Logging with additional context
Logger.error(
  'Network request failed',
  exception: error,
  information: stackTrace.toString(),
);

// Structured logging with metadata
Logger.info(
  'Order processed',
  metadata: {
    'order_id': '12345',
    'amount': 99.99,
    'items_count': 3,
  },
);

Error Tracking

Errors are automatically captured when using runWithInfobits. You can also manually track errors:

try {
  // Your code
} catch (error, stackTrace) {
  Logger.error(
    'Operation failed',
    exception: error,
    information: stackTrace.toString(),
  );
}

Track user actions leading up to errors:

// Add breadcrumbs for debugging
Infobits.addBreadcrumb(
  'user_action',
  data: {'button': 'submit', 'form': 'signup'},
);

// Breadcrumbs are automatically included with errors

Performance Monitoring

Built-in benchmarking for performance tracking:

// Simple benchmark
final timer = Infobits.benchmark.start('api_call');
await makeApiCall();
timer.stop();

// Benchmark with async/await
final result = await Infobits.benchmark.run(
  'database_query',
  () async {
    return await database.query('SELECT * FROM users');
  },
);

// Nested benchmarks
final parentTimer = Infobits.benchmark.start('checkout_flow');
final paymentTimer = Infobits.benchmark.start('payment_processing');
await processPayment();
paymentTimer.stop();
final shippingTimer = Infobits.benchmark.start('shipping_calculation');
await calculateShipping();
shippingTimer.stop();
parentTimer.stop();

Configuration

Logging Options

Customize logging behavior:

// Development configuration
LoggingOptions.development(
  printToConsole: true,
  prettyPrint: true,
  includeStackTrace: true,
);

// Production configuration
LoggingOptions.production(
  printToConsole: false,
  minLevel: LogLevel.warning,
);

// Custom configuration
LoggingOptions(
  filter: MyCustomFilter(),
  printer: MyCustomPrinter(),
  output: MultiOutput([
    ConsoleOutput(),
    FileOutput('app.log'),
  ]),
);

Global Properties

Set properties that are included with all events:

InfobitsAnalytics.instance.setGlobalProperties({
  'app_version': '1.2.3',
  'environment': 'production',
  'platform': Platform.operatingSystem,
});

Testing

Infobits provides testing utilities for unit tests:

import 'package:infobits/testing.dart';

void main() {
  test('tracks events correctly', () {
    // Use mock implementation
    final mockAnalytics = MockInfobitsAnalytics();
    
    // Your test code
    myFunction();
    
    // Verify events were tracked
    expect(mockAnalytics.trackedEvents, contains('button_clicked'));
  });
}

Privacy & Compliance

Infobits is designed with privacy in mind:

  • ✅ No user identification or tracking
  • ✅ No session tracking
  • ✅ No personal data collection
  • ✅ GDPR compliant by design
  • ✅ No third-party data sharing
  • ✅ All data is aggregated and anonymous

Platform Support

Platform Supported Notes
Android ✅ Full support
iOS ✅ Full support
Web ✅ Full support
macOS ✅ Full support
Windows ✅ Full support
Linux ✅ Full support

Examples

Check out the example directory for a complete sample application demonstrating all features.

API Reference

For detailed API documentation, visit pub.dev/documentation/infobits.

Migration Guide

From Google Analytics

// Before (Google Analytics)
await FirebaseAnalytics.instance.logEvent(
  name: 'purchase',
  parameters: {'value': 99.99},
);

// After (Infobits)
InfobitsAnalytics.instance.trackEvent(
  'purchase',
  properties: {'value': 99.99},
);

From Sentry

// Before (Sentry)
await Sentry.captureException(error, stackTrace: stackTrace);

// After (Infobits)
Logger.error('Error occurred', exception: error, information: stackTrace.toString());

Troubleshooting

Events not appearing?

  • Check if analytics is enabled: Infobits.canTrack
  • Verify API key and domain are correct
  • Check debug logs for any errors

Logs not showing?

  • Verify logging is enabled: Infobits.canLog
  • Check log level settings in LoggingOptions
  • Ensure console output is enabled in development

Contributing

We welcome contributions! Please see our Contributing Guide for details.

Support

License

This project is licensed under the BSD 3-Clause License - see the LICENSE file for details.

Acknowledgments

Built with ❤️ by the Infobits team for the Flutter community.

Libraries

infobits
testing
Testing utilities for Infobits