
Runsmith
A Flutter app started from scratch, then features delivered end to end across the app, the Nuxt dashboard and the NestJS API.Um app Flutter começado do zero e, depois, funcionalidades entregues de ponta a ponta no app, no painel Nuxt e na API NestJS.
ProjectsProjetos
Runsmith
Nov 2024 – Presentnov 2024 – Atual- Android
- iOS
- Web
An athletic coaching and team-management platform covering organizations, athletes, meets, seasons, benchmarks, records and health workouts. It runs as three separate repositories: a Flutter app for iOS and Android, a Nuxt dashboard for coaches, and a NestJS API that holds the business rules and that both clients are written against. I started the Flutter app from scratch with one other developer, and for a long stretch my work on the web client and the API was occasional. That changed as AI tooling got better, and I moved to building features end to end across all three.Uma plataforma de treinamento e gestão de equipes esportivas que cobre organizações, atletas, competições, temporadas, marcas, recordes e treinos de saúde. Funciona como três repositórios separados: um app Flutter para iOS e Android, um painel Nuxt para técnicos e uma API NestJS que concentra as regras de negócio e contra a qual os dois clientes são escritos. Comecei o app Flutter do zero com outro desenvolvedor e, por um bom tempo, meu trabalho no cliente web e na API foi eventual. Isso mudou quando as ferramentas de IA ficaram melhores, e passei a construir funcionalidades de ponta a ponta nos três.
- MobileMobile
- Flutter
- Dart
- GetX
- Dio
The client I started and know best, on iOS and Android, with GetX for state, routing and dependency injection, and Dio for the calls to the API. Feature modules follow a pages, controllers, services, models and widgets layout, with a design system of shared primitives and separate development and production flavors picking the API host at startup.O cliente que comecei e conheço melhor, em iOS e Android, com GetX para estado, rotas e injeção de dependências, e Dio para as chamadas à API. Os módulos de funcionalidade seguem um arranjo de páginas, controllers, serviços, modelos e widgets, com um design system de primitivos compartilhados e flavors separados de desenvolvimento e produção escolhendo o host da API na inicialização.
- Health & ActivitySaúde e atividade
- Apple Health
- Health Connect
- Google Maps
- fl_chart
Workouts sync from Apple Health on iOS and Health Connect on Android. Routes are drawn on Google Maps, and performance over a season is read through charts.Os treinos sincronizam do Apple Health no iOS e do Health Connect no Android. As rotas são desenhadas no Google Maps, e o desempenho ao longo de uma temporada é lido em gráficos.
- TestingTestes
- flutter_test
- mocktail
- fake_async
Unit and widget tests covering controllers and screens, with mocktail standing in for the services a controller depends on.Testes unitários e de widget cobrindo controllers e telas, com mocktail no lugar dos serviços de que um controller depende.
- BackendBackend
- NestJS
- TypeScript
- Node.js
- MongoDB
- Redis
- BullMQ
- Firebase Admin
- OpenAPI
- Fly.io
A NestJS service in TypeScript holding every business rule, which both clients render without owning domain logic of their own. Firebase issues the JWT it verifies, organization-scoped routes carry their org context through middleware, and its generated OpenAPI spec is the contract the app and the dashboard are written against. It deploys to Fly as separate development and production apps.Um serviço NestJS em TypeScript que concentra todas as regras de negócio, e que os dois clientes apenas renderizam, sem lógica de domínio própria. O Firebase emite o JWT que ele verifica, as rotas por organização carregam o contexto da organização via middleware, e sua especificação OpenAPI gerada é o contrato contra o qual o app e o painel são escritos. O deploy vai para a Fly como apps separados de desenvolvimento e produção.
- WebWeb
- Nuxt 3
- Vue 3
- TypeScript
- Pinia
- Tailwind CSS
- DaisyUI
The coach dashboard, a Nuxt 3 application with selective server rendering per route and composables owning the business logic and API calls. The browser reaches the backend only through Nitro server routes, which re-issue each request rather than forwarding it.O painel do técnico, uma aplicação Nuxt 3 com renderização no servidor seletiva por rota e composables concentrando a lógica de negócio e as chamadas de API. O navegador alcança o backend apenas por rotas de servidor do Nitro, que reemitem cada requisição em vez de encaminhá-la.