timed-pypi-uploader
A lightweight Python tool for scheduling automated builds and uploads of Python packages to PyPI at specified times or on recurring intervals.
Features
- One-time or recurring scheduling using cron expressions or specific dates/times
- Automatic build backend detection (Hatch, Poetry, setuptools, flit)
- Secure token storage via system keyring
- Dry-run mode for testing without actual uploads
- Git change detection to skip releases when no changes exist
- TestPyPI support for pre-production testing
Installation
pip install timed-pypi-uploader
Quick Start
1. Configure your PyPI token
# Store PyPI token securely
timed-pypi-uploader config --pypi-token pypi-XXXXXXXXXXXX
# Or for TestPyPI
timed-pypi-uploader config --test-pypi-token pypi-XXXXXXXXXXXX
2. Run an immediate release
# Build and upload to PyPI
timed-pypi-uploader run --project-dir .
# Dry run first
timed-pypi-uploader run --dry-run
# Upload to TestPyPI
timed-pypi-uploader run --test-pypi
3. Schedule a release
# One-time release at specific time
timed-pypi-uploader schedule --at "2026-02-01T09:00:00" --project-dir .
# Recurring release (daily at 3am)
timed-pypi-uploader schedule --cron "0 3 * * *"
# Only release if git changes exist
timed-pypi-uploader schedule --cron "0 3 * * *" --check-git-changes
Commands
| Command | Description |
|---|---|
config |
Configure tokens and settings |
schedule |
Schedule a future release |
run |
Run a release immediately |
build |
Build distributions only |
upload |
Upload existing distributions |
check |
Verify all dependencies are installed |
Configuration
Create a .timed-uploader.toml file in your project:
[general]
project_dir = "."
build_backend = "auto" # auto, hatch, poetry, build, flit
test_mode = false
clean_before_build = true
[schedule]
type = "cron" # or "one-time"
cron = "0 3 * * *" # Daily at 3am
# at = "2026-02-01T09:00:00" # For one-time
check_git_changes = true
[tokens]
# Tokens stored via keyring, not in this file
pypi_keyring_service = "timed-pypi-uploader-pypi"
Or initialize with:
timed-pypi-uploader config --init
Examples
Build only (no upload)
timed-pypi-uploader build --project-dir /path/to/project
Upload existing dist files
timed-pypi-uploader upload --project-dir /path/to/project
Schedule with verbose logging
timed-pypi-uploader schedule --at "2026-02-01T09:00:00" --verbose
Run in background
nohup timed-pypi-uploader schedule --cron "0 3 * * *" &
Security
- Tokens are never stored in plaintext files
- Uses system keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service)
- Always test with
--dry-runand TestPyPI first
Dependencies
typer- CLI frameworkapscheduler- Job schedulingkeyring- Secure credential storagebuild- PEP 517 package buildingtwine- PyPI uploading
License
MIT
Support
Metadata
Release files for timed-pypi-uploader 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| timed_pypi_uploader-0.1.0.tar.gz | 23.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| timed_pypi_uploader-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 50.9 kB
Release files / timed_pypi_uploader-0.1.0.tar.gz
| Download URL | timed_pypi_uploader-0.1.0.tar.gz |
|---|---|
| Size | 23.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0dbc05218dbc0773e8753213c7b9a294f15df3ad94c3a25c7a5ed50f36942317
|
|
BLAKE2b-256 checksum How to use checksums |
e2564d6e86dc2d30dbf2f18040fe7b9031ac595769e6795f1291eea652472fa7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / timed_pypi_uploader-0.1.0-py3-none-any.whl
| Download URL | timed_pypi_uploader-0.1.0-py3-none-any.whl |
|---|---|
| Size | 27.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cefe02d7216699c9abd4d5923676defb050d061a3935dabf73bb8d6ea15bfd21
|
|
BLAKE2b-256 checksum How to use checksums |
70f05c64f5cfd0b2b1ad5df0345fa58f8949a62c34baab393d7627bbbcea3a94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|