Snag help › Snag for the desktop

Observation

Snag can record what is being worked on, so a record exists even on days the timer was forgotten. It is off by default. Each source is switched on separately in the [observe] section of the config file; see Settings.

Everything recorded stays in the local database. Nothing is sent to the server.

In this version observation only records. It does not create time entries, and the commit setting has no effect.

Sources

KeyRecordsNeeds
windowthe focused window's title and applicationHyprland
shellthe focused terminal's working directory, and the git repository it is in (branch and commit, read from .git without running git)Hyprland
agentwhich repository and task a coding agent session is on: times, directory, branch and the session's one-line title. Message contents are never read.Claude Code session files under ~/.claude/projects/
screennot built; turning it on does nothing, and snag doctor says so-

Turn on shell first: it is the source that tells one project from another.

Window titles that are never recorded

title_deny lists title fragments. A window whose title matches is not recorded at all, not even with the title removed. The default list:

title_deny = ["1Password", "Bitwarden", "KeePass", "password", "Private Browsing"]

Setting title_deny replaces the default list rather than adding to it.

Seeing and deleting what was recorded

CommandDoes
snag observedcounts of what has been recorded, in total and in the last day, by source and by repository, and where it is stored
snag observed --jsonthe same counts as JSON
snag forgetdeletes every sighting (sightings behind a derived entry are kept)
snag forget --alldeletes every sighting and anything derived from them

Both work with the daemon stopped. Time entries already written are not touched by forget.

Sightings that nothing has been derived from are deleted automatically after 14 days.

snag doctor lists each source, whether it is on, and whether this machine can provide it.

Next: Time from git history