Hello everyone. Before I begin, please note that I am from South Korea and not fluent in English. This post was written with the help of AI translation.
Originally, this script was built for Korean output, but I adjusted the prompt to output in English so I could share it with you here. Honestly, I’m not sure how well the translated nuances will resonate with you. I kindly ask for your understanding if there are any awkward phrasings or unintended meanings.
My motivation for creating this is quite simple. I absolutely love ActivityWatch, but the default Web UI sometimes feels like looking at a raw Excel spreadsheet. I wanted to utilize local and API-based LLMs to act like a historian—taking the fragmented, raw data points of my day and weaving them into a meaningful, cohesive daily narrative.
I am not a developer, nor do I know any programming languages. However, with the assistance of AI, I managed to build this in about a week, and it has been working wonderfully for me.
Please keep in mind that this script is highly tailored to my personal workflow, so it might not perfectly fit yours out of the box. Here is a key example of how I customized the logic:
-
Wide Monitor & Concurrency Logic: I use a wide monitor, and my typical setup involves surfing the web on Chrome on one side while having a YouTube video playing on the other. Inherently, ActivityWatch only tracks the single “focused/active” window. To overcome this limitation, I modified the logic to cross-reference the window events with the web-watcher events. This allows the script to calculate “concurrency,” properly tracking media playing in the background while I am actively browsing in another window.
-
The tables at the top and bottom, along with the overall output format, are also strictly customized to my personal preferences and are not standardized.
Despite these heavy personalizations, I am sharing this for one main reason. There are certainly other AI-based tracking programs out there with tons of features. However, putting aside the cost, they felt unnecessarily heavy and bloated with features I didn’t need.
ActivityWatch is wonderfully lightweight and captures exactly what I want. Its only drawback—that the data is too raw and purely chronological—was completely solved by bridging the gap with LLM inference. For reference, the model I used here is Gemma-4-31B via API, but in reality, using the local Gemma-4-12B version yields very similar processing times and output results.
I achieved this without knowing a single line of code, which means you can absolutely do it too. I hope this provides some inspiration for your own setups!
Below, I’ve outlined the calculation logic behind the tables (which are shown in Korean in the screenshots) to give you an idea of the kind of customizations that are possible
I can only attach one screenshot, so I hope you don’t mind the written descriptions
Dashboard Metrics & Components
TOP 10 Longest Watched Videos (Format: Top 10 List)
-
Description: Displays the top 10 videos you spent the most continuous time watching.
-
Logic: It doesn’t just blindly add up the time. If you close a video and re-enter the same video within 60 minutes, it merges them into a single, continuous viewing session (Timeout rules: 5 minutes for Shorts, 60 minutes for standard videos).
-
TOP 10 Programs /
TOP 10 Websites (Format: Top 10 List)
-
Description: Shows your most used apps and website domains, including total duration, percentage share, and visit count.
-
Logic: A “visit” is not counted every time you minimize and maximize a window. It is only counted as a new visit if you do something else for at least 5 minutes before returning to that specific app or website.
-
Top 5 Multitasking Pairs (Format: Top 5 List)
-
Description: Ranks the top 5 combinations of apps or websites that were frequently used together side-by-side (e.g., YouTube ↔ Notepad).
-
Logic: It tracks consecutive switches between two different apps/websites within a 5-minute window, provided you stayed on each for at least 3 seconds.
-
YouTube Index (Format: Stacked Bar Chart)
-
Description: Visualizes your consumption ratio between Short-form (Shorts) and Long-form (Standard) YouTube videos.
-
Logic: Only videos watched for more than 5 seconds are counted, and duplicate views of the same video are ignored. The graph uses a stacked bar design (Red for Shorts, Blue for Long-form) to instantly show what type of media dominated your viewing time.
-
Concurrency Index (Format: Stacked Bar Chart)-
Description: Displays how your ‘Active Window’ usage (the main program you are currently focused on) overlaps with background media playback (YouTube, CHZZK, SOOP) across different hours of the day.
-
Logic: All activities are aggregated into 1-hour buckets. Background media time is calculated using the exact same merging rules as the ‘Longest Watched Videos’ metric (e.g., merging standard videos if re-entered within 60 minutes) and is stacked on top of the active window data. This allows you to visually separate pure focused time from media multitasking time.
-
-
