├── .github └── ISSUE_TEMPLATE │ ├── config.yml │ ├── mass-name-squatter.yml │ ├── account-recovery.yml │ ├── pep541-request.yml │ ├── limit-request-file.yml │ ├── limit-request-project.yml │ └── access-issues.yml ├── README.md └── name-retention └── README.md /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | # Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser 2 | blank_issues_enabled: false # default is true 3 | contact_links: 4 | - name: Python Infrastructure Status Page 5 | url: https://status.python.org 6 | about: Please check this page, prior to reporting possible PyPI outages 7 | - name: Organizations Feature Support 8 | url: https://docs.pypi.org/organization-accounts/support/#organization-features 9 | about: For support related to using Organizations Features on PyPI 10 | - name: Organizations Billing Support 11 | url: https://docs.pypi.org/organization-accounts/support/#organization-billing 12 | about: For support related to Organization billing, or changing Organization Types 13 | - name: Feature Request, UX issue or bug? 14 | url: https://github.com/pypa/warehouse/issues/new/choose 15 | about: Please open these under `pypa/warehouse` 16 | - name: Security Policy 17 | url: https://pypi.org/security/ 18 | about: Please learn how to report security vulnerabilities here 19 | - name: PSF Code of Conduct 20 | url: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 21 | about: For all Code of Conduct related matters, please refer to this document. 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/mass-name-squatter.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Mass name squatting by user 3 | title: "Mass name squat by user: USERNAME" 4 | description: You want to report mass project name squatting by a PyPI user 5 | labels: mass name squat 6 | 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | A PyPI user has registered a large number of projects with what you 12 | believe is an attempt to reserve their names or otherwise abuse the 13 | service. 14 | 15 | - type: input 16 | attributes: 17 | label: PyPI user performing the mass project name squatting 18 | description: | 19 | Please also **update the issue title** as well. 20 | value: | 21 | https://pypi.org/user/USERNAME 22 | validations: 23 | required: true 24 | 25 | - type: textarea 26 | attributes: 27 | label: Additional information 28 | description: | 29 | Any information you think might be useful for the moderators. 30 | 31 | validations: 32 | required: false 33 | 34 | - type: checkboxes 35 | attributes: 36 | label: Code of Conduct 37 | description: | 38 | Read the [PSF Code of Conduct][CoC] first. 39 | 40 | [CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 41 | options: 42 | - label: I agree to follow the PSF Code of Conduct 43 | required: true 44 | ... 45 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/account-recovery.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Account Recovery 3 | description: Initiate an account recovery due to lost 2FA or inability to access email address 4 | title: Account recovery request 5 | labels: account-recovery 6 | 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | **Request for account recovery.** 12 | 13 | - type: input 14 | attributes: 15 | label: PyPI Username 16 | description: >- 17 | Enter your PyPI `username` wrapped with single backticks 18 | validations: 19 | required: true 20 | 21 | - type: textarea 22 | attributes: 23 | label: Reason for request 24 | description: | 25 | State the reason for your request 26 | - Lost access to email address 27 | - Lost 2FA authentication app or security token 28 | validations: 29 | required: true 30 | 31 | - type: checkboxes 32 | attributes: 33 | label: Recovery Codes 34 | description: | 35 | Every PyPI account generates eight recovery codes when 2FA is enabled, for use when the 2FA app or security token is lost. 36 | options: 37 | - label: I never generated or have lost access to the recovery codes for my account 38 | required: true 39 | 40 | - type: checkboxes 41 | attributes: 42 | label: Code of Conduct 43 | description: | 44 | Read the [PSF Code of Conduct][CoC] first. 45 | 46 | [CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 47 | options: 48 | - label: I agree to follow the PSF Code of Conduct 49 | required: true 50 | 51 | - type: checkboxes 52 | attributes: 53 | label: Acknowledgement 54 | description: | 55 | By their nature account recovery issues are labor intensive. The PyPI team has limited resources available for their completion. 56 | 57 | There may be a delay of a week or more between responses for these issues. 58 | options: 59 | - label: I understand that it may take a significant amount of time to process my account recovery request. 60 | required: true 61 | ... 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PyPI Support 2 | This repository serves as an issue tracker for support requests related to using . 3 | 4 | ## Issues which should be opened here 5 | 6 | Any issue which relates to an individual user or project, or requires administrator or moderator intervention, should be opened here. For example: 7 | 8 | * [PEP 541](https://www.python.org/dev/peps/pep-0541/) project name requests 9 | * Network access issues 10 | * Upload limit requests 11 | * Account recovery 12 | * etc. 13 | 14 | See [this page](https://github.com/pypi/support/issues/new/choose) for the exact list. 15 | 16 | ## Issues which should _not_ be opened here 17 | Any issue that affects how PyPI works for all users, or require code or configuration changes, should _not_ be opened here. For example: 18 | 19 | * Feature requests 20 | * Usability issues 21 | * Bugs 22 | 23 | These issues should be opened against [`pypi/warehouse`](https://github.com/pypi/warehouse/issues/new/choose) instead. 24 | 25 | ## Guidelines for upload limit requests 26 | Generally, projects should try to minimize the size of their distributions as 27 | much as possible. Large distributions consume significant amounts of PyPI's 28 | resources, and also generally do not provide a good user experience. 29 | 30 | Small (up to 200MiB) upload limits are generally granted for the following reasons: 31 | * project contains small pre-trained models 32 | * project contains a small JAR file / executable 33 | * any other sufficiently motivated reason 34 | 35 | Large (more than 200MiB) upload limits are generally granted for the following reasons: 36 | * project contains large compiled binaries to maintain platform/architecture/GPU support 37 | * project is associated with an established project or organization 38 | 39 | Upload limits are generally denied for the following reasons: 40 | * project makes nightly releases and/or is published frequently 41 | * project contains large pre-trained machine learning models 42 | * project includes a large JAR file / executable 43 | * project includes a runtime for another programming language 44 | * project is not associated with an established project or organization 45 | * project has not made a best-effort to reduce release size 46 | 47 | ## Security policy 48 | To read the most up to date version of our security policy, including directions for submitting security vulnerabilities, please visit . 49 | 50 | ## If you are unsure where to file your issue 51 | Please [create a new issue here](https://github.com/pypa/pypi-support/issues/new/choose) and it will be transferred as necessary. 52 | 53 | ## Code of Conduct 54 | Everyone interacting in the PyPI's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the [PSF Code of Conduct](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md). 55 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/pep541-request.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Name retention related request (PEP 541) 3 | title: "PEP 541 Request: PROJECT_NAME" 4 | description: You want to claim or flag a project in accordance to PEP 541 5 | labels: PEP 541 6 | 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: | 11 | [PEP 541] describes the workflow for any project claiming issues 12 | and conflict resolution. Make sure you **read and understand** the 13 | PEP to set your expectations on the possible outcomes. 14 | 15 | [PEP 541]: https://www.python.org/dev/peps/pep-0541/ 16 | 17 | - type: input 18 | attributes: 19 | label: Project to be claimed 20 | description: | 21 | Provide the name of the package and a link to its PyPI page by replacing 22 | `PROJECT_NAME` with the name of the project in PyPI. 23 | 24 | Please also **update the issue title** as well. 25 | value: | 26 | `PROJECT_NAME`: https://pypi.org/project/PROJECT_NAME 27 | validations: 28 | required: true 29 | 30 | - type: input 31 | attributes: 32 | label: Your PyPI username 33 | description: | 34 | To help moderators deal with the transfer please confirm your 35 | PyPI username. 36 | value: | 37 | `USER_NAME`: https://pypi.org/user/USER_NAME 38 | validations: 39 | required: true 40 | 41 | - type: textarea 42 | attributes: 43 | label: Reasons for the request 44 | description: | 45 | *Do you believe* the project has been abandoned or otherwise has 46 | issues that **justify this request**. 47 | validations: 48 | required: true 49 | 50 | - type: dropdown 51 | attributes: 52 | label: Maintenance or replacement? 53 | description: | 54 | If the transfer is successful, do you intend to continue 55 | maintenance of the package to or publish a different one? 56 | options: 57 | - Maintenance 58 | - Replacement 59 | 60 | - type: textarea 61 | attributes: 62 | label: Source code repositories URLs 63 | description: | 64 | Please provide code repositories for both the current project and the 65 | one you intend to publish in its place. 66 | validations: 67 | required: true 68 | 69 | - type: textarea 70 | attributes: 71 | label: Contact and additional research 72 | description: | 73 | Please document below any attempts to contact current owner and/or 74 | research you may have conducted. Note moderators are obliged to contact 75 | owners independently. 76 | validations: 77 | required: true 78 | 79 | 80 | - type: checkboxes 81 | attributes: 82 | label: Code of Conduct 83 | description: | 84 | Read the [PSF Code of Conduct][CoC] first. 85 | 86 | [CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 87 | options: 88 | - label: I agree to follow the PSF Code of Conduct 89 | required: true 90 | ... 91 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/limit-request-file.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Size Limit Request (per-file) 3 | title: "File Limit Request: PROJECT_NAME - 000 MiB" 4 | description: "Your release files are larger than the per-file limit. (default: 100 MiB)" 5 | labels: limit request 6 | 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: > 11 | If you can't upload your project's release to PyPI because you're 12 | hitting the file size limit, we can sometimes increase your limit. 13 | 14 | - type: input 15 | attributes: 16 | label: Project URL 17 | placeholder: "https://pypi.org/project/" 18 | description: | 19 | Provide a link to the PyPI page for the project. 20 | validations: 21 | required: true 22 | 23 | - type: checkboxes 24 | attributes: 25 | label: Does this project already exist? 26 | description: | 27 | This project **MUST EXIST** for an increased limit to be set. 28 | 29 | An empty 0.0.0 release may be uploaded, if the project doesn't exist. You can delete this release immediately after uploading it. 30 | options: 31 | - label: "Yes" # should be a str but YAML parses unwrapped yes/no as bool 32 | required: true 33 | 34 | - type: input 35 | attributes: 36 | label: New Limit 37 | description: > 38 | What is the new size limit, in megabytes, that you are requesting? 39 | placeholder: 0 MiB 40 | validations: 41 | required: true 42 | 43 | - type: checkboxes 44 | attributes: 45 | label: Update issue title 46 | description: > 47 | The title of this issue should be updated, to mention the project name 48 | and the requested new limit. 49 | options: 50 | - label: I have updated the title. 51 | required: true 52 | 53 | - type: dropdown 54 | attributes: 55 | label: Which indexes 56 | description: > 57 | Which index/indexes you need the increase on? 58 | (PyPI, Test PyPI, or both) 59 | multiple: true 60 | options: 61 | - PyPI 62 | - TestPyPI 63 | validations: 64 | required: true 65 | 66 | # About the request 67 | - type: textarea 68 | attributes: 69 | label: About the project 70 | description: | 71 | What the project is and how long it has been active. 72 | 73 | If you have made efforts to reduce the size of your PyPI releases, mention it here. 74 | If you bundle other packages in your project, mention it here. 75 | If you bundle example data in your project, mention it here. 76 | validations: 77 | required: true 78 | 79 | - type: textarea 80 | attributes: 81 | label: Reasons for the request 82 | description: | 83 | Provide the reason for requesting the additional limit. 84 | 85 | If you expect your release sizes/total project size to increase in the future, mention it here. 86 | validations: 87 | required: true 88 | 89 | - type: checkboxes 90 | attributes: 91 | label: Code of Conduct 92 | description: | 93 | Read the [PSF Code of Conduct][CoC] first. 94 | 95 | [CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 96 | options: 97 | - label: I agree to follow the PSF Code of Conduct 98 | required: true 99 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/limit-request-project.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Size Limit Request (project-wide) 3 | title: "Project Limit Request: PROJECT_NAME - 00 GiB" 4 | description: "Your project has hit the total project size limit. (default: 10 GiB)" 5 | labels: limit request 6 | 7 | body: 8 | - type: markdown 9 | attributes: 10 | value: > 11 | If you can't upload your project's release to PyPI because you're 12 | hitting the total project size limit, we can sometimes increase your 13 | limit. 14 | 15 | - type: input 16 | attributes: 17 | label: Project URL 18 | placeholder: "https://pypi.org/project/" 19 | description: | 20 | Provide a link to the PyPI page for the project in question. 21 | validations: 22 | required: true 23 | 24 | - type: checkboxes 25 | attributes: 26 | label: Does this project already exist? 27 | description: | 28 | If it doesn't, maybe you're hitting the per-file limit? 29 | options: 30 | - label: "Yes" # should be a str but YAML parses unwrapped yes/no as bool 31 | required: true 32 | 33 | - type: input 34 | attributes: 35 | label: New limit 36 | description: | 37 | Please specify a new size limit, in gigabytes, that you want. 38 | validations: 39 | required: true 40 | 41 | - type: checkboxes 42 | attributes: 43 | label: Update issue title 44 | description: > 45 | The title of this issue should be updated, to mention the project 46 | name and the requested new limit. 47 | options: 48 | - label: I have updated the title. 49 | required: true 50 | 51 | - type: dropdown 52 | attributes: 53 | label: Which indexes 54 | description: >- 55 | Which index/indexes you need the increase for? 56 | (PyPI, Test PyPI, or both) 57 | multiple: true 58 | options: 59 | - PyPI 60 | - TestPyPI 61 | validations: 62 | required: true 63 | 64 | # About the request 65 | - type: textarea 66 | attributes: 67 | label: About the project 68 | description: | 69 | What the project is and how long it has been active. 70 | 71 | If you expect your release sizes/total project size to increase in the future, mention it here. 72 | validations: 73 | required: true 74 | 75 | - type: textarea 76 | attributes: 77 | label: How large is each release? 78 | description: | 79 | Use MiB to describe the size, and provide a summary of what files are uploaded in each release. 80 | 81 | If you have made efforts to reduce the size of your PyPI releases, mention it here. 82 | If you bundle other packages in your project, mention it here. 83 | If you bundle example data in your project, mention it here. 84 | placeholder: | 85 | ~200 MiB total. 86 | 87 | 2 Linux wheels at ~60 MiB, due to bundled libxml binaries. 88 | 6 Windows/MacOS wheels at ~10 MiB. 89 | The source tarball at ~10 MiB. 90 | validations: 91 | required: true 92 | 93 | - type: textarea 94 | attributes: 95 | label: How frequently do you make a release? 96 | placeholder: | 97 | Roughly once every three months. 98 | validations: 99 | required: true 100 | 101 | - type: checkboxes 102 | attributes: 103 | label: Code of Conduct 104 | description: | 105 | Read the [PSF Code of Conduct][CoC] first. 106 | 107 | [CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 108 | options: 109 | - label: I agree to follow the PSF Code of Conduct 110 | required: true 111 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/access-issues.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Network Access Issues 3 | description: You are having trouble reaching PyPI 4 | labels: network 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | > [!CAUTION] 11 | > Before using this form to report a new issue, please verify that it has 12 | > not already been documented on the [Python Infrastructure Status Page]. 13 | > Remember to scroll to the *Past Incidents* to see if there is something 14 | > that has recently been addressed. 15 | > 16 | > Verify first that your issue is not [already reported on GitHub][issue 17 | > search]. 18 | 19 | > [!WARNING] 20 | > This issue should be for problems accessing PyPI itself, including: 21 | > * pypi.org 22 | > * test.pypi.org 23 | > * files.pythonhosted.org 24 | > 25 | > This issue **should NOT** be for any non-PyPI properties (like 26 | > python.org, docs.python.org, etc.) 27 | 28 | *Please fill out the form below with as many precise 29 | details as possible.* 30 | 31 | [issue search]: /pypi/support/search?q=is%3Aissue&type=issues 32 | [Python Infrastructure Status Page]: https://status.python.org 33 | 34 | - type: textarea 35 | attributes: 36 | label: My Platform 37 | description: | 38 | Any details about your specific platform: 39 | * If the problem is in the browser, what browser, version, and OS? 40 | * If the problem is with a command-line tool, what version of that tool? 41 | * If the problem is with connecting to PyPI, include some details about 42 | your network, including SSL/TLS implementation in use, internet service 43 | provider, and if there are any firewalls or proxies in use. 44 | validations: 45 | required: true 46 | 47 | 48 | - type: markdown 49 | attributes: 50 | value: | 51 | **Network telemetry** 52 | 53 | Providing this information is crucial in helping diagnose 54 | networking issues for PyPI. 55 | 56 | - type: textarea 57 | attributes: 58 | label: Fastly Debug 59 | description: | 60 | Describe the steps to reproduce this bug. 61 | Note that this output is optional, as it encodes identifying 62 | information about your browser, public IP, and location. 63 | 64 | If you have a browser that reproduces your access issue, go to 65 | https://fastly-debug.com, when the page has loaded copy and paste 66 | the base64 encoded blob at the top of the page into the box below. 67 | 68 | Note that you may need to disable ad-blockers and privacy 69 | protection extensions in order for this page to operate, as it 70 | makes numerous calls to servers on our CDN's network that look 71 | concerning to those tools. 72 | value: | 73 | ``` (paste your output on the next line) 74 | 75 | ``` 76 | validations: 77 | required: false 78 | 79 | - type: textarea 80 | attributes: 81 | label: DNS Resolution 82 | description: | 83 | Provide the servers you're querying for DNS here if you know. They can be 84 | found in /etc/resolv.conf on most linux servers, or your network settings 85 | for MacOS and Windows. 86 | 87 | dig is used for these examples, if you are familiar with another tool that 88 | performs a similar utility, provide that output. 89 | value: | 90 | ```console (paste your output after the line with the dig command) 91 | $ dig pypi.org A 92 | 93 | ``` 94 | 95 | ```console (paste your output after the line with the dig command) 96 | $ dig pypi.org AAAA 97 | 98 | ``` 99 | 100 | ```console (paste your output after the line with the dig command) 101 | $ dig files.pythonhosted.org A 102 | 103 | ``` 104 | 105 | ```console (paste your output after the line with the dig command) 106 | $ dig files.pythonhosted.org AAAA 107 | 108 | ``` 109 | validations: 110 | required: true 111 | 112 | 113 | - type: markdown 114 | attributes: 115 | value: | 116 | **Traceroutes** 117 | 118 | `traceroute` is used for these examples, if you are familiar with another tool 119 | that performs a similar utility, provide that output. 120 | - type: textarea 121 | attributes: 122 | label: Traceroutes / IPv4 123 | value: | 124 | ```console (paste your output after the line with the traceroute command) 125 | $ traceroute pypi.org 126 | 127 | ``` 128 | 129 | ```console (paste your output after the line with the traceroute command) 130 | $ traceroute files.pythonhosted.org 131 | 132 | ``` 133 | validations: 134 | required: true 135 | - type: textarea 136 | attributes: 137 | label: Traceroutes / IPv6 (If available) 138 | value: | 139 | ```console (paste your output after the line with the traceroute command) 140 | $ traceroute6 pypi.org 141 | 142 | ``` 143 | 144 | ```console (paste your output after the line with the traceroute command) 145 | $ traceroute6 files.pythonhosted.org 146 | 147 | ``` 148 | validations: 149 | required: false 150 | 151 | 152 | - type: markdown 153 | attributes: 154 | value: | 155 | **HTTPS Requests** 156 | 157 | These provide a more holistic view of what is going on, and the 158 | ways that PyPI is generally accessed. They can also provide insight 159 | into TLS issues that may be occurring. 160 | - type: textarea 161 | attributes: 162 | label: HTTPS Requests / IPv4 163 | value: | 164 | ```console (paste your output after the line with the curl command) 165 | $ curl -vvv -I --ipv4 https://pypi.org/pypi/pip/json 166 | 167 | ``` 168 | 169 | ```console (paste your output after the line with the curl command) 170 | $ curl -vvv -I --ipv4 https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz 171 | 172 | ``` 173 | validations: 174 | required: true 175 | - type: textarea 176 | attributes: 177 | label: HTTPS Requests / IPv6 (If available) 178 | value: | 179 | ```console (paste your output after the line with the curl command) 180 | $ curl -vvv -I --ipv6 https://pypi.org/pypi/pip/json 181 | 182 | ``` 183 | 184 | ```console (paste your output after the line with the curl command) 185 | $ curl -vvv -I --ipv6 https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz 186 | 187 | ``` 188 | validations: 189 | required: false 190 | 191 | 192 | - type: markdown 193 | attributes: 194 | value: | 195 | **TLS Debug** 196 | - type: textarea 197 | attributes: 198 | label: TLS Debug / IPv4 199 | value: | 200 | ```console (paste your output after the line with the openssl command) 201 | $ echo -n | openssl s_client -4 -connect pypi.org:443 202 | 203 | ``` 204 | 205 | ```console (paste your output after the line with the openssl command) 206 | $ echo -n | openssl s_client -4 -connect files.pythonhosted.org:443 207 | 208 | ``` 209 | validations: 210 | required: true 211 | - type: textarea 212 | attributes: 213 | label: TLS Debug / IPv6 (If available) 214 | value: | 215 | ```console (paste your output after the line with the openssl command) 216 | $ echo -n | openssl s_client -6 -connect pypi.org:443 217 | 218 | ``` 219 | 220 | ```console (paste your output after the line with the openssl command) 221 | $ echo -n | openssl s_client -6 -connect files.pythonhosted.org:443 222 | 223 | ``` 224 | validations: 225 | required: false 226 | 227 | 228 | - type: checkboxes 229 | attributes: 230 | label: Code of Conduct 231 | description: | 232 | Read the [PSF Code of Conduct][CoC] first. 233 | 234 | [CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 235 | options: 236 | - label: I agree to follow the PSF Code of Conduct 237 | required: true 238 | ... 239 | -------------------------------------------------------------------------------- /name-retention/README.md: -------------------------------------------------------------------------------- 1 | # Name Retention (PEP 541) notes 2 | 3 | These are notes for PyPI support volunteers handling [PEP 541] project name 4 | requests. 5 | 6 | [PEP 541]: https://peps.python.org/pep-0541/ 7 | 8 | 9 | ## Diagram 10 | 11 | This is incomplete and doesn't account for special cases. 12 | From anywhere in the flow, if the process feels wrong: move to *Special case* and consult with colleagues or PyPI admins. 13 | 14 | ```mermaid 15 | %%{init: {"flowchart": {"htmlLabels": false}} }%% 16 | flowchart TD 17 | NEW[[New PEP 541 ticket]] --> NEW_isdone{{"Is the request already resolved (transferred/deleted)?"}} 18 | NEW_isdone --> |yes| NEW_done[Comment on issue] --> NEW_tbd(((TBD))) 19 | NEW_isdone --> |no| NEW_uploads{{project has uploads}} 20 | NEW_uploads --> |no| SQUAT 21 | NEW_uploads --> |yes| NEW_funct{{project has no functionality*}} 22 | NEW_uploads --> |no such project| NEW_tbd 23 | NEW_funct --> |no functionality| SQUAT 24 | NEW_funct --> |some functionality| NEW_what{{What is the request?}} 25 | NEW_what --> |Transfer for continued maintenance| ABTR 26 | NEW_what --> |Replace with a different project| NEW_whyname[Comment “Abandoned project - why not use a different name?”] 27 | NEW_whyname --> NEW_tbd 28 | subgraph SQUAT_subgraph [Invalid project: Name squatting] 29 | SQUAT[[Name squatting removal]] --> SQUAT_c[Send “Courtesy notice for invalid project -- name squatting”] --> SQUAT_w[Wait a week] --> SQUAT_r{{Did owner respond?}} --> |yes| SQUAT_tbd(((TBD))) 30 | SQUAT_r --> |no| SQUAT_s[Send “Removal notice for invalid project -- name squatting”] --> SQUAT_g[Comment “Invalid project removed; name available”] 31 | end 32 | 33 | subgraph ABTR_subgraph [Transfer of an abandoned project] 34 | ABTR[[Transferring abandoned project]] --> ABTR_init[Comment “Initial response”] --> ABTR_r[Send “Reachability -- abandoned project”] --> ABTR_wait["Wait 2 weeks (Reachability)"] --> ABTR_resp{{Owner response?}} 35 | ABTR_resp --> |want to keep| ABTR_keep["Comment with “owner is reachable” (recommend closing issue)"] 36 | ABTR_resp --> |want to transfer| ABTR_rq["Comment “Transfer per ownerʼs request” (recommend transferring)"] 37 | ABTR_resp --> |no response| ABTR_iter{{Was this the 3rd reachability mail?}} --> |no| ABTR_r 38 | ABTR_iter --> |yes| ABTR_t[Send “Transfer notice for abandoned project”] --> ABTR_tc["Comment “Transfer abandoned project” (recommend transferring)"] 39 | end 40 | 41 | SQUAT_g --> ADM[[Admin Review]] 42 | ABTR_keep --> ADM 43 | ABTR_tc --> ADM 44 | ABTR_rq --> ADM 45 | 46 | 47 | 48 | SPEC[[Special case]] 49 | ``` 50 | 51 | ## Email templates 52 | 53 | ### Reachability -- abandoned project 54 | 55 | To: $PYPI_USER_ADDRESS, $PROJECT_AUTHOR_ADDRESS, $UPLOADER_ADDRESS, $ADDRESS_FROM_DOCS 56 | Subject: ACTION REQUIRED: PyPI $PROJECT name retention 57 | 58 | Hello $NAME, 59 | 60 | Your project $PROJECT at $PYPI_URL appears to be abandoned, and $CANDIDATE 61 | has requested {transferring ownership to them in order to continue 62 | maintaining it|to reuse the name for another project}. 63 | See $SUPPORT_ISSUE_URL for details. 64 | 65 | As per the package index name retention policy 66 | (https://peps.python.org/pep-0541/), we are writing to confirm whether you 67 | are reachable, and whether you want to avoid transferring the project to 68 | $CANDIDATE. 69 | 70 | If you would like to keep the project, please reply to this email. 71 | 72 | If you are willing to give up the project, it would help us if you do it 73 | yourself: go to https://pypi.org/manage/project/$PROJECT/collaboration/, 74 | log in, and invite $CANDIDATE as an Owner. 75 | 76 | Add one of the following notes and the common end: 77 | 78 | #### ... attempt #1 79 | 80 | (nothing to add) 81 | 82 | #### ... attempt #2 83 | 84 | This is our second attempt to reach you. We tried two weeks ago. 85 | 86 | #### ... attempt #3 87 | 88 | This is our third and final attempt to reach you. If you do not reply in 89 | two weeks, we will recommend that the PyPI Administrators transfer 90 | ownership of PROJECT to CANDIDATE. 91 | 92 | #### common end 93 | 94 | Thank you for your time, 95 | PyPI Support 96 | 97 | ### Transfer notice for abandoned project 98 | 99 | To: $PYPI_USER_ADDRESS, $PROJECT_AUTHOR_ADDRESS, $UPLOADER_ADDRESS, $ADDRESS_FROM_DOCS 100 | Subject: ACTION REQUIRED: PyPI $PROJECT name retention 101 | 102 | Hello $NAME, 103 | 104 | Your project $PROJECT at $PYPI_URL appears to be abandoned, and 105 | $CANDIDATE has requested {transferring ownership to them in order to 106 | continue maintaining it|to reuse the name for another project}. 107 | See $SUPPORT_ISSUE_URL for details. 108 | 109 | We have attempted to reach you several times, and did not receive a reply. 110 | Per the package index name retention policy (https://peps.python.org/pep-0541/), 111 | we have recommended that the PyPI Administrators transfer the project to 112 | $CANDIDATE. 113 | 114 | Thank you for your time, 115 | PyPI Support 116 | 117 | ### Courtesy notice for invalid project -- name squatting 118 | 119 | To: $PYPI_USER_ADDRESS, $PROJECT_AUTHOR_ADDRESS, $UPLOADER_ADDRESS, $ADDRESS_FROM_DOCS, any additional mail we find 120 | Subject: ACTION REQUIRED: PyPI $PROJECT name retention 121 | 122 | Hello $NAME, 123 | 124 | Your project $PROJECT at $PYPI_URL {is empty|has no functionality}. 125 | Per the package index name retention policy (https://peps.python.org/pep-0541/), 126 | we consider such projects to be name squatting, and will remove them from 127 | the index. 128 | 129 | If you would like to release a project under this name, please do so as 130 | soon as possible. Otherwise, we will recommend that the PyPI Administrators 131 | delete it in about a week. 132 | 133 | Thank you for your time, 134 | PyPI Support 135 | 136 | ### Removal notice for invalid project -- name squatting 137 | 138 | To: $PYPI_USER_ADDRESS, $PROJECT_AUTHOR_ADDRESS, $UPLOADER_ADDRESS, $ADDRESS_FROM_DOCS, any additional mail we find 139 | Subject: Notice: PyPI $PROJECT may be removed 140 | 141 | Hello $NAME, 142 | 143 | Your project $PROJECT at $PYPI_URL {is empty|has no functionality} for an 144 | extended period of time. Per the package index name retention policy 145 | (https://peps.python.org/pep-0541/), we consider such projects to be name 146 | squatting. 147 | 148 | We have recommended that the PyPI Administrators remove the project from 149 | the index, making it available to be claimed by someone else. 150 | 151 | Thank you for your time, 152 | PyPI Support 153 | 154 | ## GitHub comment templates 155 | 156 | ### Initial Response - generic 157 | 158 | We are working to contact the {owner… etc (Please fill in as you see fit)} 159 | 160 | Disclaimer: We are providing support to the PyPI Administrators to validate 161 | this request and make a recommendation on the outcome and actions to be 162 | taken. Final determination will be made by the PyPI Administrators when our 163 | process is complete. 164 | 165 | ### Initial Response - determine reachability 166 | 167 | We are working to contact the owner to determine if they're reachable. 168 | 169 | Disclaimer: We are providing support to the PyPI Administrators to validate 170 | this request and make a recommendation on the outcome and actions to be 171 | taken. Final determination will be made by the PyPI Administrators when our 172 | process is complete. 173 | 174 | ### Remove invalid project; name available 175 | 176 | $PROJECT has been deemed invalid. Additionally, the owner {did not 177 | respond|did not fix the issue} in a week. 178 | We recommend that the PyPI Administrators delete the project and make the 179 | name available for registration. 180 | 181 | ### Owner is reachable 182 | 183 | $OWNER responded to our email, indicating that they want to keep the project. 184 | Projects are not transferred against the wishes of a reachable owner. 185 | We recommend that the PyPI Administrators close the issue. 186 | 187 | ### Transfer per owner's request 188 | 189 | $OWNER responded to our email and said we should transfer the project, 190 | so we recommend that the PyPI Administrators assign $CANDIDATE as the new 191 | owner of $PROJECT. 192 | 193 | ### Transfer abandoned project 194 | 195 | We could not reach $OWNER, and we consider the project abandoned per 196 | [PEP 541](https://peps.python.org/pep-0541/#abandoned-projects). 197 | We recommend that the PyPI Administrators assign $CANDIDATE as the new 198 | owner of $PROJECT. 199 | 200 | ### Abandoned project - why not use a different name? 201 | 202 | Per PEP-541: *Projects are never removed from the Package Index solely on 203 | the basis of abandonment. Artifacts uploaded to the Package Index hold 204 | inherent historical value.* 205 | 206 | One of the [requirements for removal of an abandoned 207 | project][pep-removal-abandoned] is: 208 | 209 | * the candidate is able to demonstrate why a fork under a different name 210 | is not an acceptable workaround 211 | 212 | If you have a new project, why can you not use a different name for it? 213 | 214 | [pep-removal-abandoned]: https://peps.python.org/pep-0541/#removal-of-an-abandoned-project 215 | 216 | --------------------------------------------------------------------------------