Skip to main content

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-run and TestPyPI first

Dependencies

  • typer - CLI framework
  • apscheduler - Job scheduling
  • keyring - Secure credential storage
  • build - PEP 517 package building
  • twine - PyPI uploading

License

MIT

Support

Ko-fi

Buy Me A Coffee

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)

Source distribution for timed-pypi-uploader 0.1.0
File Size Uploaded
timed_pypi_uploader-0.1.0.tar.gz 23.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for timed-pypi-uploader 0.1.0
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page