arcane_framework
Agnostic Reusable Component Architecture for New Ecosystems: a modern framework for bootstrapping new applications
What this package is like to depend on
Last release 11 days 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
10 releases in the last 12 months
see the full history below
Release timeline
40 releases · Sep 2024 to Aug 2026Releases
latest 40-
3.0.0-dev.113 Aug 2026 pre-releaseNothing published for this version
-
2.1.029 Jul 2026Release notes
Open source →Authentication Service
- [NEW] Added
AuthenticationStatus.unknownas the new default authentication state (replacesunauthenticatedas default). - [NEW] Added
AuthenticationStatus.isUnknowngetter to explicitly check for unknown state. - [CHANGE]
AuthenticationStatus.isUnauthenticatednow returnstruefor bothunauthenticatedandunknownstates (useisUnknownto distinguish). - [CHANGE]
ArcaneAuthenticationServicenow initializes withAuthenticationStatus.unknowninstead ofunauthenticated. - [CHANGE]
ArcaneAuthenticationService.reset()now resets status tounknown. - [CHANGE] Updated tests to reflect new default status behavior.
- [NEW] Added
-
2.0.619 Jun 2026Release notes
Open source →Arcane Framework
- [BREAKING] This package no longer exports the
ErrorandOksymbols from theresult_monadpackage.
Migration Steps (
Error/Ok)- Add the
result_monadpackage to yourpubspec.yamlfile. - Use the import
import 'package:result_monad/result_monad.dart';to accessErrorandOksymbols.
- [BREAKING] This package no longer exports the
-
2.0.503 Jun 2026Release notes
Open source →Arcane Framework
- [NEW] Added
Arcane.servicetyped lookup entrypoint for provider-aware service access:Arcane.service.ofType<T>(context)Arcane.service.requiredOfType<T>(context)
- [NEW] Added
-
2.0.401 Jun 2026Release notes
Open source →Logging Service
- [NEW] Added
LogInterceptorCallbacktypedef and updatedLogInterceptorcallback-based APIs to use the shared callback type alias.
- [NEW] Added
-
2.0.301 Jun 2026Release notes
Open source →Logging Service
- [CHANGE]
LogEventJSON serialization now delegates recursive nestedmetadata/extraencode-decode handling toarcane_helper_utilsJSON extensions (toJsonValue,toJsonMap,fromJsonValue,fromJsonMap). - [CHANGE] Refactored
LogInterceptorto an interface-style contract with a factory constructor for callback interceptors, so reusable class-based interceptors can be implemented without superclass callback plumbing.
- [CHANGE]
-
2.0.227 May 2026Release notes
Open source →Logging Service
- [BREAKING] Replaced the
@LoggingFeature(...)annotation (compile-time only, not readable at runtime in Flutter) with theLoggerNamemixin. MixLoggerNameinto aLoggingInterfacesubclass and overridenameto expose a runtime-accessible name insidelog().
Migration Steps (LoggingFeature)
- Replace any
@LoggingFeature("...")annotation withwith LoggerNameand 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"; } - [BREAKING] Replaced the
-
2.0.126 May 2026Release notes
Open source →Arcane Framework
- [NEW]
ArcaneAppnow owns and publishes a live service registry for provider-aware static lookups. - [CHANGE]
Arcane.features,Arcane.auth,Arcane.theme, andArcane.environmentnow prefer the liveArcaneAppregistry instance when available, then fall back to built-in singletons. - [BREAKING]
Arcaneis now a static utility surface (no instantiable singleton constructor). - [BREAKING] Several
package:arcane_framework/src/...import paths changed (for example,src/providers/...->src/service/...andsrc/services/reactive_theme/...->src/services/theme/...). Consumers importing fromsrcdirectly must update import paths. - [NEW] Added optional
ArcaneApp.buildercallback (TransitionBuilder style) for capturing provider-aware build contexts from withinArcaneApp. - [DEPRECATED]
ArcaneApp.childis now deprecated in favor ofArcaneApp.builder(legacy child usage remains supported during migration). - [DEPRECATED]
BuildContext.serviceOfType<T>()is now deprecated in favor ofBuildContext.service<T>().
Environment Service
- [NEW] Added
ArcaneEnvironmentServiceas a singletonArcaneServiceinstance. - [CHANGE] Changed
ArcaneEnvironmentis no longer aCubitand is now anInheritedWidget. - [NEW] Added
Arcane.environmentshortcut for direct environment access. - [NEW] Added environment service to
Arcane.servicesbuilt-in list. - [CHANGE]
ArcaneEnvironmentProvideris now aStatefulWidgetinstead of aStatelessWidgetwith aBlocProvider. - [NEW]
ArcaneEnvironmentProvidernow provides methods forenableDebugMode(),disableDebugMode()andsetEnvironment(). - [NEW] Added
environmentChangesstream for realtime environment updates.
Migration Steps (ArcaneEnvironment)
-
The
stategetter has been removed fromArcaneEnvironment. If you previously accessed environment state viaArcane.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 newInheritedWidget/ValueNotifier-based approach. See the README for updated usage examples.
Authentication Service
- [BREAKING]
ArcaneAuthInterface.logoutnow accepts optionalonLoggedOutcallback parameters.ArcaneAuthInterfaceimplementers must update logout signature to accept optionalonLoggedOut. See the migration steps for further details. - [NEW] Added
statusChangesstream to observeAuthenticationStatusupdates. - [NEW] Added
signedInChangesstream to observe sign-in state changes. - [FIX] Added stream lifecycle cleanup in
disposewith safe lazy recreation.
Migration Steps (ArcaneAuthInterface)
- Update
ArcaneAuthInterfaceimplementations to accept the new optionalonLoggedOutcallback parameter inlogout(...). - If your implementation performs cleanup side effects on logout, invoke
onLoggedOutwhen provided. - Run tests to confirm your authentication adapter still satisfies your login/logout flows.
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); }Feature Flag Service
- [CHANGE] Renamed service class
ArcaneFeatureFlagstoArcaneFeatureFlagService. - [NEW] Added backward compatibility typedef:
typedef ArcaneFeatureFlags = ArcaneFeatureFlagService. - [NEW] Added
enabledFeaturesChangesstream to observe enabled feature updates in realtime. - [FIX] Added stream lifecycle cleanup in
disposewith safe lazy recreation. - [NEW] Added
ArcaneFeatureFlagProvider(InheritedWidget) andArcaneFeatureFlagsProvider(StatefulWidget) for first-class feature-flag integration in the widget tree. - [DEPRECATED]
ArcaneFeatureFlagsScopehas been renamed toArcaneFeatureFlagProvider. - [NEW] Added
BuildContextconvenience accessors for feature flags, includingcontext.featureFlags,context.maybeFeatureFlags,context.isFeatureEnabled(...), andcontext.isFeatureDisabled(...). - [NEW]
ArcaneAppnow includesArcaneFeatureFlagsProviderby default, enabling rebuilds for widgets that depend onArcaneFeatureFlagProvider.of(context). - [UPDATE] README now documents
ArcaneFeatureFlagProviderandArcaneAppprovider composition.
Theme Service
- [CHANGE] Renamed
ArcaneReactiveThemetoArcaneThemeServicefor clearer naming. - [NEW] Added backward compatibility typedef:
typedef ArcaneReactiveTheme = ArcaneThemeService. - [FIX] Theme initialization now respects
ThemeMode.systemand initializesThemeDatausing the effective brightness. - [FIX]
ArcaneThemeSwitchernow initializes system-follow behavior once on first dependency resolution. - [FIX]
ArcaneThemeSwitchernow defaults tofollowSystemTheme(context)when mounted underArcaneApp, so system-follow is enabled by default and system brightness changes are handled framework-side (no app-level observer needed). - [FIX]
switchTheme()now toggles from the effective theme when current mode isThemeMode.system(system dark -> light, system light -> dark). - [CHANGE]
context.isDarkModenow reflects effective app theme brightness (Theme.of(context).brightness) instead of raw platform brightness. - [FIX]
followSystemTheme()now reads platform brightness directly to avoid coupling system-follow behavior to app theme overrides. - [NEW] Added assignment-style theme setters:
Arcane.theme.dark = ...andArcane.theme.light = ...(in addition tosetDarkTheme/setLightTheme). - [FIX] Reactive theme stream controllers now close only during service dispose, preventing stream shutdown when a single subscriber cancels.
- [FIX] Setting a theme (e.g., dark) while in the opposite mode (e.g., light) no longer changes the current brightness or rendered theme. Only the active mode's theme updates the rendered appearance.
- [NEW] Added
themeModeChangesandthemeDataChangesstreams for realtime theme updates.
Migration Steps (ArcaneThemeService)
- Replace legacy
ThemeModereads fromArcane.theme.systemTheme.valuewithArcane.theme.currentModeOf(context)when configuring appthemeMode.
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), )Arcane Logger
- [NEW] Added
logStreamfor realtime log subscriptions. - [NEW] Added explicit
disposecleanup for logger stream resources. - [NEW] Added optional lifecycle capability via
LoggingInitializableandLoggingInitialization. - [NEW] Added optional
featuretag support via@LoggingFeature(...)annotation. - [NEW] Added a
skipAutodetectionparameter toArcane.log(defaults tofalse) that, when enabled, skips detection of themodule,method, and file/line number where logs originated from. - [NEW] Added the
LogInterceptorclass which can (optionally) be added toArcaneLoggerto pre-process log messages before they are sent to the registeredArcaneLoggingInterface(s). - [NEW] Added collection-style interceptor APIs:
Arcane.logger.interceptors.add(...),Arcane.logger.interceptors.remove(...), andArcane.logger.interceptors.clear()with an optionalmatcherfor explicit type-scoped matching strategies, including subtype-inclusive matching. - [CHANGE] Updated
Arcane.logmetadata type fromMap<String, String>?toMap<String, Object?>?to support structured metadata values. - [CHANGE]
initializeInterfaces()now initializes only interfaces that implementLoggingInitializable; other interfaces are skipped. - [BREAKING]
LoggingInterfaceno longer includes built-in singleton-style initialization state.
Migration Steps (LoggingInterface)
- Remove
initializedandinitfrom interfaces that do not require startup work. - If an interface requires startup/lifecycle management, add
LoggingInitialization(or implementLoggingInitializable) and move setup logic intoinit(). - Update
log(...)implementations to guard behavior withinitializedonly for interfaces that opted into initialization. - Run tests to verify interface registration and logging behavior still match expectations.
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}) {} }- For SDK-backed loggers, opt into initialization with the mixin.
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. } }- If desired, adopt
featurefor destination-aware filtering in interceptors.
Migration Steps (Arcane.log metadata)
- Update
Arcane.log(...)call sites that stringify metadata values only to satisfy the previousMap<String, String>type. - Prefer passing native values (for example
int,bool,List, or nestedMap) directly inmetadatawhen useful. - If your logging destination expects only string metadata, convert
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, }, );Dependencies
- [CHANGE] Updated
result_monadfrom^2.3.2to^4.0.0. - [CHANGE] Removed direct
flutter_blocdependency. - [CHANGE] Updated
collectionfrom^1.18.0to^1.19.0.
- [NEW]
-
2.0.025 May 2026 withdrawn -
1.2.717 Sep 2025 -
1.2.622 Jul 2025 -
1.2.523 Jan 2025 -
1.2.416 Jan 2025 -
1.2.314 Jan 2025Release notes
Open source →- Added
ValueNotifiers to both theArcaneAuthenticationServiceandArcaneFeatureFlags. This enables the possibility of listening for changes to either service.
Example
// 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}"); }); - Added
-
1.2.216 Dec 2024Release notes
Open source →- Lowered minimum required collection dependency version to prevent forcing users into the latest Flutter release
-
1.2.116 Dec 2024Release notes
Open source →- Lowered minimum required SDK version to prevent forcing users into the latest Flutter release
-
1.2.012 Dec 2024Release notes
Open source →- Removed flutter_secure_storage dependency as it was unused
Breaking Changes
The following methods have been moved outside of the ArcaneAuthInterface base class:
- resendVerificationCode
- register
- confirmSignup
- resetPassword
These methods have been moved to mixin classes. To continue using them, please update your ArcaneAuthInterface implementations.
- To use
resendVerificationCode,registerandconfirmSignup, use the newArcaneAuthAccountRegistrationmixin. - To use
resetPassword, use the newArcaneAuthPasswordManagementmixin.
Migration
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.
-
1.1.711 Dec 2024Release notes
Open source →- Fixed an issue with the
ArcaneAuthenticationServicewhere an exception would be thrown when attempting to access an authentication token while noArcaneAuthInterfacewas registered.
- Fixed an issue with the
-
1.1.602 Dec 2024Release notes
Open source →- Updated logging feature to indicate the feature which was enabled or disabled within the log message, instead of only in the metadata.
-
1.1.504 Nov 2024 -
1.1.430 Oct 2024 -
1.1.325 Oct 2024Release notes
Open source →- Arcane Auth no longer throws exceptions when log out fails, instead returning
a
Result<void, String>. This behavior matches the login method.
- Arcane Auth no longer throws exceptions when log out fails, instead returning
a
-
1.1.218 Oct 2024Release notes
Open source →- Removed Flutter exception handling from
ArcaneLoggingService, as this functionality should be defined by a users' interface.
Migration
Add the following to your
ArcaneLoggingInterface'sinitmethod 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; }; - Removed Flutter exception handling from
-
1.1.111 Oct 2024Release notes
Open source →- [BREAKING] Updated ArcaneAuthInterface to make the
resendVerificationCode,confirmSignup, andresetPasswordmethods more versatile
Migration:
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}) - [BREAKING] Updated ArcaneAuthInterface to make the
-
1.1.1+111 Oct 2024 -
1.1.1+211 Oct 2024 -
1.1.010 Oct 2024Release notes
Open source →- [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}) -
1.0.804 Oct 2024 -
1.0.704 Oct 2024 -
1.0.625 Sep 2024 -
1.0.520 Sep 2024Release notes
Open source →- Added the ability to use a generic type for the login method in ArcaneAuthenticationService
- Added the ability to reset the ArcaneAuthenticationService, which will unregister the current interface and clear the authentication state
- Removed unused testing tooling (e.g.,
@visibleForTesting) from the codebase- Migration guide: Remove usages of
setMockedin your tests
- Migration guide: Remove usages of
-
1.0.5+120 Sep 2024Release notes
Open source →- Marked the
loginWithEmailAndPasswordmethod inArcaneAuthenticationServiceas deprecated and updated example project
- Marked the
-
1.0.5+220 Sep 2024 -
1.0.418 Sep 2024Release notes
Open source →- Resolved an issue with authentication using the ArcaneAuthenticationService when logging in with an email and password
-
1.0.317 Sep 2024Release notes
Open source →- Added the ability to switch back to the normal environment from the debug environment in ArcaneEnvironment
- (breaking) Made the optional
onLoggedOutcallback a Future instead of a void function in ArcaneAuthenticationService - Added additional error handling to the login method in ArcaneAuthenticationService
- Added support for following the system's theme in ArcaneTheme
- Removed the BuildContext parameter from the
switchThememethod in ArcaneTheme
-
1.0.3+118 Sep 2024 -
1.0.213 Sep 2024 -
1.0.112 Sep 2024Nothing published for this version
-
1.0.1+112 Sep 2024Release notes
Open source →- Removed ID and secure storage services to improve platform compatibility
-
1.0.011 Sep 2024 withdrawn