Crea productos sobre un framework operativo compartido.
Construye una vez. Lanza en todos los dominios.
After Framework da a los productos una base compartida: arquitectura, identidad, IA, sistemas de diseño, herramientas y módulos de dominio reutilizables.
01 · Arquitectura del framework
Un kernel. Dos líneas de producto. Productos ligeros encima.
Todos los productos comparten las mismas capas. Añadir un Life Domain o un Industry Domain añade un módulo arriba; las capas inferiores no cambian.
Específico del producto
Plataforma compartida
Adaptadores de la raíz de composición
Selecciona una capa para ver qué le pertenece y de qué depende.
after_core
Kernel compartido
Auth, red reforzada, almacenamiento, DI con Riverpod, flags, configuración remota, SDK de IA BYOK, derechos premium, notificaciones, deep links y los motores de dashboard, plugins, búsqueda y ajustes.
- Depende de
- Ninguna: capa base
- Usado por
- Capa de dominio del producto · Capa de ecosistema · Capacidades de IA · Módulos consumer · Módulos enterprise · Sistema de diseño · Adaptadores de Firebase
Reutilización compartida, experiencia propia
La doctrina de la plataforma apunta a que cada producto herede un noventa por ciento o más de su capacidad en tiempo de ejecución. Un producto posee su dominio, funcionalidades verticales, perfil de IA, catálogos y marca; nada más.
Reglas que sostienen el sistema
- 01Puertos antes que SDK: el código vertical depende de interfaces de After, nunca de SDK de proveedores.
- 02Los módulos verticales viven solo en repositorios de producto, en lib/features/.
- 03Cada puerto incluye un mock, así los scaffolds funcionan sin backend.
- 04Generar, no empezar de cero: los productos nuevos parten de una spec, no de una arquitectura nueva.
02 · Fábrica de productos
De la idea al producto funcional sobre una base reutilizable.
La fábrica de productos convierte un pequeño product.spec.yaml en una app Flutter hermana que depende de los paquetes compartidos. La spec contiene solo lo exclusivo del producto.
- 01
Idea
Nombra el producto y elige una línea: consumer o enterprise, con SuperGarage o SuperHospital como referencia.
- 02
Dominio
Escribe product.spec.yaml: dominio, funcionalidades verticales, pestañas, permisos, widgets de dashboard, habilidades de IA, marca, idiomas.
- 03
Módulos
Todo lo que no está en la spec —auth, membresía u organización, RBAC, calendario, tareas, notificaciones, búsqueda— se hereda.
- 04
Shell del producto
generate_product.ps1 genera el manifiesto, la raíz de composición, el catálogo de funcionalidades, el shell, los archivos l10n y un workflow de CI.
- 05
Despliegue
El workflow de CI generado ejecuta formato, análisis y tests con cobertura en cada push y pull request a main.
El producto posee
- Nombre, paquete, bundle, línea de producto
- Funcionalidades verticales y claves i18n
- Pestañas de navegación
- Cadenas de permisos RBAC
- Widgets de dashboard
- Habilidades de IA y enlaces a herramientas
- Color de acento y monograma
La plataforma aporta
- Auth y superadmin
- Membresía u organización
- Motor RBAC y registro de auditoría
- Calendario, tareas, documentos
- Notificaciones y analítica
- Motores de workflow, dashboard y búsqueda
- Sistema de diseño, splash, CI
Volver a ejecutar el generador con una spec actualizada renueva los archivos esqueleto sin destruir el código de funcionalidades escrito a mano.
03 · Paquetes y capacidades
Siete paquetes. Dependencias explícitas.
Todos los paquetes están en la versión 1.0.0 en el repositorio supercore y se consumen mediante dependencias de ruta. Selecciona un paquete para ver de qué depende y qué depende de él.
Kernel compartido
after_core
Puertos e implementaciones por defecto para auth, red, almacenamiento, DI, analítica, feature flags, configuración remota, IA, notificaciones, deep links y derechos premium. Los productos sobrescriben providers de Riverpod con sus propios adaptadores.
- Depende de
- Ninguna: capa base
- Usado por
API clave
- AppPlatformManifest
- PlatformConfig
- AfterStandardOverrides
- AfterBootstrapMode
- AfterAuthRepository
- AfterApiClient
- AfterHttpClientFactory
- AfterFeatureFlags
- AfterRemoteConfig
- AfterAiCredentialVault
Dependencias de terceros destacadas
flutter_riverpod · dio · flutter_secure_storage · shared_preferences · google_sign_in · app_links · flutter_local_notifications
Ejemplo
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(),
),
);
}Fuente supercore/packages/after_core/README.md (se abre en una pestaña nueva)
Tejido de ecosistema
after_ecosystem
After ID, After+, el bus de eventos, las API entre productos, los servicios compartidos y el contexto de IA del ecosistema, para que los módulos consumer y enterprise se comporten como un solo sistema.
- Depende de
- Usado por
API clave
- AfterEventBus
- AfterProductApi
- AfterProductApiRegistry
- AfterSecureInteropBridge
- AfterEcosystemAiContext
- afterEcosystemProvider
Dependencias de terceros destacadas
flutter_riverpod · uuid
Ejemplo
{
"id": "evt_…",
"type": "garage.maintenance.completed",
"sourceProductId": "super_garage",
"afterId": "aid_…",
"organizationId": null,
"occurredAt": "2026-07-19T20:00:00Z",
"correlationId": "corr_…",
"payload": { }
}Fuente supercore/docs/AFTER_ECOSYSTEM_PLATFORM.md (se abre en una pestaña nueva)
Plataforma de capacidades de IA
after_ai
Una capa de IA modular: los productos eligen un AfterAiProfile que activa capacidades. Llamar a una capacidad desactivada lanza una excepción. Cada capacidad incluye un adaptador mock.
- Depende de
- Usado por
- Ningún paquete depende de él
API clave
- AfterAiPlatform
- AfterAiProfile
- AfterAiCapability
- AfterAiCapabilityDisabledException
- afterAiProfileProvider
- afterAiPlatformProvider
- AfterToolCallingAi
- AfterAiPluginRegistry
Dependencias de terceros destacadas
flutter_riverpod · uuid
Ejemplo
// after_framework.dart
afterAiProfileProvider.overrideWithValue(AfterAiProfile.superGarage),
// feature code
final ai = ref.watch(afterAiPlatformProvider);
if (ai.canChat) {
final reply = await ai.chat(message: input);
}Fuente supercore/packages/after_ai/README.md (se abre en una pestaña nueva)
Sistema de diseño
after_design_system
El lenguaje visual compartido: tokens de color, espaciado, radio, movimiento y tipografía, datos de tema Material 3 y componentes compartidos, idénticos en todas las líneas de producto.
- Depende de
- Usado por
API clave
- AfterThemeData
- AfterTheme
- AfterColors
- AfterSpacing
- AfterRadius
- AfterMotion
- AfterFadeSlide
Dependencias de terceros destacadas
shared_preferences
Ejemplo
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)),
);Fuente supercore/packages/after_design_system/lib/src/foundations/theme.dart (se abre en una pestaña nueva)
Módulos consumer
after_consumer
Una capa B2C deliberadamente ligera sobre el kernel: membresía, catálogo de funcionalidades consumer, bóveda personal, consentimiento de lanzamiento, ubicación regional y el chrome del shell de la familia.
- Depende de
- Usado por
- Ningún paquete depende de él
API clave
- ConsumerMembership
- ConsumerCoreFeatureId
- ConsumerVerticalFeature
- PersonalVaultRepository
- consumerMembershipProvider
- personalVaultRepositoryProvider
Dependencias de terceros destacadas
flutter_riverpod · geolocator · geocoding · image_picker · permission_handler
Ejemplo
dependencies:
after_core:
path: ../supercore/packages/after_core
after_consumer:
path: ../supercore/packages/after_consumer
after_design_system:
path: ../supercore/packages/after_design_systemMódulos enterprise
after_enterprise
Catorce puertos B2B compartidos con mocks deterministas en memoria, tenencia fail-closed mediante EnterpriseScope, y un runtime y host de shell para productos.
- Depende de
- Usado por
- Ningún paquete depende de él
API clave
- EnterpriseScope
- OrganizationRepository
- RbacRepository
- PermissionSet
- WorkflowEngine
- TaskRepository
- CalendarRepository
- DocumentRepository
- EnterpriseAiAssistant
- AuditLogRepository
Dependencias de terceros destacadas
flutter_riverpod · collection · uuid
Ejemplo
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(),
),
];
}Fuente supercore/templates/super_app_enterprise/after_framework.dart (se abre en una pestaña nueva)
Adaptadores de Firebase
after_firebase
Adaptadores de Firebase Auth, blobs de Firestore y medios de Storage para la raíz de composición. Si Firebase no está configurado o no arranca, recurre a adaptadores locales en lugar de fallar.
- Depende de
- Usado por
API clave
- AfterFirebaseBootstrap
- FirebaseAfterAuthRepository
- FirestoreAfterUserBlobSync
- FirebaseAfterUserMediaSync
- AfterFirebaseCloudAvailability
Dependencias de terceros destacadas
firebase_core · firebase_auth · cloud_firestore · firebase_storage · google_sign_in
Ejemplo
// 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 y flujo de desarrollo
Scripts y comandos de Flutter, sin magia.
Las herramientas viven en supercore/scripts como scripts de PowerShell, junto a la toolchain estándar de Flutter. No existe un binario CLI empaquetado aparte.
Inicializar
Valida una spec sin Flutter y luego genera la app hermana y arráncala.
powershell -File scripts\validate_product_spec.ps1 -SpecPath factory\specs\examples\super_airport.product.spec.yamlFuente supercore/factory/README.md (se abre en una pestaña nueva)
# 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 -DryRunFuente supercore/factory/README.md (se abre en una pestaña nueva)
cd ..\superairport
flutter create .
flutter pub get
flutter analyze
flutter testComponer paquetes
Depende del kernel, de una capa de línea de producto y del sistema de diseño mediante dependencias de ruta.
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_systemConfigurar
Declara la identidad en AppPlatformManifest. El modo scaffold permite mocks; el modo producción falla al arrancar si falta un adaptador.
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,
);Fuente supercore/docs/AFTER_OS_ARCHITECTURE.md (se abre en una pestaña nueva)
/// 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,
}Probar
Formatea, analiza y prueba con cobertura; después verifica el producto frente al contrato de reutilización.
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 ..\superairportFuente supercore/scripts/generate_product.ps1 · docs/PLATFORM_DOCTRINE.md (se abre en una pestaña nueva)
Desplegar
Los productos generados incluyen un workflow de GitHub Actions de análisis y tests. La firma de releases de Android la configura un script de 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 --coverageFuente supercore/scripts/generate_product.ps1 (.github/workflows/ci.yml) (se abre en una pestaña nueva)
# 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 -BuildAabFuente supercore/scripts/wire_play_release_signing.ps1 (se abre en una pestaña nueva)
05 · Del framework a productos reales
Capacidades compartidas, experiencias propias de cada producto.
SuperGarage es la referencia consumer ya publicada. Cada pantalla es una captura real de la tienda; la superposición indica qué viene de la plataforma y qué es del producto.




Mapa de capacidades de SuperGarage
Identificadores importados por supergarage/lib, agrupados por paquete propietario.
after_core
- AfterUserPlan
- AfterAiCredentialVault
- AfterLocalNotifications
after_consumer
- FamilyShellHeader
- AfterRegionalLocation
after_firebase
- AfterFirebaseBootstrap
Funcionalidades del producto
- features/vehicle
- features/maintenance
- features/obd
- features/expenses
- features/fleet
- features/trips
- features/assistant
- features/community
Familia de productos
Estado según supercore/catalog/products.yaml. Solo SuperGarage figura como publicado.

SuperGarage
Consumer · Referencia
Movilidad: vehículos, mantenimiento, seguros, combustible, OBD, flotas
after_core · after_design_system · after_firebase · after_consumer

AfterHub
Consumer · Shell del SO
Shell de SO consumer: identidad, dashboard, IA, calendario, búsqueda, After+
Scaffoldafter_ai · after_consumer · after_core · after_firebase · after_design_system · after_ecosystem

SuperHospital
Enterprise · Referencia
Operaciones hospitalarias: referencia enterprise
Scaffold
SuperHealth
Consumer
Salud personal: medicación, historiales, sueño, nutrición

SuperFinance
Consumer
Finanzas personales: suscripciones, presupuestos, inversiones
Scaffold
SuperHome
Consumer
Vivienda y hogar: mantenimiento, suministros, garantías
Scaffold
SuperTravel
Consumer
Viajes: escapadas, vuelos, hoteles, itinerarios
Scaffold
SuperPet
Consumer
Mascotas: atención veterinaria, comida, historial de salud
Scaffold
SuperNews
Consumer
Noticias personalizadas con IA y resúmenes

SuperSports
Consumer
Deporte y rendimiento: fitness, resultados, calendario

SuperAirport
Enterprise
Operaciones aeroportuarias: vuelos, puertas, pistas
Scaffold
SuperMaritime
Enterprise
Operaciones portuarias y de buques
Scaffold
SuperFactory
Enterprise
MES y mantenimiento en planta
Scaffold
SuperFarm
Enterprise
Operaciones agrícolas: cultivos, ganado, maquinaria
Scaffold
06 · Sistema de diseño
Coherencia sin uniformidad.
after_design_system da a todos los productos el mismo chrome, densidad y movimiento. Los productos cambian su acento, monograma, funcionalidades y textos, no el sistema.
Tokens
Color, espaciado, radio y movimiento son constantes de Dart, compartidas por consumer y enterprise.
Color
- accent#38BDF8
- accentDeep#0284C7
- graphite950#0B0C0F
- graphite800#222831
- steel#8A919D
- lightBackground#FAFBFC
- success#22C55E
- warning#F59E0B
- danger#EF4444
Espaciado · escala de 4 pt
- xs4
- sm8
- md12
- lg16
- xxl24
- xxxl32
- massive48
- hero64
Radio
- 6
- 8
- 12
- 16
- 20
Movimiento
- instant100ms
- fast · micro180ms
- normal · page280ms
- slow · modal420ms
- emphasis560ms
Componentes
Botones, tarjetas, campos, navegación, diálogos, gráficos, dashboard, estados vacíos y de carga, secciones de ajustes y la barra superior del 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
Accesibilidad
Los esquemas de color claro y oscuro se incluyen juntos. Las series de los gráficos se ordenan para seguir siendo distinguibles, y los tokens de movimiento mantienen transiciones breves y con propósito.
Comportamiento adaptable
El padding de página y el ancho del contenido se adaptan al ancho del viewport mediante AfterSpacing.
| Ancho del viewport | Ancho máx. del contenido | Padding de página |
|---|---|---|
| < 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 |
Extensión de marca
Cada spec de producto declara un acento y un monograma. El tema recibe el acento mediante accentOverride; todo lo demás se mantiene en la familia.
- SuperGarage#22D3EE
- SuperKids#F472B6
- SuperHospital#F43F5E
- SuperFactory#F59E0B
07 · Documentación
Documentación pensada para escanear.
Cada página se deriva del repositorio supercore y enlaza a su archivo fuente.
- Búsqueda instantánea con atajo de teclado
- Índice fijo con enlaces profundos
- Botones de copia y resaltado de sintaxis en ambos temas
- Páginas de paquetes con grafos de dependencias
- Diagramas de arquitectura con alternativas estáticas
- Disponible en diez idiomas, con soporte de derecha a izquierda
08 · Límites enterprise
Límites que fallan de forma cerrada.
El aislamiento enterprise se aplica en el código y se documenta en registros de decisiones de arquitectura.
Tenencia fail-closed
Los puertos enterprise con ámbito de organización exigen un EnterpriseScope. Si falta organizationId se lanza una excepción; nunca devuelven todos los tenants.
Permisos antes de persistir
Las funcionalidades verticales comprueban PermissionSet.allows(...) antes de cualquier llamada que modifique datos. Los productos declaran sus propias cadenas de permisos.
Auditoría solo de adición
Cada acción enterprise que modifique datos debe añadir un AuditLogEntry al AuditLogRepository de solo adición.
Solo interoperabilidad segura
Las llamadas entre productos pasan por AfterSecureInteropBridge: audiencia de After ID, scopes, RBAC y pertenencia a la organización, y luego una entrada de auditoría obligatoria.
Arranque fail-fast
En modo producción, un adaptador ausente lanza una excepción al arrancar, así los providers mock no pueden llegar a producción sin avisar.
Modular por diseño
Los backends reales sustituyen a MockEnterpriseRepository en la raíz de composición. La capa de SO nunca conoce el nombre del proveedor.
/// 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;
}
}Estos son controles de arquitectura documentados en el repositorio supercore. After Framework no afirma tener certificaciones ni cumplimiento normativo.
Límites enterpriseHaz el producto más pequeño. Haz la base más sólida.
Empieza por la arquitectura, lee la documentación de los paquetes o explora el código.