Activity tracker

V rámci fakturace práce zákazníkům ve firmě sledujeme čas, který trávíme na konkrétních činnostech. Osobně s tím dost bojuji, protože v průběhu dne dělám spoustu různých věcí, a to i paralelně. Navíc často zapomenu den nebo dva vykázat (z práce obvykle hned běžím na trénink a k dalším povinnostem), a pak horko těžko dohledávám, na čem jsem to vlastně pracoval. Pro tyto účely existuje řada nástrojů, ale od toho svého potřebuji několik věcí:

  1. musí sledovat, se kterými aplikacemi pracuji, aniž by to vyžadovalo manuální činnost
  2. musí být bezpečný – nic nikam neputuje, nic citlivého se neukládá ani nesleduje
  3. musí podporovat Linux – konkrétně Ubuntu 24.04 na Waylandu (už tohle je dost limitující faktor)
  4. musí umožňovat export dat do formátu, který lze dále zpracovat (CSV)
  5. musí mít minimální paměťovou i CPU stopu a běžet jako úloha na pozadí

Vzhledem k tomu, že na internetu se nedá věřit prakticky ničemu, a zároveň jsem si chtěl vyzkoušet schopnosti Claude Code, rozhodl jsem se napsat si vlastní nástroj v „céčku“, které jsem neviděl od svých studentských let. Nástroj je zveřejněný na GitHubu a funguje tak, že se v nastavitelných intervalech podívá, jaké okno je aktuálně na popředí, a uloží jeho název spolu s časovou značkou do CSV souboru v domovském adresáři uživatele. Zároveň je napojený na Discord Rich Presence API – pokud aktivní aplikace publikuje informace o aktivitě, připíše je jako samostatný údaj do CSV souboru vedle názvu okna. Chod aplikace vyžaduje pár triků – např. z důvodu bezpečnosti se na Waylandu nelze dostat k názvům oken přímo, ale je potřeba použít prostředníka v podobě Window Calls. Ten běží jako rozšíření GNOME s potřebnými oprávněními a poskytuje API pro získání názvů oken.

Pokud aplikace už běží a spustíte ji znovu, vypíše statistiky pro aktuální den – zhruba takto:

$jno@jnonb:~$ activity-tracker 
Activity Report for 2026-01-31
Total tracked:  3h 06m 57s (active:  2h 13m 40s)

  1. jetbrains-idea                                                   1h 27m 20s
       In project: evitaDB-dev | In branch: 1079-fix-reference-at...     40m 30s
       In project: Blog_Hugo | In branch: master                         23m 47s
       In project: evitaDB-dev | In branch: dev                          22m 08s
       In project: eshop | In branch: dev                                    35s
       In project: Blog_Hugo | In branch: main                               12s
       3 other windows                                                        8s

  2. google-chrome                                                       28m 10s
       Workflow runs · FgForrest/evitaDB - Google Chrome                 11m 22s
       Fix reference attribute filtering for non-managed entity t...      5m 48s
       (4) Quora - Google Chrome                                          1m 50s
       Eshop - Edee - Google Chrome                                       1m 33s
       Google Gemini - Google Chrome                                      1m 26s
       40 other windows                                                   6m 11s

  3. gnome-terminal-server                                                9m 21s
       jno@jnonb: ~                                                       3m 07s
       ✳ GitHub PR Review Analysis                                        1m 17s
       ✳ Code Analysis ReferencedEntityFetcher                            1m 05s
       ✳ Address Copilot PR Review                                           54s
       p_prj@evita-www01: ~                                                  45s
       8 other windows                                                    2m 13s

  4. Mattermost                                                           1m 26s
       Mattermost Desktop App                                             1m 26s

  5. discord                                                                 31s
       Friends - Discord                                                     27s
        - Discord                                                             2s
       Discord                                                                2s

  6. chrome-nngceckbapebfimnlniiiahkandclblb-Default                         12s
       Bitwarden                                                             12s

  7. Spotify                                                                  8s
       Spotify Premium                                                        8s

  8. ViberPC                                                                  6s
       Rakuten Viber                                                          6s

  9. Doublecmd                                                                2s
       Double Commander                                                       2s

Away                                                                     52m 47s

Aplikace je napsaná v čistém C s minimem závislostí a při běhu spotřebovává okolo 500 kB paměti a prakticky žádné CPU. Automaticky se sestavuje a vydává přes GitHub Actions. Statistiky je možné vypsat i za jiné dny nebo v nich vyhledávat pomocí regulárních výrazů, ale to není tak podstatné.

Klíčové je zjištění, jak levné je takovou aplikaci napsat pomocí AI agentů. Celý kód mě osobně stál asi tři hodiny práce po večerech – kombinoval jsem Gemini Pro pro konzultace specifik Ubuntu/GNOME/Wayland API a Discord Rich Presence a nechal jsem si od něj vygenerovat i pár jednosouborových Python skriptů pro testování API. Na těchto „proof of concept“ základech jsem pak už stavěl finální kód s pomocí Claude Code a na programování jako takové jsem prakticky nesáhl. Po cestě jsem nenarazil na žádný větší problém – vygenerovaný kód byl funkční (ano, agent udělal pár koleček, ale vyladil je ještě v rámci automatizovaných testů), agent vytvořil i releasovací pipeline na GitHubu, dokumentaci a instrukce v Claude.md. Já jsem působil jen jako lodivod.

Když si uvědomíte, jak obrovskou sílu má teď každý z nás k dispozici, je to opravdu fascinující. Mnoho obecných nástrojů přestává v tomto kontextu dávat smysl, protože si člověk může napsat přesně to, co potřebuje – bez zbytečných funkcí a s minimální spotřebou zdrojů. Nikde ho neotravuje reklama, nemusí se bát o bezpečnost svých dat (ano, agent může udělat bezpečnostní chybu, ale i s tím může lodivod částečně pomoci). Nemusí mít obavu, že se populární aplikace dostane do rukou někomu se zlými úmysly a v rámci aktualizace mu přistane něco, co nechtěl. Aplikace má přesně ty funkce, které potřebuje, a nástroj lze kdykoliv upravit nebo rozvíjet podle toho, jaké potřeby v budoucnu vzniknou.

A to řeším pouze drobnost pro vlastní potřebu. Tohle je budoucnost firemního softwaru – myslím, že začínám chápat, proč to bude mít SaaS (Software as a Service) brzy tak těžké.