AlmanacLocal-only heatmaps and streaks for how you actually work. Days, languages, repositories and hours, tracked honestly, on your machine and nowhere else. What counts as workThe clock runs when two things are true at once. Your window has focus. Switch to a browser or Slack and the clock stops immediately. This is what stops a focused window on a second monitor from banking a meeting you were not in. Something happened in the window recently. Anything does:
"Recently" is 15 minutes by default ( Why terminal work countsTyping in the integrated terminal raises no event an extension can observe. VS
Code, however, tracks whether its own window has been interacted with recently
and exposes that as For the case that misses, watching a twenty minute test run without touching anything, Almanac follows the output stream of running shell commands. Only the fact that output arrived is used. The bytes themselves are never inspected. That second mechanism is bounded, because output proves work is happening and
not that you are still in the chair. Machine evidence (command output, a watch
task restarting, an agent editing an open file, a debugger landing on a frame)
extends a clock you opened for at most twice the idle window, 30 minutes at
the default, past the last thing you actually did. It can never open a clock on
its own. So a focused window running If the count ever looks wrong, run Almanac: Why am I idle right now?. It tells you exactly what state the clock is in and why. Repositories, not foldersAlmanac walks up from each folder you open until it finds a Open a monorepo, or open one package inside it, and both land in the same place:
Folders you never opened on their own, Stored: the repository folder name, and the path from the repository root to the
folder you opened. Never an absolute path, never a file name. Turn it off with
Two windows, two repositoriesOnly the focused window adds to your day, so an hour spent switching between two VS Code windows is one hour, split between their repositories by which one had focus. That is the default and the honest reading of "how long did I work". If the two windows are two clients and you want each to see the full hour, turn
on Almanac asks which you want the first time it notices a second window, and Almanac: Choose how several windows count switches it at any time. PrivacyThere is no network code. No account, no sync, no telemetry. The dashboard's
content security policy has no Everything is one JSON file in this extension's global storage, holding one aggregate record per calendar day: seconds split by hour, language, repository and kind of activity; counts of edits, saves, distinct files, sessions and your own commits; and how much text was typed against how much arrived in blocks. It does not hold file names, paths, contents, terminal output, commit messages, or any record of when you pressed a key. A day is a total, not a timeline.
Reading the dashboardSix figures sit across the top and stay there: today, the last 52 weeks, your average active day, days active, the streak, and commits. Under them are three tabs, and whichever one is open those six do not move. Activity is the calendar grid, one square per day of the year, with weekday labels down the side and month labels across the top. Levels are cut against your busiest day rather than a fixed number of hours, so a part-time week and a full-time week both have shape, and the legend names what each shade is worth. Hovering a square names the day, the time, and the repository and language most of it went to. Clicking one opens that day underneath: the hours it spanned, its repositories and folders, languages, what held the clock open, and the counts. Beside the grid are the last seven days, your milestones, the raw tallies, and your lifetime figures, which are deliberately not windowed. Where is the repository tree and the language split. When and how folds the year into 24 hours, then into a weekday-by-hour grid shaded against its own busiest hour, so it answers whether your Saturdays look like your Tuesdays. Beside it: what held the clock open, and how much text was typed against how much arrived in blocks. There is no week, month or quarter control. The grid already shows every day and the table already shows the last seven, and a range control made figures like "average day" mean something different without saying so. Reading the reportThe report is the same page, billing instead of activity. Its strip carries the
billable and tracked totals, the working days, the client count and the rounding
in force. Above the tabs is a filter: one checkbox per repository and one per
folder inside it, with the time each holds. Tick a few and both tables and the
CSV cover exactly those. Ticking a folder includes everything beneath it, and
an export made under a filter is named By client maps repository time to clients, with an unmapped repository billing under its own name rather than disappearing. Day by day is one row per client per day, which is the shape the CSV takes. BrandingAlmanac's panels use The Dev Labs design system,
consumed as a git submodule exactly as the website, learning portal and
community apps do. The split is deliberate. Backgrounds, text and borders come from
Light and dark are decided by VS Code's active colour theme, never by the
OS. A dark editor on a light machine gets a dark-appropriate accent, which is
the opposite of what a The fonts ship inside the extension and load through webview URIs. The CSP
allows Commands
SettingsThe defaults are meant to be right without being touched.
Honesty, stated plainlySome things are genuinely not knowable from an extension, and Almanac says so rather than guessing:
RequirementsVS Code 1.94 or later. Terminal shell integration must be enabled, which it is by default, for command and output signals to be seen. LicenseMIT. |