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í:
- musí sledovat, se kterými aplikacemi pracuji, aniž by to vyžadovalo manuální činnost
- musí být bezpečný – nic nikam neputuje, nic citlivého se neukládá ani nesleduje
- musí podporovat Linux – konkrétně Ubuntu 24.04 na Waylandu (už tohle je dost limitující faktor)
- musí umožňovat export dat do formátu, který lze dále zpracovat (CSV)
- 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é.