A powerful Google Calendar tool that merges multiple calendars to find your true availability across work and personal schedules
Project description
Whenami
A powerful Google Calendar tool that merges multiple calendars to find your true availability across work and personal schedules.
Description
whenami is a command-line tool designed for people who juggle multiple calendars (work, personal, side projects, etc.). Its key strength is merging multiple Google Calendars to show your real availability by combining busy periods from all sources.
Key Features:
- 🗓️ Multi-calendar support: Connect work calendars, personal Gmail calendars, shared calendars
- 🔀 Smart merging: Automatically merges busy periods from all calendars to show true availability
- ⏰ Flexible time filtering: Personal hours (awake time), work hours, or 24/7 view
- 🎨 Color-coded output: Green for free slots, red for busy periods
- 🌍 Advanced timezone handling: Automatically detects each calendar's timezone, merges events correctly across timezones, and converts output to any timezone
- 📅 Multiple date ranges: Today, tomorrow, next week, or custom date ranges with flexible date formats
Perfect for professionals who need to see availability across multiple calendars without manually checking each one.
Installation
From PyPI (Recommended)
pip install whenami
After installation, you can run the tool directly:
whenami --help
Local Development Setup
For local development or running from source:
Prerequisites
- Python 3.7+
Setup
# Clone the repository
git clone https://github.com/zampierilucas/whenami.git
cd whenami
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install in development mode with dev dependencies
pip install -e ".[dev]"
# Run the tool directly (after installation)
whenami --help
# Or run from source
python src/whenami/main.py --help
Usage
# Show only free slots for today (default)
whenami
# Show only free slots (same as default)
whenami --free --today
# Show only busy slots
whenami --busy --today
# Split busy and free slots into separate sections
whenami --today --split
# Show free slots for tomorrow
whenami --tomorrow
# Show free slots for next week work days(default mon-fri)
whenami --next-week --work-days
# Show free slots during work hours only
whenami --today --work-hours
# Show free slots during personal hours (default: 8-22)
whenami --today --personal-hours
# Show all hours (24/7, no time filtering)
whenami --today --all-hours
# Custom dates (supports DD/MM/YYYY, DD/MM/YY, DD-MM-YYYY, DD-MM-YY)
whenami --date "25/12/2025"
whenami --date "25/12/25"
whenami --date "25-12-2025"
# Date ranges
whenami --date-range "01/08/2025,31/08/2025"
whenami --date-range "01/08/25,31/08/25"
# Convert output to a specific timezone
whenami --today --convert-tz America/Sao_Paulo
# Show event names alongside busy slots
whenami --today --event-name
# Show event names with split view
whenami --today --event-name --split
# List available timezones
whenami --list-tz
Timezone Support
whenami intelligently handles complex timezone scenarios:
Multi-Timezone Calendar Merging
- Auto-detection: Automatically detects each calendar's native timezone (e.g., work calendar in EST, personal in PST)
- Smart merging: Converts all events to a common timezone before merging busy periods
- Accurate overlap detection: Ensures proper conflict detection across timezone boundaries
Flexible Output Conversion
# View in your local timezone (default)
whenami --today
# Convert to a specific timezone for travel/meetings
whenami --today --convert-tz Europe/London
whenami --next-week --convert-tz Asia/Tokyo
# List all available timezones
whenami --list-tz
Real-World Example
If you have:
- Work calendar in
America/New_York(EST/EDT) - Personal calendar in
America/Los_Angeles(PST/PDT) - University calendar in
Europe/London(GMT/BST)
whenami will automatically handle the conversions and show your true availability across all timezones, optionally converting the final output to any timezone you specify.
Configuration
The tool will automatically create a ~/.config/whenami/ directory for storing configuration files. You can place your configuration files there for system-wide access, or use the current directory for project-specific configurations.
- Copy the example config file:
cp config.json.example ~/.config/whenami/config.json
- Edit
config.jsonwith your calendar settings:
{
"calendars": [
{
"id": "your-work-email@company.com",
"name": "Work Calendar"
},
{
"id": "your-personal@gmail.com",
"name": "Personal Calendar"
},
{
"id": "shared-project@company.com",
"name": "Shared Project Calendar"
},
{
"id": "student.name@university.edu",
"name": "University Calendar"
}
],
"work_hours": {
"start": "09:00",
"end": "17:00"
},
"personal_hours": {
"start": "08:00",
"end": "22:00"
},
"minimum_slot_duration": 30,
"default_timezone": "Europe/Dublin"
}
Configuration Options
calendars: Array of calendar objects withidandnamefieldswork_hours: Define work hours (start/end times in 24-hour format)personal_hours: Define personal hours (start/end times in 24-hour format)minimum_slot_duration: Minimum duration in minutes for free slots to be displayeddefault_timezone: Default timezone for date calculations (e.g., "Europe/Dublin", "America/New_York", "UTC")
📝 Note: Add as many calendars as needed - the tool will merge all busy periods to show your true availability across all calendars. This is especially useful if you have separate work, personal, and project calendars that you need to coordinate.
The default_timezone setting controls the timezone used for date calculations (e.g., "today", "tomorrow"). If not specified, the tool will try to use your system's timezone, falling back to UTC.
Authentication
The tool requires Google Calendar API authentication:
- Go to Google Cloud Console
- Create a new project or select an existing one
- Enable the Google Calendar API
- Create OAuth 2.0 credentials (Desktop application)
- Download the credentials and save as
credentials.jsonin one of these locations:~/.config/whenami/credentials.json(recommended for system-wide access)./credentials.json(current directory, for project-specific setup)
The first time you run the tool, it will open a browser window for authentication. The authentication token will be saved in ~/.config/whenami/token.json for future use.
Development
This project uses GitHub Actions for CI/CD:
- CI Pipeline: Runs tests on Python 3.9-3.12, generates coverage reports, and validates builds
- PyPI Publishing: Automated publishing to PyPI on releases using trusted publishing
For development setup, see the Local Development Setup section above.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file whenami-0.3.0.tar.gz.
File metadata
- Download URL: whenami-0.3.0.tar.gz
- Upload date:
- Size: 637.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3013b4e93279e5d46b7701fc1cff7e827dc4a8771b8ae44718bc74cbc42e1fa8
|
|
| MD5 |
60bbf8c6c5e122d5109fd248a60f9efb
|
|
| BLAKE2b-256 |
337ad35d926812d3e5b13f123fc81296d2008d16c9f503335729ce6db483e53b
|
Provenance
The following attestation bundles were made for whenami-0.3.0.tar.gz:
Publisher:
publish.yml on zampierilucas/whenami
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whenami-0.3.0.tar.gz -
Subject digest:
3013b4e93279e5d46b7701fc1cff7e827dc4a8771b8ae44718bc74cbc42e1fa8 - Sigstore transparency entry: 732693039
- Sigstore integration time:
-
Permalink:
zampierilucas/whenami@f28b6777254fb646f1ee923c73c00cc277166094 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/zampierilucas
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f28b6777254fb646f1ee923c73c00cc277166094 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file whenami-0.3.0-py3-none-any.whl.
File metadata
- Download URL: whenami-0.3.0-py3-none-any.whl
- Upload date:
- Size: 24.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a860f741cb2dc62f323df625c4a190baa1e5166b9d71b409ba519980f53861f
|
|
| MD5 |
597444b90bc466ca2599a4fa039b4193
|
|
| BLAKE2b-256 |
8c97f7f5c9523f6172c71ee963c750f1c47ee4a593c7b11d6855eb8fa9e83eb5
|
Provenance
The following attestation bundles were made for whenami-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on zampierilucas/whenami
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whenami-0.3.0-py3-none-any.whl -
Subject digest:
1a860f741cb2dc62f323df625c4a190baa1e5166b9d71b409ba519980f53861f - Sigstore transparency entry: 732693040
- Sigstore integration time:
-
Permalink:
zampierilucas/whenami@f28b6777254fb646f1ee923c73c00cc277166094 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/zampierilucas
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f28b6777254fb646f1ee923c73c00cc277166094 -
Trigger Event:
workflow_dispatch
-
Statement type: