Costruisci prodotti su un framework operativo condiviso.
Costruisci una volta. Distribuisci in ogni dominio.
After Framework offre ai prodotti una base condivisa: architettura, identità, IA, design system, strumenti e moduli di dominio riutilizzabili.
01 · Architettura del framework
Un kernel. Due linee di prodotto. Prodotti snelli in cima.
Ogni prodotto condivide gli stessi livelli. Aggiungere un Life Domain o un Industry Domain significa aggiungere un modulo in cima: i livelli sottostanti non cambiano.
Specifico del prodotto
Piattaforma condivisa
Adapter della composition root
Seleziona un livello per vedere di cosa è responsabile e da cosa dipende.
after_core
Kernel condiviso
Autenticazione, networking protetto, storage, DI con Riverpod, flag, remote config, SDK di IA BYOK, diritti premium, notifiche, deep link e i motori di dashboard, plugin, ricerca e impostazioni.
- Dipende da
- Nessuna: livello di base
- Usato da
- Livello di dominio del prodotto · Livello di ecosistema · Capacità di IA · Moduli consumer · Moduli enterprise · Sistema di design · Adapter Firebase
Riuso condiviso, esperienza specifica del prodotto
La dottrina della piattaforma punta a far ereditare a ogni prodotto almeno il novanta per cento delle capacità di runtime. Un prodotto possiede il suo dominio, le funzionalità verticali, il profilo di IA, i cataloghi e il branding, nient’altro.
Le regole che tengono in piedi il sistema
- 01Port anziché SDK: il codice verticale dipende dalle interfacce After, mai dagli SDK dei fornitori.
- 02I moduli verticali vivono solo nei repository dei prodotti, in lib/features/.
- 03Ogni port include un mock, così gli scaffold girano senza backend.
- 04Generare, non ripartire da zero: i nuovi prodotti nascono da una spec, non da una nuova architettura.
02 · Fabbrica di prodotti
Dall’idea al prodotto funzionante su una base riutilizzabile.
La fabbrica di prodotti trasforma un piccolo product.spec.yaml in un’app Flutter affiancata che dipende dai pacchetti condivisi. La spec contiene solo ciò che è unico del prodotto.
- 01
Idea
Dai un nome al prodotto e scegli una linea: consumer o enterprise, con SuperGarage o SuperHospital come riferimento.
- 02
Dominio
Scrivi product.spec.yaml: dominio, funzionalità verticali, tab, permessi, widget della dashboard, skill di IA, branding, lingue.
- 03
Moduli
Tutto ciò che non è nella spec (autenticazione, membership o organizzazione, RBAC, calendario, attività, notifiche, ricerca) viene ereditato.
- 04
Shell del prodotto
generate_product.ps1 genera il manifest, la composition root, il catalogo funzionalità, la shell, i file l10n e un workflow di CI.
- 05
Distribuzione
Il workflow di CI generato esegue formattazione, analisi e test con copertura a ogni push e pull request verso main.
Il prodotto possiede
- Nome, pacchetto, bundle, linea di prodotto
- Funzionalità verticali e chiavi i18n
- Tab di navigazione
- Stringhe dei permessi RBAC
- Widget della dashboard
- Skill di IA e binding degli strumenti
- Colore d’accento e monogramma
La piattaforma fornisce
- Autenticazione e superadmin
- Membership o organizzazione
- Motore RBAC e log di audit
- Calendario, attività, documenti
- Notifiche e analytics
- Motori di workflow, dashboard e ricerca
- Sistema di design, splash, CI
Rieseguire il generatore con una spec aggiornata rinnova i file scheletro senza distruggere il codice delle funzionalità scritto a mano.
03 · Pacchetti e capacità
Sette pacchetti. Dipendenze esplicite.
Tutti i pacchetti sono alla versione 1.0.0 nel repository supercore e vengono usati tramite dipendenze di percorso. Seleziona un pacchetto per vedere da cosa dipende e cosa dipende da esso.
Kernel condiviso
after_core
Port e implementazioni predefinite per autenticazione, networking, storage, DI, analytics, feature flag, remote config, IA, notifiche, deep link e diritti premium. I prodotti sovrascrivono i provider Riverpod con i propri adapter.
- Dipende da
- Nessuna: livello di base
- Usato da
API principali
- AppPlatformManifest
- PlatformConfig
- AfterStandardOverrides
- AfterBootstrapMode
- AfterAuthRepository
- AfterApiClient
- AfterHttpClientFactory
- AfterFeatureFlags
- AfterRemoteConfig
- AfterAiCredentialVault
Dipendenze di terze parti rilevanti
flutter_riverpod · dio · flutter_secure_storage · shared_preferences · google_sign_in · app_links · flutter_local_notifications
Esempio
import 'package:after_core/after_core.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
runApp(
ProviderScope(
overrides: [
afterSharedPreferencesProvider.overrideWithValue(prefs),
afterAuthRepositoryProvider.overrideWithValue(MyFirebaseAuthRepository()),
afterAnalyticsProvider.overrideWithValue(MyFirebaseAnalytics()),
// ... store-specific adapters
],
child: const MySuperApp(),
),
);
}Sorgente supercore/packages/after_core/README.md (si apre in una nuova scheda)
Tessuto di ecosistema
after_ecosystem
After ID, After+, l’event bus, le API tra prodotti, i servizi condivisi e il contesto di IA dell’ecosistema, perché moduli consumer ed enterprise si comportino come un unico sistema.
- Dipende da
- Usato da
API principali
- AfterEventBus
- AfterProductApi
- AfterProductApiRegistry
- AfterSecureInteropBridge
- AfterEcosystemAiContext
- afterEcosystemProvider
Dipendenze di terze parti rilevanti
flutter_riverpod · uuid
Esempio
{
"id": "evt_…",
"type": "garage.maintenance.completed",
"sourceProductId": "super_garage",
"afterId": "aid_…",
"organizationId": null,
"occurredAt": "2026-07-19T20:00:00Z",
"correlationId": "corr_…",
"payload": { }
}Sorgente supercore/docs/AFTER_ECOSYSTEM_PLATFORM.md (si apre in una nuova scheda)
Piattaforma di capacità di IA
after_ai
Un livello di IA modulare: i prodotti scelgono un AfterAiProfile che abilita le capacità. Chiamare una capacità disattivata genera un’eccezione. Ogni capacità include un adapter mock.
- Dipende da
- Usato da
- Nessun pacchetto dipende da esso
API principali
- AfterAiPlatform
- AfterAiProfile
- AfterAiCapability
- AfterAiCapabilityDisabledException
- afterAiProfileProvider
- afterAiPlatformProvider
- AfterToolCallingAi
- AfterAiPluginRegistry
Dipendenze di terze parti rilevanti
flutter_riverpod · uuid
Esempio
// after_framework.dart
afterAiProfileProvider.overrideWithValue(AfterAiProfile.superGarage),
// feature code
final ai = ref.watch(afterAiPlatformProvider);
if (ai.canChat) {
final reply = await ai.chat(message: input);
}Sorgente supercore/packages/after_ai/README.md (si apre in una nuova scheda)
Sistema di design
after_design_system
Il linguaggio visivo condiviso: token di colore, spaziatura, raggio, animazione e tipografia, theme data Material 3 e componenti condivisi, identici in tutte le linee di prodotto.
- Dipende da
- Usato da
API principali
- AfterThemeData
- AfterTheme
- AfterColors
- AfterSpacing
- AfterRadius
- AfterMotion
- AfterFadeSlide
Dipendenze di terze parti rilevanti
shared_preferences
Esempio
abstract final class AfterThemeData {
static ThemeData light({
AfterTypography typography = AfterTypography.garage,
Color? accentOverride,
}) { … }
static ThemeData dark({
AfterTypography typography = AfterTypography.garage,
Color? accentOverride,
}) { … }
}
// Product: same family, own accent (spec branding.accent).
MaterialApp(
theme: AfterThemeData.light(accentOverride: const Color(0xFF22D3EE)),
darkTheme: AfterThemeData.dark(accentOverride: const Color(0xFF22D3EE)),
);Sorgente supercore/packages/after_design_system/lib/src/foundations/theme.dart (si apre in una nuova scheda)
Moduli consumer
after_consumer
Un livello B2C volutamente snello sopra il kernel: membership, catalogo funzionalità consumer, archivio personale, consenso al lancio, località regionale e cornice della shell di famiglia.
- Dipende da
- Usato da
- Nessun pacchetto dipende da esso
API principali
- ConsumerMembership
- ConsumerCoreFeatureId
- ConsumerVerticalFeature
- PersonalVaultRepository
- consumerMembershipProvider
- personalVaultRepositoryProvider
Dipendenze di terze parti rilevanti
flutter_riverpod · geolocator · geocoding · image_picker · permission_handler
Esempio
dependencies:
after_core:
path: ../supercore/packages/after_core
after_consumer:
path: ../supercore/packages/after_consumer
after_design_system:
path: ../supercore/packages/after_design_systemModuli enterprise
after_enterprise
Quattordici port B2B condivisi con mock deterministici in memoria, tenancy fail-closed tramite EnterpriseScope, un runtime di prodotto e un host per la shell.
- Dipende da
- Usato da
- Nessun pacchetto dipende da esso
API principali
- EnterpriseScope
- OrganizationRepository
- RbacRepository
- PermissionSet
- WorkflowEngine
- TaskRepository
- CalendarRepository
- DocumentRepository
- EnterpriseAiAssistant
- AuditLogRepository
Dipendenze di terze parti rilevanti
flutter_riverpod · collection · uuid
Esempio
static Future<List<Override>> ensureConfigured({
EnterpriseRepository? enterpriseRepository,
}) async {
PlatformConfig.current = superAppEnterpriseManifest;
final prefs = await SharedPreferences.getInstance();
return [
...AfterStandardOverrides.create(
preferences: prefs,
userAgent: '${superAppEnterpriseManifest.appName}/'
'${superAppEnterpriseManifest.appId}',
),
enterpriseRepositoryProvider.overrideWithValue(
enterpriseRepository ?? MockEnterpriseRepository(),
),
];
}Sorgente supercore/templates/super_app_enterprise/after_framework.dart (si apre in una nuova scheda)
Adapter Firebase
after_firebase
Adapter Firebase Auth, blob Firestore e media Storage per la composition root. Se Firebase non è configurato o non si avvia, ripiega sugli adapter locali invece di andare in crash.
- Dipende da
- Usato da
API principali
- AfterFirebaseBootstrap
- FirebaseAfterAuthRepository
- FirestoreAfterUserBlobSync
- FirebaseAfterUserMediaSync
- AfterFirebaseCloudAvailability
Dipendenze di terze parti rilevanti
firebase_core · firebase_auth · cloud_firestore · firebase_storage · google_sign_in
Esempio
// Cold start, before ProviderScope. Returns false (no crash) when
// options are null or init fails — auth falls back to prefs adapters.
await AfterFirebaseBootstrap.ensureInitialized(options: firebaseOptions);
final overrides = [
...AfterStandardOverrides.create(
preferences: prefs,
userAgent: userAgent,
includeUserBlobSync: false, // Firebase provides blob sync below
),
...AfterFirebaseBootstrap.overrides(
preferences: prefs,
appId: 'super_garage',
),
];04 · CLI e flusso di lavoro
Script e comandi Flutter, nessuna magia.
Gli strumenti si trovano in supercore/scripts come script PowerShell, accanto alla toolchain Flutter standard. Non esiste un binario CLI distribuito a parte.
Inizializza
Valida una spec senza Flutter, poi genera l’app affiancata e avviala.
powershell -File scripts\validate_product_spec.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yamlSorgente supercore/factory/README.md (si apre in una nuova scheda)
# From a spec
powershell -File scripts\generate_product.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yaml
# From a name only (quick starter)
powershell -File scripts\generate_product.ps1 -Name SuperAirport -Reference SuperHospital
# Preview without writing files
powershell -File scripts\generate_product.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yaml -DryRunSorgente supercore/factory/README.md (si apre in una nuova scheda)
cd ..\superairport
flutter create .
flutter pub get
flutter analyze
flutter testComponi i pacchetti
Dipendi dal kernel, da un livello di linea di prodotto e dal design system tramite dipendenze di percorso.
dependencies:
after_core:
path: ../supercore/packages/after_core
after_consumer:
path: ../supercore/packages/after_consumer
after_design_system:
path: ../supercore/packages/after_design_systemdependencies:
after_core:
path: ../supercore/packages/after_core
after_enterprise:
path: ../supercore/packages/after_enterprise
after_design_system:
path: ../supercore/packages/after_design_systemConfigura
Dichiara l’identità in AppPlatformManifest. La modalità scaffold consente i mock; la modalità produzione fallisce all’avvio se manca un adapter.
const superHospitalManifest = AppPlatformManifest(
appName: 'SuperHospital',
appId: 'super_hospital',
packageName: 'com.overstein.superhospital',
androidWidgetProvider: 'com.overstein.superhospital.WidgetProvider',
iosAppGroupId: 'group.com.overstein.superhospital',
productLine: AfterProductLine.enterprise,
);Sorgente supercore/docs/AFTER_OS_ARCHITECTURE.md (si apre in una nuova scheda)
/// Composition safety mode (ADR-007).
///
/// - [scaffold]: in-memory / mock adapters are allowed (templates, tests).
/// - [production]: missing real adapters must throw at startup.
enum AfterBootstrapMode {
scaffold,
production,
}Testa
Formatta, analizza e testa con copertura, poi verifica il prodotto rispetto al contratto di riuso della piattaforma.
dart format --output=none --set-exit-if-changed .
flutter analyze
flutter test --coverage
# Platform doctrine check against a generated product
powershell -File scripts\check_reuse_contract.ps1 -AppRoot ..\superairportSorgente supercore/scripts/generate_product.ps1 · docs/PLATFORM_DOCTRINE.md (si apre in una nuova scheda)
Distribuisci
I prodotti generati includono un workflow GitHub Actions di analisi e test. La firma delle release Android è configurata da uno script di supercore.
name: analyze-and-test
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
analyze-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Checkout supercore (sibling)
uses: actions/checkout@v5
with:
repository: oversteintech/supercore
path: ../supercore
- uses: subosito/flutter-action@v2
with:
channel: stable
- run: dart format --output=none --set-exit-if-changed .
- run: flutter pub get
- run: flutter analyze
- run: flutter test --coverageSorgente supercore/scripts/generate_product.ps1 (.github/workflows/ci.yml) (si apre in una nuova scheda)
# Wires Play release signing for sibling apps; -BuildAab also builds bundles.
# key.properties / *.jks stay local and gitignored.
powershell -File scripts\wire_play_release_signing.ps1 -BuildAabSorgente supercore/scripts/wire_play_release_signing.ps1 (si apre in una nuova scheda)
05 · Dal framework ai prodotti reali
Le capacità condivise diventano esperienze specifiche del prodotto.
SuperGarage è il riferimento consumer già pubblicato. Ogni schermata qui sotto è un vero screenshot dello store; la sovrapposizione mostra quali parti arrivano dalla piattaforma e quali appartengono al prodotto.




Mappa delle capacità di SuperGarage
Identificatori importati da supergarage/lib, raggruppati per pacchetto di appartenenza.
after_core
- AfterUserPlan
- AfterAiCredentialVault
- AfterLocalNotifications
after_consumer
- FamilyShellHeader
- AfterRegionalLocation
after_firebase
- AfterFirebaseBootstrap
Funzionalità del prodotto
- features/vehicle
- features/maintenance
- features/obd
- features/expenses
- features/fleet
- features/trips
- features/assistant
- features/community
Famiglia di prodotti
Stato come registrato in supercore/catalog/products.yaml. Solo SuperGarage risulta pubblicato.

SuperGarage
Consumer · Riferimento
Mobilità: veicoli, manutenzione, assicurazione, carburante, OBD, flotta
after_core · after_design_system · after_firebase · after_consumer

AfterHub
Consumer · Shell OS
Shell OS consumer: identità, dashboard, IA, calendario, ricerca, After+
Scaffoldafter_ai · after_consumer · after_core · after_firebase · after_design_system · after_ecosystem

SuperHospital
Enterprise · Riferimento
Operazioni ospedaliere: riferimento enterprise
Scaffold
SuperHealth
Consumer
Salute personale: farmaci, cartelle, sonno, alimentazione

SuperFinance
Consumer
Finanza personale: abbonamenti, budget, investimenti
Scaffold
SuperHome
Consumer
Casa e famiglia: manutenzione, utenze, garanzie
Scaffold
SuperTravel
Consumer
Viaggi: itinerari, voli, hotel, programmi
Scaffold
SuperPet
Consumer
Animali: cure veterinarie, cibo, cartelle sanitarie
Scaffold
SuperNews
Consumer
Notizie personalizzate dall’IA con riassunti

SuperSports
Consumer
Sport e prestazioni: fitness, risultati, calendari

SuperAirport
Enterprise
Operazioni aeroportuali: voli, gate, piste
Scaffold
SuperMaritime
Enterprise
Operazioni portuali e navali
Scaffold
SuperFactory
Enterprise
MES e manutenzione per il reparto produttivo
Scaffold
SuperFarm
Enterprise
Operazioni agricole: colture, bestiame, attrezzature
Scaffold
06 · Sistema di design
Coerenza senza uniformità.
after_design_system dà a ogni prodotto la stessa cornice, densità e animazione. I prodotti cambiano accento, monogramma, funzionalità e testi, non il sistema.
Token
Colore, spaziatura, raggio e animazione sono costanti Dart, condivise da consumer ed enterprise.
Colore
- accent#38BDF8
- accentDeep#0284C7
- graphite950#0B0C0F
- graphite800#222831
- steel#8A919D
- lightBackground#FAFBFC
- success#22C55E
- warning#F59E0B
- danger#EF4444
Spaziatura · scala a 4pt
- xs4
- sm8
- md12
- lg16
- xxl24
- xxxl32
- massive48
- hero64
Raggio
- 6
- 8
- 12
- 16
- 20
Animazione
- instant100ms
- fast · micro180ms
- normal · page280ms
- slow · modal420ms
- emphasis560ms
Componenti
Pulsanti, schede, campi di input, navigazione, finestre di dialogo, grafici, dashboard, stati vuoti e di caricamento, sezioni delle impostazioni e barra superiore della shell.
- buttons.dart
- cards.dart
- inputs.dart
- navigation_bar.dart
- dialogs.dart
- charts.dart
- dashboard.dart
- empty_states.dart
- loading.dart
- settings_section.dart
- shell_top_bar.dart
Accessibilità
Gli schemi di colore chiaro e scuro vengono forniti insieme. Le serie dei grafici sono ordinate per restare distinguibili e i token di animazione mantengono le transizioni brevi e mirate.
Comportamento responsive
Il padding della pagina e la larghezza del contenuto si adattano alla larghezza del viewport tramite AfterSpacing.
| Larghezza viewport | Contenuto max | Padding pagina |
|---|---|---|
| < 360 | width | 14 / 10 / 14 / 28 |
| 360 – 419 | 520 | 16 / 12 / 16 / 28 |
| 420 – 719 | 640 | 20 / 12 / 20 / 28 |
| ≥ 720 | 760 | 20 / 12 / 20 / 28 |
Estensione del brand
Ogni spec di prodotto dichiara un accento e un monogramma. Il tema riceve l’accento tramite accentOverride; tutto il resto resta nella famiglia.
- SuperGarage#22D3EE
- SuperKids#F472B6
- SuperHospital#F43F5E
- SuperFactory#F59E0B
07 · Documentazione
Documentazione pensata per la consultazione rapida.
Ogni pagina è ricavata dal repository supercore e rimanda al proprio file sorgente.
- Ricerca istantanea con scorciatoia da tastiera
- Indice fisso con link diretti
- Pulsanti di copia ed evidenziazione della sintassi in entrambi i temi
- Pagine dei pacchetti con grafi delle dipendenze
- Diagrammi di architettura con alternative statiche
- Disponibile in dieci lingue, con supporto da destra a sinistra
08 · Confini enterprise
Confini che falliscono in modo sicuro.
L’isolamento enterprise è imposto nel codice e registrato negli architecture decision record.
Tenancy fail-closed
I port enterprise con ambito organizzazione richiedono un EnterpriseScope. Se manca organizationId viene generata un’eccezione: non restituiscono mai tutti i tenant.
Permessi prima della persistenza
Le funzionalità verticali verificano PermissionSet.allows(...) prima di ogni chiamata che modifica dati. I prodotti dichiarano le proprie stringhe di permesso.
Audit append-only
Ogni azione enterprise che modifica dati deve aggiungere un AuditLogEntry all’AuditLogRepository append-only.
Solo interoperabilità sicura
Le chiamate tra prodotti passano da AfterSecureInteropBridge: audience After ID, scope, RBAC e appartenenza all’organizzazione, poi una voce di audit obbligatoria.
Avvio fail-fast
In modalità produzione un adapter mancante genera un’eccezione all’avvio, così i provider mock non possono arrivare in produzione inosservati.
Modulare per costruzione
I backend reali sostituiscono MockEnterpriseRepository nella composition root. Il livello OS non conosce mai il nome del fornitore.
/// Fail-closed tenant + actor context for enterprise ports (ADR-002).
class EnterpriseScope {
final String organizationId;
final String actorId;
final PermissionSet permissions;
/// Throws if [organizationId] is missing/blank — never allow all-tenant lists.
static String requireOrganizationId(String? organizationId) {
final id = organizationId?.trim() ?? '';
if (id.isEmpty) {
throw StateError(
'EnterpriseScope: organizationId is required (fail-closed tenancy).',
);
}
return id;
}
}Si tratta di controlli architetturali documentati nel repository supercore. After Framework non dichiara alcuna certificazione né conformità normativa.
Confini enterpriseRendi il prodotto più piccolo. Rendi le fondamenta più solide.
Parti dall’architettura, leggi la documentazione dei pacchetti o esplora il sorgente.