Vallor - Visão Geral do Desenvolvimento

AI
AWS
Next.js
PostgreSQL
Kysely
oRPC
Trigger.dev
Tailwind
TypeScript
JavaScript
HTML
CSS

26 de agosto de 2026

Article banner

Vallor é uma plataforma de gestão de contratos impulsionada por IA. Os clientes fazem upload de milhares de contratos já assinados; o sistema extrai campos estruturados, permite que os usuários façam redlines de novos contratos com base em playbooks e oferece uma camada de chat e analytics para times jurídicos e de receita. A base de código é um grande monorepo em TypeScript com regras rígidas de desenvolvimento: sem tipos any ou typecasts, todos os registros no banco de dados passam por verificações de controle de acesso a recursos, e Zod é utilizado em todas as fronteiras do sistema.

Entrei como Engenheiro Full Stack Fundador enquanto o produto ainda consolidava sua segunda grande área, o redline, e permaneci até o lançamento do produto de analytics, composto por relatórios + dashboard de retorno sobre o investimento. Ao longo dos 17 meses em que fiz parte do time, fui responsável por features de ponta a ponta e um dos principais responsáveis por duas das maiores áreas voltadas ao cliente lançadas nesse período: Tabela avançada de contratos (TableCN) e Relatórios / Analytics.

TLDR;

Resumo de impacto
AreaResultado
Produto de relatóriosEvoluímos a solução de um protótipo v0 para uma ferramenta de análise em produção, incluindo visualizações salvas, geração de gráficos com IA, filtros em nível de gráfico, compartilhamento de "views", exportação em PNG e exportação em XLSX com múltiplas abas.
Tabela avançada de contratosReconstruí a tela mais utilizada como uma superfície tipada, virtualizada, dinâmica e expansível com IA; uma base para o recurso de relatórios.
Chat de IAEvoluímos o chat de uma ferramenta simples de perguntas e respostas para uma plataforma de agentes multifuncional, com recursos de execução de código, pesquisa na web, áudio e atualização de campos dinâmicos na base de dados.
Feature de redlineEntreguei a versão inicial da interface, do upload, do visualizador de PDF e do WebSocket, e retornei mais tarde para transformar a exportação de documentos em um recurso pronto para produção.
Campos customizadosGeneralizei o sistema de campos dinâmicos para permitir que, além de contratos, qualquer entidade o utilize.
Dashboard de retorno sobre o investimentoDesenvolvi a métrica de economia de tempo integrada ao produto, utilizada pela equipe de Customer Success durante as renovações.
Exportação Excel dos dados de contratoReconstruído duas vezes: inicialmente via streaming do S3 e, depois, por meio de um job em segundo plano no Trigger.dev.
Saúde do códigoLiderei a refatoração do estado da URL para filtros de tabelas, uma migração para oRPC, otimizações de desempenho nas telas de maior tráfego e a implementação de um fluxo de CI para análise de boas práticas do React em todos os PRs.

Features sob minha responsabilidade

1. Página de Relatórios & Produto de Analytics

A página de relatórios foi a aposta da empresa para transformar os dados extraídos dos contratos em algo que os times de Revenue Ops e Legal Ops dos clientes pudessem realmente utilizar. Levei a feature de um protótipo v0 até um produto de analytics em produção que os clientes passaram a utilizar diariamente.

Escopo sob minha responsabilidade:

  • Migração de v0 para produção da página de relatórios: transformei um protótipo de interface feito no Vercel v0 em uma feature tipada, renderizada no servidor e com controle de acesso.
  • Views salvas com filtros customizados: usuários podem nomear, favoritar, compartilhar e reabrir qualquer combinação de filtros e colunas como uma "view".
  • Geração de gráficos com IA: pipeline de linguagem natural para gráfico. A partir de um prompt, o agente escolhe o tipo de gráfico, eixos, agregação e paleta de cores e renderiza o resultado diretamente no dashboard.
  • Aplicação de filtros com IA: estendi o gerador de gráficos para também inferir e aplicar filtros de dados a partir do prompt.
  • Filtros por gráfico: cada gráfico pode possuir seu próprio grupo de filtros, adicionalmente aos filtros definidos no nível da view.
  • Filtros no nível da view para analytics: herança composável de filtros entre os escopos de view, dashboard e gráfico.
  • Compartilhamento de views para toda a organização ou membros específicos: modelo de compartilhamento com controle de acesso adequado.
  • Exportação de gráficos, PNG individual e em lote: pipeline client-side que serializa SVGs do Recharts para PNG e os compacta em um arquivo ZIP para exportação em lote.
  • Exportação para Excel com duas planilhas: exportação de dados da página de relatórios. Uma planilha "Primária" com as principais colunas configuradas pelo cliente e uma planilha "Todos Campos" contendo a tabela completa.
  • Otimização de performance dos relatórios: removi campos não utilizados da seleção de contratos usada para gerar gráficos, reduzindo o tamanho do payload das queries em uma ordem de grandeza.

Impacto

Levei a experiência de analytics de um protótipo interno para uma feature do roadmap voltada aos clientes, construindo views salvas e compartilháveis dentro da própria plataforma que substituíram um fluxo manual de exportação para Excel/Sheets utilizado por usuários avançados. Também desenvolvi a geração de gráficos com IA até transformá-la em uma funcionalidade de produto polida, que passou a ter destaque em demos para clientes e materiais de marketing.

2. Tabela avançada de contratos (TableCN)

A tabela da biblioteca de contratos é a tela mais utilizada de todo o produto. Quando comecei a trabalhar nela, era uma tabela com colunas fixas e filtros básicos de igualdade. Quando finalizei meu trabalho nessa área, ela havia se tornado uma superfície de dados totalmente dinâmica, virtualizada e integrada à IA, servindo posteriormente como base para a construção da página de relatórios.

Escopo sob minha responsabilidade:

  • Refatoração da tipagem de query parameters: uma refatoração estrutural da forma como todas as páginas com tabelas e listas codificavam ordenação, filtros e paginação nos parâmetros da URL. Essa mudança foi a base que possibilitou tudo o que veio depois.
  • Campos aninhados e filtros avançados: suporte a filtros em caminhos JSON como contract.parties[*].name, com geração correta de SQL e condições de filtro type-safe.
  • Ordenação de campos aninhados.
  • Campo de busca no dropdown de filtros avançados.
  • Mostrar e ocultar colunas dinâmicas, com persistência das preferências.
  • Coluna de nome fixa, expansores "See all", dropdowns ordenados, scrollbar e reordenação de abas: uma série extensa de melhorias de UX.
  • Linguagem natural para filtros: a feature "Query to AI Filters". O usuário digita uma frase e recebe um grupo de filtros aplicado automaticamente.
  • Exportação para Excel de colunas dinâmicas: corrigi um problema antigo em que campos dinâmicos não eram incluídos nas exportações.
  • Filtros em campos do tipo array: suporte à filtragem de campos extraídos armazenados como arrays.
  • Otimização de performance na responsividade dos filtros: reduzi re-renders e adicionei debounce a estados derivados.

Impacto

Construí a tabela avançada como uma base reutilizável tanto para a biblioteca de contratos quanto para a página de relatórios, centralizando estado da URL, geração de SQL para filtros e controle de visibilidade das colunas. Isso permitiu que novas features utilizassem a mesma infraestrutura sem precisar reimplementar essas funcionalidades. Também adicionei filtros por linguagem natural, reduzindo fluxos de busca que antes exigiam várias interações para uma única frase.

3. Chat de IA & Plataforma de Agentes

Trabalhei continuamente na experiência de Chat, desde a integração inicial com o agente de extração até a evolução para uma plataforma moderna de agentes com suporte ao uso de ferramentas.

Escopo sob minha responsabilidade:

  • Histórico do Chat para agente de extração: primeira versão que permitiu ao modelo de extração utilizar o contexto de conversas anteriores.
  • Artefatos no Chat: sistema de renderização de artefatos, incluindo citações, documentos gerados e gráficos dentro do chat.
  • Adoção do AI Elements na interface do Chat: substituí uma camada de renderização desenvolvida internamente pelo SDK AI Elements.
  • Interpretador de código: adicionei uma ferramenta de execução de código em sandbox que envia arquivos gerados no container de volta ao Chat como artefatos.
  • Integração com pesquisa na web.
  • Transcrição de áudio no Chat.
  • Otimização das definições de ferramentas da IA: reestruturei schemas, inputs e outputs das ferramentas em toda a camada de agentes, melhorando de forma mensurável a taxa de sucesso das chamadas de ferramentas.
  • Ferramenta genérica updateDynamicFields: uma única ferramenta que permite ao agente escrever em qualquer campo dinâmico de qualquer entidade, substituindo a necessidade de N ferramentas específicas para cada entidade.
  • Injeção de contexto de organização e usuário nos prompts de sistema do agente.
  • Uma longa série de melhorias de confiabilidade do Chat: refresh do seletor de modelos, race conditions no envio de mensagens, erros com prompts longos, tratamento de erros de navegação, abort signals em queries de dados e correções de loops infinitos.

Impacto

Ajudei a expandir o Chat de uma experiência de perguntas e respostas voltada exclusivamente à extração de dados para uma superfície de agentes com múltiplas ferramentas, incluindo execução de código, busca na web, entrada por áudio e atualização de campos dinâmicos. Também melhorei a confiabilidade do agente ao otimizar seu comportamento de chamadas de ferramentas e as instruções dos prompts com base em padrões utilizados pela indústria, reduzindo o consumo de tokens e a incidência de chamadas malformadas e tornando as interações mais confiáveis para os usuários.

4. Feature de Redline

Redline é o produto da Vallor para comparação entre dois documentos, por exemplo, "compare o contrato-quadro de prestação de serviços deste fornecedor com o nosso playbook e gere um redline". Fiz parte do time responsável por lançar a versão original e, aproximadamente um ano depois, voltei a trabalhar na feature para implementar melhorias adicionais.

Escopo sob minha responsabilidade:

  • Interface base do redline: fui responsável pela implementação da visão original do produto, especialmente o fluxo que inclui a visualização de projetos de redline anteriores e o caminho desde o upload do documento até sua análise.
  • Single upload e Dual upload: fluxos para criar um novo documento de redline ou comparar e analisar duas versões do mesmo documento, respectivamente.
  • Visualizador de PDF do redline.
  • Camada de conexão WebSocket: atualizações de progresso em tempo real para o pipeline de análise.
  • Prompt do projeto, indicador de progresso, restrições de acesso e exclusão de projetos.
  • Refatoração da revisão de redlines: grande refatoração da experiência de revisão após o lançamento.
  • Alternância de perspectiva no diálogo de reanálise: adicionei a possibilidade de gerar um redline a partir da perspectiva de comprador ou vendedor, produzindo um resultado otimizado para cada ponto de vista.
  • Envio de redlines por e-mail externo com dropdown de exportação: transformei o fluxo de compartilhamento e exportação do pipeline de redline em uma funcionalidade completa do produto.

Impacto

Junto com meu time, ajudei a lançar o redline como uma feature que os clientes conseguiam utilizar sem depender do acompanhamento do time de engenharia. Posteriormente, voltei à feature para aprimorar os pontos de fricção identificados através do uso real do produto.

5. Campos Customizados para Diferentes Entidades

Generalizei o sistema de campos dinâmicos da Vallor. Originalmente, campos dinâmicos, configurados pelos próprios clientes, existiam apenas em contratos. Estendi o JSON Schema, o registro de entidades, os componentes de formulário, as ferramentas dos agentes e o controle de acesso para funcionarem com múltiplos tipos de entidades.

Impacto

Com essas mudanças, viabilizei campos customizados para as entidades divisions, companies, redline projects e dashboard analytics, todos utilizando um único fluxo de código compartilhado em vez de duplicar o sistema de campos de contratos para cada entidade. A refatoração também tornou simples estender esse comportamento para outras entidades da plataforma no futuro.

6. Dashboard de Retorno Sobre o Investimento

A pedido de um de nossos clientes, construí um dashboard de economia de tempo que quantificava quanto tempo de revisão manual a plataforma economizava para cada cliente mensalmente. Isso exigiu combinar dados de execução da state machine com os tempos de extração, além de definir cuidadosamente o conceito de "segundos de IA", excluindo artefatos gerados por reprocessamentos.

Impacto

Esse dashboard forneceu aos times de Customer Success e Sales uma métrica concreta dentro do próprio produto para utilizar durante renovações, com gráficos que permitiam analisar facilmente o tempo economizado e o número de horas poupadas em cada etapa do workflow, desde análise de contratos e uso de ferramentas até a elaboração de redlines, tudo comparado ao tempo médio que uma pessoa do time do cliente levaria para realizar o trabalho equivalente.

7. Pipeline de Exportação para Excel

Tanto os relatórios quanto a biblioteca de contratos precisavam exportar grandes planilhas. Reconstruí esse pipeline duas vezes:

  • Primeira versão: exportação via streaming pelo S3 para garantir segurança de memória durante exportações grandes.
  • Segunda versão: migrei a exportação para Excel para um job em background no Trigger.dev, permitindo que a aba do usuário não precisasse permanecer aberta enquanto a operação estivesse em andamento. Integrei o processo ao fluxo já existente de envio de e-mail após a conclusão.

8. Migração para oRPC

Migrei as Server Actions para a camada de API oRPC. Foi uma refatoração transversal em todo o pacote web, impactando praticamente todas as mutações do aplicativo. A mudança estabeleceu a base para erros tipados nas fronteiras do sistema e um padrão mais consistente de tratamento de erros.

Melhorias Transversais: aquelas que ninguém pediu, mas das quais todo mundo se beneficia

São melhorias que não aparecem diretamente no roadmap, mas cujo impacto se acumula em todas as features desenvolvidas posteriormente.

  • Refatoração da tipagem de query parameters: a fundação que tornou a página de relatórios possível.
  • Trabalho de performance: memoização de componentes do Chat, melhorias de performance na página de dados extraídos, responsividade de filtros avançados, performance de scroll no visualizador de PDF utilizando prefix sums e queries de exportação em lotes para evitar erros de statement_timeout.
  • Segurança e robustez: sanitização de chaves do S3 + fallback para presigned URLs, escape de valores fornecidos por usuários em filtros jsonpath com wildcard, escape de caracteres de regex POSIX e codificação do conteúdo de comandos do Chat em Base64 para evitar falsos positivos do WAF.
  • CI: adicionei um workflow de revisão de React Best Practices para que novos componentes sejam automaticamente avaliados de acordo com as diretrizes de performance em React/Next.js do time.

Habilidades Desenvolvidas

No fim das contas, trabalhar com o excelente time da Vallor me permitiu evoluir em diversas áreas como engenheiro de software. Como o time de engenharia era pequeno, aproximadamente cinco pessoas, incluindo eu, quando deixei a empresa, tive a responsabilidade de desenvolver e ser responsável por features de ponta a ponta, passando por schema da base de dados → query Kysely → procedimento oRPC → funções AWS Lambda → Componente de Servidor React → hook de mutação de cliente, tudo dentro de um ambiente com regras rígidas de tipagem, controle de acesso e validação com Zod.

Por ter sido meu primeiro trabalho em tempo integral dentro desse novo espaço de IA, também adquiri experiência significativa construindo e trabalhando com agentes de IA. Tive a oportunidade de desenvolver ferramentas e prompts para uma plataforma de agentes integrada ao produto, utilizando LangGraph + Anthropic + um runtime próprio de ferramentas, além de trabalhar com geração e filtragem de tabelas e gráficos através de IA. Em grande parte da tecnologia que desenvolvemos na Vallor para o setor de aquisições, estávamos à frente da curva em relação às funcionalidades de IA que estávamos construindo.

Além de participar regularmente de bug bashing (eu era frequentemente chamado de "o cara de QA"), e trabalhar em melhorias de performance tanto no frontend quanto no backend, acredito que uma das principais habilidades que pude desenvolver ainda mais foi julgamento de produto.

Aprendi a entender e projetar para as pessoas que realmente utilizam os dados, e não apenas para os engenheiros que leem os schemas. Pequenos detalhes fazem diferença: colunas fixas para dar contexto ao usuário enquanto ele navega horizontalmente por grandes tabelas; inputs numéricos e de datas formatados de acordo com o locale; feedback através de toasts sempre que uma mutação pudesse ser concluída silenciosamente (deixando o usuário sem saber se sua alteração havia sido aplicada).

Até mesmo passar horas analisando sessões de usuários no PostHog para observar as pequenas maneiras pelas quais novos usuários interagiam com a plataforma nos dava insights e nos fazia questionar decisões de design que pareciam óbvias do ponto de vista de um desenvolvedor.

Só porque algo funciona para você não significa que funciona para todo mundo. Entender isso é fundamental para construir um bom produto.


TOPO

PRECISA DE UM DESENVOLVEDOR?

Eu estou sempre procurando novas oportunidades para programar! Acha que eu posso te ajudar a construir suas ideias, quer uma copia do meu currículo ou precisa atualizar algumas linhas de código? Entre em contato abaixo!


2024 ❖ Designed & developed by Leonardo Oliveira