Fiz um habit tracker com bash
Eu já testei alguns habit trackers no celular e todos eram meio bosta. O que eu mais gostava era o Loop. É um aplicativo bem simples e acredito que sua simplicidade é o que o torna menos pior, apesar de faltar recursos. Na verdade quase todo aplicativo para celular é uma bosta por alguma razão. Quer fazer isso? Pague a versão premium. Não vai pagar? Fique com um aplicativo limitado cheio de anúncios! Mas o pior é quando baixo um aplicativo e pede registro pra usar. Nesse caso faço a coisa razoável a se fazer: desinstalo imediatamente e deixo uma avaliação negativa explicando o motivo. Quando eles vão aprender? Enfim, é por isso eu tento fazer tudo no computador e o mínimo no celular, pois eu sei que a expreriência do celular é tão ruim.
Fui pesquisar sobre habit trackers de desktop e sinceramente não gostei do que vi. Ou eram muito complicados, ou eram parte de um aplicativo maior. Não gostei de nenhum. Mas adimito que nem cheguei a testar, só bati o olho e não fui com a cara.
Resolvi eu mesmo fazer um. A ideia era fazer algo bem básico, direto ao ponto, mas que permitisse todos os tipos de hábito e que não fosse retardado. Como assim retardado? Uma coisa que me irritava no Loop era que se eu mudasse a meta ele atualizava todos os registros. Exemplo: minha meta é correr 10 minutos. Por uma semana eu corria 10 minutos e todos os registros eram de sucesso. Então na segunda semana eu aumentava a meta para 15 minutos. O que acontecia? Todos os registros antigos se baseavam na nova meta e atualizavam para fracasso. Ideia mais retardada. Mas pelo menos o Loop aceitava números ao invés de apenas deixar você marcar se foi sucesso ou fracasso como muitos outros aplicativos. Ainda assim o Loop não tinha opção para tempo. Se o hábito era acordar às 6:30, eu tinha que marcar os dias com 6,5 para 6:30, 6,25 para 6:15, etc.
Por que shell script e não uma línguagem mais estruturada?
Na verdade eu queria praticar bash. Eu gosto de bash. Por que não?
Sei que bash não é pra isso, mas é a linguagem de script que eu gosto de usar e a que mais conheço. Até daria pra fazer com python, mas queria melhorar no bash e reter o que venho estudando fazendo algo prático. Proibido me chamar de burro nos comentários. A melhor ferramenta é a que funciona e alguns centésimos de segundos perdidos com performace não vão mudar nada na vida de ninguém. E eu também não precisava de interface gráfica, um CLI já dá pro gasto e tem suas vantagens, como integração em scripts, etc. Ex.: eu posso ter um script que marca um dia como sucesso ou fracasso automaticamente a partir de alguma informação, como o tempo que gastei no computador, a hora que desliguei e fui dormir, se commitei em algum projeto, etc. Cabe à criatividade.
Este blog é inteiramente powered by bash, btw.
Tipos de hábitos
Alguns são de sim ou não, como fui à academia hoje?. Outros podem ser quantificados, como correr 10 minutos, dormir antes das dez, ou beber no máximo 3 latas de pitú. Beber duas latas é um dia de sucesso, mas beber uma só ainda é melhor do que beber duas. Desses quantificáveis, alguns podem ser expressos apenas com números inteiros, mas outros como tempo/horário para faciltiar. E quando o hábito não é só de sim ou não também dá pra mudar a meta com o tempo ao passo que você progride, corre mais tempo, dorme mais cedo, etc.
Uma coisa que o Loop tinha e eu não fiz: números reais. Exemplo: beber pelo menos 3 litros de água. E se eu beber 2,5L? No meu script só entram números inteiros. Por que não implementei isso? Duas razões: bash não suporta números reais e eu teria que fazer uma gambiarra com bc. Fiquei com preguiça. Mas também porque considero inútil. 2,5L é o mesmo que 2500ml, 70,5kg é o mesmo que 70500g.
Outra coisa que tinha lá e também não fiz foi frequência semanal/mensal. Exemplo, no Loop você pode ter a frenquência semanal e o status será sucesso se fizer só uma vez na semana. No script só existe a frenquência diária. Não sei o quanto as outras frenquências são úteis, nunca usei. O que eu acredito que seja útil e quero implementar no futuro é dias específicos da semana. Exemplo: um hábito que só se faz no domingo, mesmo que você não bata a meta, o dia é marcado sucesso caso não seja domingo.
Como usar o script?
Só baixe o script e rode. Mas você vai precisar do sqlite3 e do bc.
Crie os hábitos:
$ sdfht new -B --name 'No Fap'
$ sdfht new -I --name 'Ler' --min 10 --unit 'páginas'
$ sdfht new -T --name 'Dormir Cedo' --max '22:00:00'
Para marcar os dias use o comando log.
$ sdfht log -i 1 --status s
Também dá pra selecionar pelo nome do hábito.
$ sdfht log -n 'No Fap' -s f --date 01/04/2025
$ sdfht log -n 'Ler' -s 10
$ sdfht log -n 'Dormir Cedo' -s 23:15:00 --message 'Estava sem sono.'
Mostrando os dados
Após preencher com dados aleatórios, usei o comando show para mostrar.


Por enquanto existem cinco maneiras de printar os hábitos na tela. Algumas saídas têm métricas, mas são bem simplistas e são apenas do mês sendo printado, inclusive a streak.
Para printar um ano ou mês diferente do atual, especifique assim:
Tem mais alguns detalhes que não mostrei aqui, veja o help depois:
Vou usando esse script e se eu encontrar muitos bugs ou surgirem novas necessidades, então farei novas versões. Já tenho umas ideias bobas como printar hábitos em gráficos ou heatmaps, também quero printar de uma forma que fique legal no termux, mas não vou fazer por agora. Enjoei de mexer nisso por enquanto.
Por último, escrever um comando para cada hábito seria chato, então tem esse comando abaixo.
$ sdfht more --auto
Gostei do resultado. Não é perfeito, mas atendeu o que eu queria, pelo menos por enquanto.
Saindo da Falha, Friday, 11/04/2025 13:50
Comentários:
Powered by HTML Comment Box.