Como a Documenso construiu uma alternativa open source ao DocuSign
A Documenso é uma plataforma open source de assinatura de documentos que qualquer um pode hospedar por conta própria ou usar na nuvem. Roda num monorepo em TypeScript com React Router, Hono, tRPC, Prisma e PostgreSQL, e o time escreveu a própria biblioteca de PDF para cuidar das assinaturas digitais.
Análise de visitas do site, como consta na política de privacidade.
Como montaram
Confiança pelo código aberto
A Documenso se apresenta como a alternativa open source ao DocuSign, e a aposta é que a confiança vem do código que qualquer um pode ler e da opção de hospedar por conta própria. A licença é AGPLv3.
O projeto publica imagens oficiais de Docker e aceita Docker Compose, Railway, Render, Kubernetes e instalação manual. Os documentos ficam no PostgreSQL por padrão, com armazenamento compatível com S3 como opção.
O app começou em Next.js, que o time chamou de escolha óbvia pela renderização no servidor, pelas rotas fáceis e pela comunidade. Com o tempo, as Server Actions ficaram difíceis de depurar, o build quebrava por causa de chunks assíncronos, o hot reload chegou a uns 45 segundos e o Turbopack falhava sempre.
Em março de 2025 eles contaram a troca para React Router (o sucessor do Remix) com Vite. Foi uma mudança direta, sem nenhuma funcionalidade nova. No lugar das Server Actions agora entra o tRPC.
Assinar mexe em todas as etapas de um PDF, e nenhuma biblioteca em JavaScript dava conta de tudo. Eles usavam o pdf.js para exibir, o pdf-lib para editar e uma biblioteca em Rust com bindings N-API só para as assinaturas, sempre remendando os buracos.
Em janeiro de 2026 lançaram a LibPDF, uma biblioteca em TypeScript que lê, edita e assina PDFs. Ela substituiu o código antigo de assinatura em Rust e já roda em produção na Documenso.
O repositório é um workspace do npm comandado pelo Turborepo. O Biome cuida de lint e formatação, o Playwright roda os testes de ponta a ponta, o Lingui cuida das traduções e o Inngest roda as tarefas em segundo plano.