NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
Agnostic Reusable Component Architecture for New Ecosystems: a modern framework for bootstrapping new applications
Last release 1 months ago
13 Aug 2026
Ships unpredictably
gaps range from 8 days to 8 months
Nearly every release is documented
notes for 36 of 37 stable releases
2 versions withdrawn
withdrawn after publishing
2 years old
40 releases · first in 2024
One column per month.
Nothing published for this version
[NEW] Added AuthenticationStatus.unknown as the new default authentication state (replaces unauthenticated as default).
AuthenticationStatus.unknown as the new default authentication state (replaces unauthenticated as default).AuthenticationStatus.isUnknown getter to explicitly check for unknown state.AuthenticationStatus.isUnauthenticated now returns true for both unauthenticated and unknown states (use isUnknown to distinguish).ArcaneAuthenticationService now initializes with AuthenticationStatus.unknown instead of unauthenticated.ArcaneAuthenticationService.reset() now resets status to unknown.[BREAKING] This package no longer exports the Error and Ok symbols from the result_monad package.
Error and Ok symbols from
the result_monad package.Error/Ok)result_monad package to your pubspec.yaml file.import 'package:result_monad/result_monad.dart'; to access
Error and Ok symbols.[NEW] Added Arcane.service typed lookup entrypoint for provider-aware service access:
Arcane.service typed lookup entrypoint for provider-aware
service access:
Arcane.service.ofType<T>(context)Arcane.service.requiredOfType<T>(context)[NEW] Added LogInterceptorCallback typedef and updated LogInterceptor callback-based APIs to use the shared callback type alias.
LogInterceptorCallback typedef and updated LogInterceptor
callback-based APIs to use the shared callback type alias.[CHANGE] LogEvent JSON serialization now delegates recursive nested metadata / extra encode-decode handling to arcane_helper_utils JSON extensions (to
LogEvent JSON serialization now delegates recursive nested
metadata / extra encode-decode handling to arcane_helper_utils JSON
extensions (toJsonValue, toJsonMap, fromJsonValue, fromJsonMap).LogInterceptor to an interface-style contract with a
factory constructor for callback interceptors, so reusable class-based
interceptors can be implemented without superclass callback plumbing.[BREAKING] Replaced the @LoggingFeature(...) annotation (compile-time only, not readable at runtime in Flutter) with the LoggerName mixin. Mix LoggerN
@LoggingFeature(...) annotation (compile-time only,
not readable at runtime in Flutter) with the LoggerName mixin.
Mix LoggerName into a LoggingInterface subclass and override
name to expose a runtime-accessible name inside log().@LoggingFeature("...") annotation with with LoggerName and
add an @override String get name => '...'; getter to the class body.Before:
@LoggingFeature("my-feature")
class MyLogger extends LoggingInterface {...}
After:
class MyLogger extends LoggingInterface with LoggerName {
@override
String get name => "my-feature";
}
[DEPRECATED] ArcaneApp.child is now deprecated in favor of ArcaneApp.builder (legacy child usage remains supported during migration).
ArcaneApp now owns and publishes a live service registry for
provider-aware static lookups.Arcane.features, Arcane.auth, Arcane.theme, and
Arcane.environment now prefer the live ArcaneApp registry instance when
available, then fall back to built-in singletons.Arcane is now a static utility surface (no instantiable
singleton constructor).package:arcane_framework/src/... import paths changed
(for example, src/providers/... -> src/service/... and
src/services/reactive_theme/... -> src/services/theme/...). Consumers
importing from src directly must update import paths.ArcaneApp.builder callback (TransitionBuilder style)
for capturing provider-aware build contexts from within ArcaneApp.ArcaneApp.child is now deprecated in favor of
ArcaneApp.builder (legacy child usage remains supported during migration).BuildContext.serviceOfType<T>() is now deprecated in favor of
BuildContext.service<T>().ArcaneEnvironmentService as a singleton ArcaneService instance.ArcaneEnvironment is no longer a Cubit and is now an
InheritedWidget.Arcane.environment shortcut for direct environment access.Arcane.services built-in list.ArcaneEnvironmentProvider is now a StatefulWidget instead of a
StatelessWidget with a BlocProvider.ArcaneEnvironmentProvider now provides methods for
enableDebugMode(), disableDebugMode() and setEnvironment().environmentChanges stream for realtime environment updates.The state getter has been removed from ArcaneEnvironment. If you previously accessed environment state via Arcane.environment.state, update your code to use the new API:
Before:
final env = Arcane.environment.state;
After:
final env = Arcane.environment.current;
If you were using Cubit-style APIs, migrate to the new InheritedWidget/ValueNotifier-based approach. See the README for updated usage examples.
ArcaneAuthInterface.logout now accepts optional
onLoggedOut callback parameters. ArcaneAuthInterface implementers must
update logout signature to accept optional onLoggedOut. See the migration
steps for further details.statusChanges stream to observe AuthenticationStatus updates.signedInChanges stream to observe sign-in state changes.dispose with safe lazy recreation.ArcaneAuthInterface implementations to accept the new optional
onLoggedOut callback parameter in logout(...).onLoggedOut when provided.Before:
@override
Future<Result<void, String>> logout() async {
// ...
return Result.ok(null);
}
After:
@override
Future<Result<void, String>> logout({
Future<void> Function()? onLoggedOut,
}) async {
// ...
if (onLoggedOut != null) await onLoggedOut();
return Result.ok(null);
}
ArcaneFeatureFlags to
ArcaneFeatureFlagService.typedef ArcaneFeatureFlags = ArcaneFeatureFlagService.enabledFeaturesChanges stream to observe enabled feature
updates in realtime.dispose with safe lazy recreation.ArcaneFeatureFlagProvider (InheritedWidget) and
ArcaneFeatureFlagsProvider (StatefulWidget) for first-class feature-flag
integration in the widget tree.ArcaneFeatureFlagsScope has been renamed to
ArcaneFeatureFlagProvider.BuildContext convenience accessors for feature flags, including
context.featureFlags, context.maybeFeatureFlags,
context.isFeatureEnabled(...), and context.isFeatureDisabled(...).ArcaneApp now includes ArcaneFeatureFlagsProvider by default,
enabling rebuilds for widgets that depend on
ArcaneFeatureFlagProvider.of(context).ArcaneFeatureFlagProvider and ArcaneApp
provider composition.ArcaneReactiveTheme to ArcaneThemeService for clearer
naming.typedef ArcaneReactiveTheme = ArcaneThemeService.ThemeMode.system and initializes
ThemeData using the effective brightness.ArcaneThemeSwitcher now initializes system-follow behavior once on
first dependency resolution.ArcaneThemeSwitcher now defaults to followSystemTheme(context) when
mounted under ArcaneApp, so system-follow is enabled by default and system
brightness changes are handled framework-side (no app-level observer needed).switchTheme() now toggles from the effective theme when current mode
is ThemeMode.system (system dark -> light, system light -> dark).context.isDarkMode now reflects effective app theme brightness
(Theme.of(context).brightness) instead of raw platform brightness.followSystemTheme() now reads platform brightness directly to avoid
coupling system-follow behavior to app theme overrides.Arcane.theme.dark = ... and
Arcane.theme.light = ... (in addition to setDarkTheme /
setLightTheme).themeModeChanges and themeDataChanges streams for realtime
theme updates.ThemeMode reads from Arcane.theme.systemTheme.value with
Arcane.theme.currentModeOf(context) when configuring app themeMode.Before:
MaterialApp(
theme: Arcane.theme.light,
darkTheme: Arcane.theme.dark,
themeMode: Arcane.theme.systemTheme.value,
)
After:
MaterialApp(
theme: Arcane.theme.light,
darkTheme: Arcane.theme.dark,
themeMode: Arcane.theme.currentModeOf(context),
)
logStream for realtime log subscriptions.dispose cleanup for logger stream resources.LoggingInitializable and
LoggingInitialization.feature tag support via @LoggingFeature(...)
annotation.skipAutodetection parameter to Arcane.log (defaults to
false) that, when enabled, skips detection of the module, method, and
file/line number where logs originated from.LogInterceptor class which can (optionally) be added to
ArcaneLogger to pre-process log messages before they are sent to the
registered ArcaneLoggingInterface(s).Arcane.logger.interceptors.add(...),
Arcane.logger.interceptors.remove(...), and
Arcane.logger.interceptors.clear() with an optional matcher for
explicit type-scoped matching strategies, including subtype-inclusive
matching.Arcane.log metadata type from Map<String, String>? to
Map<String, Object?>? to support structured metadata values.initializeInterfaces() now initializes only interfaces that
implement LoggingInitializable; other interfaces are skipped.LoggingInterface no longer includes built-in singleton-style
initialization state.initialized and init from interfaces that do not require startup
work.LoggingInitialization (or implement LoggingInitializable) and move
setup logic into init().log(...) implementations to guard behavior with initialized only
for interfaces that opted into initialization.Before:
class DebugConsole implements LoggingInterface {
@override
bool get initialized => true;
@override
Future<LoggingInterface?> init() async => this;
@override
void log(String message, {Map<String, Object?>? metadata, Level? level}) {}
}
After:
class DebugConsole extends LoggingInterface {
@override
void log(String message, {Map<String, Object?>? metadata, Level? level}) {}
}
class ExternalLogger extends LoggingInterface with LoggingInitialization {
@override
Future<void> init() async {
if (initialized) return;
// Start SDK.
await super.init();
}
@override
void log(String message, {Map<String, Object?>? metadata, Level? level}) {
if (!initialized) return;
// Send to SDK.
}
}
feature for destination-aware filtering in interceptors.Arcane.log(...) call sites that stringify metadata values only to
satisfy the previous Map<String, String> type.int, bool, List, or nested
Map) directly in metadata when useful.Object? values to strings at your logging boundary.Before:
Arcane.log(
"Login attempt",
metadata: {
"attempt": attempt.toString(),
"rememberMe": rememberMe.toString(),
},
);
After:
Arcane.log(
"Login attempt",
metadata: {
"attempt": attempt,
"rememberMe": rememberMe,
},
);
result_monad from ^2.3.2 to ^4.0.0.flutter_bloc dependency.collection from ^1.18.0 to ^1.19.0.- Version redacted. Use v2.0.1.
- Updated dependencies to latest
- Updated dependencies to latest
Improved automatic metadata detection in ArcaneLogger
ArcaneLogger- Update package dependencies
Added ValueNotifiers to both the ArcaneAuthenticationService and ArcaneFeatureFlags. This enables the possibility of listening for changes to either s
ValueNotifiers to both the ArcaneAuthenticationService and
ArcaneFeatureFlags. This enables the possibility of listening for changes to
either service.// Listen to changes in the authentication status
Arcane.auth.isSignedIn.addListener(() {
if (Arcane.auth.isSignedIn.value) {
Arcane.log("User is signed in");
} else {
Arcane.log("User is signed out");
}
});
// Listen to changes in the enabled/disabled features
Arcane.features.notifier.addListener(() {
Arcane.log("Enabled features have been updated: ${Arcane.features.notifier.value}");
});
Lowered minimum required collection dependency version to prevent forcing users into the latest Flutter release
Lowered minimum required SDK version to prevent forcing users into the latest Flutter release
Removed flutter_secure_storage dependency as it was unused
The following methods have been moved outside of the ArcaneAuthInterface base class:
These methods have been moved to mixin classes. To continue using them, please update your ArcaneAuthInterface implementations.
resendVerificationCode, register and confirmSignup, use the new
ArcaneAuthAccountRegistration mixin.resetPassword, use the new ArcaneAuthPasswordManagement mixin.In order to migrate your existing interfaces, update them from:
class MyAuthInterface implements ArcaneAuthInterface {}
to:
class MyAuthInterface
with ArcaneAuthAccountRegistration, ArcaneAuthPasswordManagement
implements ArcaneAuthInterface {}
If the methods that these mixins provide are not being used, the mixins can safely be omitted. If only one of these mixins is required, the other can be safely omitted.
This change should result in fewer lines of code for interface implementations that do not require these additional features.
Fixed an issue with the ArcaneAuthenticationService where an exception would be thrown when attempting to access an authentication token while no Arca
ArcaneAuthenticationService where an exception would
be thrown when attempting to access an authentication token while no
ArcaneAuthInterface was registered.Updated logging feature to indicate the feature which was enabled or disabled within the log message, instead of only in the metadata.
Update package dependencies. No code changes.
Update package dependencies. No code changes.
Arcane Auth no longer throws exceptions when log out fails, instead returning a Result . This behavior matches the login method.
Result<void, String>. This behavior matches the login method.Removed Flutter exception handling from ArcaneLoggingService, as this functionality should be defined by a users' interface.
ArcaneLoggingService, as this
functionality should be defined by a users' interface.Add the following to your ArcaneLoggingInterface's init method to replicate
the previous behavior:
// Handles unhandled Flutter errors by logging them.
FlutterError.onError = (errorDetails) {
Arcane.log(
errorDetails.exceptionAsString(),
level: Level.error,
module: errorDetails.library,
stackTrace: errorDetails.stack,
);
};
// Handles unhandled platform-specific errors by logging them.
PlatformDispatcher.instance.onError = (error, stack) {
Arcane.log(
"$error",
level: Level.error,
stackTrace: stack,
);
return false;
};
[BREAKING] Updated ArcaneAuthInterface to make the resendVerificationCode, confirmSignup, and resetPassword methods more versatile
resendVerificationCode,
confirmSignup, and resetPassword methods more versatileMigration:
| Class | Migration path |
|---|---|
| ArcaneAuthInterface | resendVerificationCode(String email) -> resendVerificationCode<T>({T? input}) |
| ArcaneAuthInterface | confirmSignup({String email, String password}) -> confirmSignup({String? email, String? password}) |
| ArcaneAuthInterface | resetPassword({String email, String? newPassword, String? code}) -> resetPassword({String? email, String? newPassword, String? code}) |
- Updated example in README
- Updated example in README
[BREAKING] Updated the authentication service and interface to be more versatile
Migration:
| Class | Migration path |
|---|---|
| ArcaneAuthInterface | loginWtihEmailAndPassword({String email, String password}) -> login<T>({T? input}) |
| ArcaneAuthInterface | signup({String email, String password}) -> register<T>({T? input}) |
Added the extra parameter to the Arcane.log shortcut method
extra parameter to the Arcane.log shortcut methodAdded the extra parameter to the LoggingInterface
extra parameter to the LoggingInterface- Removed get_it as a dependency
Added the ability to use a generic type for the login method in ArcaneAuthenticationService
@visibleForTesting) from the codebase
setMocked in your testsMarked the loginWithEmailAndPassword method in ArcaneAuthenticationService as deprecated and updated example project
loginWithEmailAndPassword method in ArcaneAuthenticationService
as deprecated and updated example projectUpdated README and example project documentation
Resolved an issue with authentication using the ArcaneAuthenticationService when logging in with an email and password
Added the ability to switch back to the normal environment from the debug environment in ArcaneEnvironment
onLoggedOut callback a Future instead of a void
function in ArcaneAuthenticationServiceswitchTheme method in
ArcaneTheme- Added example project
Migrated ArcaneAuthenticationService's isSignedIn to a ValueListenable
Nothing published for this version
Removed ID and secure storage services to improve platform compatibility
- Initial release
Your coding agent can read these notes before it upgrades. Set up the MCP server →