O que o Vibetime registra

A documentação do Vibetime o descreve como uma ferramenta de linha de comando que informa o que uma sessão de codificação assistida por IA realmente alterou no git. No terminal, ela encapsula Claude Code, Codex, Gemini, Aster e Opencode. Sessões de desktop do Claude Code, Codex, Cursor e ZCode são capturadas por hooks de sessão. As ferramentas encapsuladas continuam funcionando normalmente: o Vibetime acompanha o estado do git durante o trabalho e imprime um resumo quando a sessão termina. Por padrão, não exige configuração, daemon nem conta.

Instalação e configuração

npm install -g vibetime-cli
vibe
source ~/.zshrc   # ou ~/.bashrc / ~/.config/fish/config.fish

Executar vibe sem argumentos realiza toda a configuração. O comando adiciona hooks de shell aos comandos claude, codex, gemini, aster e opencode e registra hooks de sessão de desktop para os aplicativos Claude Code, Codex, Cursor e ZCode. Fish, Bash e Zsh são detectados automaticamente, e a sintaxe correspondente é gravada no arquivo rc desse shell. vibe init executa explicitamente a mesma configuração e pode ser repetido com segurança.

Resumos de sessão e pontuação

Quando uma sessão em uma ferramenta compatível termina, o Vibetime imprime um cartão final como este:

╭─────────────────────────────────────────────╮
│  ◆ vibe  ·  api  ·  2h 14m                  │
├─────────────────────────────────────────────┤
│                                             │
│  3 commits  ·  +847 −231  ·  12 files       │
│                                             │
│  ████████░░  shipped  ✦                     │
│                                             │
╰─────────────────────────────────────────────╯

As sessões do dia atual, inclusive as que ainda estão ativas, podem ser consultadas com vibe status.

A visualização do vibe status
A visualização do vibe status — Fonte

Depois de ativar a classificação opcional, cada sessão marcada como shipped conta para ela. O Vibetime determina o nível da sessão a partir da atividade do git:

Nível Barra Significado
shipped ████████░░ commits e alterações significativas
progressed ██████░░░░ commits com alterações pequenas
tinkering ████░░░░░░ alterações sem commits
exploring ██░░░░░░░░ poucas linhas modificadas
idle ░░░░░░░░░░ nada mudou
interrupted ░░░░░░░░░░ a sessão foi encerrada ou falhou

Duração e inatividade

O Vibetime verifica o estado do git a cada 30 segundos. Se não detectar alterações de arquivos, commits ou atividade de staging durante 30 minutos, esse período ocioso é excluído da duração da sessão. Suspensão do laptop e inatividade em segundo plano são tratadas automaticamente. Em projetos que não são repositórios git, a duração é medida pelo tempo de relógio.

Propriedade e desduplicação de commits

Depois do login, somente os commits do próprio usuário são creditados. Trazer o trabalho de colegas para a branch por pull ou merge durante uma sessão deixa de contar esses commits como do usuário. O Vibetime compara o e-mail em git config user.email do repositório com os endereços noreply do GitHub do usuário, portanto commits feitos pela interface web do GitHub também contam sem configuração adicional. Sem login, tudo dentro do intervalo medido conta como antes.

Cada commit é creditado apenas uma vez, mesmo quando várias sessões conseguem vê-lo. Isso pode acontecer com agentes em worktrees paralelos do mesmo repositório, duas janelas de editor em uma branch, um terminal ao lado de um editor ou uma segunda máquina para a qual o usuário trouxe o próprio trabalho. O commit normalmente é atribuído à sessão que trabalha no checkout onde ele foi criado, de modo que o trabalho paralelo receba crédito integral sem contagem dupla. Fazer merge, rebase ou amend de trabalho já creditado a uma sessão não o conta novamente, assim como um squash merge de uma branch que já estava atualizada. A documentação identifica um caso que não consegue reconhecer: um squash sobre uma main que avançou desde então.

Trabalho em vários repositórios

Uma sessão pode começar em qualquer diretório. Se esse diretório não for um repositório, o Vibetime detecta os repositórios diretamente dentro dele e mede todos; assim, uma sessão que altera api/ e web/ é pontuada nos dois. Um diretório sem nenhum repositório dentro ou abaixo dele não é acompanhado porque não haveria nada para medir.

Aplicativos de desktop

Os aplicativos de desktop Claude Code, Codex, Cursor e ZCode não executam os comandos encapsulados do terminal, portanto o wrapper do shell não consegue observá-los. O Vibetime os acompanha por hooks de sessão. vibe init instala esses hooks automaticamente; instalações criadas antes da existência do suporte a desktop podem executar vibe init novamente ou usar:

vibe hooks install

O instalador registra hooks em ~/.claude/settings.json, ~/.codex/hooks.json, ~/.cursor/hooks.json e ~/.zcode/cli/config.json para os quatro aplicativos. Também pode gravar entradas para um aplicativo ainda não instalado; elas permanecem como configuração inerte até que o aplicativo exista, de modo que mudar para um deles meses depois não exige nova configuração. Hooks que o Vibetime não criou não são alterados. A partir daí, cada sessão de desktop é registrada e aparece em vibe status, vibe log, vibe share e na classificação, como uma sessão de terminal.

  • Claude Code recarrega as configurações automaticamente, então basta abrir uma nova sessão de Desktop.
  • Codex carrega os hooks na próxima sessão. Dependendo da versão do Codex, o aplicativo pode primeiro pedir que eles sejam revisados e confiados. Se as sessões do Codex não aparecerem em vibe status, a documentação indica essa como a causa provável; revise e confie nos hooks do Vibetime em Settings e depois Hooks no aplicativo de desktop, ou com /hooks na CLI. É necessária uma build do Codex de maio de 2026 ou posterior, quando os hooks ficaram disponíveis de forma geral. O suporte foi testado no macOS e no Linux. O Windows não foi testado, embora os hooks incluam uma variante de comando para Windows, e o projeto aceita relatos. Se o Codex tiver importado hooks do Claude Code, vibe hooks install substitui essas cópias por versões específicas do Codex, que marcam as sessões como Codex e respeitam o limite de três segundos do SessionEnd.
  • Cursor recarrega ~/.cursor/hooks.json automaticamente, portanto abrir uma nova sessão de Agent é suficiente. Se as sessões não aparecerem, os hooks do Vibetime podem ser confirmados em Customize e depois Hooks. O Cursor também pode importar hooks do Claude Code quando configurações de terceiros estão ativadas; essas cópias são marcadas como Cursor, não como Claude. Hooks de nível de usuário não são executados em agentes na nuvem. O suporte ao Cursor foi testado no macOS, e relatos sobre Windows e Linux são bem-vindos.
  • ZCode lê ~/.zcode/cli/config.json na inicialização e mantém novos hooks desativados. É preciso fechar e reabrir o ZCode e depois ativar os quatro hooks do Vibetime em Installed dentro de Settings e Hooks. As cópias de hooks do Claude Code em Legacy devem ser deixadas como estão, porque hooks importados identificariam sessões do ZCode como Claude. Se o caminho fixado do Node mudar e vibe hooks install reescrever os hooks, o ZCode os desativa novamente até que sejam reativados. O ZCode não tem evento de fim de sessão, portanto uma sessão é encerrada após 30 minutos ociosos, como uma sessão de desktop abandonada. Subagentes do ZCode contam para a sessão que os iniciou, em vez de abrir sessões próprias.

A duração no desktop segue a mesma regra do terminal: conta o tempo ativo de codificação e exclui intervalos ociosos de mais de 30 minutos.

Usar o wrapper de terminal e os hooks de desktop ao mesmo tempo não conta uma sessão de terminal duas vezes. Os hooks de desktop ficam inativos quando o wrapper do shell já está acompanhando o trabalho.

Os hooks usam caminhos absolutos porque um aplicativo de desktop iniciado pelo Dock não herda o PATH do shell, o que poderia impedir a resolução de um comando simples vibe. vibe hooks install fixa os caminhos absolutos do Node e da CLI. Depois de mudar a versão do Node, por exemplo em uma atualização do nvm que remova a versão antiga, vibe status aponta os hooks para a instalação atual do Node. Ele também pode identificar um aplicativo que ainda não está sendo acompanhado e explicar o motivo, como um arquivo de configuração que deixou de ser JSON válido.

O acompanhamento de desktop pode ser interrompido sem remover o wrapper do shell:

vibe hooks uninstall

Classificação e compartilhamento

A classificação opcional está disponível publicamente em https://vibetime.club/leaderboard; não é preciso usar a CLI para navegar nela.

vibe login
vibe leaderboard
vibe logout

vibe login faz login pelo GitHub, vibe leaderboard mostra as entregas desta semana no terminal e vibe logout encerra a sessão e interrompe os envios.

A classificação ordena usuários por entregas, ou seja, sessões que registram um commit com alterações significativas. A documentação define significativas como mais de 50 linhas ou mais de 3 arquivos. Lockfiles como package-lock.json, yarn.lock e Cargo.lock são excluídos dos dois cálculos porque um lockfile regenerado não é considerado trabalho. Os quadrados na página indicam os dias em que o usuário entregou. A visualização web oferece abas para esta semana, definida de segunda a domingo em UTC, este mês e todo o período.

O login usa o device flow do GitHub: não há callback de navegador, apenas um código curto informado em github.com. Até a execução de vibe login, o Vibetime não faz solicitações de rede. Depois do login, o cartão final é exibido normalmente e a sessão é enviada em segundo plano. Se a máquina estiver offline, o envio é tentado novamente ao fim da sessão seguinte.

Entrar na conta sozinho não cria uma posição na classificação. A primeira sessão qualificada precisa durar pelo menos um minuto e registrar um commit com alterações significativas. Sessões de terminal são enviadas assim que o Vibetime detecta esse resultado, normalmente dentro de um minuto após o commit, de modo que a entrada pode aparecer enquanto o trabalho ainda está em andamento. Sessões de desktop são enviadas ao terminar. A própria página web também fica em cache por um minuto.

Quem faz login depois de já ter registrado sessões não perde o histórico. Sessões das duas semanas anteriores são enviadas no próximo flush, e vibe leaderboard dispara um imediatamente. Se uma entrada esperada estiver ausente, vibe status é a etapa de diagnóstico: sessões marcadas como progressed ou tinkering não se qualificaram porque somente entregas pontuam. Se houver sessões encerradas ainda aguardando no servidor, vibe status informa isso, e vibe leaderboard tenta o envio novamente.

Os campos enviados são tool, startedAt, endedAt, durationSeconds, commits, linesAdded, linesRemoved, filesTouched, momentum, um hash SHA-256 do nome do projeto e um hash com sal do nome da branch. O sal da branch é gerado aleatoriamente na máquina do usuário e nunca é transmitido, portanto o hash só mostra se duas sessões usaram a mesma branch e não pode ser convertido de volta no nome. Para cada commit creditado, o Vibetime envia hashes com chave do commit, de seu autor e horário de autoria, e do snapshot produzido, junto com o horário do commit e as contagens de linhas e arquivos. A chave é emitida por conta, portanto o mesmo commit informado por duas máquinas do usuário gera o mesmo hash e é contado uma vez. IDs de commits, mensagens de commit, nomes de arquivos, nomes de branches, nomes brutos de repositórios, o e-mail do usuário, códigos de saída e o identificador local nunca saem da máquina.

vibe logout remove ~/.vibe/auth.json, e os envios param imediatamente.

Um badge para README pode exibir as entregas do usuário:

[![vibetime](https://vibetime.club/@your-handle/badge.svg)](https://vibetime.club/@your-handle)

O badge mostra as entregas de todo o período e é atualizado a cada hora. Acrescentar ?window=week ou ?window=month à URL do badge altera a janela exibida.

vibe share imprime um cartão semanal de resumo. Pressionar h abre a versão HTML, que pode ser copiada, capturada em uma imagem ou publicada.

O cartão semanal do vibe share em um terminal
O cartão semanal do vibe share em um terminal — Fonte
A versão HTML de um cartão do vibe share
A versão HTML de um cartão do vibe share — Fonte

As sequências medem dias consecutivos com entregas. Se o usuário entregou ontem, mas ainda não entregou hoje, a sequência mostra uma ampulheta para indicar que o dia ainda está aberto.

Ferramentas adicionais e comandos

A documentação afirma que o Vibetime pode encapsular qualquer CLI de IA. Uma ferramenta não coberta pela configuração padrão pode ser adicionada explicitamente, como em:

vibe config add-tool aider
Comando Função
vibe status Mostra as sessões de hoje, inclusive as ativas
vibe log Mostra as últimas 20 sessões
vibe share Imprime o cartão semanal de resumo
vibe share --html Produz um cartão HTML compartilhável
vibe login Entra na classificação pelo GitHub
vibe logout Sai da classificação
vibe leaderboard Mostra as entregas desta semana
vibe config show Exibe as configurações atuais
vibe config set handle <name> Define o @handle exibido nos cartões
vibe config add-tool <name> Acompanha outra CLI de IA
vibe hooks install Ativa o acompanhamento de sessões de desktop do Claude Code, Codex, Cursor e ZCode
vibe hooks uninstall Interrompe o acompanhamento de sessões de desktop
vibe uninstall Remove hooks de shell e de desktop

Uma sessão pertence ao dia em que começou, portanto uma sessão que continue depois da meia-noite ainda aparece no dia anterior.

Remoção, privacidade e licença

vibe uninstall
npm uninstall -g vibetime-cli

vibe uninstall remove tudo o que vibe init configurou: os hooks de shell no arquivo rc e os hooks de desktop do Vibetime em ~/.claude/settings.json, ~/.codex/hooks.json, ~/.cursor/hooks.json e ~/.zcode/cli/config.json, preservando hooks que ele não criou. vibe hooks uninstall remove apenas o acompanhamento de desktop. Os dados de sessão em ~/.vibe/ são preservados; quem quiser uma remoção completamente limpa precisa excluir esse diretório manualmente.

O Vibetime não tem telemetria e não exige conta por padrão. Os dados permanecem na máquina a menos que o usuário opte pelos envios à classificação com vibe login. A ferramenta afirma ler apenas metadados do git, como contagens de commits, linhas e arquivos. Ela não lê conteúdo de arquivos, variáveis de ambiente, chaves de API nem texto digitado em uma ferramenta encapsulada. O stdin e o stdout da CLI de IA são repassados diretamente por spawn com stdio: 'inherit'.

A documentação descreve os hooks de desktop com os mesmos limites: eles leem somente o ID de sessão e o diretório de trabalho do payload do hook, nunca a transcrição, os prompts ou a saída do modelo, e derivam a partir daí os mesmos metadados do git. Todos os dados locais ficam armazenados em ~/.vibe/.

O Vibetime é distribuído sob a licença MIT.