A cross-platform terminal Pomodoro timer (stdlib-only) with keypress pauses and an ASCII reward banner.
This project has been archived.
The maintainers of this project have marked this project as archived. No new releases are expected.
Project description
Shellpomodoro
shellpomodoro = Shell + Pomodoro timer. Built for my own use; sharing in case it helps others too.
A cross-platform terminal-based Pomodoro timer CLI application that can be installed via pip and run anywhere. Built with Python's standard library only - no external dependencies required.
Features
- 🍅 Classic Pomodoro technique with customizable work and break durations
- ⏱️ Real-time countdown display with MM:SS format
- 🔔 Terminal bell notifications at phase transitions
- ⌨️ Keypress-controlled phase transitions (no need to wait)
- 🎨 ASCII art congratulations upon session completion
- 🖥️ Cross-platform support (Windows, macOS, Linux)
- 📦 Zero external dependencies (Python stdlib only)
- 🚀 Fast installation via pip
Installation
From PyPI (Recommended)
pip install shellpomodoro
Or, using UV instead of pip:
uv pip install shellpomodoro
Development Installation (from source)
git clone https://github.com/inspiringsource/shellpomodoro.git
cd shellpomodoro
python3 -m venv .venv
# macOS/Linux
source .venv/bin/activate
# Windows PowerShell
.\.venv\Scripts\Activate.ps1
# Windows CMD
.\.venv\Scripts\activate.bat
pip install -U pip
pip install -U pip
Alternative: Using pipx (isolated install)
pipx install .
Usage
Basic Usage
Start a default Pomodoro session (25min work, 5min break, 4 iterations):
shellpomodoro
Customization Options
# Custom work and break durations
shellpomodoro --work 30 --break 10
# Custom number of iterations
shellpomodoro --iterations 6
# Custom notification beeps
shellpomodoro --beeps 3
# Combine all options
shellpomodoro --work 45 --break 15 --iterations 3 --beeps 1
Command Line Options
--work N: Set work period duration in minutes (default: 25)--break N: Set break period duration in minutes (default: 5)--iterations N: Set number of Pomodoro cycles (default: 4)--beeps N: Set number of notification beeps (default: 2)--version,-v: Show version and exit--help: Show help message and exit
Display modes
By default, shellpomodoro shows a countdown timer. You can pick other displays:
# default behavior (countdown)
shellpomodoro --display timer-back
# count up from 00:00
shellpomodoro --display timer-forward
# progress bar
shellpomodoro --display bar
# test-runner style dots
shellpomodoro --display dots --dot-interval 60 # one dot per minute
--dot-interval(seconds) is optional and only used with dots. If omitted, shellpomodoro uses a sensible default (one dot per minute for long phases; ~10 dots for short ones).
How It Works
- Work Phase: Focus on your task while the timer counts down
- Notification: Terminal bell sounds when work phase ends
- Keypress Transition: Press any key when ready for break
- Break Phase: Take a break while the timer counts down
- Repeat: Continue until all iterations are complete
- Completion: Enjoy ASCII art congratulations!
Session Control
- Check Version: Run
shellpomodoro --versionorshellpomodoro -v - Abort Session: Press
Ctrl+Cat any time to abort the current session - Phase Transitions: Press
Ctrl+Eto end the current phase early (WORK → BREAK, BREAK → next WORK) - Real-time Display: See countdown timer, current phase, and instructions
Requirements
- Python 3.9 or higher
- No external dependencies required
Cross-Platform Compatibility
Shellpomodoro works seamlessly across different operating systems:
- Windows: Uses
msvcrtfor keypress detection - Unix/Linux/macOS: Uses
termiosandttyfor terminal control - Terminal Bell: Uses standard
\acharacter (may require terminal configuration)
Troubleshooting: No Beep in VS Code
If you don't hear the terminal bell when running in the VS Code integrated terminal, you may need to enable audio cues in your VS Code settings. Add the following to your settings.json:
{
"terminal.integrated.enableVisualBell": true,
"accessibility.signals.terminalBell": {
"sound": "on"
},
"audioCues.enabled": "on",
"audioCues.terminalBell": "on"
}
This enables the audible bell and ensures \a is played as a sound when Shellpomodoro triggers notifications.
Examples
Quick 15-minute session
shellpomodoro --work 15 --break 5 --iterations 1
Extended deep work session
shellpomodoro --work 50 --break 10 --iterations 3
Silent mode (no beeps)
shellpomodoro --beeps 0
License
MIT License - see LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Support
If you encounter any issues or have questions, please open an issue on the GitHub repository.
Development History
This project was initiated using Kiro, which helped establish the initial structure and core functionality of the Pomodoro timer (the original design.md, requirements.md, and tasks.md are included in the repo). Later, the codebase was optimized and refined using Grok code to improve performance, code quality, and maintainability.
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 shellpomodoro-0.1.4.tar.gz.
File metadata
- Download URL: shellpomodoro-0.1.4.tar.gz
- Upload date:
- Size: 37.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
132272b19433578c02a5b05d30638eb1b2cfa25ce6602b7720766f1df4e4439e
|
|
| MD5 |
a3a3fa00a395c418e30b3ce9aae4fac0
|
|
| BLAKE2b-256 |
84baf4251f825ad6bd432f873e2d0db083fdc69ec47a27b2227b07ee1c4bb1de
|
Provenance
The following attestation bundles were made for shellpomodoro-0.1.4.tar.gz:
Publisher:
publish.yml on inspiringsource/shellpomodoro
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shellpomodoro-0.1.4.tar.gz -
Subject digest:
132272b19433578c02a5b05d30638eb1b2cfa25ce6602b7720766f1df4e4439e - Sigstore transparency entry: 473655279
- Sigstore integration time:
-
Permalink:
inspiringsource/shellpomodoro@aa277c10579cc81cd1a7180da0285fd81581de0b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/inspiringsource
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@aa277c10579cc81cd1a7180da0285fd81581de0b -
Trigger Event:
push
-
Statement type:
File details
Details for the file shellpomodoro-0.1.4-py3-none-any.whl.
File metadata
- Download URL: shellpomodoro-0.1.4-py3-none-any.whl
- Upload date:
- Size: 15.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 |
40b97faffffb45945d936ea5359a9d88b7bd559bc75bbf72cf5b25a3859deaa0
|
|
| MD5 |
8f983978e86243ee55a3822993fe862c
|
|
| BLAKE2b-256 |
5332b072314a99a89fd2aebca0bf24d85a66e00e7f1246cff7f28e6988937cf8
|
Provenance
The following attestation bundles were made for shellpomodoro-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on inspiringsource/shellpomodoro
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shellpomodoro-0.1.4-py3-none-any.whl -
Subject digest:
40b97faffffb45945d936ea5359a9d88b7bd559bc75bbf72cf5b25a3859deaa0 - Sigstore transparency entry: 473655293
- Sigstore integration time:
-
Permalink:
inspiringsource/shellpomodoro@aa277c10579cc81cd1a7180da0285fd81581de0b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/inspiringsource
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@aa277c10579cc81cd1a7180da0285fd81581de0b -
Trigger Event:
push
-
Statement type: