├── .github └── ISSUE_TEMPLATE │ ├── access-issues.yml │ ├── account-recovery.yml │ ├── config.yml │ ├── limit-request-file.yml │ ├── limit-request-project.yml │ ├── mass-name-squatter.yml │ └── pep541-request.yml ├── README.md └── name-retention └── README.md /.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 | ⚠ 11 | This issue should be for problems accessing PyPI itself, including: 12 | * pypi.org 13 | * test.pypi.org 14 | * files.pythonhosted.org 15 | 16 | This issue **should NOT** be for any non-PyPI properties (like 17 | python.org, docs.python.org, etc.) 18 | 19 | - type: textarea 20 | attributes: 21 | label: My Platform 22 | description: | 23 | Any details about your specific platform: 24 | * If the problem is in the browser, what browser, version, and OS? 25 | * If the problem is with a command-line tool, what version of that tool? 26 | * If the problem is with connecting to PyPI, include some details about 27 | your network, including SSL/TLS implementation in use, internet service 28 | provider, and if there are any firewalls or proxies in use. 29 | validations: 30 | required: true 31 | 32 | 33 | - type: markdown 34 | attributes: 35 | value: | 36 | **Network telemetry** 37 | 38 | Providing this information is crucial in helping diagnose 39 | networking issues for PyPI. 40 | 41 | - type: textarea 42 | attributes: 43 | label: Fastly Debug 44 | description: | 45 | Describe the steps to reproduce this bug. 46 | Note that this output is optional, as it encodes identifying 47 | information about your browser, public IP, and location. 48 | 49 | If you have a browser that reproduces your access issue, go to 50 | https://fastly-debug.com, when the page has loaded copy and paste 51 | the base64 encoded blob at the top of the page into the box below. 52 | 53 | Note that you may need to disable ad-blockers and privacy 54 | protection extensions in order for this page to operate, as it 55 | makes numerous calls to servers on our CDN's network that look 56 | concerning to those tools. 57 | value: | 58 | ``` (paste your output on the next line) 59 | 60 | ``` 61 | validations: 62 | required: false 63 | 64 | - type: textarea 65 | attributes: 66 | label: DNS Resolution 67 | description: | 68 | Provide the servers you're querying for DNS here if you know. They can be 69 | found in /etc/resolv.conf on most linux servers, or your network settings 70 | for MacOS and Windows. 71 | 72 | dig is used for these examples, if you are familiar with another tool that 73 | performs a similar utility, provide that output. 74 | value: | 75 | ```console (paste your output after the line with the dig command) 76 | $ dig pypi.org A 77 | 78 | ``` 79 | 80 | ```console (paste your output after the line with the dig command) 81 | $ dig pypi.org AAAA 82 | 83 | ``` 84 | 85 | ```console (paste your output after the line with the dig command) 86 | $ dig files.pythonhosted.org A 87 | 88 | ``` 89 | 90 | ```console (paste your output after the line with the dig command) 91 | $ dig files.pythonhosted.org AAAA 92 | 93 | ``` 94 | validations: 95 | required: true 96 | 97 | 98 | - type: markdown 99 | attributes: 100 | value: | 101 | **Traceroutes** 102 | 103 | `traceroute` is used for these examples, if you are familiar with another tool 104 | that performs a similar utility, provide that output. 105 | - type: textarea 106 | attributes: 107 | label: Traceroutes / IPv4 108 | value: | 109 | ```console (paste your output after the line with the traceroute command) 110 | $ traceroute pypi.org 111 | 112 | ``` 113 | 114 | ```console (paste your output after the line with the traceroute command) 115 | $ traceroute files.pythonhosted.org 116 | 117 | ``` 118 | validations: 119 | required: true 120 | - type: textarea 121 | attributes: 122 | label: Traceroutes / IPv6 (If available) 123 | value: | 124 | ```console (paste your output after the line with the traceroute command) 125 | $ traceroute6 pypi.org 126 | 127 | ``` 128 | 129 | ```console (paste your output after the line with the traceroute command) 130 | $ traceroute6 files.pythonhosted.org 131 | 132 | ``` 133 | validations: 134 | required: false 135 | 136 | 137 | - type: markdown 138 | attributes: 139 | value: | 140 | **HTTPS Requests** 141 | 142 | These provide a more holistic view of what is going on, and the 143 | ways that PyPI is generally accessed. They can also provide insight 144 | into TLS issues that may be occurring. 145 | - type: textarea 146 | attributes: 147 | label: HTTPS Requests / IPv4 148 | value: | 149 | ```console (paste your output after the line with the curl command) 150 | $ curl -vvv -I --ipv4 https://pypi.org/pypi/pip/json 151 | 152 | ``` 153 | 154 | ```console (paste your output after the line with the curl command) 155 | $ curl -vvv -I --ipv4 https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz 156 | 157 | ``` 158 | validations: 159 | required: true 160 | - type: textarea 161 | attributes: 162 | label: HTTPS Requests / IPv6 (If available) 163 | value: | 164 | ```console (paste your output after the line with the curl command) 165 | $ curl -vvv -I --ipv6 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 --ipv6 https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz 171 | 172 | ``` 173 | validations: 174 | required: false 175 | 176 | 177 | - type: markdown 178 | attributes: 179 | value: | 180 | **TLS Debug** 181 | - type: textarea 182 | attributes: 183 | label: TLS Debug / IPv4 184 | value: | 185 | ```console (paste your output after the line with the openssl command) 186 | $ echo -n | openssl s_client -4 -connect pypi.org:443 187 | 188 | ``` 189 | 190 | ```console (paste your output after the line with the openssl command) 191 | $ echo -n | openssl s_client -4 -connect files.pythonhosted.org:443 192 | 193 | ``` 194 | validations: 195 | required: true 196 | - type: textarea 197 | attributes: 198 | label: TLS Debug / IPv6 (If available) 199 | value: | 200 | ```console (paste your output after the line with the openssl command) 201 | $ echo -n | openssl s_client -6 -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 -6 -connect files.pythonhosted.org:443 207 | 208 | ``` 209 | validations: 210 | required: false 211 | 212 | 213 | - type: checkboxes 214 | attributes: 215 | label: Code of Conduct 216 | description: | 217 | Read the [PSF Code of Conduct][CoC] first. 218 | 219 | [CoC]: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 220 | options: 221 | - label: I agree to follow the PSF Code of Conduct 222 | required: true 223 | ... 224 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.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: Organizations Feature Support 5 | url: https://docs.pypi.org/organization-accounts/support/#organization-features 6 | about: For support related to using Organizations Features on PyPI 7 | - name: Organizations Billing Support 8 | url: https://docs.pypi.org/organization-accounts/support/#organization-billing 9 | about: For support related to Organization billing, or changing Organization Types 10 | - name: Feature Request, UX issue or bug? 11 | url: https://github.com/pypa/warehouse/issues/new/choose 12 | about: Please open these under `pypa/warehouse` 13 | - name: Security Policy 14 | url: https://pypi.org/security/ 15 | about: Please learn how to report security vulnerabilities here 16 | - name: PSF Code of Conduct 17 | url: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md 18 | about: For all Code of Conduct related matters, please refer to this document. 19 | -------------------------------------------------------------------------------- /.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/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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------