← Projetos

fastin

App Android de controle de jejum intermitente. Offline por construção, distribuído por sideload — sem backend, sem login e sem permissão de internet no manifesto.

2026
Ver no GitHub →
KotlinJetpack ComposeRoomWorkManagerGradle KTS
fastin — calendário com relógio de jejum
fastin — dashboard com gráficos
fastin — formulário de registro do dia
fastin — ajustes e backup

O Contexto e o Problema

Eu acompanhava meu jejum intermitente em planilha, e a planilha não resolvia a única pergunta que importava no meio da manhã: há quanto tempo eu estou sem comer? Os apps do mercado resolviam isso, mas todos pediam conta, mandavam meus dados de saúde para um servidor e monetizavam com assinatura.

O incômodo não era o preço. Um registro diário de peso, alimentação e jejum é um dado íntimo, e não havia motivo técnico para ele sair do meu aparelho — o app não precisa de nada além do meu próprio histórico para funcionar.

A Solução

Um app nativo que roda inteiramente no dispositivo. O manifesto não declara a permissão de INTERNET: o app funciona em modo avião por construção, não por promessa. Sem Play Store, sem Play Services, sem conta.

A regra central é mais sutil do que parece: o jejum de um dia começa na última refeição do dia anterior e termina na primeira refeição do dia atual. Ele atravessa a meia-noite por definição, e num país com horário de verão a duração real diverge do relógio de parede. Um jejum de 20:00 às 12:00 marca 16h no relógio, mas 17h reais quando o país sai do horário de verão naquela noite.

Números

90

Testes na JVM

1,5 MB

Tamanho do APK

0

Permissões de rede

9

ADRs documentados

Funcionalidades

Relógio de jejum em tempo real

Conta o tempo desde a última refeição registrada, com os marcos de 16h, 18h, 20h e 24h e o horário previsto de cada um.

Registro diário sem campo obrigatório

Horários das refeições, déficit calórico, qualidade, água, álcool, peso e observações. Todos opcionais — tocar de novo num chip já marcado limpa o campo.

Dashboard configurável

O usuário adiciona, remove e configura cards: linha, dispersão, heatmap e número grande, sobre sete métricas e cinco períodos.

Backup em CSV

Export e import simétricos. É o único backup que existe, e o Auto Backup do Android está desligado de propósito — um log de saúde não vai para a nuvem sem o usuário pedir.

Notificações locais

Avisos ao bater 16h, 18h e 20h via WorkManager, sem rede e sem Play Services. O worker revalida o jejum antes de notificar: se você já comeu, o aviso não dispara.

Destaque Técnico: testar um app Android sem emulador

Desenvolvi o app numa máquina Windows ARM64, e no meio do caminho descobri que o Google não publica o emulador Android para essa plataforma — o pacote nem aparece no SDK manager. O Robolectric, que roda testes de Android na JVM, também só publica binário nativo para x86_64 no Windows, e uma JVM ARM64 não carrega DLL x64.

A saída foi isolar o problema onde ele realmente existe: apenas a JVM de teste roda em x64. Compilação, Kotlin, KSP, R8 e o empacotamento do APK seguem em ARM64 nativo — o APK entregue nunca passa por emulação. Com isso, os 90 testes rodam na JVM, sem aparelho conectado.

Para ver as telas, cada uma é composta e desenhada de verdade num bitmap e salva em PNG. Isso virou também um teste de renderização: uma tela que quebrasse ao medir ou desenhar falharia ali, e nenhum outro teste pegaria — os demais consultam a árvore de semântica, que existe mesmo quando o desenho falha.