A utt plugin that shows your worked time balance against daily and weekly targets.
This plugin is designed as a quick time check to see how many hours you've worked and what your remaining time budget is. The name "balance" reflects its core purpose: supporting your work-life balance by encouraging you to stay within your pre-allocated work time.
The color coding tells the story:
- π’ Green β You're under your target. You still have time remaining in your budget for the day or week.
- π‘ Yellow β You've hit exactly your target. This is a warning that you're about to dip into a deficit.
- π΄ Red β You've exceeded your allotted time. You're over 8 hours for the day or 40 hours for the week (by default).
Work ebbs and flowsβcertain days are more demanding than others, and that's okay. But having a quick visual check helps keep things on rails and reminds you to protect your time outside of work.
- π Daily & Weekly Tracking - See worked hours and remaining time at a glance
- π¨ Color-coded Output - Green (under target), Yellow (at target), Red (over/negative)
- βοΈ Configurable Targets - Set custom daily hours, weekly hours, and week start day
- π Native
uttIntegration - Usesutt's plugin API for seamless integration
First, install utt (Ultimate Time Tracker):
pip install uttVerify the installation:
utt --versionInstall the plugin:
pip install utt-balanceThat's it! The plugin is automatically discovered by utt. No additional configuration needed.
Confirm the balance command is available:
utt balance --helpRequirements:
- Python 3.10+
utt>= 1.0
After installation, a new balance command is available in utt:
utt balanceπ’ Under target β time remaining in your budget:
π‘ At target β you've hit your limit:
π΄ Over target β you've exceeded your budget:
| Option | Default | Description |
|---|---|---|
--daily-hrs |
8 | Target working hours per day |
--weekly-hrs |
40 | Target working hours per week |
--week-start |
sunday | Day the work week starts (monday, tuesday, wednesday, thursday, friday, saturday, sunday) |
Default usage (8h/day, 40h/week, week starts Sunday):
utt balanceCustom daily target β set a 6-hour workday with --daily-hrs:
utt balance --daily-hrs 6ββββββββββββββββ¬ββββββββββ¬ββββββββββββ
β β Worked β Remaining β
ββββββββββββββββΌββββββββββΌββββββββββββ€
β Today β 5h00 β 1h00 β β 1h until 6h target
β Since Sunday β 25h00 β 15h00 β
ββββββββββββββββ΄ββββββββββ΄ββββββββββββ
Custom weekly target β set a 35-hour work week with --weekly-hrs:
utt balance --weekly-hrs 35ββββββββββββββββ¬ββββββββββ¬ββββββββββββ
β β Worked β Remaining β
ββββββββββββββββΌββββββββββΌββββββββββββ€
β Today β 6h30 β 1h30 β
β Since Sunday β 28h00 β 7h00 β β 7h until 35h target
ββββββββββββββββ΄ββββββββββ΄ββββββββββββ
Change week start day β use Monday with --week-start:
utt balance --week-start mondayββββββββββββββββ¬ββββββββββ¬ββββββββββββ
β β Worked β Remaining β
ββββββββββββββββΌββββββββββΌββββββββββββ€
β Today β 6h30 β 1h30 β
β Since Monday β 22h30 β 17h30 β β week starts Monday
ββββββββββββββββ΄ββββββββββ΄ββββββββββββ
Part-time schedule β combine options for 4h/day, 20h/week:
utt balance --daily-hrs 4 --weekly-hrs 20ββββββββββββββββ¬ββββββββββ¬ββββββββββββ
β β Worked β Remaining β
ββββββββββββββββΌββββββββββΌββββββββββββ€
β Today β 3h30 β 0h30 β β 30min until 4h target
β Since Sunday β 15h00 β 5h00 β β 5h until 20h target
ββββββββββββββββ΄ββββββββββ΄ββββββββββββ
| Color | Worked Column | Remaining Column |
|---|---|---|
| π’ Green | Under target | Time remaining |
| π‘ Yellow | Exactly at target | Zero remaining |
| π΄ Red | Over target | Negative (overtime) |
This plugin uses utt's native plugin API to:
- Access your time entries directly (no subprocess calls)
- Filter activities for today and the current week
- Calculate total working time (excludes breaks marked with
**) - Compare against your configured targets
This project is licensed under the GPL-3.0 License - see the LICENSE file for details.
To run the test suite, first install the development dependencies:
pip install -e ".[dev]"Then run the tests with pytest:
pytestFor coverage reporting:
pytest --cov=utt_balance.balance --cov-report=term-missingRun ruff (linter, formatter, and import sorting):
# Check for linting errors
ruff check .
# Auto-fix linting errors (including import sorting)
ruff check --fix .
# Format code
ruff format .Run ty (type checker):
ty check src/ruff check --fix . && ruff format . && ty check src/ && pytestInstall pre-commit hooks to automatically run checks before each commit:
pre-commit installRun hooks manually on all files:
pre-commit run --all-filesContributions are welcome! Here's how to get started:
-
Clone the repository:
git clone https://github.com/loganthomas/utt-balance.git cd utt-balance -
Create a virtual environment:
python -m venv .venv source .venv/bin/activate # On Windows: .venv\Scripts\activate
-
Install in editable mode with dev dependencies:
pip install -e ".[dev]" -
Install pre-commit hooks:
pre-commit install
- Create a new branch for your feature or fix
- Make your changes following the code style guidelines
- Ensure all tests pass:
pytest - Ensure code passes linting:
ruff check . && ruff format --check . - Submit a pull request with a clear description of your changes
- Follow PEP 8 conventions
- Use type hints for all function signatures
- Write docstrings in NumPy style
- Keep functions focused and single-purpose
- Prefer explicit over implicit
utt(Ultimate Time Tracker) - The time tracking tool this plugin extendsuttPlugin Documentation - How to createuttplugins


