I’m self employed. I need to record how much time I spend on whatever task for whatever client.

Sounds simple, but I’m terrible at it. I always get to the end of the day without having recorded anything and not knowing what I’ve actually done.

Basically, I’d like to create a text log of the active window title, and take a screen cap.

I’d like to do this periodically as in every 15 minutes or so.

For the text log I just haven’t been able to achieve this at all.

For the screen caps I can use flameshot to take a screenshot from the CLI, but it makes a sound and shows an animation which is sub-optimal.

Any suggestions of where to look much appreciated.

Edit: I’m not asking for a time tracking app. I want something to log the active window title and take a screen cap so I can figure out what I was doing and write it in my time tracking app.

Edit: I’m narrowing in on a solution.

Firstly, a lot of previously available solutions don’t work because of recently implemented security features in gnome.

You need to enter unsafe mode by entering this:

global.context.unsafe_mode = true

in the looking glass tool which you can access by running lg in the alt + f2 dialog

thereafter, this can grab the active window title for you:

gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "global.display.focus_window.title"
    • Communist
      link
      fedilink
      English
      1
      edit-2
      3 days ago
      #!/usr/bin/env bash
      
      # get hyprland event socket path
      HIS=$HYPRLAND_INSTANCE_SIGNATURE
      EVENT_SOCK="$XDG_RUNTIME_DIR/hypr/$HIS/.socket2.sock"
      
      # fallback / error check
      if [ -z "$HIS" ] || [ ! -S "$EVENT_SOCK" ]; then
        echo "Error: cannot locate Hyprland event socket at $EVENT_SOCK" >&2
        exit 1
      fi
      
      logfile="${HOME}/hypr_focus.log"
      
      # function to handle a line from the event stream
      handle_event() {
        local line="$1"
        # check for activewindow event
        if [[ $line == activewindow* ]]; then
          # format: activewindow>>CLASS,TITLE
          # strip prefix
          local payload=${line#activewindow>>}
          # split on comma (first comma)
          local cls="${payload%%,*}"
          local title="${payload#*,}"
          local ts
          ts=$(date '+%Y-%m-%d %H:%M:%S')
          echo "$ts$title (class: $cls)" >> "$logfile"
        fi
        # optionally handle activewindowv2 if you want address instead
        # if [[ $line == activewindowv2* ]]; then
        #   ...
        # fi
      }
      
      # listen to the socket
      socat -u "UNIX-CONNECT:$EVENT_SOCK" - | while IFS= read -r line; do
        handle_event "$line"
      done
      
      

      honestly if you’re willing to do some work you can make hyprland do almost anything

      **disclaimer i did not test this much

      edit: forgot about the screenshot part, should be easy to add though, just add screenshotting everytime focus changes with grim or whatever