← Início

Tecnologia e segurança

O que roda por baixo dos sistemas que entregamos, e o que não fazemos.

Cada escolha de stack vem com o motivo. Cada afirmação de segurança vem de código que está em produção. E tem um bloco inteiro dizendo onde paramos.

A stack padrão, e por que cada peça está aí

Cada peça está aqui pelo motivo que vem escrito com ela.

É a stack que uma equipe pequena consegue manter, que o próximo desenvolvedor consegue ler e que não prende ninguém a uma ferramenta nossa.

Aplicação

TypeScript, Next.js, React e Tailwind

Uma linguagem só, da tela ao servidor. O tipo pega no editor o erro que o cliente descobriria no caixa. Renderização no servidor porque a primeira tela precisa aparecer no 4G do canteiro de obra, não no wi-fi do escritório. O estilo fica no Tailwind, junto do componente, sem uma folha de estilo paralela crescendo por fora.

Banco de dados

PostgreSQL, e SQLite quando faz sentido

Postgres quando há servidor: transação, restrição dentro do próprio banco e dinheiro calculado em decimal, nunca em ponto flutuante. SQLite em modo WAL quando o sistema roda dentro do estabelecimento ou é um serviço pequeno demais para carregar mais uma peça que pode cair.

Schema e migrations

Prisma

Mudança de estrutura é arquivo versionado no repositório, não comando digitado direto em produção. Migração aditiva com valor padrão em toda coluna nova: a linha antiga continua válida e o que já gravava segue gravando.

Infraestrutura

Docker e Traefik

Cada serviço em container: derrubar um não derruba os outros. O Traefik cuida do certificado TLS renovado sozinho, do roteamento por domínio e do limite de tráfego antes da aplicação. A mesma imagem sobe no servidor da sua empresa ou no nosso.

Funcionar sem sinal

PWA, IndexedDB e fila local

O app instala no celular sem passar por loja. Quando o sinal cai, a alteração entra numa fila local e sobe sozinha ao reconectar, com identificador gerado no aparelho para o mesmo envio nunca entrar duas vezes.

Pagamento

Stripe

Cartão não passa pelos nossos servidores. O gateway cobra, o webhook chega assinado e é reconferido na origem, e a baixa de estoque só acontece com o pagamento aprovado.

Teste e integração

Playwright

Serve para testar a tela como o usuário usa. E serve para operar por robô o sistema legado que não tem API nenhuma, sempre por fila, para não virar um script que roda torto de madrugada.

Onde ele é melhor

Python

Visão computacional, imagem e áudio. Detecção de rosto feita dentro do próprio aparelho, sem enviar a foto para lugar nenhum, é Python com modelo especializado, trabalho que um modelo de linguagem não faz bem.

Peça visual como código

Remotion, three.js e HTML renderizado

Quando a saída é arte ou vídeo, a fonte continua sendo código. Mudou uma data ou uma cor, regera o lote inteiro. Nenhuma etapa passa por editor gráfico.

Processo com IA

A skill /agent-team, aberta no GitHub

A skill que usamos está publicada: agentes por papel, planejamento, arquitetura, UX, QA, segurança, red team, documentação, cada um em worktree isolado, com um quadro compartilhado. Está em github.com/Riicke/SkillAgentTeam e dá para ler o código antes de contratar.

Arquitetura de referência de um sistema típico

O caminho de uma requisição, da tela até o banco e de volta.

  1. 1. O aparelho do usuário

    Navegador ou app instalado no celular. Guarda o necessário para operar sem sinal e mantém a fila de alterações pendentes até a rede voltar.

  2. 2. A borda

    Traefik encerra o TLS com certificado renovado automaticamente, roteia por domínio e aplica o limite de tráfego. É aqui que um flood morre, antes de encostar na aplicação.

  3. 3. A aplicação

    Next.js com sessão em cookie assinado. Nenhuma tela e nenhuma ação de servidor confia apenas no que a camada anterior verificou, o detalhe de como isso é feito está no bloco de segurança.

  4. 4. As regras de negócio

    Onde o preço é recalculado, a parcela é dividida em decimal e a venda acima do estoque é barrada. Nada disso confia no valor que veio do navegador.

  5. 5. O banco

    PostgreSQL ou SQLite, schema versionado, restrição no próprio banco e campo sensível cifrado em repouso. O banco é a última linha de defesa da regra de negócio.

  6. 6. Fila e workers

    Fila com worker para o que é lento ou pode falhar: integração com ERP, e-mail, robô do portal legado, replicação para o painel. Falhou, tenta de novo, e não trava a tela de ninguém.

  7. 7. Fora do caminho crítico

    Backup, logs e captação de lead ficam deliberadamente fora do fluxo principal. O formulário público continua gravando mesmo com o painel em deploy.

Onde o sistema fica hospedado

E o que muda quando o dado precisa ficar no Brasil ou na Europa.

Sistema com banco, operação no BrasilVPS, sua ou nossaO sistema sob medida sobe numa máquina contratada no nome da sua empresa, e a H&I entra como administradora. Quando o cliente prefere não gerenciar servidor, hospedamos na nossa, e isso fica escrito no contrato. Nos dois casos a configuração é a mesma: Docker e Traefik, firewall fechado no ufw, fail2ban no SSH e TLS do Let’s Encrypt.
Dado que precisa ficar em território brasileiroRegião brasileira do provedorA mesma imagem Docker sobe numa máquina contratada na região. Muda o endereço e a latência. Não muda o código, nem o processo de deploy.
Dado de residente no Reino Unido ou na UEInstância e backup na mesma regiãoÉ o que configuramos quando o projeto exige residência de dados na região: a cópia de segurança fica onde está o banco, e a lista de quem tem acesso é escrita. Sair da região passa a ser decisão registrada, com o motivo escrito no projeto.
Operação que não pode depender de internetServidor dentro do próprio estabelecimentoO PDV de restaurante roda na rede local: pedido, comanda e cozinha em tempo real sem a nuvem no caminho. O dado do salão não sai do salão; a internet serve só para atualizar o programa.
Site institucional ou landingExport estático em hospedagem comumSem banco e sem servidor de aplicação. Não existe painel para invadir nem base de clientes para vazar, porque não existe base.
Cliente que já tem infraestruturaNo servidor do clienteSubimos lá, com o deploy documentado passo a passo, e o sistema não depende de nenhuma ferramenta proprietária nossa para rodar.

Segurança: o que está implementado, com nome

Cada item abaixo existe em código que está no ar.

O site antigo dizia "criptografia AES-256, a mesma do Google Cloud". Isso não quer dizer nada. Segue o que quer dizer.

Borda

TLS e cabeçalhos de segurança

Certificado Let’s Encrypt renovado sozinho pelo Traefik e HTTP redirecionado para HTTPS. Política de conteúdo restritiva, negação de enquadramento, nosniff e política de referência, reaplicadas em cada bloco de configuração, porque cabeçalho de nginx não é herdado.

Dados

Criptografia em repouso

CPF cifrado dentro do banco. Token de acesso de terceiro guardado com envelope encryption: uma chave cifra a chave que cifra o dado, então cópia do banco não vira acesso à conta do cliente.

Autenticação

Sessão

Cookie assinado com HMAC-SHA256, comparado em tempo constante, httpOnly e restrito ao próprio site. O segredo é obrigatório em produção: sem ele a aplicação se recusa a subir, sem cair num valor de desenvolvimento. E o token carrega a impressão digital da credencial, trocar a senha derruba na hora toda sessão antiga, em qualquer aparelho, sem tabela de sessão no banco.

Autorização

Controle de acesso em três camadas

Guarda no middleware, revalidação do usuário a cada requisição e verificação dentro de cada ação de servidor. Usuário removido, bloqueado ou com credencial trocada cai no logout na requisição seguinte, não no próximo login.

Força bruta

Limite de tentativas de login

Login e recuperação de senha limitados por e-mail e por IP, com uma mensagem de erro única que não revela se o endereço existe. Link de redefinição de uso único, válido por 30 minutos e invalidado se a senha mudar.

Disponibilidade

Limite de tráfego na borda

Contamos os arquivos que a home pede, consideramos o visitante de celular atrás do NAT da operadora e escolhemos números que barraram um teste de carga de 654 requisições por segundo sem barrar o tráfego legítimo simulado no mesmo teste. O serviço público de captação aceita 10 requisições por minuto por IP.

Infraestrutura

O servidor

Firewall ufw fechado e fail2ban no SSH, instalado depois de contarmos 346 tentativas de força bruta em 7 dias no log. Container multi-stage rodando com usuário não-root. Serviço de e-mail em rede interna, sem porta exposta no host.

Segredos

Segredos fora do bundle

Nenhum segredo no pacote que vai para o navegador. Variável de ambiente no servidor e webhook do Stripe validado por assinatura. No sistema distribuído como instalador, o segredo de sessão é gerado no primeiro boot na máquina do cliente, com permissão restrita, o executável não sai daqui com segredo dentro.

Validação

Entrada não confiável

Schema validado na borda da aplicação. Preço e frete recalculados no servidor, porque o valor que vem do navegador não é dado, é sugestão. Upload restrito ao administrador, com lista de tipos permitidos, limite de tamanho e nome de arquivo aleatório.

Rastro

Auditoria e backup

Cada acesso grava data, responsável e dispositivo, e conflito resolvido na sincronização offline fica registrado. O backup do banco sai da máquina que o gerou; frequência e retenção são acordadas no projeto, e a restauração é testada, backup que nunca foi restaurado é só um arquivo.

Cadeia de suprimento

Dependências

Versões travadas em lockfile, atualização revisada antes de subir e superfície pequena de propósito: uma das landings entregues tem zero biblioteca JavaScript de terceiros, só a fonte tipográfica.

Processo

Checklist replicável

Mantemos um SECURITY.md de 24 KB que vai de projeto em projeto, com o que foi verificado, o que ficou de fora e por quê. Você pode pedir para ler o do seu projeto.

O que não fazemos

O limite declarado, e o que ele significa na prática.

Fornecedor que lista só o que faz está pedindo para você acreditar. Aqui está onde paramos.

Na prática

Não somos certificados ISO 27001 nem SOC 2.

Se a sua área de compliance exige certificado do fornecedor, a H&I não passa nesse crivo. O que entregamos para a auditoria de vocês é o SECURITY.md do projeto, o registro de decisões de arquitetura e o acesso ao código.

Na prática

Não fazemos pentest formal.

Testamos o que escrevemos, rodamos verificação automática de cabeçalhos, TLS, redirecionamento e arquivo exposto, e passamos o código por uma revisão adversarial dentro do nosso processo. Isso não é um relatório assinado por empresa de pentest. Se o seu contrato exige um, contrate, corrigimos os achados.

Na prática

Não operamos plantão 24 horas.

Não existe equipe de sobreaviso às três da manhã. Combinamos por escrito a janela de atendimento e o tempo de resposta, e automatizamos o que dá: verificação de saúde, reinício de container e alerta.

Na prática

Não prometemos uptime numérico.

Não vendemos SLA de 99,9%. O que fica escrito no contrato é a janela de atendimento, o tempo de resposta acordado e a lista do que é monitorado automaticamente. Número de disponibilidade que não conseguimos garantir sozinhos, não assinamos.

Na prática

Não assumimos manutenção de código de terceiro sem auditoria paga antes.

Herdar sistema escrito por outra pessoa começa por uma auditoria curta e paga: o que existe, o que está quebrado, o que dá para manter. Só depois dela dizemos se assumimos, e por quanto. Sem essa etapa, qualquer prazo seria chute e a conta cairia no seu colo.

Na prática

Não fazemos marca, design gráfico nem tráfego pago.

Não criamos identidade visual, não desenhamos logo e não gerenciamos campanha de anúncio. Construímos o sistema e a página que converte, aplicando a marca que já existe. Se você ainda precisa da marca, contrate quem faz isso, trabalhamos junto sem problema.

Na prática

Não guardamos cartão de crédito.

O pagamento vai por gateway. O número do cartão não passa pelos nossos servidores, então não há dado de cartão para vazar aqui. Também não emitimos conformidade PCI, porque não somos nós que processamos.

Na prática

Não somos o encarregado de dados da sua empresa.

Fazemos a arquitetura atender LGPD e UK GDPR e escrevemos o que o sistema coleta, por quanto tempo e quem acessa. A política, o contrato com os titulares e o papel de encarregado são da empresa, e o jurídico de vocês valida.

Na prática

Não somos uma equipe grande.

A engenharia é de um desenvolvedor. O prazo é sequencial, não paralelo. E a pergunta certa a fazer é o que acontece se a H&I sumir: o código está no repositório de vocês, o deploy é documentado e nada depende de ferramenta proprietária nossa.

Na prática

Não entregamos código que não foi lido.

Usamos IA no processo, por papéis, com histórico do que cada um fez. Ela acelera revisão, teste e documentação. Não decide arquitetura e não substitui a leitura do diff, quem assina o que subiu tem nome e telefone.

Na prática

Não prometemos prazo nem preço antes de ver a operação.

Número fechado sem olhar o sistema atual é chute, e chute vira atraso no meio do projeto. Primeiro o diagnóstico e o escopo escrito; depois o número.

Privacidade por design

LGPD e UK GDPR resolvidos no schema, não na página de política.

A política de privacidade é o documento. A decisão acontece antes dele, na hora de escolher qual coluna vai existir.

O que nem é coletado

Minimização

Campo que não vai ser usado não entra no formulário. Num gerador de imagem que entregamos, a foto da pessoa é processada dentro do navegador e nunca sai do aparelho, e a política de conteúdo da página bloqueia tecnicamente a conexão que faria o envio. A promessa é imposta pelo navegador, e dá para conferir no cabeçalho da própria página.

O que fica cifrado

Dado sensível separado

O que é sensível é cifrado em repouso e não aparece inteiro na tela. Chave de integração cadastrada pelo cliente fica em tabela com política de acesso no próprio banco, e o painel só lê uma view mascarada que devolve "configurado" e os quatro últimos dígitos.

Como é atendido

Direito de acesso

Endpoint que devolve à própria pessoa os dados dela em JSON. O funcionário exporta o que a empresa guarda sobre ele sem abrir chamado com ninguém.

Decidido antes da tela

Direito de exclusão

Exclusão é desenhada no sistema: o que apaga, o que anonimiza e o que permanece. Registro com efeito contábil ou legal não desaparece, perde o vínculo com a pessoa e mantém o histórico. Isso fica escrito antes de existir tela.

Prazo por tabela

Retenção

Cada tabela com dado pessoal tem prazo definido no projeto, e log de acesso é o primeiro a expirar. Quando dá para não guardar, não guardamos: um contador de uso que construímos grava um número inteiro e mais nada, sem IP, sem cookie, sem log.

Onde o dado atravessa

Transferência internacional

Quando o projeto exige que o dado do titular fique no Reino Unido ou na UE, a instância e o backup ficam na região, e o que sair dela vira decisão registrada no projeto, com o motivo escrito.

Quem mais recebe o quê

Terceiros e modelos de IA

Cada serviço externo entra numa lista com o que recebe: gateway de pagamento, envio de e-mail, modelo de linguagem. E o que vai para o modelo é escolhido campo a campo, num assistente financeiro que mantemos, o número do dinheiro nunca volta para o modelo: quem responde é uma camada determinística que lê o banco direto.

Traga o seu time técnico para a conversa

Diagnóstico de 30 minutos, gratuito e sem compromisso: você sai com um resumo escrito do seu problema, e ele é seu mesmo que a gente não trabalhe junto. Conte três coisas: onde o dado precisa ficar, o que já existe rodando hoje e o que não pode parar nem por uma hora.

Agendar diagnóstico de 30 min