sint 1.6.2
sint: ^1.6.2 copied to clipboard
SINT (State, Injection, Navigation, Translation) - The Four Pillars of High-Fidelity Flutter Infrastructure.
Changelog - sint #
1.6.2 - 2026-09-05 #
Correctness and lifecycle #
- Mutation-safe synchronous listener dispatch with per-registration disposers, immediate removal, deferred additions and exception-safe nested notification bookkeeping. No listener-list copy per notification.
- Restore the async stream bridge after the last subscriber cancels; close Rx streams idempotently and cancel all upstream
bindStreamsubscriptions when the Rx closes. SintListeneruses the latest callback and compares sources by identity, not wrapped-value equality.- Snapshot lazy/self-referencing iterables before
assignAllmutation; unchanged lists stay silent and changed Rx maps publish once. - Make the type-keyed DI registry authoritative; reject ambiguous legacy string keys instead of resolving the wrong type/tag. Capture route ownership by registration generation to protect replacements and revived fenix instances.
- Initialize lazy registrations through
putOrFind, and harden replacement, reload and lifecycle reentrancy. - Preserve exact types through the complete
toInitial(keep:)route/widget teardown without making them permanent. AlignBind.replace/lazyReplace, close local bindings, and preventonReadyafteronClose. - Dispose M route-owned dependencies with O(M) registry work, excluding user lifecycle callbacks; continue cleanup if one callback throws, then propagate its error.
- Register nested route descendants once, remove the correct qualified branch, and share route-template tokenization between matching and URL generation. Handle optional/dotted parameters, custom captures, escaping and separate query/path data.
- Invalidate the route index for all mutations through the exposed route list, including same-length replacements and reorderings.
Compatibility notes #
- Correct the supported SDK floor to Flutter >=3.32.0 / Dart >=3.8.0. The former 3.22/3.4 declaration conflicted with APIs and development dependencies already in use.
RouteParsernow snapshots its initial input list. Mutateparser.routes,registeredRoutes, or use add/remove methods afterward; mutating the original list alias is no longer observed.registeredKeysretains unambiguous traditional strings and returns opaque handles for collisions. Ambiguous legacydelete(key:),reload(key:)andmarkAsDirty(key:)calls throwStateError. Prefer typed APIs or handles returned byregisteredKeys; do not parse type-name prefixes.
Measurement and tests #
- Add adversarial regression tests and actual widget rebuild/cleanup counts; replace the duplicated "targeted rebuild" timing demo.
- Add validated workload outcomes, time-based warmup/calibration, ordered raw batch samples, dispersion and machine/SDK/harness metadata. Batch-average statistics are explicitly not individual-operation p95 latency.
- Cover shared-prefix navigation, real lazy DI chains, complete lifecycle, changed/unchanged collections, synchronous dispatch and asynchronous delivery separately.
- Separate correctness/coverage jobs from serial performance artifact generation. Provide explicit-budget comparison and a macOS profile/release frame-measurement app.
Corrections to historical performance claims #
The tables below are preserved as historical reports, not validated current performance guarantees. The old "Depth: 10" test performed a hot flat tagged lookup; its seven-sample "p95" summarized batch means, not per-operation tail latency. The 1.6.1 direct map deletion still left quadratic route-list cleanup. First-segment indexing does not make matching independent of route count for shared-prefix tables. The former BLoC speed multiplier had no equivalent runnable comparison and has been removed from the README. Native JIT measurements also do not establish release, browser or Wasm performance.
1.6.1 - 2026-09-02 #
Optimization — O(1) Route-Dispose Dependency Injection (Pillar I) #
- Stored reified
Type registeredTypein_InstanceBuilderFactory<S>to resolvetargetTypeindelete<S>(). - Enables direct O(1) removal from
_typeSingleven when invoked viaRouterReportManager.instance.reportRouteDispose()without generic type parameters (S == dynamic). - Eradicates the O(N×M) brute-force fallback loop over the entire dependency injection tree upon route exit.
Reactive Fixes & Collection Hardening (Pillar S) #
RxList.assign&RxList.assignAll: Now conditionally verify existing elements and length before refreshing, preventing unconditional UI rebuild cascades when the incoming collection is identical.ListExtension.assign&assignAll: Fixed standardList<E>behavior to properly clear the collection before adding new items instead of erroneously appending.RxSetConditional Refresh: Hardenedclear(),removeAll(),retainAll(), andretainWhere()to only invokerefresh()when the set contents actually change.
Maintenance & Hygiene #
- Renamed Engine Builder: Added
lib/state_manager/src/engine/sint_builder.dart.get_builder.dartis preserved and re-exports it with a deprecation notice for seamless backwards compatibility. - Filename Typo Fix: Added
lib/state_manager/src/ui/obx_reactive_element.dartwith correct spelling.obx_reacive_element.dartis preserved and re-exports it with a deprecation notice.
Benchmark Comparison (1.6.0 vs 1.6.1) #
Microbenchmarks (median µs/op, Dart VM JIT, 7 rounds × 1k/20k ops):
| Benchmark | 1.6.0 | 1.6.1 | Δ vs 1.6.0 |
|---|---|---|---|
Sint.find<T>(tag) (20k lookups) |
0.0683 | 0.0583 | −14.6% faster |
Deep Lookup Sint.find (Depth: 10) |
0.1890 | 0.1556 | −17.7% faster |
| Reactive High-Load Audit (30k ops) | 5.6879 | 4.8578 | −14.6% throughput |
| Fan-Out (100 listeners) | 0.9177 | 0.9020 | −1.7% latency |
Route Dispose Cleanup (delete(key)) |
O(N×M) scan | O(1) direct | Eliminated scan overhead |
1.6.0 - 2026-08-31 #
Feature 1 — Type-Keyed Injection Registry (Pillar I — O5a) #
- Replaced string-concatenated instance registry (
"${S.toString()}$tag") with a two-tiered Type-indexed registryMap<Type, Map<String?, _InstanceBuilderFactory>>. - Delivers O(1) type-identity lookup for
Sint.find<T>(), eliminating string allocations in hot dependency paths. - Completely eliminates risk of minification name collisions in web release builds (
dart2js/ WASM). - Full backwards compatibility with
RouterReportManagerroute-lifecycle disposal.
Dependency Lookup Benchmarks (median µs/op, Dart VM JIT, 7 rounds × 1k/20k ops):
| Benchmark | 1.5.0 / 1.5.1 | 1.6.0 | Δ |
|---|---|---|---|
Sint.find<T>(tag) (20k lookups) |
0.6777 | 0.0683 | −89.9% (~10× speedup) |
Deep Lookup Sint.find (Depth: 10) |
0.9162 | 0.1890 | −79.4% (~5× speedup) |
SintController.update() (p95 latency) |
0.3356 | 0.0636 | −81.0% (~5.3× consistency) |
| Reactive High-Load Audit (30k ops) | 5.7302 | 5.6879 | Optimized throughput |
Feature 2 — Reactive Performance & Collection Conditional Refresh (Pillar S) #
RxList:[]=,remove,removeWhere,retainWhere,clear, andlength=now only triggerrefresh()when the list contents or length actually change.RxMap:[]=,remove, andclearnow verify existing keys and values before triggering notifications.ObxStale Dependency Cleanup:ObxReactiveElement.build()now disposes prior frame subscriptions before recording active observables, eliminating phantom rebuilds on conditional UI branches.
Feature 3 — Synapse Hardening & Error Handling #
Notifier.append: Wrapped intry ... finallyto guarantee global synapse state cleanup even when widget builders throw exceptions.ObxError: Formalized as a subclass of Dart'sError.SintListener:didUpdateWidgetnow respects dynamically changed callback references.
1.5.1 - 2026-08-31 #
Refactor & Ecosystem Alignment #
- Log Message Alignment: Updated router logs from
GetDelegate is created !andGetInformationParser is created !toSintDelegate is created !andSintInformationParser is created !. - Navigation Typedefs & Builders: Replaced internal
GetPageBuilderwithSintPageBuilder(GetPageBuilderretained as@Deprecatedalias for backwards compatibility). - Route Data & Observer: Replaced
isGetPageRoutewithisSintPageRoute(isGetPageRoutepreserved as deprecated getter). - Internal Widget & Error Cleanup: Renamed private
_GetModalBottomSheetto_SintModalBottomSheet, updated exception and error messages inSintSnackBarandSintTickerProviderStateMixinto remove legacy Get references.
1.5.0 - 2026-07-23 #
Navigation overhaul (Pillar N). All changes are additive and backwards
compatible: existing route tables, Sint.toNamed('/path'), /:param
routes, SintPage and middleware keep working identically.
Feature 1 — Segment route index (O(k) matching) #
RouteParser no longer scans the whole flat route list with a regex per
route for every cumulative path (O(segments × routes)). Routes are now
bucketed by their first segment type with the precedence
literal > param with pattern > simple param > wildcard (registration
order is preserved inside each bucket), and only candidate buckets are
regex-evaluated. The index rebuilds lazily and is invalidated on
add/remove (including external routes mutations via a length guard).
The dead experimental trie (RouteTree/RouteMatcher) stays untouched
and unused. Baseline in test/benchmarks/BASELINE_1.4.0.md.
Route matching (median µs/op, Dart VM JIT, 7 rounds × 1k ops):
| Benchmark | 1.4.0 | 1.5.0 | Δ |
|---|---|---|---|
| literal match, last of 10 | 4.4390 | 3.6590 | −17.6 % |
| param match, last of 10 | 7.3280 | 5.0290 | −31.4 % |
| miss (unknown), 10 | 4.5190 | 1.5910 | −64.8 % |
| literal match, last of 100 | 14.0920 | 3.3370 | −76.3 % |
| param match, last of 100 | 25.7190 | 4.9490 | −80.8 % |
| miss (unknown), 100 | 31.5970 | 1.5430 | −95.1 % |
Feature 2 — Extended route syntax #
- Pattern params:
/user/:id(\d+)only matches segments satisfying the custom constraint. - Wildcards:
/docs/:path*captures one or more remaining segments,/separators included. - Escaped separator (bug A4): the
.in dotted params (/file.:ext) is now regex-escaped — it no longer matches any character. - Per-segment decoding (bug A2): path params are decoded with
Uri.decodeComponentinstead ofUri.decodeQueryComponent— a literal+stays a plus and%2Fdecodes to/after the segment split. - Duplicate route detection: registering two routes that compile to
the same pattern logs a warning via
Sint.log(first-still-wins, no exception, backwards compatible).
Feature 3 — pathParams / queryParams API #
Sint.toNamed,Sint.offNamedandSint.offAllNamedaccept optionalpathParamsandqueryParams:Sint.toNamed('/user/:id', pathParams: {'id': '42'}, queryParams: {'tab': 'posts'})navigates to/user/42?tab=postswith correct per-segment encoding.PageSettings.pathParams/PageSettings.queryParams(plusRouteDecoder,SintDelegateandSint.pathParams/Sint.queryParams) expose path and query parameters SEPARATELY.Sint.parameterskeeps the legacy merged view unchanged.
Web fixes #
- W1 — Browser back/forward:
SintDelegate.setNewRoutePathnow diffs against the active stack: if the requested URL is already present it pops the entries above it (completing their completers through the normal pop path) instead of pushing a duplicate. - W2 — Public
SintUrlStrategy:SintUrlStrategy.setPath()/SintUrlStrategy.setHash()can be called inmain()beforerunApp(); the delegate respects a pre-configured strategy. - W3 — State restoration:
restoreRouteInformationpasses the route state instead of a hardcodednull, andSintPage.copyWithno longer losesrestorationId(self-reference fixed). SintPage.copyWithnow propagatespreventDuplicateHandlingMode(latent since 1.3.1) — this activates the fixedpopUntilOriginalRoutebranch, now covered by an end-to-end test.
Middleware fixes #
- M1:
SintDelegate.runMiddlewarenow honorsprioritylikeMiddlewareRunner— both pipelines share the same STABLE sort (declaration order preserved among equal priorities). - M4: redirect cycles now hit a depth guard (5) with a clear
Redirect loop detectederror instead of looping/overflowing, in both the delegate pipeline andPageRedirect.
Verification #
flutter test 272/272 pass (240 from 1.4.0 + 32 new navigation tests);
dart analyze 0 errors, no new issues.
Deferred to a future release: Type-keyed injection registry
(Map<Type, Map<String?, _InstanceBuilderFactory>>) — the string keys of
_getKey are an internal protocol shared with RouterReportManager and
registeredKeys consumers in navigation; migrating them is a larger
cross-cutting change that was not worth destabilizing this release.
1.4.0 - 2026-07-23 #
Performance release — 5 P0 hot-path optimizations with before/after benchmarks
(test/benchmarks/p0_benchmark_test.dart, reusable harness in
test/benchmarks/bench_harness.dart, 1.3.1 baseline in
test/benchmarks/BASELINE_1.3.1.md). Internal changes only; zero public API changes.
- O1 — No per-notification listener copy:
ListNotifier._notifyUpdate()no longer allocates_updaters!.toList()on every notification. It now iterates the listener list directly by index, guarded by a mutation version counter; a defensive copy is only paid for the remaining listeners when a reentrant add/remove is detected mid-iteration (lib/state_manager/src/engine/list_notifier.dart). - O2 — Direct
markNeedsBuildin Obx:ObxReactiveElement.getUpdate()no longer schedules a microtask per notification (N redundant microtasks per frame).markNeedsBuild()is idempotent and Flutter batches dirty elements into the next frame naturally (lib/state_manager/src/ui/obx_reacive_element.dart). - O3 — Lazy
_updatersGroupIds: everyListNotifier(each Rx + each controller) used to allocate an eagerHashMapeven when id-groups were never used. The map is now created with??=on firstaddListenerId(). Additionally,dispose()now disposes and clears the group notifiers, fixing a memory leak found in the audit (lib/state_manager/src/engine/list_notifier.dart). - O4 — Typed
Notifier.read:void read(dynamic updaters)→void read(ListNotifier updaters), enabling static dispatch/inlining in AOT and dart2js (lib/state_manager/src/engine/notifier.dart). - O5 — Single-lookup
Sint.find& friends:find,_initDependencies,_startController,_insert,_getDependency,markAsDirty,putOrFindanddeleteeach performed 2–5 map lookups of the same key; all now resolve the factory in a single lookup. Eager log string interpolation in_startControlleris now gated behindSint.isLogEnable(lib/injection/src/domain/extensions/injection_extension.dart).
Before/after (median µs/op, Dart VM JIT, 7 rounds × 20k ops after 2k warmup):
| Benchmark | 1.3.1 | 1.4.0 | Δ |
|---|---|---|---|
| Pure notification (RxInt, 1 listener) | 0.0193 | 0.0101 | −47.7 % |
| Fan-out (0 listeners) | 0.0132 | 0.0077 | −41.7 % |
| Fan-out (1 listener) | 0.0188 | 0.0095 | −49.5 % |
| Fan-out (10 listeners) | 0.0682 | 0.0262 | −61.6 % |
| Fan-out (100 listeners) | 0.6452 | 0.2110 | −67.3 % |
| No listeners (empty path) | 0.0149 | 0.0065 | −56.4 % |
Sint.find (tagged) |
0.5555 | 0.3835 | −31.0 % |
SintController.update() (1 listener) |
0.0158 | 0.0070 | −55.7 % |
Verified: flutter test 238/238 pass (234 existing + 4 new benchmark tests);
dart analyze 0 errors, no new issues.
1.3.1 - 2026-07-22 #
Hotfix release — 7 high-severity fixes from the 1.3.0 audit.
- RxnDouble subtraction:
RxnDoubleExt.operator -was adding instead of subtracting (value = value! + other→value = value! - other). - Worker timers on dispose:
debounceandintervaltimers are now tracked per controller and cancelled inonClose(), so pending callbacks never fire on an already-disposed controller. - SintQueue resilience: A job throwing an
Error(e.g.TypeError, not justException) no longer freezes the queue forever — the completer always completes with the error and_activeis always released.cancelAllJobs()now completes pending futures withStateError('Job cancelled')instead of leaving them hanging. - popUntilOriginalRoute: Fixed inverted condition (
==→!=) that popped the original route itself instead of popping until it became current. - offAllNamed / offNamedUntil: Removed pages now complete their route completers through the standard pop path, instead of leaving the original navigation futures hanging forever.
- removeLastHistory: Fixed unconditional self-recursion (stack overflow); it now delegates to the platform implementation (no-op where browser history does not exist).
- Optional route params: Routes like
/user/:id?no longer crash with a null-assert when the optional param is absent (URL/user). The path separator is now part of the optional regex group and absent match groups are skipped during parameter parsing.
Maintenance Notes — 2026-07-09 (unversioned) #
Historical entries that were recorded under a duplicated/incorrect version heading; kept here for traceability.
- Optimize transitions and layout configurations in sint_root.dart.
- Stability and compatibility updates.
1.3.0 - 2026-03-11 #
Vanity URLs & Slug Resolution — The Missing Web Piece.
Pillar N (Navigation) #
- Vanity / Slug URL Resolution: Fixed a long-standing GetX limitation where
unknownRoutenever triggered for single-segment URLs like/serzenmontoya. The root cause:RouteParser.matchRoute()builds cumulative paths (['/', '/serzenmontoya']), and since/always matches the root route, the tree was never empty — sounknownRoutewas silently bypassed. SINT now detects when only a parent segment matched but the full URL did not, and correctly returns an empty tree to triggerunknownRoute. - URL-Preserving
unknownRoute: When an unregistered URL triggersunknownRoute, SINT now preserves the original URL in the route stack.Sint.currentRoutereturns the actual requested path (e.g./serzenmontoya) instead of/not-found. This enables catch-all resolver pages (likeSlugResolverPage) to read the original slug and resolve it to the correct content via async lookups.
Why this matters: Vanity URLs (cyberneom.xyz/serzenmontoya, cyberneom.xyz/events/burning-your-mind) are essential for shareable, human-friendly links on the web. Before this fix, these URLs silently redirected to the home page. Now, they correctly route through unknownRoute where a resolver page can perform parallel Firestore queries to identify the content type and navigate accordingly.
GetX comparison: GetX explicitly documents this as a known limitation: "any string that starts with '/' will correspond to the '/' route". SINT 1.3.0 solves this without breaking existing route matching.
// Register a catch-all resolver as unknownRoute
SintMaterialApp(
initialRoute: '/',
unknownRoute: SintPage(name: '/not-found', page: () => SlugResolverPage()),
sintPages: [
SintPage(name: '/', page: () => HomePage()),
SintPage(name: '/book/:bookId', page: () => BookDetail()),
// ... registered routes
],
)
// In SlugResolverPage — read the original vanity URL
final slug = Sint.currentRoute.replaceFirst('/', '');
// → 'serzenmontoya' (not '/not-found')
// Resolve the slug against your data layer
final match = await SlugRouter.resolve(slug);
// → profile, item, event, band, post, etc.
1.2.2 - 2026-02-28 #
- CHANGELOG sync: Turns out an AI that manages State, Injection, Navigation & Translation still can't manage to update the CHANGELOG before hitting publish. Lesson learned. Version and CHANGELOG now walk into pub.dev together, holding hands. It won't happen again. Probably.
1.2.1 - 2026-02-28 #
- README images: Switched to absolute GitHub raw URLs so images render correctly on pub.dev (
.pubignoreexcludes PNGs from the package).
1.2.0 - 2026-02-28 #
RESTful Navigation & i18n URL Routing.
133 lines of new code. Zero new dependencies. Pillars N and T upgraded.
Pillar N (Navigation) #
- RESTful Route Parameters (Spring Boot-inspired API):
Sint.routeParam— Primary path parameter value. For route/book/:bookIdnavigated as/book/abc123, returns'abc123'. Equivalent to Spring Boot's@PathVariable.Sint.pathParam('bookId')— Named path parameter. Equivalent to@PathVariable("bookId").Sint.queryParam('page')— Query parameter from URL. Equivalent to@RequestParam.Sint.queryParamOrDefault('sort', 'recent')— Query parameter with fallback. Equivalent to@RequestParam(defaultValue = "recent").- Full test mode support via
SintTestMode.
translateEndpointsflag: New parameter onSintMaterialAppandConfigDatathat enables automatic i18n URL routing. Whentrue, SINT builds aPathTranslatorfrom registered translations and routes.setUrlStrategy()resilience: Wrapped in try-catch to handle "URL strategy already set" when the Flutter engine is already initialized — prevents web startup crashes on hot restart.
Pillar T (Translation) #
PathTranslator— New class for internationalized URL routing:canonicalizePath()— Converts localized URLs to canonical English before route matching. e.g./libro/abc123→/book/abc123.localizePath()— Converts canonical URLs to the current locale for the browser URL bar. e.g./book/abc123→/libro/abc123(ES) or/livre/abc123(FR).extractSegments()— Automatically extracts static route segments from registeredSintPagenames (skips:paramsegments).- Built-in diacritics normalization (
Publicación→publicacion) for clean URLs. - Zero-config: built automatically from existing app translations when
translateEndpoints: true. No external localization file needed.
Sint.pathTranslator— Getter/setter on theSintInterfaceto access the URL translator. Stored inIntlHostand cleaned up onSintRoot.onClose().SintInformationParserintegration — Automatic canonicalization onparseRouteInformation()and localization onrestoreRouteInformation(). Browser URL bar shows localized paths; internal routing uses canonical English.
Housekeeping #
- Example app: Added
example/main.dartdemonstrating all four SINT pillars (State, Injection, Navigation, Translation) in a counter app. Targets 160/160 pub points. - TickerMode.of deprecation: Suppressed for cross-SDK compatibility in
RxTickerProviderMixin.
1.1.0 - 2026-02-26 #
The Four Pillars Evolve — Workers, Pattern Matching, Async DI & Web-Safe Navigation.
175 lines of new code. Zero new dependencies. All four pillars upgraded.
Pillar S (State Management) #
- Reactive Workers: Added
ever(),once(),debounce(), andinterval()toSintController. Built on top of the existingRx.listen()engine with automatic lifecycle management — all subscriptions auto-cancel ononClose(). - SintStatus Pattern Matching: Added
.when()and.maybeWhen()exhaustive pattern matching toSintStatus<T>, plus convenience getters (.isLoading,.isSuccess,.isError,.isEmpty,.dataOrNull,.errorOrNull). Inspired by Riverpod'sAsyncValue. - SintListener Widget: New widget that listens to
Rxchanges and executes a callback without rebuilding the widget tree. Equivalent to BLoC'sBlocListener— ideal for side effects like snackbars, navigation triggers, and logging.
Pillar I (Injection) #
putAsync<S>(): Async dependency registration for services that requireFuture-based initialization (SharedPreferences, databases, HTTP clients). Equivalent to GetIt'sregisterSingletonAsync.InjectionExtension.registeredKeys: Exposed registered dependency keys for internal selective cleanup operations.
Pillar N (Navigation) #
SintSnackBarStyle: Global snackbar styling viaSintMaterialApp(snackBarStyle: ...). Defines default visual properties (colors, margins, durations, position, etc.) that apply to everySint.snackbar()call. Three-level cascade: call-site parameters > global style > hardcoded defaults.- Web-Safe
back(): Integrated web-aware logic directly intoSint.back(). On web, if there's no internal navigation history to pop, it gracefully does nothing instead of crashing — the browser's back/forward arrows handle it. toInitial()Hard Reset: Performs a full app reset — deletes all non-permanent controllers (onClose()called on each), then reloadsinitialRoutefrom scratch. Supports selective preservation viakeepparameter:Sint.toInitial(keep: {AuthController}).Sint.isWeb: Platform detection shortcut.Sint.showBackButton: Returnsfalseon web (browser has native arrows),trueon mobile.- Web Fade Transition: Default
Transition.fadeon web for GPU-light performance (vs heavy Cupertino/Zoom). - Web Scroll Behavior: Enabled drag scrolling for touch, mouse, and trackpad on web by default.
- Deprecated
webBack(): Logic merged intoback(). UseSint.back()directly. - Deprecated
homeproperty: InSintMaterialApp,ConfigData, andSintRoot. UseinitialRoute+sintPagesinstead.
Pillar T (Translation) #
loadTranslations(): Async lazy-loading of translations per module/feature. Merges with existing translations without replacing them — built on top of the existingappendTranslations()engine.
Performance (v1.1.0 Benchmarks) #
| Pillar | Operation | Avg Time |
|---|---|---|
| S | Reactive .obs update |
0.09 us/op |
| S | Simple update() |
0.11 us/op |
| I | find() with 10 tags |
1.34 us/find |
| T | trParams() interpolation |
2.65 us/op |
1.0.0 - 2026-02-01 #
The Birth of SINT (Initial Stable Release). SINT 1.0.0 is a hard fork and Clean Architecture evolution of GetX (v5.0.0-rc). This version marks the transition from a "do-everything" framework to a "do the right things" infrastructure, focused exclusively on four pillars: State, Injection, Navigation, and Translation.
Key Architectural Changes #
- Massive Code Pruning: Removed 7,766 lines of code (~37.7%) by stripping away non-core features like the HTTP client, animations, and unused string validators.
- Clean Architecture Restructuring: Reorganized the entire codebase into a modular domain/engine/ui structure for every pillar, replacing the legacy flat-file layout.
- Pillar Consolidation: Unified the framework into 5 core modules (core, injection, navigation, state_manager, translation) instead of the original 9+ scattered directories.
- Reactive Sovereignty: Consolidated all reactive types (Rx) into the core/ module and moved platform detection into the navigation/ module where it is actually consumed.
Compatibility & Migration #
- Legacy Bridge: Included a deprecated Get alias to allow a seamless migration for existing apps.
- Single Entry Point: All pillars are now accessible through a single, clean import:
package:sint/sint.dart.
Documentation & Global Ready #
- Standardized Documentation: Shipped with complete guides for each of the four pillars in 12 languages, ensuring global adoption across the Open Neom ecosystem.