Aperçu techniqueTechnical overviewVisão técnicaVisión técnica
Aperçu technique de SikaflowSikaflow technical overviewVisão técnica do SikaflowVisión técnica de Sikaflow
Sikaflow est une plateforme SaaS B2B multi-tenant de gestion de tontines (épargne rotative communautaire / ROSCA), 100 % serverless sur AWS eu-west-3, alignée sur l'infrastructure de RMS International Group.
Sikaflow is a multi-tenant B2B SaaS platform for managing tontines (rotating community savings / ROSCA), fully serverless on AWS eu-west-3, aligned with the RMS International Group infrastructure.
O Sikaflow é uma plataforma SaaS B2B multi-tenant de gestão de tontinas (poupança rotativa comunitária / ROSCA), 100 % serverless na AWS eu-west-3, alinhada com a infraestrutura da RMS International Group.
Sikaflow es una plataforma SaaS B2B multi-tenant de gestión de tontinas (ahorro rotativo comunitario / ROSCA), 100 % serverless en AWS eu-west-3, alineada con la infraestructura de RMS International Group.
Rôles & modèle métierRoles & business modelFunções & modelo de negócioRoles & modelo de negocio
Trois espaces isolés, trois rôles Keycloak. Les gestionnaires sont les clients payants ; RMS supervise la plateforme ; les participants disposent d'un espace personnel restreint.
Three isolated spaces, three Keycloak roles. Managers are the paying customers; RMS supervises the platform; participants get a restricted personal space.
Três espaços isolados, três funções Keycloak. Os gestores são os clientes pagantes; a RMS supervisiona a plataforma; os participantes têm um espaço pessoal restrito.
Tres espacios aislados, tres roles Keycloak. Los gestores son los clientes que pagan; RMS supervisa la plataforma; los participantes disponen de un espacio personal restringido.
🔑Règle d'orGolden ruleRegra de ouroRegla de oro
Un gestionnaire ne voit jamais les données d'un autre. Le tenantId provient toujours du JWT Keycloak, jamais du corps de requête. Revenus : accès gratuit + forfaits optionnels (Starter / Pro / Business) ; le gestionnaire fixe sa commission (1–10 %) et Sikaflow en garde une part fixe de 25 %.
A manager never sees another's data. The tenantId always comes from the Keycloak JWT, never from the request body. Revenue: free access + optional plans (Starter / Pro / Business); the manager sets their commission (1–10%) and Sikaflow keeps a flat 25% of it.
Um gestor nunca vê os dados de outro. O tenantId vem sempre do JWT Keycloak, nunca do corpo do pedido. Receitas: acesso gratuito + planos opcionais (Starter / Pro / Business); o gestor define a sua comissão (1–10%) e a Sikaflow guarda uma parte fixa de 25%.
Un gestor nunca ve los datos de otro. El tenantId proviene siempre del JWT de Keycloak, nunca del cuerpo de la petición. Ingresos: acceso gratuito + planes opcionales (Starter / Pro / Business); el gestor fija su comisión (1–10%) y Sikaflow se queda con una parte fija del 25%.
ArchitectureArchitectureArquiteturaArquitectura
Frontend statique diffusé par CloudFront ; authentification déléguée à Keycloak (PKCE / OIDC) ; API Lambda derrière un authorizer qui résout le tenant depuis le JWT ; données en DynamoDB single-table ; un scheduler EventBridge horaire pilote le moteur de cycles.
Static frontend served by CloudFront; authentication delegated to Keycloak (PKCE / OIDC); Lambda API behind an authorizer that resolves the tenant from the JWT; data in a DynamoDB single table; an hourly EventBridge scheduler drives the cycle engine.
Frontend estático servido pelo CloudFront; autenticação delegada ao Keycloak (PKCE / OIDC); API Lambda atrás de um authorizer que resolve o tenant a partir do JWT; dados numa tabela única DynamoDB; um scheduler EventBridge horário conduz o motor de ciclos.
Frontend estático servido por CloudFront; autenticación delegada a Keycloak (PKCE / OIDC); API Lambda tras un authorizer que resuelve el tenant desde el JWT; datos en una tabla única DynamoDB; un scheduler EventBridge horario impulsa el motor de ciclos.
Navigateur (SPA statique, FR/EN/PT/ES)
|
v
CloudFront + S3 ────────────── Keycloak (realm « sikaflow », OIDC/PKCE)
sikaflow.grouperms.com | rôles + tenantId
| |
| JWT (tenantId injecté par l'authorizer)
v
API Gateway REST -> Lambda API (Node.js 20)
routeur : 12 handlers / 9 librairies
| | |
v v v
DynamoDB FedaPay / Stripe SES / SNS
single-table webhooks + notifications
TENANT#<id> réconciliation
^
EventBridge rate(1 hour) -> Lambda scheduler (moteur de cycles)
La stack, couche par coucheThe stack, layer by layerA stack, camada a camadaEl stack, capa por capa
🖥️
FrontendFrontendFrontendFrontend
HTML / CSS / JS vanilla statique, sans build ni framework. Multilingue FR / EN / PT / ES par bascule de classes CSS, header/footer partagés via includes.js, graphiques SVG inline sans dépendance. ~30 pages. Hébergé sur S3 + CloudFront.
HTML / CSS / static vanilla JS, no build, no framework. Multilingual FR / EN / PT / ES via CSS-class toggling, shared header/footer via includes.js, dependency-free inline SVG charts. ~30 pages. Hosted on S3 + CloudFront.
HTML / CSS / JS vanilla estático, sem build nem framework. Multilingue FR / EN / PT / ES por alternância de classes CSS, header/footer partilhados via includes.js, gráficos SVG inline sem dependências. ~30 páginas. Alojado em S3 + CloudFront.
HTML / CSS / JS vanilla estático, sin build ni framework. Multilingüe FR / EN / PT / ES mediante alternancia de clases CSS, header/footer compartidos vía includes.js, gráficos SVG inline sin dependencias. ~30 páginas. Alojado en S3 + CloudFront.
⚙️
BackendBackendBackendBackend
Node.js 20 sur AWS Lambda + API Gateway REST. Trois Lambdas : l'API principale (routeur, 12 handlers / 9 librairies), le scheduler horaire et le webhook de paiement. SDK AWS v3, jsonwebtoken + jwks-rsa, stripe, axios.
Node.js 20 on AWS Lambda + API Gateway REST. Three Lambdas: the main API (router, 12 handlers / 9 libraries), the hourly scheduler and the payment webhook. AWS SDK v3, jsonwebtoken + jwks-rsa, stripe, axios.
Node.js 20 em AWS Lambda + API Gateway REST. Três Lambdas: a API principal (router, 12 handlers / 9 librarias), o scheduler horário e o webhook de pagamento. AWS SDK v3, jsonwebtoken + jwks-rsa, stripe, axios.
Node.js 20 en AWS Lambda + API Gateway REST. Tres Lambdas: la API principal (router, 12 handlers / 9 librerías), el scheduler horario y el webhook de pago. AWS SDK v3, jsonwebtoken + jwks-rsa, stripe, axios.
🗄️
Base de donnéesDatabaseBase de dadosBase de datos
DynamoDB en single-table design, partitionnée par TENANT#<managerId>, index secondaire GSI1 pour les vues transverses. Protection de suppression activée en production.
DynamoDB in single-table design, partitioned by TENANT#<managerId>, a GSI1 secondary index for cross-cutting views. Deletion protection enabled in production.
DynamoDB em single-table design, particionada por TENANT#<managerId>, índice secundário GSI1 para vistas transversais. Proteção contra eliminação ativa em produção.
DynamoDB en single-table design, particionada por TENANT#<managerId>, índice secundario GSI1 para vistas transversales. Protección contra borrado activada en producción.
🔐
AuthentificationAuthenticationAutenticaçãoAutenticación
Keycloak mutualisé RMS, realm sikaflow, PKCE (S256) pour le client SPA public sikaflow-web. Le scope sikaflow-tenant porte tenantId + rôles + audience. OTP (TOTP) applicable au niveau du realm.
Keycloak shared across RMS, realm sikaflow, PKCE (S256) for the public SPA client sikaflow-web. The sikaflow-tenant scope carries tenantId + roles + audience. OTP (TOTP) applicable realm-wide.
Keycloak partilhado na RMS, realm sikaflow, PKCE (S256) para o cliente SPA público sikaflow-web. O scope sikaflow-tenant leva tenantId + funções + audience. OTP (TOTP) aplicável ao nível do realm.
Keycloak compartido en RMS, realm sikaflow, PKCE (S256) para el cliente SPA público sikaflow-web. El scope sikaflow-tenant lleva tenantId + roles + audience. OTP (TOTP) aplicable a nivel de realm.
💳
PaiementsPaymentsPagamentosPagos
FedaPay (primaire, Mobile Money + cartes, XOF) + Stripe (secondaire, international) + hors-ligne validé par le gestionnaire. Webhooks + réconciliation, garde-fous anti-double-crédit. Clés côté serveur uniquement.
FedaPay (primary, Mobile Money + cards, XOF) + Stripe (secondary, international) + offline validated by the manager. Webhooks + reconciliation, anti-double-credit guards. Keys server-side only.
FedaPay (primário, Mobile Money + cartões, XOF) + Stripe (secundário, internacional) + offline validado pelo gestor. Webhooks + reconciliação, salvaguardas anti-duplo-crédito. Chaves apenas do lado do servidor.
FedaPay (primario, Mobile Money + tarjetas, XOF) + Stripe (secundario, internacional) + offline validado por el gestor. Webhooks + conciliación, salvaguardas anti-doble-abono. Claves solo del lado del servidor.
☁️
Infra as CodeInfra as CodeInfra as CodeInfra as Code
AWS SAM / CloudFormation (infra/template.yaml), environnements preprod / prod paramétrés. Preprod verrouillée (Basic Auth via CloudFront Function + noindex). Secrets en SSM Parameter Store, jamais en clair. Déploiement via deploy.sh.
AWS SAM / CloudFormation (infra/template.yaml), parameterised preprod / prod environments. Preprod locked (Basic Auth via CloudFront Function + noindex). Secrets in SSM Parameter Store, never in cleartext. Deploy via deploy.sh.
AWS SAM / CloudFormation (infra/template.yaml), ambientes preprod / prod parametrizados. Preprod bloqueada (Basic Auth via CloudFront Function + noindex). Segredos em SSM Parameter Store, nunca em claro. Deploy via deploy.sh.
AWS SAM / CloudFormation (infra/template.yaml), entornos preprod / prod parametrizados. Preprod bloqueada (Basic Auth vía CloudFront Function + noindex). Secretos en SSM Parameter Store, nunca en claro. Despliegue vía deploy.sh.
Sécurité & cloisonnement multi-tenantSecurity & multi-tenant isolationSegurança & isolamento multi-tenantSeguridad & aislamiento multi-tenant
- tenantId depuis le JWTtenantId from the JWTtenantId a partir do JWTtenantId desde el JWTJamais depuis la requête ; injecté par l'authorizer d'API Gateway.Never from the request; injected by the API Gateway authorizer.Nunca a partir do pedido; injetado pelo authorizer do API Gateway.Nunca desde la petición; inyectado por el authorizer de API Gateway.
- Partitions DynamoDBDynamoDB partitionsPartições DynamoDBParticiones DynamoDBChaque item préfixé
TENANT#<managerId> ; lecture transverse réservée aux endpoints ADMIN_PLATFORM (plafonnée, drapeau truncated).Every item prefixed TENANT#<managerId>; cross-tenant reads reserved for ADMIN_PLATFORM endpoints (capped, truncated flag).Cada item prefixado TENANT#<managerId>; leitura transversal reservada aos endpoints ADMIN_PLATFORM (limitada, flag truncated).Cada ítem prefijado TENANT#<managerId>; lectura transversal reservada a los endpoints ADMIN_PLATFORM (limitada, flag truncated).
- Secrets & clésSecrets & keysSegredos & chavesSecretos & clavesExclusivement en SSM / Secrets Manager ; clés de paiement côté serveur uniquement.Exclusively in SSM / Secrets Manager; payment keys server-side only.Exclusivamente em SSM / Secrets Manager; chaves de pagamento apenas do lado do servidor.Exclusivamente en SSM / Secrets Manager; claves de pago solo del lado del servidor.
- ObservabilitéObservabilityObservabilidadeObservabilidadLogs d'accès exportables vers le SIEM Wazuh existant ; un test de non-fuite inter-tenant est obligatoire.Access logs exportable to the existing Wazuh SIEM; a cross-tenant leakage test is mandatory.Logs de acesso exportáveis para o SIEM Wazuh existente; um teste de não-fuga inter-tenant é obrigatório.Logs de acceso exportables al SIEM Wazuh existente; una prueba de no fuga inter-tenant es obligatoria.
EnvironnementsEnvironmentsAmbientesEntornos
Qualité & testsQuality & testsQualidade & testesCalidad & pruebas
Les zones à plus haut risque — moteur de cycles et logique de paiement — sont couvertes en priorité, avec un test de non-fuite inter-tenant obligatoire.
The highest-risk areas — cycle engine and payment logic — are covered first, with a mandatory cross-tenant leakage test.
As áreas de maior risco — motor de ciclos e lógica de pagamento — são cobertas prioritariamente, com um teste de não-fuga inter-tenant obrigatório.
Las áreas de mayor riesgo — motor de ciclos y lógica de pago — se cubren de forma prioritaria, con una prueba de no fuga inter-tenant obligatoria.
203
tests JestJest teststestes Jestpruebas Jest
9
suites de testtest suitessuites de testesuites de prueba
12
handlers APIAPI handlershandlers da APIhandlers de API
4
langueslanguagesidiomasidiomas
État du projetProject statusEstado do projetoEstado del proyecto
En production, mode réel actif (Keycloak PKCE + API + 203 tests). Connexion, provisioning des comptes et cycle d'argent (cotisation → décaissement → commission, part Sikaflow 25 %) validés de bout en bout. Restent à finaliser : poser les clés de paiement live puis activer les décaissements, appliquer les en-têtes de sécurité en prod, construire les écrans encore simulés, activer le domaine API custom et brancher les notifications SES/SNS.
In production, real mode on (Keycloak PKCE + API + 203 tests). Login, account provisioning and the money cycle (contribution → disbursement → commission, 25% Sikaflow share) validated end-to-end. Still to finish: set the live payment keys then enable payouts, apply the production security headers, build the remaining stubbed screens, enable the custom API domain, and wire SES/SNS notifications.
Em produção, modo real ativo (Keycloak PKCE + API + 203 testes). Login, provisionamento de contas e ciclo de dinheiro (contribuição → desembolso → comissão, parte Sikaflow 25 %) validados de ponta a ponta. Falta concluir: colocar as chaves de pagamento live e ativar os desembolsos, aplicar os cabeçalhos de segurança em produção, construir os ecrãs ainda simulados, ativar o domínio API personalizado e ligar as notificações SES/SNS.
En producción, modo real activo (Keycloak PKCE + API + 203 pruebas). Inicio de sesión, aprovisionamiento de cuentas y ciclo de dinero (aportación → desembolso → comisión, parte Sikaflow 25 %) validados de extremo a extremo. Queda por finalizar: colocar las claves de pago live y activar los desembolsos, aplicar las cabeceras de seguridad en producción, construir las pantallas aún simuladas, activar el dominio API personalizado y conectar las notificaciones SES/SNS.
ℹ️Détail & prioritésDetail & prioritiesDetalhe & prioridadesDetalle & prioridades
La feuille de route détaille l'état par phase. La documentation technique complète vit dans le dépôt : docs/overview.md, docs/architecture.md, docs/database-schema.md, docs/payments.md.
The roadmap details status by phase. The full technical documentation lives in the repo: docs/overview.md, docs/architecture.md, docs/database-schema.md, docs/payments.md.
O roteiro detalha o estado por fase. A documentação técnica completa está no repositório: docs/overview.md, docs/architecture.md, docs/database-schema.md, docs/payments.md.
La hoja de ruta detalla el estado por fase. La documentación técnica completa vive en el repositorio: docs/overview.md, docs/architecture.md, docs/database-schema.md, docs/payments.md.