NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
A unified analytics abstraction for Dart/Flutter. Send events to multiple backends (Firebase, Mixpanel, etc.) through one API with a single LogEvent model.
Last release 2 months ago
05 Aug 2026
Release timing varies
gaps range from 2 weeks to 5 months
Nearly every release is documented
notes for 11 of 11 stable releases
Nothing withdrawn
no release was ever pulled
8 months old
11 releases · first in 2026
One column per month.
Release 0.5.0: port zeely-mobile fixes, drop session support, add CI
Port behavior fixes made in the zeely-mobile copies of these packages:
Remove session support (breaking): Session, HubSessionDelegate,
AnalyticsHub.sessionDelegate and AnalytycsProvider.setSession are gone;
apps manage user identity directly on the underlying SDKs. The
getAnonymousId parameters of the Mixpanel/Appsflyer providers are
removed with it.
Add GitHub Actions CI modeled on basalt_dart: analyze/format/test plus
publish dry-run on every push/PR, and tag-driven pub.dev publishing via
OIDC (-v tags).
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
dart testtest from the provider packageslints from mixpanel (inherited fromtest from the root package (no tests there).Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Fix the long-standing typo in the provider base class name across all
packages, docs, examples, and tests. No compatibility alias is kept —
the packages have no external consumers yet.
Also move resolution: workspace from pubspec_overrides.yaml into each
package's pubspec.yaml (the layout basalt_dart and zeely-mobile use, and
what dart test's workspace validation expects) and delete the
overrides files.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Ran pana (the tool pub.dev uses to compute package score) against all
four packages. analytics_hub itself scores a clean 160/160.
Found a real bug via the "compatible with dependency constraint lower
bounds" check: mixpanel_flutter's declared minimum (2.0.0) allows
versions up to 2.2.0 where Mixpanel.track() returns void instead of
Future. MixpanelEventResolver.resolve declares a Future
return type and returns the track() call directly, so pinning an old
2.x mixpanel_flutter breaks analysis (and would break at runtime for
anyone actually on that range). Raised the lower bound to >=2.3.0,
where track() became async. Verified dart analyze is clean and tests
pass with dependencies downgraded to their lower bounds.
The three provider packages can't get a full pana score yet since they
depend on analytics_hub, which isn't published to pub.dev — pana (like
pub.dev itself) resolves dependency_overrides are ignored for scoring,
so this is a publish-order concern rather than a code issue: publish
analytics_hub first, then the providers.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Covers badges + workspace banners on all READMEs, a "what's inside"
reference table in the core README, a packages/analytics_hub/doc/
folder with four deep-dive guides, and a root CONTRIBUTING.md —
scoped down from basalt_dart's equivalent docs to this repo's size.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Badges + "part of workspace" banners on every README (EN/UA), a
"what's inside" reference table in the core README, a
packages/analytics_hub/doc/ folder with four deep-dive guides
(getting started, providers, interceptors & context, testing), and a
root CONTRIBUTING.md — implements the design spec, which is removed
now that it's realized in the actual docs.
Skipped the MIT license badge from the original spec: the repo has no
LICENSE file, so that badge would have been false.
Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
SDK lifecycle belongs in the app — keep only flush for buffered backends.
Co-authored-by: Cursor cursoragent@cursor.com
Co-authored-by: Cursor cursoragent@cursor.com
Co-authored-by: Claude Fable 5 noreply@anthropic.com
Co-authored-by: Cursor cursoragent@cursor.com
ProviderIdentifier equality and hashCode now include the runtime type, so
identifiers of different subclasses with the same name no longer collide.
toString now prints the concrete subclass name.sendEvent logs at fine level and the internal
dispatch pipeline no longer logs each step.Session, HubSessionDelegate, the
AnalyticsHub.sessionDelegate parameter, and AnalyticsProvider.setSession
are gone. Manage user identity directly on the underlying SDKs.AnalyticsHub.initialize / AnalyticsProvider.initialize and
AnalyticsHub.dispose / AnalyticsProvider.dispose. SDK lifecycle belongs
in the app — pass already-initialized backend instances into provider
constructors; call flush before shutdown if a provider buffers events.AnalytycsProvider is now
AnalyticsProvider.Simplified provider-specific overrides API: EventProvider now exposes a direct overrides: EventOverrides? field instead of options: EventOptions?.
EventProvider now exposes a direct
overrides: EventOverrides? field instead of options: EventOptions?.EventOverridesApplier.apply now accepts EventOverrides? and no longer depends
on EventOptions.EventProvider(overrides: ...)
and the EventOverrides type directly.EventOptions type has been removed from the public API.EventProvider(options: EventOptions(overrides: ...))
must be updated to use EventProvider(overrides: EventOverrides(...)) instead.Added AnalyticsHub.flush() to allow explicit provider flush before app shutdown.
AnalyticsHub.flush() to allow explicit provider flush before app shutdown.AnalytycsProvider contract:
final List<EventInterceptor> interceptors);flush() lifecycle method.EventDispatchContextBuilder.AnalyticsHub, dispatcher, chain executor, overrides applier).flush coverage.interceptors.Relaxed ContextEntry inheritance restriction by changing it from abstract base class to abstract class.
ContextEntry inheritance restriction by changing it from abstract base class to abstract class.Refined interception context architecture by extracting ContextEntry and introducing shared Context contract (Context, ContextEntry, EventContext, Eve
ContextEntry and introducing shared Context contract (Context, ContextEntry, EventContext, EventDispatchContext).AnalyticsHub; dispatch context now combines event context and provider interceptor context.interceptorMetadata to interceptorContext.event context + provider context) and removed obsolete hub-context assertions.0.3.1.Universal event interception pipeline with both hub-level and provider-level interceptors.
EventContext / EventContextEntry (one entry per type, gql_exec-style).ResolvedEvent, EventDispatchContext, and InterceptorResult.interceptorMetadata) and provider-level metadata (interceptorMetadata) in dispatch context.LogEvent approach.List<EventProvider>.AnalyticsHub.sendEvent now applies EventProvider.options.overrides before dispatch.Event now exposes context so metadata is created at event declaration time.src/core/interception/*
components (EventDispatcher, context builder, chain executor, overrides applier).CustomLogEvent, CustomLogEventResolver, and CustomLogEventOptions.ECommerceEvent, all e-commerce event/data types, and ECommerceEventResolver.ProviderIdentifier, AnalytycsProvider, and EventProvider.Event is no longer generic and resolves only via LogEventResolver.AnalytycsProvider is no longer generic and now exposes LogEventResolver.ProviderIdentifier is no longer generic.EventResolver contract changed from resolveEvent(Event) to
resolve({required ResolvedEvent event, required EventDispatchContext context}).AnalytycsProvider now supports optional interceptors and interceptorMetadata.AnalyticsHub constructor now supports global interceptors and interceptorMetadata.Added nullable property value support in LogEvent.properties: Map ?.
LogEvent.properties:
Map<String, Object?>?.LogEventOverrides.properties:
Map<String, Object?>?.Updated README examples to the Event.providers / EventProvider API.
Event.providers / EventProvider API.ProviderKey/providerKeys naming in docs with ProviderIdentifier/providers.New provider-targeting model via EventProvider and EventOptions.
EventProvider<R, O> and EventOptions.LogEvent via LogEventOptions and LogEventOverrides.CustomLogEvent<T> and ECommerceEvent<T> through CustomLogEventOptions<T> and ECommerceEventOptions<T>.ProviderKey to ProviderIdentifier.AnalyticsHub now routes events via Event.providers and EventProvider.identifier.Event.providerKeys was removed. Implement Event.providers instead:
List<EventProvider<R, O>> get providers.ProviderKey<R> was renamed to ProviderIdentifier<R>.AnalytycsProvider constructor parameter and field were renamed from key to identifier.Event<R> now requires options type parameter: Event<R, O extends EventOptions>.LogEvent now extends Event<LogEventResolver, LogEventOptions>.CustomLogEvent<T> moved to custom_log_event.dart and now extends
Event<CustomLogEventResolver<T>, CustomLogEventOptions<T>>.ECommerceEvent now requires a payload type:
ECommerceEvent<T> extends Event<ECommerceEventResolver, ECommerceEventOptions<T>>.Public API documentation (public_member_api_docs) for all core types: AnalyticsHub, events, providers, session, and resolvers.
public_member_api_docs) for all core types: AnalyticsHub, events, providers, session, and resolvers.AddToCart, AddToWishlist, ViewCart, AddPaymentInfo, AddShippingInfo, BeginCheckout, Purchase, RemoveFromCart, SelectItem, ViewItem, ViewItemList, ViewPromotion, Refund, and ECommerceEventItem.Initial implementation of AnalyticsHub to fan-out events to multiple analytics providers.
AnalyticsHub to fan-out events to multiple analytics providers.Event, LogEvent, CustomLogEvent<T>, ECommerceEvent and SelectPromotionECommerceEvent.AnalytycsProvider<R>, ProviderKey<R>, HubSessionDelegate and Session for centralized session management.Your coding agent can read these notes before it upgrades. Set up the MCP server →