Workloom is a local-first desktop activity tracker for knowledge work. It watches the active window, captures screenshots only after filter checks, summarizes them with a local Ollama model, merges them into sessions, and generates searchable history plus daily digests.
Built by Kay @ itskay.co.
- Captures activity privately on your machine
- Uses local Ollama models for screenshot understanding and session merging
- Builds daily digests with OpenAI, Anthropic, or fully local Ollama
- Lets you search past work and ask questions about recent activity
- Keeps behavior customizable through
config.yamlanduser_prompts/
-
Create and activate a virtualenv:
python3 -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip pip install -r requirements.txt -
Create a local config:
cp config.example.yaml config.yaml
-
Pull the recommended local model:
ollama pull granite3.2-vision
-
Start Ollama:
ollama serve
-
Fill in
config.yaml. For a fully local setup, usedigest_provider: "ollama"and pointdigest_modelat a local model or reusetext_model. -
Start Workloom:
python run.py
python run.py # open the interactive UI
python run.py ui # re-open / attach the UI
python run.py start # run headless
python run.py status # runtime status
python run.py inspect --today # inspect today's captures and sessions
python run.py digest-preview --today
python run.py trends --range weekInside the UI:
/inspect/search <query>/digest/trends [week|month|30d]/pause/resume/shutdown
There are two main customization surfaces:
config.yamlMachine-level settings like models, providers, redaction, retention, and chat context.user_prompts/Plain markdown files that control behavior and tone.
Important prompt files:
digest.mdControls digest structure and section instructions with a simple heading-based format.chat.mdControls how the local assistant answers.filters.mdControls which apps are skipped or marked low-signal.persona.mdControls digest tone and framing.summariser.mdControls screenshot interpretation.
If you still have old user_prompts/insight_style.md or user_prompts/digest_format.md files from an older version, they are obsolete and ignored.
- Screenshots are only taken after filter checks pass.
- Screenshots are not persisted to disk.
- Capture text is redacted before persistence based on
config.yaml.redaction. - Cloud digest providers only receive redacted session text by default.
retention_dayscontrols automatic pruning of older captures.
Known-good baseline:
schedule_interval_seconds: 60
vision_model: "granite3.2-vision"
text_model: "granite3.2-vision"
digest_provider: "openai"
digest_model: "gpt-4o-mini"Alternative local setup to try:
vision_model: "qwen3-vl:4b"
text_model: "qwen3-vl:4b"- SQLite database:
outputs/tracker.db - Chroma storage:
outputs/chroma/ - Log file:
outputs/tracker.log - Runtime state:
outputs/runtime_state.json - Daily digests:
outputs/daily_digests/YYYY-MM-DD.md
python run.pyis the main operator experience.inspect.pystill exists, butrun.py inspect ...is the primary interface.- The scheduler is designed to keep running even if model or provider calls fail.