plataforma saas multi-tenant

Tudo em um lugar,
orquestrado por IA

Interface conversacional para centralizar operacoes pessoais e corporativas. Evolucao do HubChat — base tecnica solida, segura e pronta para escalar.

Visao Geral

O que e o aerah e de onde ele vem.

O aerah e a evolucao do HubChat: uma plataforma SaaS multi-tenant com interface conversacional, orquestrada por IA. Tudo o que o HubChat faz, o aerah faz — mas com uma base tecnica mais robusta.

aerah.app substitui o HubChat (hubchat.vilaflormoitas.com.br)
aerah
aerah

O que muda

Comparacao direta entre HubChat e aerah.

Seguranca

JWT unico (longa duracao)
Access Token 15min + Refresh Token 7d
Token vazado expira rapido. Refresh rotaciona a cada uso.
Sem CSRF
Token CSRF em formularios e mutacoes
Impede requisicoes forjadas de outros sites.
Sem CSP
Content-Security-Policy rigoroso
Bloqueia XSS, scripts injetados, fontes nao autorizadas.
Apenas OTP
OTP + TOTP (Google Auth) + Passkeys
Multiplas camadas de autenticacao.
Rate limit so no OTP
Rate limit por rota, IP e usuario
Protege todas as rotas contra abuso.
Sem brute force protection
Bloqueio progressivo (3/5/10 tentativas)
Impede ataques de forca bruta no OTP.
Validacao basica
Zod schema validation em todas as rotas
Rejeita dados malformados antes da logica.
Dados em texto plano
Campos sensiveis criptografados (AES-256)
CPF, CNPJ, dados de pagamento protegidos.

Agilidade e Performance

JavaScript puro
TypeScript (backend + frontend)
Type safety, autocomplete, menos bugs.
Vanilla JS SPA 205KB
React 19 + Vite
Componentizacao, hot reload, code splitting.
CSS-in-JS manual
Tailwind CSS 4
Design system consistente, produtividade.
Sem real-time
WebSocket (Socket.io)
Chat real-time, notificacoes push, sem polling.
Sem cache
Redis (sessoes, cache, filas)
Reduz carga no MySQL.
SQL manual
Prisma Migrate
Versionamento de schema, rollback.
Sem testes
Vitest + Supertest + Playwright
Confianca para mudar codigo.
Deploy manual
GitHub Actions CI/CD
Deploy automatico, menos erro humano.

Arquitetura

Tudo em uma pasta
Monorepo com pacotes separados
Escala melhor, deploys independentes.
Arquivos misturando logica
Controller → Service → Repository
Separacao clara, testabilidade.
crudService.js generico
Prisma: repositorios tipados
Mais seguro e previsivel.
OpenAI direto
Anthropic (Claude) + abstraction layer
Claude como provider principal, arquitetura permite trocar sem mudar codigo.

Tech Stack

Tecnologias escolhidas e confirmadas.

Backend

TecnologiaFuncao
Node.js 22+Runtime
TypeScript 5+Linguagem
FastifyFramework HTTP
PrismaORM / Migrations
ZodValidacao de schemas
PinoLogs estruturados
BullMQFilas de processamento
Socket.ioWebSocket real-time
Redis 7+Cache, sessoes, rate limit, filas

Frontend

TecnologiaFuncao
React 19Framework UI
TypeScriptLinguagem
ViteBuild tool + dev server
Tailwind CSS 4Estilizacao
PWA (Workbox)Service Worker
Socket.io ClientReal-time

Banco de Dados e Infra

BancoFuncao
MySQL 8.0Banco principal
Redis 7+Cache, sessoes, filas
InfraFuncao
Docker + ComposeContainerizacao
GitHub ActionsCI/CD
PM2Process manager
NginxReverse proxy

Integracoes

ServicoFuncao
Anthropic (Claude)IA conversacional
WhatsApp (Meta)OTP e notificacoes
Cloudflare R2Storage de arquivos
xGate GlobalPagamentos PIX / crypto
SMTPEmail

Decisoes Tecnicas Confirmadas

DecisaoEscolhaMotivo
FrontendReact 19Ecossistema imenso, libs prontas para modulos complexos
ORMPrismaType-safe, migrations, Studio substitui phpMyAdmin
HTTPFastifyMais rapido que Express, melhor suporte TypeScript
Monorepopnpm WorkspacesSimples, sem dependencia extra como Turborepo

Arquitetura

Estrutura do monorepo, middleware e banco de dados.

Estrutura do Monorepo

aerah/ ├── apps/ │ ├── api/ # Backend Fastify │ │ └── src/ │ │ ├── config/ # Database, redis, env │ │ ├── modules/ # auth, chat, company, contact, │ │ │ # financial, hospitality, payment, session │ │ ├── shared/ # middleware, services, errors, database │ │ ├── jobs/ # Workers BullMQ │ │ └── websocket/ # Socket.io handlers │ │ │ └── web/ # Frontend React │ └── src/ │ ├── components/ # ui, chat, forms, layout │ ├── pages/ # Views │ ├── hooks/ # useAuth, useChat │ ├── services/ # API clients │ └── stores/ # Estado global │ ├── packages/shared/ # Types, constants, schemas ├── docker/ # Dockerfiles + compose └── .github/workflows/ # CI + Deploy

Middleware Stack

Ordem de execucao de cada request.

1
Helmet — security headers + CSP
2
CORS — origins por ambiente
3
Rate Limiter — Redis, por rota + IP
4
Logger — Pino + correlation ID
5
Body Parser — JSON, limit 1MB
6
CSRF — validacao em mutacoes
7
Auth — JWT validation + refresh
8
Tenant Resolver — identifica empresa + banco
9
Schema Validation — Zod (body/params/query)
10
Controller → Service → Repository
11
Error Handler — formata erros, nao vaza detalhes

Banco de Dados — 3 Camadas

Central (hcn_00000000)

contacts, companies

chat_messages, otp_codes

refresh_tokens, security_logs

api_keys, login_attempts

menu_items, metadata

Por Empresa (hcc_XXXXXXXX)

Hotelaria: properties, units, bookings, availability, pricing

Financeiro: contas, categorias, centros, operacoes

payments, documents, logs

Por Usuario (hcp_XXXXXXXX)

Espaco pessoal isolado

Implementado desde o dia 1

Dados privados do usuario

Seguranca

Fluxo de autenticacao, filas e real-time.

Fluxo de Autenticacao

1
Usuario informa email ou telefone
2
Rate limit + brute force check
3
OTP gerado (6 digitos, 10min) — enviado via email ou WhatsApp
4
Verificacao — erros: 3 = 5min, 5 = 30min, 10 = 24h de bloqueio
5
Sessao criada (device, IP, user-agent)
6
Access Token (JWT 15min, em memoria) + Refresh Token (7d, cookie HttpOnly)
7
Requests: Bearer token. Se 401 → /auth/refresh → par rotacionado
8
Logout: blacklist Redis + refresh deletado + cookie limpo

WebSocket (Socket.io)

Rooms

user:{contactId} — notificacoes pessoais

company:{companyId} — updates da empresa

chat:{contactId} — mensagens de chat

Eventos

chat:message — nova mensagem

chat:typing — indicador digitacao

notification:new — push

session:revoked — forcar logout

Filas (BullMQ)

FilaFuncaoRetry
emailEnvio de emails (OTP, notificacoes)3x exponencial
whatsappMensagens WhatsApp3x exponencial
webhook-outWebhooks para clientes5x exponencial
webhook-inWebhooks recebidos3x
image-processRedimensionar imagens2x
reportRelatorios pesados1x
cleanupLimpar tokens e logscron diario

CI/CD Pipeline

1
Push — codigo vai pro GitHub
2
CI — Lint + Type Check + Unit Tests + API Tests + Build Check
3
Deploy (main) — Build → SSH → Pull → Migrations → PM2 restart → Health check

Modulos e Funcionalidades

O que ja funciona e o que e novo.

Mantidas do HubChat

Interface chat-first com IA
Multi-tenancy (banco por empresa)
OTP via email e WhatsApp
Gestao de empresas (CNPJ, logo)
Gestao de contatos/usuarios
Niveis de acesso (user/manager/admin)
Modulo financeiro completo
Modulo hotelaria/reservas completo
Pagamentos PIX/crypto (xGate)
Upload de arquivos (R2)
Menu dinamico por empresa/papel
PWA instalavel
Soft delete + audit trail
Metadata dinamico (campos custom)

Novas no aerah

Real-time chat via WebSocket
Notificacoes push (in-app + browser)
Access + Refresh Token rotativo
TOTP (Google Authenticator)
API Keys por empresa
Dashboard com metricas
Relatorios PDF/Excel
Espaco pessoal (hcp_)
Filas BullMQ
Logs com correlation ID
Auditoria de seguranca
API docs (OpenAPI/Swagger)
Testes automatizados