Pular para o conteúdo
PRODUTO EM PRODUÇÃO
frotamais.expostacker.com.br
Frotamais — arte do produto
live preview

Frotamais — Plataforma de frota com D1, auth real, roles e rastreamento ao vivo

Stack tecnológica: Astro Hono Cloudflare Workers D1 Durable Objects Better Auth
8
Veiculos na demo
11
Modulos ativos
3
Roles com permissoes

Cliente

Frotamais

Setor

Gestão de Frotas e Logística

Linha do tempo

6 dias de implementação · 2026-08

Produto ao vivo

Usar agora

Resultados

Resultados reportados pelo cliente durante o rollout

3 bindings Cloudflare ativos

Baseline: D1 + KV + Durable Object

8 veículos na demo

Baseline: dados ilustrativos em D1

7 módulos ativos

Baseline: dashboard funcional com auth

10 eventos de telemetria

Baseline: base para score de segurança

<1s TTFB estimado

Baseline: borda Cloudflare

100% rotas via VRP real

Baseline: Nearest Neighbor + 2-opt

Dados reportados pelo cliente

O desafio

O desafio

Frotamais e uma demonstracao de plataforma SaaS de gestao de frotas evoluida de mock estatico para MVP funcional honesto. A landing page comunica o valor do produto enquanto a area logada exige autenticacao real com roles e mostra dashboard com mapa ao vivo, roteirizacao VRP, KPIs do banco D1, paginas de detalhe por veiculo e motorista, CRUD completo, relatorios com graficos dinamicos, inspecoes DVIR, geofences e score de motorista calculado em tempo real.

Transportadoras e gestores de frota perdem visibilidade quando controlam tudo em planilhas desatualizadas. Falta uma visao unica de veiculos, motoristas, rotas, manutencao, combustivel, inspecoes e geofences para decidir com agilidade.

A abordagem

A abordagem

Implementamos Astro com SSR, Hono para API REST com CRUD completo (POST/PUT/DELETE), Cloudflare D1 com Drizzle ORM para persistencia real, Better Auth para autenticacao com roles (admin, gestor, motorista) e permissoes granulares, Durable Objects com SSE para rastreamento em tempo real, algoritmo VRP (Nearest Neighbor + 2-opt com distancia haversine) para roteirizacao, Leaflet para mapas com geofences, score de seguranca calculado a partir de eventos de telemetria, paginas de detalhe por veiculo e motorista, relatorios com graficos dinamicos (barras e donut em SVG puro) e exportacao CSV, inspecoes DVIR e sino de notificacoes in-app.

A solução

A solução

  • Landing page com hero fotografico e CTA para acessar a demo
  • Autenticacao real com Better Auth (email/senha) e sessao via KV
  • Sistema de roles e permissoes (admin, gestor, motorista) com middleware de acesso
  • Banco Cloudflare D1 com Drizzle ORM e migrations aplicadas em producao
  • Dashboard com KPIs lidos do D1, mapa Leaflet e grafico dinamico de consumo
  • Pagina de detalhe por veiculo com historico, mapa, financeiro, viagens, manutencao e inspecoes
  • Pagina de detalhe por motorista com score detalhado, eventos de telemetria e viagens
  • CRUD completo na interface: adicionar e remover veiculos e motoristas com modal de formulario
  • Filtros e busca em veiculos, motoristas e alertas
  • Roteirizacao VRP real com Nearest Neighbor + 2-opt e distancia haversine
  • Rastreamento em tempo real via SSE com Durable Object (simulacao de telemetria)
  • Score de seguranca calculado em tempo real a partir de eventos de telemetria
  • Inspecoes DVIR (checklist pre/pos viagem) com aprovacao e defeitos
  • Geofences com areas de controle visualizadas no mapa Leaflet
  • Relatorios com graficos dinamicos (barras e donut em SVG puro) lidos do D1
  • Exportacao CSV para combustivel, manutencao e viagens
  • Sino de notificacoes in-app com contador de alertas pendentes
  • Middleware de auth protegendo rotas /app/* com redirecionamento por role
  • Módulos: dashboard, veiculos, motoristas, rotas, manutencao, combustivel, alertas, inspecoes, geofences, relatorios e usuarios
  • API Hono com CRUD completo (GET/POST/PUT/DELETE) lendo do D1
  • Deploy em Cloudflare Workers com D1, KV e Durable Object bindings
  • Tabelas acessiveis com th scope e badges de status
  • Disclaimers claros de que nao ha emissao de documentos fiscais reais

Linha do tempo

Como o projeto foi conduzido, do mapeamento ao deploy. How the project was conducted, from mapping to deploy.

1 dia

Discovery

  • Pesquisa de benchmarks de gestão de frotas
  • Análise de fluxos operacionais de transportadoras brasileiras
  • Definição de módulos e arquitetura

1 dia

Design

  • Landing page com hero fotográfico
  • Paleta azul profundo + laranja de CTA
  • Sidebar e top bar do dashboard

2 dias

Dev base

  • Scaffold Astro + Hono + Tailwind
  • Seed de dados ilustrativos brasileiros
  • Landing page e módulos do dashboard
  • Deploy no Cloudflare Workers

2 dias

Dev funcional

  • D1 real com Drizzle migrations
  • Better Auth com sessao e middleware
  • Durable Object + SSE para rastreamento
  • VRP Nearest Neighbor + 2-opt
  • Leaflet no dashboard
  • Score de seguranca calculado

2 dias

Evolucao MVP

  • Sistema de roles e permissoes (admin, gestor, motorista)
  • Paginas de detalhe por veiculo e motorista
  • CRUD completo na interface com modais
  • Inspecoes DVIR com checklist pre/pos viagem
  • Geofences com areas no mapa
  • Relatorios com graficos dinamicos e exportacao CSV
  • Sino de notificacoes in-app
  • Filtros e busca em todos modulos

Metodologia

Como o projeto foi conduzido, do mapeamento ao deploy. How the project was conducted, from mapping to deploy.

1

Pesquisa de benchmarks

2

Arquitetura edge-first

3

Mobile-first

4

Acessibilidade primeiro

5

Honestidade no conteúdo

6

Algoritmos próprios

7

Tempo real na borda

8

Deploy contínuo

Arquitetura

  • → Astro SSR com Cloudflare Workers adapter e custom worker entry point
  • → Hono gerenciando rotas /api/* lendo do D1 via Drizzle ORM
  • → Cloudflare D1 com migrations Drizzle aplicadas em produção
  • → Better Auth com factory function (D1 binding só existe no contexto da request)
  • → Middleware Astro protegendo rotas /app/* com verificação de sessão
  • → Durable Object FleetTracker com SSE para rastreamento em tempo real
  • → Durable Object usa alarm() para simular telemetria a cada 3 segundos
  • → Algoritmo VRP (Nearest Neighbor + 2-opt) roda no edge com haversine
  • → Leaflet com client:only para evitar problemas de SSR com window
  • → KV Namespace para sessão de auth na borda
  • → Build e deploy via GitHub Actions com migrations D1 automáticas
  • → Subdomínio frotamais.expostacker.com.br gerenciado pela Cloudflare

Diagrama conceitual — não reflete implementação real

Stack tecnológica

Escolhas técnicas e o que ficou para fora.

systems

Astro

Por quê: SSR leve e islands para interatividade seletiva.

Alternativa rejeitada: Next.js

React 18

Por quê: Compatibilidade com SSR no Workers.

Alternativa rejeitada: React 19

Leaflet

Por quê: Mapa interativo leve com marcadores e polylines.

Alternativa rejeitada: MapLibre GL

Tailwind CSS

Por quê: Design tokens e responsividade.

Alternativa rejeitada: CSS customizado

systems

Hono

Por quê: API pequena e compatível com Workers.

Alternativa rejeitada: Express

Better Auth

Por quê: Auth real com sessão e adapter Drizzle.

Alternativa rejeitada: Auth mockado

Drizzle ORM

Por quê: Type-safe queries SQL no D1.

Alternativa rejeitada: SQL cru

systems

Cloudflare D1

Por quê: Banco SQLite serverless na borda.

Alternativa rejeitada: Supabase

Durable Objects

Por quê: Estado compartilhado e SSE para realtime.

Alternativa rejeitada: WebSocket service

KV Namespace

Por quê: Sessão de auth na borda.

Alternativa rejeitada: Redis

systems

Nearest Neighbor + 2-opt

Por quê: VRP leve com haversine, funciona no Workers.

Alternativa rejeitada: OR-Tools WASM

Safety Score

Por quê: Cálculo real a partir de eventos de telemetria.

Alternativa rejeitada: Score estático mockado

systems

Cloudflare Workers

Por quê: Borda global, SSL e domínio personalizado.

Alternativa rejeitada: Vercel

Decision log

O que escolhi, o que rejeitei e por quê.

D1 real em vez de dados em memória

Por que: D1 com Drizzle ORM demonstra capacidade de persistência real, migrations e queries SQL na borda. Mostra domínio de banco serverless sem custo adicional no plano Cloudflare.

Alternativas rejeitadas: Seed em memória — rejeitado por não demonstrar capacidade de banco real.

Better Auth em vez de auth mockado

Por que: Better Auth com adapter Drizzle + D1 mostra autenticação real com sessão, cookies seguros e middleware. Demonstra domínio de segurança para prospects B2B.

Alternativas rejeitadas: Auth mockado sem persistência — rejeitado por não demonstrar capacidade real de auth.

Durable Objects + SSE em vez de polling

Por que: Durable Objects mantêm estado compartilhado entre conexões e broadcastam posições via SSE. Demonstra arquitetura realtime na borda sem serviço externo.

Alternativas rejeitadas: Polling com setInterval — rejeitado por não ser tempo real e gerar carga desnecessária.

VRP próprio (Nearest Neighbor + 2-opt) em vez de OR-Tools

Por que: Implementação própria de Nearest Neighbor + 2-opt com haversine é leve, funciona no Workers e demonstra domínio de algoritmos. OR-Tools WASM pesa 58MB e excede limites do Workers.

Alternativas rejeitadas: OR-Tools WASM — rejeitado pelo tamanho de 58MB que excede o limite do Workers.

Leaflet em vez de MapLibre GL

Por que: Leaflet pesa 40KB gzipped contra 200KB do MapLibre GL. Para marcadores e polylines de rota, Leaflet é suficiente e mais leve. Usa client:only para evitar problemas de SSR.

Alternativas rejeitadas: MapLibre GL — rejeitado pelo tamanho e complexidade desnecessária para o caso de uso.

React 18 em vez de React 19

Por que: React 19 gera erro MessageChannel no ambiente do Cloudflare Workers. React 18 e estavel para SSR nesse runtime.

Alternativas rejeitadas: React 19 — rejeitado por incompatibilidade com o ambiente Workers.

Roles fixos em vez de RBAC customizavel

Por que: Tres roles fixos (admin, gestor, motorista) com permissoes definidas em codigo cobrem os cenarios de portofolio sem adicionar complexidade de CRUD de permissoes. Middleware checa acesso por role e sidebar filtra itens automaticamente.

Alternativas rejeitadas: RBAC customizavel com CRUD de permissoes — rejeitado por escopo excessivo para um portofolio.

Graficos SVG puro em vez de Chart.js

Por que: Graficos de barras e donut em SVG puro pesam menos de 3KB contra 60KB+ do Chart.js. Para os graficos do portofolio, SVG e suficiente e mantem o bundle leve.

Alternativas rejeitadas: Chart.js — rejeitado pelo tamanho e complexidade desnecessaria.

Segurança e acesso

Seguranca e privacidade

  • Autenticacao real com Better Auth (email/senha)

  • Sessao persistida em KV com cookies seguros

  • Sistema de roles (admin, gestor, motorista) com permissoes granulares

  • Middleware protege rotas /app/* com redirecionamento por role

  • Sidebar filtra itens de menu conforme permissoes do usuario

  • Banco D1 com dados ilustrativos persistidos

  • CRUD com validacao server-side via Hono

  • Deploy com SSL via Cloudflare

  • Nenhum documento fiscal real e emitido

  • Secrets gerenciados via wrangler secret put

Lições aprendidas

Nem tudo saiu como planejado.

— Evoluir de mock para MVP funcional honesto foi a decisão certa. D1 real, Better Auth, Durable Objects com SSE, VRP próprio e Leaflet demonstram capacidade técnica profunda sem virar produto comercial. O Wrangler v4 mudou a configuração de Durable Objects de exports para migrations. Better Auth exige factory function porque D1 bindings só existem no contexto da request. Leaflet precisa de client:only no Astro porque acessa window na importação.

Quer um produto como esse?

Posso fazer o mesmo para o seu negócio. Vamos conversar.