Passei 13 anos criando aplicativos Android e, para a maioria deles, o back-end era problema de outra pessoa. Construir o Weather Pal, meu próprio aplicativo de previsão, quebrou esse hábito rapidamente. Isso me ensinou que a confiabilidade móvel raramente depende da resposta do servidor. É sobre o que acontece com seus dados entre a busca e a exibição e sobre quem mais está bebendo do cachimbo pelo qual você paga. Dois incidentes tornaram isso concreto. No primeiro, o sistema operacional parou silenciosamente de atualizar meus dados. No segundo, scripts que eu nunca autorizei esgotaram a cota que o teria atualizado. Nenhum dos dois apareceu como um erro.

Weather Pal é um aplicativo Kotlin e Jetpack Compose — previsões horárias e diárias, AQI, radar, alertas meteorológicos e uma camada de insights em linguagem simples gerados no dispositivo com TensorFlow Lite. As previsões vêm do Open-Meteo e MET Norway, alertas oficiais dos EUA da API do Serviço Meteorológico Nacional e cada solicitação é retransmitida através de um gateway que executo, em vez de ser chamado diretamente do aparelho. As coordenadas são arredondadas com precisão aproximada de um quarteirão antes de partirem; não há conta e os favoritos e o histórico de pesquisa nunca chegam a um servidor, como diz minha política de privacidade. Sou cauteloso quanto a essa formulação, porque não é possível obter uma previsão para um local sem informar alguém sobre o local. As questões são quanto e se você diz isso claramente.

A interrupção que existia apenas na tela inicial

O widget era o recurso do qual mais me orgulhava e o primeiro a me trair. Ele foi atualizado por meio de um trabalho periódico do WorkManager, a maneira correta de fazer trabalho em segundo plano no Android moderno. Então, um testador beta me enviou uma captura de tela: seu widget mostrava 31°C e céu limpo, e sua foto na mesma janela, tirada segundos depois, mostrava uma chuva torrencial. O valor do AQI foi aproximadamente metade da leitura ao vivo. Nada falhou. O Crashlytics estava limpo; o gateway retornou 200 durante todo o dia. Seu dispositivo simplesmente colocou meu aplicativo em um intervalo restritivo de App Standby, e o modo Soneca adiou meu trabalho supostamente periódico por cerca de quatorze horas. O widget estava reproduzindo fielmente a última coisa que havia buscado, sem ter ideia de que era da noite anterior.