Projeto próprio · em produção
Trajecto+
Os horários do Metro do Porto no telemóvel, em 7 línguas e mesmo sem rede dentro do túnel. Uma app independente, que desenhei e mantenho de ponta a ponta: da interface aos pagamentos, da importação dos horários ao servidor.
trajectoplus.pt
O problema
Os horários do metro fazem falta exatamente onde a rede falha: dentro do túnel. E no Porto há muitos turistas, que precisam deles na sua língua.
O que construí
Uma app instalável com as próximas partidas de cada estação, as linhas, um planeador de viagens com transbordos e um roteiro turístico com 31 pontos de interesse perto do metro, com mapa e fotografias. Está em 7 línguas: português, inglês, espanhol, francês, alemão, italiano e japonês.
Decisões
- Horários no telemóvel. Os horários publicados pela Metro do Porto (GTFS) são validados antes de cada importação e guardados no telemóvel, por isso a app funciona sem rede. Até os comboios depois da meia-noite, que no GTFS aparecem como 24:xx, pertencem ao dia anterior e mostram a hora certa.
- Mapas sem terceiros. O mapa do Porto é um recorte servido pelo próprio servidor, sem pedidos a serviços de mapas externos, e a localização nunca sai do telemóvel.
- Pagamento dentro da app. Numa app instalada no iPhone, abrir o browser para pagar fazia perder a compra, por isso o checkout do Stripe abre dentro da app. Quem dá o passe é o webhook do Stripe, nunca o regresso do browser.
- Passes que se somam. Comprar um passe antes de o anterior acabar não faz perder dias: o novo começa quando o outro termina.
Operação
Tudo corre em Docker, com Caddy a tratar do HTTPS. As imagens são construídas no GitHub Actions, nenhum deploy avança sem os testes passarem e, se a versão nova não responder, o servidor volta sozinho à anterior. A base de dados é copiada todos os dias às 03:00 e levada para uma NAS em casa, protegida por snapshots.
Tecnologia
React, TypeScript, Mantine e Leaflet no frontend, FastAPI no backend, MongoDB, Stripe, Docker, Caddy e GitHub Actions.
Tecnologias
- React
- TypeScript
- FastAPI
- MongoDB
- Stripe
- PWA