Skip to content
 
 

Repository files navigation

Screen Time

Screen Time

Per-app screen time for the Omarchy bar. A lightweight service tracks how long each app keeps focus, the bar shows today's total, and a popup breaks the day down into a donut chart with a 7-day usage trend.

Screen Time bar widget Donut breakdown
Week-trend bars

Features

Feature What it does
Time in the bar Today's total, live, right next to your tray.
Per-app tracking Focus time per app; idle, locked, asleep and desktop time never counted.
Terminal-aware A focused terminal reports what's actually running inside it (opencode, not foot), re-resolved every few seconds.
Steam-aware steam_app_123456 becomes the real game title, read from local Steam metadata.
Donut breakdown Today's apps as a ring: six biggest + "Other", day total in the centre.
Slice hover Hover the ring to dim the other slices and preview that app's name and share in the centre.
Clickable week bars Click a day in the 7-day trend to view its apps and insights; click again to return to today.
13-week trend Paginated Mon-Sun bars with < Aug 2026 · W34 > navigation; today's bar in your theme accent.
Week total Sits in the graph header; click it to flip between time and its share of the week's 168 hours.
Yearly overview The hourglass opens a full-card view: one bar per month across all recorded years, exact totals on hover.
Hourglass easter egg It flips over on the hour; hover for gold sparkles around your cursor.
Scrollable app list Bounded legend with a thin scrollbar; Show More expands the full list inline.
Clean app names Reverse-DNS IDs shortened and lowercased (com.github.user.Codiumcodium).
Usage patterns Press p for top app, vs. yesterday, and busiest day.
Icon-only mode Right-click collapses the widget to a single glyph; remembered.
Keyboard-first Esc closes, p toggles patterns, j/k/arrows scroll; mouse wheel works too.
Keybind-friendly Summon the panel from a script or keybind via the agx.screen-time IPC target.
Private by design Local JSON, daily detail pruned after ~3 months (monthly totals kept); colours generated from your theme's accent.

Install

omarchy plugin add https://github.com/ax1g/quickshell-screentime-plugin.git
omarchy plugin enable agx.screen-time

Requires Omarchy and Hyprland. A Nerd Font provides the glyphs, and python3 (preinstalled on Omarchy) powers terminal and Steam name resolution — without it the plugin still tracks, but terminals show under their own name (foot, kitty) instead of what runs inside them.

Uninstall

omarchy plugin disable agx.screen-time
omarchy plugin remove agx.screen-time

To also delete the history file:

rm ~/.config/omarchy/screen-time/history.json

Data

Everything lives in one local file, ~/.config/omarchy/screen-time/history.json:

{
  "days": {
    "2026-08-16": { "total": 490875, "apps": { "zen": 313349, "opencode": 148706 } }
  },
  "months": {
    "2026-07": 9823400
  }
}
  • Per-app focus time in milliseconds, keyed by day (YYYY-MM-DD).
  • Focus is credited to the day it started on, so a session spanning midnight still lands on the right day.
  • Daily detail older than ~3 months (95 days, matching the 13-week trend) is pruned, but its total is folded into a per-month aggregate first — so the yearly overview remembers your history even though raw days are forgotten. Delete the file to reset.

Project time

Alongside per-app time, focused time is also attributed to the Git repository behind it (by remote identity, so a moved or re-cloned checkout keeps its history) and broken into activity categories: claude, editor, terminal, browser, other. A repo's categories always sum to that repo's total — only one window can be focused at a time, so there is no double-counting between, say, an editor and a terminal.

Detection: a terminal (or Claude Code's own agent terminal) uses its foreground process's actual working directory; VS Code uses the folder name shown in its window title, matched against repositories discovered under ~/coding, ~/projects, ~/dev, ~/code, ~/repos (override with the PROJECT_TIME_ROOTS environment variable, colon-separated); a browser is a best-effort match of its tab title against those same repo names. See scripts/resolve_project.py for the full resolution logic.

Stored separately in ~/.config/omarchy/screen-time/projects.json:

{
  "days": { "2026-08-27": { "total": 9420000, "apps": { "remote:github.com/org/repo␟claude": 4320000 } } },
  "repos": { "remote:github.com/org/repo": { "display": "repo", "remote": "https://github.com/org/repo.git", "toplevel": "/home/you/coding/repo" } }
}

Each apps key packs a repo id and a category into one string (<repoId>␟<category>) so the existing day/app accrual, pruning, and monthly-rollup logic in lib/Model.js/lib/State.js applies unchanged — see lib/ProjectModel.js for the parsing/aggregation helpers built on top of it.

Development

The shell hot-reloads the plugin whenever a file changes, so a symlink into your checkout is all you need to iterate:

ln -s "$PWD" ~/.config/omarchy/plugins/agx.screen-time
node --check lib/Model.js && node --check lib/State.js && node --check lib/ProjectModel.js
node --test tests/model.test.js tests/state.test.js tests/project-model.test.js
python3 -m unittest discover -s tests

The same checks run in CI on every push.

License

MIT

About

Per-app screen time tracker for the Omarchy quickshell bar with donut chart and 7-day trends

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages