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