1.13.0 2019-02-13

  • [Feature] #418: Support keyring.get_username_and_password.
  • [Feature] #419: Support keyring.get_credential.
  • [Feature] #426: Allow defining an empty username and password in .pypirc.
  • [Feature] #427: Add disable_progress_bar option to disable tqdm.
  • [Support] #439: Refactor tox env and travis config.

1.12.1 2018-09-24

  • [Bug] #404: Fix regression with upload exit code

1.12.0 2018-09-24

  • [Feature] #363: Empower --skip-existing for Artifactory repositories
  • [Feature] #392: Drop support for Python 3.3
  • [Feature] #395: Add twine check command to check long description

1.11.0 2018-03-19

  • [Feature] #319: Support Metadata 2.1 (PEP 566), including Markdown for description fields.
  • [Feature] #320: Remove PyPI as default register package index.
  • [Bug] #322: Raise exception if attempting upload to deprecated legacy PyPI URLs.
  • [Bug] #269: Avoid uploading to PyPI when given alternate repository URL, and require http:// or https:// in repository_url.
  • [Support] #318: Update PyPI URLs.
  • [Support] #314: Add new maintainer, release checklists.
  • [Support] #277: Add instructions on how to use keyring.

1.10.0 2018-03-07

  • [Feature] #256: Improve progressbar
  • [Feature] #257: Declare support for Python 3.6
  • [Feature] #303: Revise docs predicting future of twine
  • [Feature] #296: Add architecture overview to docs
  • [Feature] #295: Add doc building instructions
  • [Feature] #46: Link to changelog from README
  • [Feature] #304: Reorganize & improve user & developer documentation.
  • [Bug] #265: Fix --repository[-url] help text
  • [Bug] #268: Print progress to stdout, not stderr
  • [Bug] #297: Fix Read the Docs, tox, Travis configuration
  • [Bug] #286: Fix Travis CI and test configuration
  • [Bug] #200: Remove obsolete registration guidance
  • [Bug] #299: Fix changelog formatting
  • [Bug] #298: Fix syntax highlighting in README
  • [Bug] #315: Degrade gracefully when keyring is unavailable

1.9.1 2017-05-27

  • [Bug]: Blacklist known bad versions of Requests. See also [Bug] #253:

1.9.0 2017-05-22

  • [Support]: Check if a package exists if the URL is one of:


    This helps people with still in their .pypirc file.

  • [Support]: Fix precedence of --repository-url over --repository. See also [Bug] #206:

  • [Support]: Fix --skip-existing when used to upload a package for the first time. See also [Bug] #220:

  • [Support]: Twine sends less information about the user’s system in the User-Agent string. See also [Bug] #229:

  • [Support]: Twine will use hashlib.blake2b on Python 3.6+ instead of using pyblake2 for Blake2 hashes 256 bit hashes.

  • [Support]: Twine will now resolve passwords using the keyring if available. Module can be required with the keyring extra.

1.8.0 2016-08-08

  • [Feature] #171: Generate Blake2b 256 digests for packages if pyblake2 is installed. Users can use python -m pip install twine[with-blake2] to have pyblake2 installed with Twine.

  • [Feature] #166: Allow the Repository URL to be provided on the command-line (--repository-url) or via an environment variable (TWINE_REPOSITORY_URL).

  • [Feature] #144: Retrieve configuration from the environment as a default.

    • Repository URL will default to TWINE_REPOSITORY
    • Username will default to TWINE_USERNAME
    • Password will default to TWINE_PASSWORD
  • [Feature] #201: Switch from to

  • [Support]: Do not generate traffic to Legacy PyPI unless we’re uploading to it or uploading to Warehouse (e.g., This avoids the attempt to upload a package to the index if we can find it on Legacy PyPI already.

  • [Support]: Warn users if they receive a 500 error when uploading to *

  • [Support]: Stop testing on Python 2.6. 2.6 support will be “best effort” until 2.0.0

  • [Support]: Generate SHA256 digest for all packages by default.

1.7.4 2016-07-09

  • [Bug]: Correct a packaging error.

1.7.3 2016-07-08

  • [Bug] #195: Fix uploads to instances of pypiserver using --skip-existing. We were not properly checking the return status code on the response after attempting an upload.

1.7.2 2016-07-05

  • [Bug] #189:, [Bug] #191: Fix issue where we were checking the existence of packages even if the user didn’t specify --skip-existing.

1.7.1 2016-07-05

  • [Bug] #187: Clint was not specified in the wheel metadata as a dependency.

1.7.0 2016-07-04

  • [Feature] #177: Switch Twine to upload to instead of
  • [Feature] #167: Implement retries when the CDN in front of PyPI gives us a 5xx error.
  • [Feature] #162: Allow --skip-existing to work for 409 status codes.
  • [Feature] #152: Add progress bar to uploads.
  • [Feature] #142: Support --cert and --client-cert command-line flags and config file options for feature parity with pip. This allows users to verify connections to servers other than PyPI (e.g., local package repositories) with different certificates.
  • [Bug] #186: Allow passwords to have %s in them.

1.6.5 2015-12-16

  • [Bug] #155: Bump requests-toolbelt version to ensure we avoid ConnectionErrors

1.6.4 2015-10-27

  • [Bug] #146: Exception while accessing the respository key (sic) when raising a redirect exception.
  • [Bug] #145: Paths with hyphens in them break the Wheel regular expression.

1.6.3 2015-10-05

  • [Bug] #137:, [Bug] #140: Uploading signatures was broken due to the pull request that added large file support via requests-toolbelt. This caused a 500 error on PyPI and prevented package and signature upload in twine 1.6.0

1.6.2 2015-09-28

  • [Bug] #132: Upload signatures with packages appropriately

    As part of the refactor for the 1.6.0 release, we were using the wrong name to find the signature file.

    This also uncovered a bug where if you’re using twine in a situation where * is not expanded by your shell, we might also miss uploading signatures to PyPI. Both were fixed as part of this.

1.6.1 2015-09-18

  • [Bug] #130: Fix signing support for uploads

1.6.0 2015-09-14

  • [Feature] #8: Support registering new packages with twine register
  • [Feature] #115: Add the --skip-existing flag to twine upload to allow users to skip releases that already exist on PyPI.
  • [Feature] #97: Allow the user to specify the location of their .pypirc
  • [Feature] #104: Large file support via the requests-toolbelt
  • [Feature] #106: Upload wheels first to PyPI
  • [Bug] #111: Provide more helpful messages if .pypirc is out of date.
  • [Bug] #116: Work around problems with Windows when using getpass.getpass
  • [Bug] #114: Warnings triggered by pkginfo searching for PKG-INFO files should no longer be user visible.
  • [Bug] #92: Raise an exception on redirects

1.5.0 2015-03-10

  • [Feature] #29: Support commands not named “gpg” for signing
  • [Bug] #61: Support deprecated pypirc file format
  • [Bug] #85: Display information about the version of setuptools installed
  • [Support]: Add lower-limit to requests dependency

1.4.0 2014-12-12

  • [Feature] #6: Switch to a git style dispatching for the commands to enable simpler commands and programmatic invocation.
  • [Feature] #13: Parse ~/.pypirc ourselves and use subprocess instead of the distutils.spawn module.
  • [Bug] #65: Expand globs and check for existence of dists to upload
  • [Bug] #26: Add support for uploading Windows installers
  • [Bug] #47: Fix issue uploading packages with _s in the name
  • [Bug] #32: Use pkg_resources to load registered commands
  • [Bug] #34: List registered commands in help text
  • [Bug] #28: Prevent ResourceWarning from being shown

1.3.0 2014-03-31

  • [Feature]: Additional functionality.

1.2.2 2013-10-03

  • [Feature]: Basic functionality.