Créez vos produits sur un framework opérationnel partagé.
Construire une fois. Livrer dans tous les domaines.
After Framework offre aux produits une base commune : architecture, identité, IA, systèmes de design, outillage et modules métier réutilisables.
01 · Architecture du framework
Un noyau. Deux lignes de produits. Des produits légers au sommet.
Tous les produits partagent les mêmes couches. Ajouter un domaine de vie ou un domaine sectoriel ajoute un module au sommet — les couches inférieures ne changent pas.
Spécifique au produit
Plateforme partagée
Adaptateurs de la racine de composition
Sélectionnez une couche pour voir ce qu’elle possède et ce dont elle dépend.
after_core
Noyau partagé
Auth, réseau renforcé, stockage, DI Riverpod, feature flags, configuration à distance, SDK d’IA BYOK, droits premium, notifications, liens profonds, ainsi que les moteurs de tableau de bord, de plugins, de recherche et de paramètres.
- Dépend de
- Aucune — couche de base
- Utilisé par
- Couche domaine produit · Couche écosystème · Capacités d’IA · Modules grand public · Modules entreprise · Système de design · Adaptateurs Firebase
Réutilisation partagée, expérience propre au produit
La doctrine de la plateforme vise au moins quatre-vingt-dix pour cent des capacités d’exécution héritées par produit. Un produit possède son domaine, ses fonctionnalités verticales, son profil d’IA, ses catalogues et son image de marque — rien d’autre.
Les règles qui font tenir le système
- 01Des ports plutôt que des SDK : le code vertical dépend des interfaces After, jamais des SDK des fournisseurs.
- 02Les modules verticaux vivent uniquement dans les dépôts produit, sous lib/features/.
- 03Chaque port est livré avec un mock, pour que les squelettes tournent sans backend.
- 04Générer plutôt que repartir de zéro : un nouveau produit part d’une spec, pas d’une nouvelle architecture.
02 · Fabrique de produits
De l’idée au produit fonctionnel, sur une base réutilisable.
La fabrique de produits transforme un petit product.spec.yaml en une app Flutter sœur qui dépend des packages partagés. La spec ne contient que ce qui est propre au produit.
- 01
Idée
Nommez le produit et choisissez une ligne : grand public ou entreprise, avec SuperGarage ou SuperHospital comme référence.
- 02
Domaine
Rédigez product.spec.yaml : domaine, fonctionnalités verticales, onglets, permissions, widgets du tableau de bord, compétences IA, image de marque, langues.
- 03
Modules
Tout ce qui n’est pas dans la spec — auth, adhésion ou organisation, RBAC, calendrier, tâches, notifications, recherche — est hérité.
- 04
Shell produit
generate_product.ps1 génère le manifeste, la racine de composition, le catalogue de fonctionnalités, le shell, les fichiers l10n et un workflow CI.
- 05
Déploiement
Le workflow CI généré exécute formatage, analyse et tests avec couverture à chaque push et pull request vers main.
Le produit possède
- Nom, package, bundle, ligne de produits
- Fonctionnalités verticales et clés i18n
- Onglets de navigation
- Chaînes de permissions RBAC
- Widgets du tableau de bord
- Compétences IA et liaisons d’outils
- Couleur d’accent et monogramme
La plateforme fournit
- Auth et superadmin
- Adhésion ou organisation
- Moteur RBAC et journal d’audit
- Calendrier, tâches, documents
- Notifications et analytique
- Moteurs de workflow, de tableau de bord et de recherche
- Système de design, écran de démarrage, CI
Relancer le générateur avec une spec modifiée met à jour les fichiers squelettes sans détruire le code de fonctionnalités écrit à la main.
03 · Packages et capacités
Sept packages. Des dépendances explicites.
Tous les packages sont en version 1.0.0 dans le dépôt supercore et sont consommés via des dépendances par chemin. Sélectionnez un package pour suivre ses dépendances et ce qui dépend de lui.
Noyau partagé
after_core
Ports et implémentations par défaut pour l’auth, le réseau, le stockage, la DI, l’analytique, les feature flags, la configuration à distance, l’IA, les notifications, les liens profonds et les droits premium. Les produits remplacent les providers Riverpod par leurs propres adaptateurs.
- Dépend de
- Aucune — couche de base
- Utilisé par
API clés
- AppPlatformManifest
- PlatformConfig
- AfterStandardOverrides
- AfterBootstrapMode
- AfterAuthRepository
- AfterApiClient
- AfterHttpClientFactory
- AfterFeatureFlags
- AfterRemoteConfig
- AfterAiCredentialVault
Dépendances tierces notables
flutter_riverpod · dio · flutter_secure_storage · shared_preferences · google_sign_in · app_links · flutter_local_notifications
Exemple
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(),
),
);
}Source supercore/packages/after_core/README.md (s’ouvre dans un nouvel onglet)
Trame d’écosystème
after_ecosystem
After ID, After+, le bus d’événements, les API interproduits, les services partagés et le contexte IA de l’écosystème, pour que les modules grand public et entreprise se comportent comme un seul système.
- Dépend de
- Utilisé par
API clés
- AfterEventBus
- AfterProductApi
- AfterProductApiRegistry
- AfterSecureInteropBridge
- AfterEcosystemAiContext
- afterEcosystemProvider
Dépendances tierces notables
flutter_riverpod · uuid
Exemple
{
"id": "evt_…",
"type": "garage.maintenance.completed",
"sourceProductId": "super_garage",
"afterId": "aid_…",
"organizationId": null,
"occurredAt": "2026-07-19T20:00:00Z",
"correlationId": "corr_…",
"payload": { }
}Source supercore/docs/AFTER_ECOSYSTEM_PLATFORM.md (s’ouvre dans un nouvel onglet)
Plateforme de capacités d’IA
after_ai
Une couche d’IA modulaire : les produits choisissent un AfterAiProfile qui active des capacités. Appeler une capacité désactivée lève une exception. Chaque capacité est livrée avec un adaptateur mock.
- Dépend de
- Utilisé par
- Aucun package n’en dépend
API clés
- AfterAiPlatform
- AfterAiProfile
- AfterAiCapability
- AfterAiCapabilityDisabledException
- afterAiProfileProvider
- afterAiPlatformProvider
- AfterToolCallingAi
- AfterAiPluginRegistry
Dépendances tierces notables
flutter_riverpod · uuid
Exemple
// after_framework.dart
afterAiProfileProvider.overrideWithValue(AfterAiProfile.superGarage),
// feature code
final ai = ref.watch(afterAiPlatformProvider);
if (ai.canChat) {
final reply = await ai.chat(message: input);
}Source supercore/packages/after_ai/README.md (s’ouvre dans un nouvel onglet)
Système de design
after_design_system
Le langage visuel partagé : tokens de couleur, d’espacement, de rayon, de mouvement et de typographie, données de thème Material 3 et composants partagés, identiques d’une ligne de produits à l’autre.
- Dépend de
- Utilisé par
API clés
- AfterThemeData
- AfterTheme
- AfterColors
- AfterSpacing
- AfterRadius
- AfterMotion
- AfterFadeSlide
Dépendances tierces notables
shared_preferences
Exemple
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)),
);Modules grand public
after_consumer
Une couche B2C volontairement légère au-dessus du noyau : adhésion, catalogue de fonctionnalités grand public, coffre personnel, consentement au lancement, localisation régionale et chrome du shell de la famille.
- Dépend de
- Utilisé par
- Aucun package n’en dépend
API clés
- ConsumerMembership
- ConsumerCoreFeatureId
- ConsumerVerticalFeature
- PersonalVaultRepository
- consumerMembershipProvider
- personalVaultRepositoryProvider
Dépendances tierces notables
flutter_riverpod · geolocator · geocoding · image_picker · permission_handler
Exemple
dependencies:
after_core:
path: ../supercore/packages/after_core
after_consumer:
path: ../supercore/packages/after_consumer
after_design_system:
path: ../supercore/packages/after_design_systemModules entreprise
after_enterprise
Quatorze ports B2B partagés avec des mocks en mémoire déterministes, une isolation des locataires en refus par défaut via EnterpriseScope, ainsi qu’un runtime produit et un hôte de shell.
- Dépend de
- Utilisé par
- Aucun package n’en dépend
API clés
- EnterpriseScope
- OrganizationRepository
- RbacRepository
- PermissionSet
- WorkflowEngine
- TaskRepository
- CalendarRepository
- DocumentRepository
- EnterpriseAiAssistant
- AuditLogRepository
Dépendances tierces notables
flutter_riverpod · collection · uuid
Exemple
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(),
),
];
}Source supercore/templates/super_app_enterprise/after_framework.dart (s’ouvre dans un nouvel onglet)
Adaptateurs Firebase
after_firebase
Adaptateurs Firebase Auth, blobs Firestore et médias Storage pour la racine de composition. Si Firebase n’est pas configuré ou ne démarre pas, il se rabat sur des adaptateurs locaux au lieu de planter.
- Dépend de
- Utilisé par
API clés
- AfterFirebaseBootstrap
- FirebaseAfterAuthRepository
- FirestoreAfterUserBlobSync
- FirebaseAfterUserMediaSync
- AfterFirebaseCloudAvailability
Dépendances tierces notables
firebase_core · firebase_auth · cloud_firestore · firebase_storage · google_sign_in
Exemple
// 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 et workflow développeur
Des scripts et des commandes Flutter, pas de magie.
L’outillage se trouve dans supercore/scripts sous forme de scripts PowerShell, aux côtés de la chaîne d’outils Flutter standard. Il n’existe pas de binaire CLI packagé séparé.
Initialiser
Validez une spec sans Flutter, puis générez l’app sœur et amorcez-la.
powershell -File scripts\validate_product_spec.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yamlSource supercore/factory/README.md (s’ouvre dans un nouvel onglet)
# 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 -DryRunSource supercore/factory/README.md (s’ouvre dans un nouvel onglet)
cd ..\superairport
flutter create .
flutter pub get
flutter analyze
flutter testComposer les packages
Dépendez du noyau, d’une couche de ligne de produits et du système de design via des dépendances par chemin.
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_systemConfigurer
Déclarez l’identité dans AppPlatformManifest. Le mode squelette autorise les mocks ; le mode production échoue au démarrage si un adaptateur manque.
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,
);Source supercore/docs/AFTER_OS_ARCHITECTURE.md (s’ouvre dans un nouvel onglet)
/// 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,
}Tester
Formatez, analysez et testez avec couverture, puis vérifiez le produit au regard du contrat de réutilisation de la plateforme.
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 ..\superairportSource supercore/scripts/generate_product.ps1 · docs/PLATFORM_DOCTRINE.md (s’ouvre dans un nouvel onglet)
Déployer
Les produits générés incluent un workflow GitHub Actions d’analyse et de tests. La signature des releases Android est configurée par un script 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 --coverageSource supercore/scripts/generate_product.ps1 (.github/workflows/ci.yml) (s’ouvre dans un nouvel onglet)
# 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 -BuildAabSource supercore/scripts/wire_play_release_signing.ps1 (s’ouvre dans un nouvel onglet)
05 · Du framework aux vrais produits
Des capacités partagées deviennent des expériences propres à chaque produit.
SuperGarage est la référence grand public en production. Chaque écran ci-dessous est une vraie capture des stores ; la surcouche indique ce qui vient de la plateforme et ce qui appartient au produit.




Carte des capacités de SuperGarage
Identifiants importés par supergarage/lib, regroupés par package propriétaire.
after_core
- AfterUserPlan
- AfterAiCredentialVault
- AfterLocalNotifications
after_consumer
- FamilyShellHeader
- AfterRegionalLocation
after_firebase
- AfterFirebaseBootstrap
Fonctionnalités produit
- features/vehicle
- features/maintenance
- features/obd
- features/expenses
- features/fleet
- features/trips
- features/assistant
- features/community
Famille de produits
Statut tel qu’enregistré dans supercore/catalog/products.yaml. Seul SuperGarage est marqué en production.

SuperGarage
Grand public · Référence
Mobilité : véhicules, entretien, assurance, carburant, OBD, flotte
En productionSuperGarage (s’ouvre dans un nouvel onglet)after_core · after_design_system · after_firebase · after_consumer

AfterHub
Grand public · Shell OS
Shell OS grand public : identité, tableau de bord, IA, calendrier, recherche, After+
Squeletteafter_ai · after_consumer · after_core · after_firebase · after_design_system · after_ecosystem

SuperHospital
Entreprise · Référence
Opérations hospitalières — référence entreprise
Squelette
SuperHealth
Grand public
Santé personnelle : médicaments, dossiers, sommeil, nutrition

SuperFinance
Grand public
Finances personnelles : abonnements, budgets, investissements
Squelette
SuperHome
Grand public
Logement et foyer : entretien, charges, garanties
Squelette
SuperTravel
Grand public
Voyages : séjours, vols, hôtels, itinéraires
Squelette
SuperPet
Grand public
Animaux : soins vétérinaires, alimentation, dossiers de santé
Squelette
SuperNews
Grand public
Actualités personnalisées par l’IA, avec résumés

SuperSports
Grand public
Sport et performance : forme physique, scores, rencontres

SuperAirport
Entreprise
Opérations aéroportuaires : vols, portes, pistes
Squelette
SuperMaritime
Entreprise
Opérations portuaires et navires
Squelette
SuperFactory
Entreprise
MES d’atelier et maintenance en usine
Squelette
SuperFarm
Entreprise
Exploitation agricole : cultures, bétail, équipements
Squelette
06 · Système de design
Cohérent sans être uniforme.
after_design_system donne à chaque produit le même chrome, la même densité et le même mouvement. Les produits changent leur accent, leur monogramme, leurs fonctionnalités et leurs textes — pas le système.
Tokens
Couleurs, espacements, rayons et mouvements sont des constantes Dart, partagées par le grand public et l’entreprise.
Couleur
- accent#38BDF8
- accentDeep#0284C7
- graphite950#0B0C0F
- graphite800#222831
- steel#8A919D
- lightBackground#FAFBFC
- success#22C55E
- warning#F59E0B
- danger#EF4444
Espacement · échelle de 4 pt
- xs4
- sm8
- md12
- lg16
- xxl24
- xxxl32
- massive48
- hero64
Rayon
- 6
- 8
- 12
- 16
- 20
Mouvement
- instant100ms
- fast · micro180ms
- normal · page280ms
- slow · modal420ms
- emphasis560ms
Composants
Boutons, cartes, champs, navigation, boîtes de dialogue, graphiques, tableau de bord, états vides et de chargement, sections de paramètres et barre supérieure du 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é
Les palettes claire et sombre sont livrées ensemble. Les séries des graphiques sont ordonnées pour rester distinguables, et les tokens de mouvement gardent des transitions courtes et utiles.
Comportement adaptatif
Les marges de page et la largeur du contenu s’adaptent à la largeur de la fenêtre via AfterSpacing.
| Largeur de la fenêtre | Contenu max. | Marge de page |
|---|---|---|
| < 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 |
Extension de marque
Chaque spec produit déclare un accent et un monogramme. Le thème reçoit l’accent via accentOverride ; tout le reste demeure dans la famille.
- SuperGarage#22D3EE
- SuperKids#F472B6
- SuperHospital#F43F5E
- SuperFactory#F59E0B
07 · Documentation
Une documentation pensée pour être parcourue.
Chaque page est issue du dépôt supercore et renvoie à son fichier source.
- Recherche instantanée avec raccourci clavier
- Table des matières fixe avec liens profonds
- Boutons de copie et coloration syntaxique dans les deux thèmes
- Pages de packages avec graphes de dépendances
- Diagrammes d’architecture avec alternatives statiques
- Disponible en dix langues, avec prise en charge de la lecture de droite à gauche
08 · Frontières entreprise
Des frontières qui refusent par défaut.
L’isolation entreprise est imposée dans le code et consignée dans des enregistrements de décisions d’architecture.
Multilocation en refus par défaut
Les ports entreprise liés à une organisation exigent un EnterpriseScope. Un organizationId manquant lève une exception — ils ne renvoient jamais tous les locataires.
Permissions avant persistance
Les fonctionnalités verticales vérifient PermissionSet.allows(...) avant tout appel de mutation. Les produits déclarent leurs propres chaînes de permissions.
Audit en ajout seul
Chaque action entreprise de mutation doit ajouter un AuditLogEntry à l’AuditLogRepository en ajout seul.
Interop sécurisée uniquement
Les appels interproduits passent par AfterSecureInteropBridge : audience After ID, portées, RBAC et appartenance à l’organisation, puis une entrée d’audit obligatoire.
Amorçage à échec rapide
En mode production, un adaptateur manquant lève une exception au démarrage : les providers mock ne peuvent pas atteindre la production en silence.
Modulaire par construction
Les vrais backends remplacent MockEnterpriseRepository à la racine de composition. La couche OS ne connaît jamais le nom du fournisseur.
/// 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;
}
}Il s’agit de contrôles d’architecture documentés dans le dépôt supercore. After Framework ne revendique aucune certification ni conformité réglementaire.
Frontières entrepriseAllégez le produit. Renforcez les fondations.
Commencez par l’architecture, lisez la documentation des packages ou explorez la source.