Case 02Operações e SST
Kippis
Segurança do trabalho no bolso de quem está na obra.
Plataforma de SST que leva APR, permissão de trabalho, inspeção e advertência para o celular do técnico e liga tudo a colaboradores, cargos, NRs, exames e EPIs. Toda madrugada, cinco rotinas varrem os prazos legais de cada empresa e avisam o responsável certo antes do vencimento e de novo no dia, antes do turno começar.
- Cliente
- Construtora de grande porte
- Período
- 2025 — 2026
- Equipe
- Squad de 4 pessoas
- Papel
- Engenheiro full stack · líder do app mobile e das regras de SST
- Stack
- Go · Fiber · PostgreSQL · Expo · React Native · TypeScript
- Confidencialidade
- Dados de clientes preservados
Resultados em números
- 5prazos legais vigiados toda madrugadatreinamento, CA, vida útil de EPI, ASO periódico e ativos
- 180endpoints na API multiempresa27 módulos de API, de RH e saúde a estoque e comunicação
- 2.500colaboradores acompanhadospróprios e terceiros, em várias frentes de obra
- 42condições de insalubridade e periculosidade mapeadas24 da NR-15 e 18 da NR-16, com o percentual de adicional de cada cargo
O contexto do negócio
- Cliente
- Construtora de grande porte
- Período
- 2025 — 2026
Numa construtora de grande porte, segurança do trabalho é exigência legal e risco de vida ao mesmo tempo. Cada frente de obra reúne equipes próprias e terceiras; cada cargo carrega NRs, exames do PCMSO, EPIs com CA válido e adicionais de insalubridade ou periculosidade. Toda atividade crítica começa com uma APR e uma permissão assinada. Quando esse controle vive em papel, planilha e grupo de mensagem, o treinamento vencido aparece na fiscalização, na auditoria ou, no pior caso, depois do acidente.
O desafio
O registro precisava acontecer no canteiro, em minutos, com a assinatura de quem vai executar o serviço. RH, saúde ocupacional, segurança e almoxarifado precisavam enxergar o mesmo colaborador sem misturar dados entre empresas. E prazos de naturezas diferentes — certificado de treinamento, CA do EPI, vida útil de cada unidade, ASO periódico e ativos — tinham de virar avisos para a pessoa certa, na hora certa e sem repetição, sem soterrar o técnico de segurança em notificações.
Campo primeiro
APR com matriz de risco, permissão de trabalho e inspeção preenchidas no celular, etapa por etapa, com assinatura na tela e validação antes do envio. Nenhuma PT pode nascer sem uma APR vinculada.
Cada NR com a sua regra
NR-35, NR-15, NR-16, NR-06: cada norma exige coisas diferentes de cargos, turmas e permissões. Incluir uma norma nova ou acompanhar uma revisão tinha de ser cadastro, nunca deploy.
Prazos que não podem passar
Treinamentos, CAs, vida útil de EPI por unidade, ASOs periódicos e ativos vencem em ritmos diferentes — e cada um tem um responsável diferente a ser avisado.
O que entreguei
Construí o app de campo em Expo e React Native e estruturei o painel web em React. Por trás, uma API em Go e Fiber, com 180 endpoints em 27 módulos de API e 32 módulos de permissão, isola cada empresa na sessão e trata NRs, exames, EPIs e adicionais como dados ligados ao cargo. Um scheduler em Go roda cinco rotinas por empresa toda madrugada, descobre quem precisa ser avisado e registra cada envio.
App de campo
APR em cinco etapas com matriz de risco 5 × 4, PT com equipe e assinaturas, inspeção por checklist e advertência com testemunhas e foto.
API multiempresa
Go e Fiber com empresa vinda da sessão, RBAC em três níveis por módulo e por plataforma, MFA e auditoria em cada alteração.
NRs, cargos e treinamentos
Catálogo de NRs ligado a turmas e PTs; cada cargo define exames, EPIs e adicionais a partir de 42 condições de insalubridade e periculosidade.
Scheduler de vencimentos
Cinco rotinas escalonadas entre 3h e 5h, que avisam antes do vencimento e de novo no dia, com destinatário resolvido pela hierarquia e um único aviso por item a cada dia.
Como funciona
Siga o trabalho atravessando o sistema, etapa por etapa, ou clique em qualquer componente do quadro para ver o que ele faz.
arraste para ver o fluxo
Legenda
- Síncrono
- Assíncrono
- Canal seguro
- Integração externa
Descrição textual do fluxo
- De App de campo para API multiempresa — Campo (síncrono).
- De Painel de gestão para API multiempresa — Gestão (síncrono).
- De API multiempresa para Treinamentos e NRs — Turmas (síncrono).
- De API multiempresa para SST e saúde — APR e PT (síncrono).
- De API multiempresa para EPIs e estoque — EPIs e ativos (síncrono).
- De Treinamentos e NRs para Certificados e evidências — Certificado (síncrono).
- De Treinamentos e NRs para Base operacional — Presença (síncrono).
- De SST e saúde para Base operacional — Persiste (síncrono).
- De EPIs e estoque para Base operacional — Estoque (síncrono).
- De EPIs e estoque para Serviço CA-EPI — Consulta CA (integração externa).
- De Base operacional para Scheduler de vencimentos — Prazos (assíncrono).
- De Scheduler de vencimentos para Avisos — Pendências (assíncrono).
- De Avisos para Pendências e ações — Aviso (assíncrono).
Percorra o fluxo
←→trocam de etapa
6 etapas
Do começo ao fim
Escolha uma etapa ou pressione Reproduzir para acompanhar o fluxo inteiro. Enquanto isso, o quadro destaca por onde o trabalho passa.
Componentes do sistema
Aplicativo de campo
- O que resolve
- Levar o registro de segurança para o lugar onde o trabalho acontece.
- Como funciona
- São 18 telas em Expo Router. A APR segue cinco etapas — informações, riscos, etapas da atividade, gravidade e assinatura — e cada risco recebe frequência e severidade numa matriz 5 × 4 que devolve prioridade de 1 a 5, com medida de controle administrativa, de EPI ou de engenharia. React Hook Form e Zod barram o envio incompleto. A sessão vive em cookies no SecureStore, e o app só volta ao login quando a API responde SESSION_EXPIRED: um 401 qualquer não derruba um formulário em andamento.
Expo · React Native · TypeScript · Zod
API multiempresa
- O que resolve
- Fazer RH, saúde ocupacional, segurança e almoxarifado compartilharem contexto sem misturar empresas.
- Como funciona
- O middleware de autenticação tira empresa e usuário da sessão; o de autorização compara o nível exigido pela rota — ver, interagir ou gerenciar — com o do papel naquele módulo e naquela plataforma, com cache de 30 segundos invalidado quando o papel muda. Login com MFA por código, sessão de 1 hora renovada por refresh token de 30 dias e no máximo 5 sessões web por usuário. 68 pontos de auditoria registram quem alterou o quê. São 78 tabelas em 6 schemas: core, hr, health, safety, stock e comms.
Go · Fiber · PostgreSQL · JWT
NRs, cargos e saúde ocupacional
- O que resolve
- Fazer o sistema se adaptar a cada norma sem reescrever código.
- Como funciona
- Cada NR é um registro com atividade e objetivo; tabelas de ligação conectam a norma às turmas que a cobrem e às PTs que a exigem. O cargo define exames obrigatórios, EPIs exigidos e adicionais: insalubridade da NR-15 em 10, 20 ou 40%, periculosidade da NR-16 em 30% fixo e condições de penosidade. Os ASOs — admissional, periódico, retorno ao trabalho, demissional e PCMSO — registram apto, inapto ou restrito.
Go · PostgreSQL
Treinamentos e certificados
- O que resolve
- Registrar quem participou, quais NRs a turma cobre e qual evidência foi emitida.
- Como funciona
- Turmas de treinamento ou DDS, do tipo obrigatório, específico ou reciclagem, com instrutor, carga horária, lista de presença e NRs. O backend gera o certificado em PDF A4 sem nenhuma dependência externa — nome, documento, carga horária, instrutor e validade — e o guarda no S3 por turma e participante, pronto para baixar na auditoria.
Go · PostgreSQL · AWS S3
EPIs, estoque e ativos
- O que resolve
- Saber qual equipamento está com quem, se o CA vale e quando ele precisa ser trocado.
- Como funciona
- O modelo de EPI consulta o número do CA no serviço CA-EPI e guarda a validade. Cada unidade tem número de série, status e data de compra, de onde sai a vida útil em dias, semanas, meses ou anos. Entregas ao colaborador registram a devolução e o estado do item; ferramentas e máquinas têm empréstimo com checklist, intervenção e inventário. Só este módulo responde por 38 endpoints.
Go · PostgreSQL · CA-EPI
Scheduler de vencimentos
- O que resolve
- Transformar prazos espalhados entre módulos em avisos acionáveis para a pessoa certa.
- Como funciona
- Serviço Go separado da API, com cinco jobs em horários próprios: treinamentos às 3h, CA às 3h30, vida útil de EPI às 4h, ASO periódico às 4h30 e ativos às 5h. Todos reaproveitam um retrato das empresas em cache de 6 horas. Cada job resolve o destinatário — gestor do local da turma, gestor do setor cujos cargos usam aquele EPI, líder direto do colaborador com fallback para o setor e para a empresa — e grava item, destinatários e resultado do envio. Cada prazo gera um aviso antes do vencimento e outro no próprio dia, e a consulta ignora o que já foi avisado no dia.
Go · robfig/cron · SMTP
Painel de gestão
- O que resolve
- Dar à gestão de SST uma visão administrativa de colaboradores, EPIs, inspeções, treinamentos e permissões.
- Como funciona
- React 19, Vite e Tailwind. O menu nasce da sessão: o backend devolve os caminhos liberados para o papel a partir de um registro de 32 módulos de permissão, então mudar uma rota não exige reescrever perfis. Telas de alerta de CA, vida útil, ASO e treinamentos concentram as pendências, e os mesmos avisos chegam numa caixa de entrada com contador de não lidas.
React · Vite · TypeScript · Tailwind CSS
Decisões que sustentam o sistema
Empresa vem da sessão, nunca do cliente
O middleware carrega a empresa em cada requisição e toda consulta filtra por ela. Ao criar uma PT, APRs, técnico, trabalhadores e signatários são validados em lote contra a mesma empresa — nenhuma tela consegue misturar dados de outra, mesmo com um parâmetro manipulado.
NR é dado, não código
A norma é uma linha no catálogo, ligada a turmas, PTs e cargos por tabelas de relação. Atender uma NR nova, uma revisão ou uma exigência específica de obra vira cadastro, e a PT já mostra quais NRs cada trabalhador tem treinadas.
Permissão por módulo, nível e plataforma
A mesma rota pode exigir permissões diferentes no web e no mobile: criar APR no painel pede um módulo de gestão, no celular pede o módulo de campo. Assim o técnico opera na obra sem ganhar acesso administrativo.
Aviso registrado, não só disparado
Cada envio grava item, destinatários, origem do responsável e sucesso. Isso impede repetir a mesma notificação no dia e prova, na auditoria, que o responsável foi avisado a tempo.
Resultado para o negócio
Treinamentos, CAs, EPIs, ASOs e ativos avisam o responsável antes do vencimento e de novo no dia, antes do turno, em vez de aparecerem na auditoria.
A emissão de uma permissão de trabalho no canteiro caiu de cerca de 20 minutos em papel para menos de 5 no app.
Toda PT nasce vinculada a uma APR avaliada risco a risco, com equipe e signatários validados dentro da mesma empresa.
Cada aviso fica registrado com destinatário e resultado do envio: na fiscalização, a prova de que o responsável foi avisado já está pronta.
Meu papel
- Papel
- Engenheiro full stack · líder do app mobile e das regras de SST
- Equipe
- Squad de 4 pessoas
Planejei e construí o app mobile do zero, da arquitetura de rotas ao tratamento de sessão, e fiz a estruturação real do painel web. Na API, modelei o backend para comportar várias NRs e se adaptar a cada uma: norma, cargo, exame, EPI e adicional viraram dados relacionados, não regras fixas no código. Escrevi a lógica de negócio dos avisos de exames, de vencimento de EPI e de treinamentos, e transformei as exigências do time de SST do cliente em validações de sistema.
Pelo que respondi
- Construí o app em Expo/React Native: APR, PT, inspeção, advertência, MFA e recuperação de senha em 18 telas.
- Modelei NRs, cargos, exames, EPIs e adicionais como dados relacionados, para que uma norma nova seja cadastro e não código.
- Desenhei o RBAC com níveis ver, interagir e gerenciar por módulo, aplicado de forma distinta para web e mobile.
- Escrevi as cinco rotinas de vencimento e a resolução de destinatários por líder direto, gestor do setor e gestor do local.
- Integrei o cadastro de EPIs ao serviço CA-EPI e a vida útil de cada unidade ao controle de estoque.
- Gerei certificados de treinamento em PDF no próprio backend, guardados no S3 por turma e participante.
Stack por camada
Mobile
- Expo
- React Native
- Expo Router
- React Query
- React Hook Form
- Zod
- SecureStore
Web
- React
- Vite
- TypeScript
- Tailwind CSS
- Zustand
Backend
- Go
- Fiber
- sqlx
- JWT
- TOTP
- robfig/cron
Dados e integrações
- PostgreSQL
- Goose
- AWS S3
- CA-EPI
- SMTP
Infra
- Docker
- Nginx
- GitHub Actions
O que levo deste projeto
Modelar norma, cargo e exigência como dados relacionados desde o início foi o que permitiu acompanhar cada NR sem uma fila de mudanças no código.
Aviso útil é aviso que chega à pessoa certa, na hora certa e sem repetição. Resolver o destinatário pela hierarquia e registrar cada envio fez o técnico confiar no sistema em vez de silenciá-lo.
No campo, sessão expirada precisa ser um estado explícito da interface. Separar SESSION_EXPIRED dos outros 401 evitou formulários perdidos e assinaturas sem dono.