chroncal dois meses depois: contas CalDAV, robustez de sincronização e o que vem a seguir
· 6 min. de leitura
Também disponível em English
Quando apresentei o chroncal em meados de junho, ele estava na v0.3.x. Pouco mais de dois meses depois ele está na v0.7.12 — vinte e quatro releases no meio do caminho, o maior release de funcionalidades até agora, uma enorme passada de robustez e os primeiros relatos de bugs de pessoas que não sou eu. Quatro dessas cinco issues da comunidade já estão corrigidas e publicadas. Este post é um apanhado do que mudou e para onde o projeto vai.
Contas CalDAV
A grande novidade da v0.7.0: contas agora são um conceito de primeira classe. Até então, cada calendário remoto carregava sua própria URL e sua própria cópia de uma credencial — conectar dez calendários do Nextcloud significava dez logins. Uma conta armazena uma credencial, descobre todas as coleções que o servidor expõe e passa a ser dona dos calendários que vêm dela:
CHRONCAL_PASSWORD="…" chroncal account add "Servidor do trabalho" \
--server https://cal.example.com --username alice
chroncal account calendars list "Servidor do trabalho" # inventário completo, atualizado
chroncal account calendars add "Servidor do trabalho" --all
O account add importa toda coleção que suporte VEVENT, VTODO ou VJOURNAL e completa uma sincronização inicial antes de retornar. O account remove apaga a credencial e os vínculos remotos, mas mantém os calendários baixados como cópias locais. Segredos são lidos de CHRONCAL_PASSWORD, CHRONCAL_BEARER_TOKEN ou GOOGLE_CLIENT_SECRET, ou pedidos via prompt interativo — nunca aceitos como flag de CLI.
O Google Calendar saiu ganhando: a descoberta agora lê a CalendarList do Google, então calendários delegados, de família, de feriados e de assinatura passam a ser encontrados — não só o primário — atrás de um único login. E as credenciais agora têm escopo por banco de dados no chaveiro do sistema operacional, então dois bancos do chroncal na mesma máquina não colidem mais.
Atualizar não exige ação: as migrações 040–042 são aditivas, vínculos por calendário via --remote-url continuam funcionando e nenhum comando foi removido ou renomeado.
Um gerenciador de calendários unificado na TUI
Pressione C (ou procure na paleta de comandos) e você tem o novo gerenciador de calendários: uma hierarquia agrupada por conta à esquerda, um inspetor à direita e edição de metadados inline. Um menu + Add na base oferece New Calendar…, Add Account… (OAuth completo no navegador, sem sair do aplicativo) e Import Calendar File…. O Manage Calendars… mostra as coleções descobertas como uma lista de verificação — desmarcar uma remove a cópia local após confirmação, nunca a remota.
A barra lateral também se reorganizou em torno de contas: seções discretas e recolhíveis com um grupo Local separado, círculos preenchidos ● e vazados ○ para alternar visibilidade, e Shift+↑/Shift+↓ para reordenar seções inteiras de contas. Calendários locais ganharam Move to Account… para transferir seu conteúdo para uma coleção remota. E coleções que o servidor expõe como somente leitura agora são utilizáveis: navegação local e sincronização apenas de download, com edições rejeitadas em vez de silenciosamente perdidas.
Robustez do núcleo
A v0.6.0 foi um único release com mais de 200 correções de bugs, e ele mostra onde está o trabalho real de uma ferramenta de calendário:
- Correção na sincronização: ETags fracos tratados como fracos, exclusões de tombstones condicionais, resolução de conflitos atômica, fim dos objetos duplicados após conflitos no modo prompt
- Alarmes: claims de snooze e refire para checadores sobrepostos nunca dispararem duas vezes, ancoragem por ocorrência no
DUEde alarmes de tarefas recorrentes - Fidelidade iCal: horários floating exportados como UTC wall clock, abas de
VTIMEZONEampliadas para o horizonte da série recorrente,TZIDemitido emEXDATE/RDATE - Recorrência: eventos só com RDATE,
EXDATEs distorcidos por fuso, instâncias de vários dias cruzando o limite de uma janela - A TUI: truncamento consciente da largura de exibição em toda parte, para que títulos com CJK e emojis deixem de quebrar o grid
A v0.7.1 complementou exibindo os avisos de importação em vez de descartá-los — eles agora aparecem na linha de status e num arquivo de log, com o registro dono nomeado. No desempenho, contas distintas sincronizam em paralelo enquanto calendários de uma mesma conta seguem em série, e as buscas de sobreposições recorrentes são agrupadas por mestre.
Adições menores
chroncal --event <id|uid>abre a TUI focada num evento (v0.7.7)chroncal event rsvp 42 --status ACCEPTEDdefine seu status de RSVP pela CLI, com apelidosyes/no/maybe(v0.7.5)- Excluir esta ocorrência ou esta e as seguintes de uma série (v0.7.4)
pcopia os detalhes do evento na visualização de evento (v0.7.8)Walterna o primeiro dia da semana entre domingo e segunda, persistido como a escolha de visão e configurável viaui.week_start(v0.7.11)account credentialseaccount reauthrotacionam segredos basic/bearer e repetem o fluxo OAuth do Google; calendários podem ser ocultados e exibidos, e a sincronização pode rodar para uma única conta (v0.7.8)
Da comunidade
A parte que mais me deixava curioso: como seriam as primeiras issues de desconhecidos? Cinco issues, quatro pessoas, e a resposta acabou sendo as peculiaridades do CalDAV do Google Calendar.
#575 — @dmitrydoni descobriu que o Google entrega VALARM com ACTION:NONE, que o schema do chroncal (CHECK action IN ('AUDIO','DISPLAY','EMAIL')) rejeitava, revertendo a transação do recurso inteiro e impedindo a convergência da sincronização inicial. A v0.7.8 agora preserva alarmes estranhos por completo, conta-os nos avisos, e o --clear-foreign-alarms os remove.
#576 — o mesmo repórter esbarrou no Google devolvendo hrefs de recursos desatualizados que dão 404 no multiget; cada falha contava como incompleta e o token de sincronização era retido para sempre. A v0.7.9 converge apesar dos 404s desatualizados. A issue foi fechada e a correção publicada cerca de quinze minutos depois.
#629 — @Six-VI, que gentilmente chamou o chroncal de "by far the best terminal calendar I have come across" (de longe o melhor calendário de terminal que já encontrei), pediu uma forma de começar a semana na segunda. Saiu na v0.7.11 como o alternador W, também de issue fechada a release em quinze minutos.
#628 — @maxandersen relatou que o Google responde 403 ao PROPFIND não padronizado de calendar-color, o que abortava a sincronização inicial depois da conta já criada. A v0.7.12 (publicada no dia seguinte) mantém a sincronização de eventos rodando quando a busca da cor falha e envia as cores pela API CalendarList.
#627 — @teto pediu um módulo do home-manager para Nix, exposto pelo flake como o khal faz. Ainda aberta, e um pedido justo dado que o projeto já publica um flake — saber que a importação do Fastmail funcionou sem ajustes foi um bônus agradável de ler.
O repositório também cruzou 60 estrelas nesse meio-tempo. Para uma ferramenta que promete conformidade com o RFC 5545, ver estranhos testando-a contra servidores CalDAV do mundo real é exatamente o ciclo de feedback que eu esperava.
O que vem a seguir
A lista que dei em junho continua de pé, e o progresso nela é honesto, se não rápido:
- Tarefas e diários na TUI (#30) — a maior lacuna restante e o próximo grande foco. O lado da CLI está completo; a TUI ainda trata
VTODOeVJOURNALcomo cidadãos de segunda classe. - Pacotes
.debe.rpmvia GoReleaser nFPM, quando os canais primários de gerenciadores de pacotes estiverem estáveis. - O módulo do home-manager da #627.
- Casos-limite de sincronização da minha própria lista: o push oportunista hoje fixa em server-wins e pode descartar uma edição local concorrente (#610), além de acompanhamentos sobre token de sincronização e calendar-color do Google (#625, #634).
- Um arcabouço de testes com banco de dados para a TUI, para que a cadeia edição-salvamento tenha cobertura de regressão (#601).
Se você experimentou o chroncal em junho, atualize e reconecte via chroncal account add — um único login para o servidor inteiro supera colar URLs por calendário. Se ainda não experimentou, o repositório está em github.com/DouglasdeMoura/chroncal, e issues e contribuições continuam sendo bem-vindas.