01 - Roadmap
Sinew is built waterfall: every note in base/, kotlin/ and flutter/ is written and reviewed before any code. Each milestone is then built in Kotlin first, then in Flutter, from the same notes. Releases are lockstep: every package ships together, at one version number.
Milestones
| Milestone | Content | Notes | Done when |
|---|---|---|---|
| S0 Setup | the umbrella repo srctool/sinew with sinew-kotlin and sinew-dart submodules and Docusaurus docs; build logic; CI; one empty module or package per v1 package | Architecture | every package compiles on every target, and CI fails a dependency edge that isn't in the graph |
| S1 Models + Exception | envelope bases, paging shapes, ViewState, Result (Flutter), AppException and ErrorMessage; the built-in types, processCall, the use-case guard, CrashReporter, Localizer; sinew_l10n (English, Indonesian) | Error Model, Models, Exception | a failure keeps its code through every layer, and a language switch re-renders an error on screen |
| S2 Paging + Presentation | Pager and its strategies; StateEffectHandler, EventActionHandler, EffectEmitter; the Riverpod mixins and hooks, the ViewModel bases, ObserveEffects, the AsyncValue conversions | Paging, Presentation, Adapters | every paging race test passes, and one order-list view model runs unchanged on the neutral base and both adapters |
| S3 Network | SinewHttp, the six layers, the auth layer, processApiCall, the handlers, retry and polling, the network checker | Network | ten parallel 401s cause one refresh, and a refresh failing because the backend is down keeps the session |
| S4 Security + Storage | FieldCipher, BiometricVault; SecureStore, KeyValueStore, processStorageCall, pagedQuery, InspectableStore | Security, Storage | no storage failure crashes the app, and an iOS reinstall starts with an empty secure store |
| S5 Testing + Glue | sinew_testing; sinew_camouflage; sinew_riverpod_providers; one sample app per platform with a list screen through CamoPagedList | Testing, Camouflage Glue | the sample list screen runs the full cycle (skeleton, items, more, retry, refresh, end) on each platform |
| S6 Publish 1.0 | lockstep release on pub.dev and Maven Central (com.srctool.sinew), the Kotlin BOM, changelogs | the platform 05 - Delivery notes | a fresh app on each platform resolves 1.0 and runs the sample screen |
| S7 DevTools (1.1) | sinew_devtools, sinew_devtools_ui, sinew-devtools-noop, gating, the built-in inspectors | DevTools | a production release or profile build contains no devtools code (checked in CI), and no stored record contains a secret |
Later
| Item | Note |
|---|---|
sinew_permission | Permission |
sinew_notification (+ the devtools notification playground) | Notification |
sinew_extensions (toMoney, toRelative) | Extensions |
| Devtools inspectors with native code: EXIF, camera, map | separate optional packages |
| Router adapters for the devtools | one per router |
| A Camouflage skin and theme inspector | in the Camouflage family |
| An external devtools companion | reads sinew_devtools over a connection |
| Migration recipes | fpdart Either → Result; state-flag reactions → effects |
The Koin adapter was considered and dropped (Koin Adapter).