arrow_backBack to WorkVoltar para Projetos

Production product · RunningProduto em produção · Corrida

Running Analytics

A multi-user running tracker that brings activities, shoe mileage, upcoming races, and progress indicators into one private history. Uma plataforma multiusuário que reúne atividades, quilometragem dos tênis, próximas provas e indicadores de evolução em um histórico privado.

TypeTipo Production full stackFull stack em produção
Domain running.kaue.space
Stack Next.js · Express · PostgreSQL
Running Analytics dashboard with monthly metrics, weekly volume, shoes, and upcoming races

Product and engineeringProduto e engenharia

The project started as a small activity API and evolved into a complete product. Each account owns its records, can register manual runs, associate shoes, plan races, and follow aggregated weekly indicators from a responsive dashboard.O projeto começou como uma pequena API de atividades e evoluiu para um produto completo. Cada conta controla seus registros, cadastra corridas manuais, associa tênis, planeja provas e acompanha indicadores semanais em um dashboard responsivo.

The production path was part of the engineering work: relational migrations run before the API starts, PostgreSQL stays private to the Docker network, Caddy terminates TLS, and application containers run with reduced privileges and read-only filesystems.O caminho de produção fez parte da engenharia: migrations relacionais executam antes da API, o PostgreSQL permanece privado na rede Docker, o Caddy encerra o TLS e os containers da aplicação rodam com privilégios reduzidos e sistema de arquivos somente leitura.

Inside the productPor dentro do produto

The interface beyond the login screen.A interface além da tela de login.

Real flows captured from a local environment with fictional data: weekly overview, activity history, shoe mileage, and race planning.Fluxos reais capturados em ambiente local com dados fictícios: visão semanal, histórico de atividades, quilometragem dos tênis e planejamento de provas.

Running Analytics dashboard showing monthly metrics and weekly volume
Monthly indicators and weekly volume.Indicadores mensais e volume semanal.
Running Analytics activity history with distance, duration, pace, and notes
Manual activity history with pace and equipment.Histórico manual com pace e equipamento.
Running Analytics shoe mileage and estimated lifespan
Shoe mileage derived from recorded activities.Quilometragem do tênis derivada das atividades.
Running Analytics upcoming race planning
Upcoming race planning and goals.Planejamento de próximas provas e metas.

ArchitectureArquitetura

One domain, separated responsibilities.Um domínio, responsabilidades separadas.

  1. 1. Next.js renders protected routes and the responsive interface.renderiza rotas protegidas e a interface responsiva.
  2. 2. Express owns authentication, validation, business rules, and HTTP resources.concentra autenticação, validação, regras de negócio e recursos HTTP.
  3. 3. Prisma + PostgreSQL enforce relational ownership and migrations.garantem propriedade relacional dos dados e migrations.
  4. 4. Caddy + Docker provide TLS, same-origin routing, health checks, and isolated services.fornecem TLS, roteamento same-origin, healthchecks e serviços isolados.

AuthenticationAutenticação

Opaque sessions instead of browser-stored user data.Sessões opacas sem dados do usuário no navegador.

  • Argon2id password hashes and rate-limited authentication.Senhas com Argon2id e autenticação protegida por rate limit.
  • Random session tokens; only SHA-256 hashes reach the database.Tokens aleatórios; apenas o hash SHA-256 chega ao banco.
  • HttpOnly, Secure, SameSite cookies in production.Cookies HttpOnly, Secure e SameSite em produção.
  • Every query is scoped to the authenticated account.Todas as consultas são limitadas à conta autenticada.

Data modelModelo de dados

Relational ownership by design.Propriedade relacional por definição.

Users own sessions, shoes, activities, and races. Activities reference both the account and the shoe through composite constraints, preventing cross-account associations even if an identifier is manipulated.Usuários possuem sessões, tênis, atividades e provas. As atividades referenciam conta e tênis por restrições compostas, impedindo associações entre contas mesmo se um identificador for manipulado.