
LiveFire
A running social app for firearm owners, continued with one other Flutter developer: moved off Firebase onto the REST API, with a custom mention editor behind its feed.Um app social para proprietários de armas de fogo já em andamento, tocado com outro desenvolvedor Flutter: tirado do Firebase para a API REST, com um editor de menções próprio no feed.
ProjectsProjetos
LiveFire
Jul 2023 – Nov 2024jul 2023 – nov 2024- Android
- iOS
A social network for firearm owners, built around courses, a feed, and a training activity log. The project was already running when I joined, and I carried the development forward with one other Flutter developer. It was the only app I worked on at the company. The team ran as a startup, with no sprints or formal process, and this was the first job where my meetings were in English. That was the step I was after, even at a smaller company. The app is still published.Uma rede social para proprietários de armas de fogo, construída em torno de cursos, um feed e um diário de treino. O projeto já estava em andamento quando entrei, e toquei o desenvolvimento adiante com outro desenvolvedor Flutter. Foi o único app em que trabalhei na empresa. O time funcionava como startup, sem sprints nem processo formal, e este foi o primeiro trabalho em que minhas reuniões eram em inglês. Era esse o passo que eu procurava, mesmo em uma empresa menor. O app segue publicado.
- MobileMobile
- Flutter
- Dart
- GetX
One Flutter codebase for iOS and Android, on GetX for state and dependency injection, with two mobile developers on it. Feeds are scoped by where they are read from, so the main feed, a group feed and a profile feed each get their own controller instance, each holding its own copy of a post.Uma base de código Flutter para iOS e Android, com GetX para estado e injeção de dependências, com dois desenvolvedores mobile nela. Os feeds são delimitados por onde são lidos, então o feed principal, o de um grupo e o de um perfil recebem cada um sua instância de controller, cada uma com sua própria cópia de um post.
- API & CachingAPI e cache
- Dio
- REST
The app talks to its own REST API through Dio, with interceptors carrying the cross-cutting work: one attaches the Firebase ID token as a bearer header on requests to the app's own host, others add device and app-version information, and the last one handles being offline. That interceptor stores the responses to requests that opt into caching, and when a request later fails for lack of connection it serves the stored response and flips a connection flag the feed controllers read.O app conversa com a própria API REST via Dio, com interceptors carregando o que é transversal: um anexa o token do Firebase como bearer nas requisições ao host do próprio app, outros acrescentam informação de dispositivo e de versão, e o último trata a ausência de conexão. Esse interceptor guarda as respostas das requisições que optam por cache e, quando uma requisição depois falha por falta de conexão, entrega a resposta guardada e marca uma flag de conexão que os controllers de feed leem.
- Feed & PostsFeed e posts
- Algolia
The mention controller searches Algolia while the user types, and holds the mapping between the handle shown in the field and the user id the backend stores.O controller de menções busca no Algolia enquanto o usuário digita e mantém a correspondência entre o handle exibido no campo e o id de usuário que o backend guarda.
- MediaMídia
- api.video Live Stream
- video_player
- Firebase Cloud Storage
- image_picker
The app uploads images and video. Images go to Cloud Storage; an uploaded video comes back as a stream URL with a generated preview image. Playback covers recorded video and live stream viewing.O app envia imagens e vídeos. As imagens vão para o Cloud Storage; um vídeo enviado volta como URL de stream com uma imagem de preview gerada. A reprodução cobre vídeo gravado e visualização de transmissão ao vivo.
- Location & MapsLocalização e mapas
- Geolocator
- Google Maps
Device location filters events and profiles by proximity and supplies the weather recorded alongside a training session. Google Maps shows an event's location and backs the location search.A localização do dispositivo filtra eventos e perfis por proximidade e fornece o clima registrado junto de uma sessão de treino. O Google Maps mostra o local de um evento e sustenta a busca por localização.
- Auth & Platform ServicesAutenticação e serviços de plataforma
- Firebase Auth
- Firebase Crashlytics
- Firebase Analytics
- Firebase Cloud Messaging
- Firebase Remote Config
- Firebase Dynamic Links
Firebase covers sign-in and the operational side of the app: Auth with Google, Apple and Facebook sign-in, Crashlytics and Analytics, push through Cloud Messaging, Remote Config, and Dynamic Links behind the deep links that open a shared post or profile in the app. Auth is the piece that stayed when the app's data reads moved to the REST API.O Firebase cobre o login e o lado operacional do app: Auth com entrada por Google, Apple e Facebook, Crashlytics e Analytics, push via Cloud Messaging, Remote Config e Dynamic Links por trás dos deep links que abrem no app um post ou perfil compartilhado. O Auth é a parte que ficou quando as leituras de dados do app passaram para a API REST.
- BackendBackend
- NestJS
- TypeScript
- MongoDB
- Redis
- BullMQ
- Firebase Admin
- OpenAPI
- Stripe
- Mux
- Algolia
- Pusher
A separate NestJS service in TypeScript, on MongoDB, with Redis for caching and locks, BullMQ for background jobs, and Firebase Admin verifying the same tokens the app sends. I was not on the backend team, and passed through it only for the changes my own work required.Um serviço NestJS separado, em TypeScript, sobre MongoDB, com Redis para cache e locks, BullMQ para tarefas em segundo plano e Firebase Admin validando os mesmos tokens que o app envia. Eu não era do time de backend, e passava por lá apenas para as mudanças que o meu próprio trabalho exigia.