PageSourceSearch

https://packagist.org/about

html packagist.org collected 2026-10-01 06:47:18 UTC 25,140 bytes, 369 lines download raw bytes

1<!DOCTYPE html>
2<html>
3    <head>
4        <meta charset="UTF-8" />
5
6        <title>Packagist.org</title>
7        <meta name="description" content="The PHP Package Repository" />
8        <meta name="author" content="Jordi Boggiano" />
9        <meta name="canonical" href="https://packagist.org/about" />
10        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
12        <link rel="shortcut icon" href="/favicon.ico?v=1790710795" />
13
14        <link rel="stylesheet" href="/build/app.css?v=1790710795" />
15        
16                <link rel="alternate" type="application/rss+xml" title="Newly Submitted Packages - Packagist.org" href="https://packagist.org/feeds/packages.rss" />
17        <link rel="alternate" type="application/rss+xml" title="New Releases - Packagist.org" href="https://packagist.org/feeds/releases.rss" />
18        
19        <link rel="search" type="application/opensearchdescription+xml" href="/search.osd?v=1790710795" title="Packagist.org" />
20
21        
21<script nonce="fURd+UOdfg9llOnyOt3dJA==">
22            var onloadRecaptchaCallback = function() {
23                document.querySelectorAll('.recaptcha-protected').forEach((el) => {
24                    el.closest('form').querySelectorAll('button, input[type="submit"]').forEach((submit) => {
25                        grecaptcha.render(submit, {
26                            'sitekey' : '6LfKiPoUAAAAAGlKWkhEEx7X8muIVYy6oA0GNdX0',
27                            'callback' : function (token) {
28                                submit.form.submit();
29                            }
30                        });
31                    })
32                });
33            };
34        </script>
34
35        
36            </head>
37    <body>
38    <section class="wrap">
39        <header class="navbar-wrapper fixed-top">
40                        <nav class="container">
41                <div class="navbar navbar-expand-md" role="navigation">                        <h1 class="navbar-brand"><a href="/">Packagist</a> <em class="d-none d-lg-inline">The PHP Package Repository</em></h1>                    <button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target=".navbar-collapse">
42                        <span class="visually-hidden">Toggle navigation</span>
43                        <span class="icon-bar"></span>
44                        <span class="icon-bar"></span>
45                        <span class="icon-bar"></span>
46                    </button>
47
48                    <div class="collapse navbar-collapse">
49                        <ul class="nav navbar-nav">
50                            <li>
51                                <a href="/explore/">Browse</a>
52                            </li>
53                            <li>
54                                <a href="/about">About Packagist.org</a>
55                            </li>
56                            <li>
57                                <a href="/packages/submit">Submit</a>
58                            </li>                            <li>
59                                <a href="/register/">Create account</a>
60                            </li>
61                            <li class="nav-user">
62                                <section class="nav-user-signin">
63                                    <a href="/login/">Sign in</a>
64
65                                    <section class="signin-box">
66                                        <form action="/login/" method="POST" id="nav_login">
67                                            <div class="input-group">
68                                                <span class="input-group-text"><span class="icon-user"></span></span>
69                                                <input class="form-control" type="text" id="_username" name="_username" placeholder="Username / Email">
70                                            </div>
71                                            <div class="input-group">
72                                                <span class="input-group-text"><span class="icon-lock"></span></span>
73                                                <input class="form-control" type="password" id="_password" name="_password" placeholder="Password">
74                                            </div>
75
76                                            <div class="form-check">
77                                                <input class="form-check-input" type="checkbox" id="_remember_me" name="_remember_me" value="on" checked="checked" />
78                                                <label class="form-check-label" for="_remember_me">Remember me</label>
79                                            </div>
80                                            <div class="signin-box-buttons">
81                                                <a href="/login/github" class="float-end btn btn-primary btn-github"><span class="icon-github"></span>Use Github</a>
82                                                <button type="submit" class="btn btn-success" id="_submit_mini" name="_submit">Log in</button>
83                                            </div>
84                                        </form>
85
86                                        <div class="signin-box-register">
87                                            <a href="/register/">No account yet? Create one now!</a>
88                                        </div>
89                                    </section>
90                                </section>
91                            </li>                        </ul>
92                    </div>
93                </div>
94            </nav>
95        </header>
96
97        <section class="wrapper wrapper-search">
98    <div class="container with-description">
99        <form name="search_query" method="get" action="/search/" id="search-form" autocomplete="off">
100            <div class="sortable row">
101                <div class="col-12 js-search-field-wrapper col-lg-9">
102                    <input type="search" id="search_query_query" name="query" required="required" autocomplete="off" placeholder="Search packages..." tabindex="1" class=" form-control" value="" />
103                </div>
104            </div>
105        </form>            <div class="row">
106                <div class="col-md-9 d-none d-md-block search-claim">
107                    <img src="/img/logo-small.png?v=1790710795" class="logo" alt="Packagist logo">
108                    <p>Packagist aggregates public packages that anyone can install with <a href="https://getcomposer.org/">Composer</a>.
109</p>
110                    <img src="/img/logo-composer.png?v=1790710795" alt="Composer logo" class="logo-composer d-none d-lg-inline-block">
111                </div>
112            </div>    </div>
113</section>
114
115
116                
117        
118        <section class="wrapper">
119            <section class="container content" role="main">
120                                    <div id="search-container" class="d-none">
121                        <div class="row">
122                            <div class="search-list col-lg-9"></div>
123
124                            <div class="search-facets col-lg-3">
125                                <div class="search-facets-active-filters-wrapper" style="display:none">
126                                    <div class="search-facets-active-filters-header">
127                                        <span>Active filters</span>
128                                        <div class="search-facets-clear-all"></div>
129                                    </div>
130                                    <div class="search-facets-active-filters"></div>
131                                </div>
132                                <div class="search-facets-type"></div>
133                                <div class="search-facets-tags"></div>
134                            </div>
135                        </div>
136
137                        <div class="row">
138                            <div class="col-lg-9">
139                                <div id="powered-by">
140                                    Search by <a href="https://www.algolia.com/"><img src="/img/sponsors/algolia-logo-light.svg?v=1790710795"></a>
141                                </div>
142                                <div id="pagination-container">
143                                    <div class="pagination-mount"></div>
144                                </div>
145                            </div>
146                        </div>
147                    </div>
148                
149                    <h2 class="title">What is Packagist?</h2>
150    <p>Packagist is the default Composer package repository. It lets you find packages and lets Composer know where to get the code from. You can use Composer to manage your project or libraries' dependencies - read more about it on the <a href="https://getcomposer.org/">Composer website</a>.</p>
151    <section class="row">
152        <div class="clearfix"></div>
153
154        <section class="col-lg-6">
155            <h3 id="support-consulting">Support &amp; Consulting</h3>
156            <p>Commercial support and consulting for PHP dependency management with Packagist and Composer are available through <a href="https://packagist.com">Private Packagist</a> subscription plans.</p>
157            <p>For general Composer usage guides and a command reference, see the <a href="https://getcomposer.org/doc/">Composer documentation</a>.</p>
158
159            <h3 id="contributing">Contributing</h3>
160            <p>To report issues or contribute code, you can find the source repository on <a href="https://github.com/composer/packagist">GitHub</a>.</p>
161        </section>
162
163        <section class="col-lg-6">
164            <h3 id="sponsoring">Sponsoring</h3>
165            <p>The best way to financially support the hosting and maintenance of Packagist.org and Composer is by using <a href="https://packagist.com">Private Packagist</a>. It helps you install packages fast and reliably, provides you with a private package repository, and the proceeds go directly towards Packagist.org and Composer maintenance.</p>
166            <p>For other ways to sponsor the project, visit our <a href="/sponsor/">sponsors page</a>.</p>
167        </section>
168    </section>
169
170    <h2 class="title" id="how-to-submit-packages">How to submit packages?</h2>
171    <section class="row">
172        <section class="col-lg-6">
173            <h3 id="naming-your-package">Naming your package</h3>
174            <p>First of all, you must pick a package name. This is a very important step since it can not change and it should be unique enough to avoid conflicts in the future.</p>
175            <p>The package name consists of a vendor name and a project name joined by a <code>/</code>. The vendor name exists to prevent naming conflicts. For example, by including a vendor name both <code>igorw</code> and <code>seldaek</code> can have a library named <code>json</code> by naming their packages <code>igorw/json</code> and <code>seldaek/json</code>.</p>
176            <p>In some cases the vendor name and the package name may be identical. An example of this would be `monolog/monolog`. For projects with a unique name this is recommended. It also allows adding more related projects under the same vendor later on. If you are maintaining a library, this would make it really easy to split it up into smaller decoupled parts.</p>
177            <p>Here is a list of typical package names for reference:</p>
178            <pre><code>// Monolog is a library, so the vendor name and package name are the same.
179monolog/monolog
180
181// That could be the name of a drupal module (maintained/provided by monolog,
182// if the drupal team did it, the vendor would be drupal).
183monolog/monolog-drupal-module
184
185// Acme is a company or person here, they can name their package with a common name (Email).
186// As long as it's in their own vendor namespace it does not conflict with anyone else.
187acme/email</code></pre>
188            <p>Vendor names on packagist are protected once a package with that name has been published. That means you can not publish packages with a vendor name that already exists on packagist without permission. To be able to publish packages for an already existing vendor name you need to be maintainer of at least one package within that vendor. Package and vendor names are allowed to contain lowercase letters (a-z), numbers (0-9), and the characters ".", "-" and "_". Each must start with a letter or number.</p>
189        </section>
190
191        <section class="col-lg-6">
192            <h3 id="creating-a-composerjson-file">Creating a composer.json file</h3>
193            <p>The composer.json file should reside at the top of your package's git/svn/.. repository, and is the way you describe your package to both packagist and composer.</p>
194            <p>A typical composer.json file looks like this:</p>
195            <pre><code>{
196    "name": "monolog/monolog",
197    "type": "library",
198    "description": "Logging for PHP 8.0",
199    "keywords": ["log","logging"],
200    "homepage": "https://github.com/Seldaek/monolog",
201    "license": "MIT",
202    "authors": [
203        {
204            "name": "Jordi Boggiano",
205            "email": "[email protected]",
206            "homepage": "http://seld.be",
207            "role": "Developer"
208        }
209    ],
210    "require": {
211        "php": ">=8.2"
212    },
213    "autoload": {
214        "psr-4": {
215            "Monolog\\": "src/Monolog"
216        }
217    }
218}</code></pre>
219            <p>Most of this information is obvious, keywords are tags, require are list of dependencies that your package has. This can of course be packages, not only a php version. You can use ext-foo to require php extensions (e.g. ext-curl). Note that most extensions don't expose version information, so unless you know for sure it does, it's safer to use <code>"ext-curl": "*"</code> to allow any version of it. Finally the type field is in this case indicating that this is a library. If you do plugins for frameworks etc, and if they integrate composer, they may have a custom package type for their plugins that you can use to install the package with their own installer. In the absence of custom type, you can omit it or use "library".</p>
220            <p>Once you have this file committed in your repository root, you can <a href="/packages/submit">submit the package</a> to Packagist by entering the public repository URL.</p>
221        </section>
222
223        <section class="col-lg-6">
224            <h3 id="validate-and-publish">Validate and publish</h3>
225            <p>Run <code>composer validate</code> to check that your composer.json file has no syntax errors, then commit it to your git or other VCS repository.</p>
226            <p><a href="/login/">Log in</a> or <a href="/register/">register</a> on this site, then hit the <a href="/packages/submit">submit</a> button in the menu. Once you entered your public repository URL, your package will be automatically crawled periodically - just make sure you keep the composer.json file up to date.</p>
227            <p>Use <a href="https://packagist.com">Private Packagist</a> if you want to share private code as a Composer package with colleagues or customers without publishing it for everyone on Packagist.org.</p>
228        </section>
229
230        <section class="col-lg-6">
231            <h3 id="managing-package-versions">Managing package versions</h3>
232            <p>New versions of your package are automatically fetched from tags you create in your VCS repository.</p>
233            <p>The easiest way to manage versioning is to just omit the version field from the composer.json file. The version numbers will then be parsed from the tag and branch names.</p>
234            <p>Tag/version names should match 'X.Y.Z', or 'vX.Y.Z', with an optional suffix for RC, beta, alpha or patch versions. Here are a few examples of valid tag names:</p>
235            <pre><code>1.0.0
236v1.0.0
2371.10.5-RC1
238v4.4.4beta2
239v2.0.0-alpha
240v2.0.4-p1</code></pre>
241            <p>Branches will automatically appear as "dev" versions that are easily installable by anyone that wants to try your library's latest and greatest, but that does not mean you should not tag releases. The use of <a href="http://semver.org/">Semantic Versioning</a> is strongly encouraged.</p>
242        </section>
243
244        <section class="col-lg-6">
245            <h3 id="update-schedule">Update Schedule</h3>
246            <p>New packages will be crawled <strong>immediately</strong> after submission if you have JS enabled.</p>
247            <p>Existing packages without auto-updating (GitHub/BitBucket/GitLab/Gitea hook) will be crawled <strong>once a week</strong> for updates. When a hook is enabled, packages are crawled whenever you push, or at least once a month in case the crawl failed. You can also trigger a manual update on your package page if you are logged-in as a maintainer.</p>
248            <p>It is highly recommended to set up the <strong>GitHub/BitBucket/GitLab/Gitea service hook</strong> for all your packages. This reduces the load on our side, and ensures your package is updated almost instantly. Check the how-to <a href="#how-to-update-packages">below</a>.</p>
249            <p>The search index is updated <strong>every five minutes</strong>. It will index (or reindex) any package that has been crawled since the last time the search indexer ran.</p>
250        </section>
251    </section>
252
253    <div class="clearfix"></div>
254
255    <h2 class="title" id="how-to-update-packages">How to update packages?</h2>
256    <section class="row">
257        <section class="col-lg-6">
258            <h3>GitHub Hook</h3>
259            <p>Enabling the Packagist service hook ensures that your package will always be updated instantly when you push to GitHub.</p>
260            <p>To do so you can:</p>
261            <ul>
262                <li>Make sure you log in via GitHub (if you already have an account not connected to GitHub, you can <a href="https://packagist.org/profile/edit">connect it on your profile</a>). If you are logged in already, log out first then log in via GitHub again to make sure you grant us the required permissions.</li>
263                <li>Make sure <a href="https://github.com/settings/connections/applications/a059f127e1c09c04aa5a">the Packagist application</a> has access to all the GitHub organizations you need to publish packages from.</li>
264                <li>Check <a href="https://packagist.org/profile/">your package list</a> to see if any has a warning about not being automatically synced.</li>
265                <li>If you still need to setup sync on some packages, try <a rel="nofollow noindex" href="/trigger-github-sync/">triggering a manual account sync</a> to have Packagist try to set up hooks on your account again. Note that archived repositories can not be setup as they are readonly in GitHub's API.</li>
266            </ul>
267            <h4>Do not want to log in via GitHub and grant us webhook configuration access?</h4>
268            <p>
268You can configure a GitHub webhook manually by using the following values:</p>
269            <ul>
270                <li>Payload URL: <code>https://packagist.org/api/github?username=PACKAGIST_USERNAME</code></li>
271                <li>Content Type: <code>application/json</code></li>
272                <li>Secret: your <a href="/profile/">Packagist API Token</a></li>
273                <li>Which events? Just the <code>push</code> event is enough.</li>
274            </ul>
275        </section>
276
277        <section class="col-lg-6">
278            <h3>Bitbucket Webhooks</h3>
279            <p>To enable the Bitbucket web hook, go to your BitBucket repository, open the settings and select "Webhooks" in the menu. Add a new hook. You have to enter the Packagist endpoint, containing both your username and API token. Enter <code>https://packagist.org/api/bitbucket?username=USERNAME&amp;apiToken=API_TOKEN</code> as URL. Save your changes and you're done.</p>
280        </section>
281
282        <div class="clearfix"></div>
283        <section class="col-lg-6">
284            <h3>GitLab Service</h3>
285            <p>To enable the GitLab service integration, go to your GitLab repository, open the Settings > Integrations page from the menu. Search for Packagist in the list of Project Services. Check the "Active" box, enter your packagist.org username and API token. Save your changes and you're done.</p>
286        </section>
287        <section class="col-lg-6">
288            <h3>Gitea Webhook</h3>
289            <p>Gitea supports automatic package updates on Packagist since v1.17.</p>
290            <p>To enable the Gitea webhook, go to your Gitea repository, open the Settings > Webhooks page and click on "Add Webhook". Select "Packagist" from the dropdown menu. You need to enter your packagist username, API token and the packagist URL of your package in the form. All other options can remain unchanged. Save your changes and you're done.</p>
291        </section>
292
293        <div class="clearfix"></div>
294        <section class="col-lg-6">
295            <h3>Manual hook setup</h3>
296            <p>If you do not use Bitbucket or GitHub there is a generic endpoint you can call manually from a git post-receive hook or similar. You have to do a <code>POST</code> request to <code>https://packagist.org/api/update-package?username=USERNAME&amp;apiToken=API_TOKEN</code> with a request body looking like this: <code>{"repository":{"url":"PACKAGIST_PACKAGE_URL"}}</code></p>
297            <p>You can do this using curl for example:</p>
298            <pre>curl -XPOST -H'content-type:application/json' 'https://packagist.org/api/update-package?username=USERNAME&amp;apiToken=API_TOKEN' -d'{"repository":{"url":"PACKAGIST_PACKAGE_URL"}}'</pre>
299        </section>
300
301        <section class="col-lg-6">
302            <h3>API Token</h3>
303            <p>You can find your API token on <a href="/profile/">your profile page</a>.</p>
304        </section>
305
306        <div class="clearfix"></div>
307        <section class="col-lg-6">
308            <h3>IP Allowlists</h3>
309            <p>If you are trying to restrict IPs and need to grant access to packagist.org workers we maintain a <a href="https://packagist-org-network.s3-eu-west-1.amazonaws.com/ip-address-list">list of our public IPs</a>.</p>
310        </section>
311    </section>
312            </section>
313        </section>
314    </section>
315
316        <footer class="wrapper-footer">
317            <nav class="container">
318                <div class="row">
319                    <div class="col-8 col-md-9 col-lg-10">
320                        <div class="row">
321                            <ul class="col-6 col-md-3">
322                                <li><a href="/about">About Packagist.org</a></li>
323                                <li><a href="/feeds/" rel="nofollow">Atom/RSS Feeds</a></li>
324                            </ul>
325
326                            <ul class="col-6 col-md-3">
327                                <li><a href="/statistics" rel="nofollow">Statistics</a></li>
328                                <li><a href="/explore/">Browse Packages</a></li>
329                            </ul>
330
331                            <ul class="col-6 col-md-3">
332                                <li><a href="/apidoc">API</a></li>
333                                <li><a href="/mirrors">Mirrors</a></li>
334                            </ul>
335
336                            <ul class="col-6 col-md-3">
337                                <li><a href="https://status.packagist.org/">Status</a></li>
338                                <li><a href="https://p.datadoghq.com/sb/x98w56x71erzshui-4a54c45f82bacc991e83302548934b6a">Dashboard</a></li>
339                            </ul>
340                        </div>
341                    </div>
342
343                    <div class="col-4 col-md-3 col-lg-2">
344                        <ul class="social">
345                            <li><a href="http://github.com/composer/packagist" title="GitHub"><span class="icon-github"></span></a></li>
346                            <li><a href="/contact" title="Contact"><span class="icon-mail"></span></a></li>
347                        </ul>
348                    </div>
349                </div>
350
351                <div class="row sponsor">
352                    <p class="col-12 col-lg-6"><a class="short" href="https://packagist.com/"><img alt="Private Packagist" src="/img/sponsors/private-packagist.svg?v=1790710795" /></a> provides maintenance and hosting</p>
353                    <p class="col-12 col-lg-6"><a class="long" href="https://bunny.net/"><img alt="Bunny.net" src="/img/sponsors/bunny-net.svg?v=1790710795" /></a> provides bandwidth and CDN</p>
354                    <p class="col-12 col-lg-6"><a class="short" href="https://www.aikido.dev/"><img alt="Aikido" src="/img/sponsors/aikido.svg?v=1790710795" /></a> provides malware detection</p>
355                    <p class="col-12 text-center"><a href="/sponsor/">Sponsor Packagist &amp; Composer</a></p>
356                </div>
357            </nav>
358        </footer>
359
360        <div class="notifications-container toast-container position-fixed top-0 start-50 translate-middle-x p-3"></div>
361
362        
362<script nonce="fURd+UOdfg9llOnyOt3dJA==">
363                        var algoliaConfig = {"app_id":"M58222SH95","search_key":"0cdb98d788b15a422a65e7f2fcecff5b","index_name":"packagist"};
364                    </script>
364
365        
366        
366<script nonce="fURd+UOdfg9llOnyOt3dJA==" src="/build/app.js?v=1790710795"></script>
366
367
368            </body>
369</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.