Pitch: fiz um bloqueador de apps que cobra flexões (sem câmera)
Fala, galera! Sou um dev americano escrevendo em português (talvez meio torto, me perdoem kkkk). Só pra deixar claro desde o começo: o app é meu.
O problema
Eu precisava dar um limite no meu uso do celular e baixei um daqueles apps de "faz flexão pra desbloquear o Instagram". Amei a ideia! Só não curtia ter que montar o celular pra câmera me filmar fazendo flexão. Era chato demais, e um mico quando o pessoal me via fazendo flexão no posto de gasolina kkkk.
A solução
Fiz o HonorFit: a mesma ideia, só que no sistema de honra. Você escolhe os apps que quer travar, e pra ganhar tempo neles faz flexões, abdominais, agachamentos (ou o exercício que quiser). Sem câmera, sem conta, nada sai do celular. Se você trapacear, só engana você mesmo.
Não é pra todo mundo, mas tô usando faz uns meses e curtindo muito.
Como fiz
- Stack: Expo + React Native, um código só pra iOS e Android, traduzido pra 15 idiomas (inclusive pt-BR).
- iOS: API de Tempo de Uso da Apple (FamilyControls, DeviceActivity e ManagedSettings) via
react-native-device-activity. O usuário escolhe os apps no seletor do próprio sistema e o app só recebe tokens opacos, então nem eu sei quais apps você bloqueou. O saldo de tempo vira thresholds do DeviceActivity, e quando zera o ManagedSettings coloca a tela de bloqueio (shield). - Android: módulo nativo em Kotlin com um foreground service que usa o UsageStats pra ver qual app está aberto e desenha uma tela de bloqueio por cima (overlay). Tem um watchdog e um BootReceiver pra ele não morrer quando o sistema mata o processo.
- Bugs que me pegaram no iOS:
- Nome de evento do DeviceActivity não pode ter
_: a lib separa a chave por underscore e o nome volta cortado (used_7viraused). - Se o início do intervalo for "agora", o iOS entende que já passou e só começa a monitorar amanhã. Nenhum threshold dispara. Solução: começar o intervalo uns 15 minutos no passado.
- No iOS 26 aparecem thresholds "fantasmas" que disparam sem uso nenhum (celular parado no bolso e de repente "acabou seu tempo"). Contornei ignorando eventos que chegam cedo demais pra serem possíveis.
- O botão da tela de bloqueio não consegue abrir o app (limitação da Apple), então a extensão de shield manda uma notificação quando aparece, e é ela que leva de volta pro app.
- Nome de evento do DeviceActivity não pode ter
- Privacidade: sem conta, sem servidor, sem analytics. Tudo fica no aparelho.
Modelo
Grátis, com um Pro opcional (dá pra comprar uma vez só, sem assinatura). E em novembro tem o "Desafio Novembro Sem Scroll" como evento dentro da App Store, se alguém quiser fazer junto.
Grátis no iPhone e Android: https://honorfitapp.com/get/?c=tabnews-br
Qualquer feedback é bem-vindo, até crítica! Principalmente: qual proporção de repetições por minuto parece justa pra vocês?