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@lemmy.frozeninferno.xyz
        link
        fedilink
        English
        arrow-up
        0
        ·
        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