Skip to main content

A utt plugin to check worked time balance against daily/weekly targets

Project description

utt-balance

CI - Test PyPI Latest Release PyPI Downloads License - GPL-3.0 Python Versions

A utt plugin that shows your worked time balance against daily and weekly targets.

Why utt-balance?

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.

Features

  • ๐Ÿ“Š 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 utt Integration - Uses utt's plugin API for seamless integration

Installation

Step 1: Install utt

First, install utt (Ultimate Time Tracker):

pip install utt

Verify the installation:

utt --version

Step 2: Install utt-balance

Install the plugin:

pip install utt-balance

That's it! The plugin is automatically discovered by utt. No additional configuration needed.

Verify Installation

Confirm the balance command is available:

utt balance --help

Requirements:

  • Python 3.10+
  • utt >= 1.0

Usage

After installation, a new balance command is available in utt:

utt balance

Example Output

๐ŸŸข Under target โ€” time remaining in your budget:

Under target

๐ŸŸก At target โ€” you've hit your limit:

At target

๐Ÿ”ด Over target โ€” you've exceeded your budget:

Over target

Options

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

[!NOTE] --week-start values: monday, tuesday, wednesday, thursday, friday, saturday, sunday

Examples

Default usage (8h/day, 40h/week, week starts Sunday):

utt balance

Custom 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 Coding

Color Worked Column Remaining Column
๐ŸŸข Green Under target Time remaining
๐ŸŸก Yellow Exactly at target Zero remaining
๐Ÿ”ด Red Over target Negative (overtime)

How It Works

This plugin uses utt's native plugin API to:

  1. Access your time entries directly (no subprocess calls)
  2. Filter activities for today and the current week
  3. Calculate total working time (excludes breaks marked with **)
  4. Compare against your configured targets

License

This project is licensed under the GPL-3.0 License - see the LICENSE file for details.

Development

Running Tests

To run the test suite, first install the development dependencies:

pip install -e ".[dev]"

Then run the tests with pytest:

pytest

For coverage reporting:

pytest --cov=utt_balance.balance --cov-report=term-missing

Linting & Formatting

Run 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 .

Type Checking

Run ty (type checker):

ty check src/

Run All Checks

ruff check --fix . && ruff format . && ty check src/ && pytest

Pre-commit Hooks

Install pre-commit hooks to automatically run checks before each commit:

pre-commit install

Run hooks manually on all files:

pre-commit run --all-files

Contributing

Contributions are welcome! Here's how to get started:

Setting Up for Development

  1. Clone the repository:

    git clone https://github.com/loganthomas/utt-balance.git
    cd utt-balance
    
  2. Create a virtual environment:

    python -m venv .venv
    source .venv/bin/activate  # On Windows: .venv\Scripts\activate
    
  3. Install in editable mode with dev dependencies:

    pip install -e ".[dev]"
    
  4. Install pre-commit hooks:

    pre-commit install
    

Submitting Changes

  1. Create a new branch for your feature or fix
  2. Make your changes following the code style guidelines
  3. Ensure all tests pass: pytest
  4. Ensure code passes linting: ruff check . && ruff format --check .
  5. Submit a pull request with a clear description of your changes

Code Style Guidelines

  • 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

Related

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

utt_balance-0.1.1.tar.gz (51.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

utt_balance-0.1.1-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

Details for the file utt_balance-0.1.1.tar.gz.

File metadata

  • Download URL: utt_balance-0.1.1.tar.gz
  • Upload date:
  • Size: 51.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for utt_balance-0.1.1.tar.gz
Algorithm Hash digest
SHA256 39a9ca42494546540a918da189496b629f36e4cd8fa7513060559623b89e793d
MD5 93a73815fd11cc43598a23fd9d20449f
BLAKE2b-256 1e76ec4eff99f955645d8e2bd8775d646949715078253243a3c4ce6c1c67e880

See more details on using hashes here.

File details

Details for the file utt_balance-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: utt_balance-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 20.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for utt_balance-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e309406d8b07cc6a5f8aa807bf323d5142f9a1cf24ff1eabaa250ccb0f96412b
MD5 68b6eb4ec435972afb56403399123563
BLAKE2b-256 737427861f05fe71c68ba8b8512b4e5523fb1875740d0c2388be704bb82652cd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page