What Vibetime records
The documentation for Vibetime describes it as a command-line tool that reports what an AI-assisted coding session changed in git. In a terminal, it wraps Claude Code, Codex, Gemini, Aster, and Opencode. Desktop sessions in Claude Code, Codex, Cursor, and ZCode are captured through session hooks instead. The wrapped tools continue to work normally: Vibetime watches git state while the work happens and prints a closing summary when the session ends. By default, it requires no configuration, daemon, or account.
Installation and setup
npm install -g vibetime-cli
vibe
source ~/.zshrc # or ~/.bashrc / ~/.config/fish/config.fish
Running vibe with no arguments performs the complete setup. It installs shell hooks around the claude, codex, gemini, aster, and opencode commands and registers desktop session hooks for the Claude Code, Codex, Cursor, and ZCode applications. Fish, Bash, and Zsh are detected automatically, and the appropriate syntax is written to that shell's rc file. vibe init performs the same setup explicitly, and repeating it is safe.
Session summaries and scoring
When a session in a supported tool ends, Vibetime prints an endcard such as:
╭─────────────────────────────────────────────╮
│ ◆ vibe · api · 2h 14m │
├─────────────────────────────────────────────┤
│ │
│ 3 commits · +847 −231 · 12 files │
│ │
│ ████████░░ shipped ✦ │
│ │
╰─────────────────────────────────────────────╯
The current day's sessions, including sessions that are still active, can be inspected with vibe status.

Once the optional leaderboard is enabled, every session classified as shipped counts toward it. Vibetime derives the session tier from git activity:
| Tier | Bar | Meaning |
|---|---|---|
shipped |
████████░░ |
commits and meaningful changes |
progressed |
██████░░░░ |
commits with small changes |
tinkering |
████░░░░░░ |
changes but no commits |
exploring |
██░░░░░░░░ |
a few lines touched |
idle |
░░░░░░░░░░ |
nothing changed |
interrupted |
░░░░░░░░░░ |
the session was killed or crashed |
Duration and inactivity
Vibetime samples git state every 30 seconds. If it detects no file changes, commits, or staging activity for 30 minutes, that idle period is removed from the session duration. Laptop sleep and background inactivity are handled automatically. For projects that are not git repositories, duration is measured with wall-clock time.
Commit ownership and deduplication
After signing in, only the user's own commits are credited. Pulling or merging teammates' work into a branch during a session no longer causes their commits to count as the user's. Vibetime matches the email address in that repository's git config user.email plus the user's GitHub noreply addresses, so commits made through GitHub's web interface still count without additional configuration. When logged out, every commit in the measured range counts, as before.
A commit is credited only once, even when several sessions can see it. That can happen with agents in parallel worktrees of the same repository, two editor windows on one branch, a terminal next to an editor, or a second machine onto which the user pulled their own work. The commit is normally assigned to the session working in the checkout where it was created, so parallel work receives full credit without being counted twice. Merging, rebasing, or amending work that a session was already credited for does not count it again, and neither does squash-merging a branch that was already up to date. The documentation identifies one case it cannot recognize: a squash onto a main branch that has moved since.
Working across repositories
A session can be started in any directory. If that directory is not itself a repository, Vibetime detects repositories immediately inside it and measures all of them, so work touching both api/ and web/ is scored on both repositories. A directory containing no repository within or beneath it is not tracked because there is nothing to measure.
Desktop applications
The Claude Code, Codex, Cursor, and ZCode desktop applications do not invoke the wrapped terminal commands, so the shell wrapper cannot observe them. Vibetime tracks them through session hooks. vibe init installs these hooks automatically; installations initialized before desktop support existed can either run vibe init again or use:
vibe hooks install
The installer registers hooks in ~/.claude/settings.json, ~/.codex/hooks.json, ~/.cursor/hooks.json, and ~/.zcode/cli/config.json for all four applications. Entries can also be written for an application that is not installed yet; they remain inert configuration until the application exists, so switching to one of those apps later does not require another setup pass. Hooks that Vibetime did not create are left untouched. Desktop sessions then appear in vibe status, vibe log, vibe share, and the leaderboard in the same way as terminal sessions.
- Claude Code reloads its settings automatically, so opening a new Desktop session is enough.
- Codex loads the hooks at the next session. Depending on the Codex version, the application may first require the hooks to be reviewed and trusted. If Codex sessions do not appear in
vibe status, the documentation says that is the likely cause; review and trust the Vibetime hooks through Settings and then Hooks in the desktop app, or with/hooksin the CLI. Support requires a Codex build from May 2026 or later, when hooks became generally available. It has been tested on macOS and Linux. Windows is untested, although the hooks include a Windows command variant, and the project welcomes reports. If Codex imported Claude Code hooks,vibe hooks installreplaces those copies with Codex-specific versions that tag sessions as Codex and fit Codex's three-second SessionEnd limit. - Cursor reloads
~/.cursor/hooks.jsonautomatically, so a new Agent session is sufficient. If sessions do not appear, the user can confirm the Vibetime hooks under Customize and then Hooks. Cursor can also import Claude Code hooks when third-party configurations are enabled; those imported copies are tagged as Cursor rather than Claude. User-level hooks do not run in cloud agents. Cursor support has been tested on macOS, and reports for Windows and Linux are welcome. - ZCode reads
~/.zcode/cli/config.jsonat startup and leaves newly added hooks switched off. The user must quit and reopen ZCode, then enable the four Vibetime hooks under Installed in Settings and then Hooks. Copies of Claude Code hooks under Legacy should be left alone because imported hooks would identify ZCode sessions as Claude. If the pinned Node path changes andvibe hooks installrewrites the hooks, ZCode disables them again until they are re-enabled. ZCode has no session-end event, so its session closes after 30 idle minutes, just like an abandoned Desktop session. ZCode sub-agents count toward the session that started them rather than opening their own sessions.
Desktop duration uses the same rule as the terminal: active coding time is counted, while idle gaps longer than 30 minutes are excluded.
Using both the terminal wrapper and desktop hooks does not double-count terminal sessions. The desktop hooks stand down when the shell wrapper is already tracking the work.
The hooks use absolute paths because a desktop application launched from the Dock does not inherit the shell PATH, meaning a bare vibe command might not resolve. vibe hooks install pins the absolute paths to Node and to the CLI. After changing Node versions, such as through an nvm upgrade that removes the old version, vibe status points the hooks at the current Node installation. It can also name an application that is still not being tracked and explain why, for example because a settings file is no longer valid JSON.
Desktop tracking can be stopped without removing the shell wrapper:
vibe hooks uninstall
Leaderboard and sharing
The opt-in leaderboard is available publicly at https://vibetime.club/leaderboard; browsing it does not require the CLI.
vibe login
vibe leaderboard
vibe logout
vibe login signs in through GitHub, vibe leaderboard displays this week's ships from the terminal, and vibe logout signs out and stops submissions.
The leaderboard ranks users by ships, meaning a session that lands a commit containing meaningful changes. The documentation defines meaningful as more than 50 lines or more than 3 files. Lockfiles such as package-lock.json, yarn.lock, and Cargo.lock are excluded from both counts because a regenerated lockfile is not considered work. Squares on the page indicate the days on which the user shipped. The web view offers tabs for this week, defined as Monday through Sunday in UTC, this month, and all time.
Sign-in uses GitHub's device flow: there is no browser callback, only a short code entered on github.com. Until vibe login is run, Vibetime makes no network requests. After sign-in, the terminal endcard is rendered normally and the session is submitted in the background. If the machine is offline, the submission is retried at the end of the next session.
Signing in by itself does not create a leaderboard entry. The first qualifying session must last at least one minute and land a commit with meaningful changes. Terminal sessions submit as soon as Vibetime detects that result, usually within a minute of the commit, so the entry can appear while work is still under way. Desktop sessions submit when they end. The web page itself is also cached for one minute.
Users who sign in after already tracking sessions do not lose prior work. Sessions from the previous two weeks are submitted on the next flush, and vibe leaderboard triggers a flush immediately. If an expected entry is missing, vibe status is the diagnostic step: sessions marked progressed or tinkering did not qualify because only shipping scores. If ended sessions are still waiting on the server, vibe status reports that state, and vibe leaderboard retries the upload.
Submitted fields are tool, startedAt, endedAt, durationSeconds, commits, linesAdded, linesRemoved, filesTouched, momentum, a SHA-256 hash of the project name, and a salted hash of the branch name. The branch salt is generated randomly on the user's machine and is never transmitted, so the resulting hash can only show whether two sessions used the same branch and cannot be converted back into the branch name. For every credited commit, Vibetime submits keyed hashes of the commit, of its author and author time, and of the snapshot it produced, together with the commit time and line and file counts. The hash key is issued per account, so the same commit reported from two of the user's machines produces the same hash and is counted once. Commit ids, commit messages, file names, branch names, raw repository names, the user's email address, exit codes, and the user's local handle never leave the machine.
vibe logout deletes ~/.vibe/auth.json, and submissions stop immediately.
A README badge can display the user's ships:
[](https://vibetime.club/@your-handle)
The badge shows all-time ships and updates every hour. Appending ?window=week or ?window=month to the badge URL changes the displayed window.
vibe share prints a weekly summary card. Pressing h opens the HTML version, which can be copied, captured in a screenshot, or posted.


Streaks measure consecutive days on which the user shipped. If the user shipped yesterday but has not shipped yet today, the streak displays an hourglass to indicate that the day is still open.
Additional tools and commands
The documentation says Vibetime can wrap any AI CLI. A tool not covered by the default setup can be added explicitly, as in:
vibe config add-tool aider
| Command | Purpose |
|---|---|
vibe status |
Shows today's sessions, including active sessions |
vibe log |
Shows the last 20 sessions |
vibe share |
Prints the weekly summary card |
vibe share --html |
Produces a shareable HTML card |
vibe login |
Signs in to the leaderboard through GitHub |
vibe logout |
Signs out of the leaderboard |
vibe leaderboard |
Shows this week's ships |
vibe config show |
Displays current settings |
vibe config set handle <name> |
Sets the @handle shown on share cards |
vibe config add-tool <name> |
Tracks another AI CLI tool |
vibe hooks install |
Enables Claude Code, Codex, Cursor, and ZCode desktop tracking |
vibe hooks uninstall |
Stops desktop session tracking |
vibe uninstall |
Removes shell hooks and desktop hooks |
A session is assigned to the day on which it began, so a session continuing past midnight still appears under the preceding day.
Removal, privacy, and license
vibe uninstall
npm uninstall -g vibetime-cli
vibe uninstall removes everything installed by vibe init: the shell hooks in the rc file and Vibetime's desktop hooks in ~/.claude/settings.json, ~/.codex/hooks.json, ~/.cursor/hooks.json, and ~/.zcode/cli/config.json, while preserving hooks it did not create. vibe hooks uninstall removes only desktop tracking. Session data under ~/.vibe/ is preserved; users who want a completely clean removal must delete that directory manually.
Vibetime has no telemetry and does not require an account by default. Data remains local unless the user opts in to leaderboard submissions through vibe login. The tool says it reads only git metadata such as commit, line, and file counts. It does not read file contents, environment variables, API keys, or text entered into a wrapped tool. The wrapped CLI's stdin and stdout are passed directly through using spawn with stdio: 'inherit'.
The desktop hooks are described as following the same limits: they read only the session id and working directory from the hook payload, never the transcript, prompts, or model output, and derive the same git metadata from that point. All local data is stored in ~/.vibe/.
Vibetime is distributed under the MIT License.