CINXE.COM
Release Download Pages for Projects - Apache Infrastructure Website
<!doctype html> <html class="no-js" lang="en" dir="ltr"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Release Download Pages for Projects - Apache Infrastructure Website</title> <link href="/css/bootstrap.min.css" rel="stylesheet"> <link href="/css/fontawesome.all.min.css" rel="stylesheet"> <link href="/css/headerlink.css" rel="stylesheet"> <script src="/highlight/highlight.min.js"></script> <!-- pagefind search --> <link href="/_pagefind/pagefind-ui.css" rel="stylesheet"> <script src="/_pagefind/pagefind-ui.js" type="text/javascript"></script> <script> window.addEventListener('DOMContentLoaded', (event) => { new PagefindUI({ element: "#pagefind-search" }); }); var pageTitle = ''; if(pageTitle === '404'){ window.addEventListener('DOMContentLoaded', (event) => { new PagefindUI({ element: "#page-404-search" }); }); } </script> <!-- pagefind search box styling --> <style type="text/css"> .search-form { right: 0; left: initial !important; min-width: 25vw; max-width: 90vw; max-height: calc(95vh - 100px); overflow: auto; margin-top: 5px; } </style> </head> <body class="d-flex flex-column h-100"> <main class="flex-shrink-0"> <div> <!-- nav bar --> <nav class="navbar navbar-expand-lg navbar-dark bg-dark" aria-label="Fifth navbar example"> <div class="container-fluid"> <a class="navbar-brand" href="/"><img src="/images/feather.png" style="height: 32px;"/> Apache Infrastructure</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarADP" aria-controls="navbarADP" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarADP"> <ul class="navbar-nav me-auto mb-2 mb-lg-0"> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false">About</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="/infra-news.html">News</a></li> <li><a class="dropdown-item" href="/blog/">The Infrastructure Blog</a></li> <li><a class="dropdown-item" href="/roundtable.html">The Infrastructure Roundtable</a></li> <li><a class="dropdown-item" href="/team.html">About the team</a></li> </ul> </li> <li class="nav-item"> <a class="nav-link" href="/policies.html">Policies</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false">Services and Tools</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="/services.html">Services and Tools</a></li> <li><a class="dropdown-item" href="https://blocky.apache.org/">Blocky</a></li> <li><a class="dropdown-item" href="https://app.datadoghq.com/account/login?next=%2Finfrastructure">DataDog</a></li> <li><a class="dropdown-item" href="https://whimsy.apache.org/roster/committer/" target="_blank">Committer Search</a></li> </ul> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false">Documentation</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="/doc.html">Infra docs</a></li> <li><a class="dropdown-item" href="/present.html">Infra presentations</a></li> </ul> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-expanded="false">Contribute</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="/infra-volunteer.html">Volunteer with Infra</a></li> <li><a class="dropdown-item" href="/how-to-mirror.html">Become an ASF download mirror</a></li> <li><a class="dropdown-item" href="/hosting-external-agent.html">Host a Jenkins or Buildbot agent</a></li> </ul> </li> <li class="nav-item"> <a class="nav-link" href="/stats.html">Status</a> </li> <li class="nav-item"> <a class="nav-link" href="/contact.html">Contact Us</a> </li> <li class="nav-item dropdown"> <a href="#" class="nav-link dropdown-toggle hidden-xs" data-bs-toggle="dropdown"><span class="fa-solid fa-magnifying-glass" aria-hidden="true"></span> Search</a> <ul class="search-form dropdown-menu"> <li> <div id="pagefind-search" class="input-group" style="width: 100%; padding: 0 5px;"></div> </li> </ul> </li> </ul> </div> </div> </nav> <!-- page contents --> <div id="contents"> <div class="bg-white p-5 rounded"> <div class="col-sm-8 mx-auto"> <h1> Release Download Pages for Projects </h1> <p>Your project's release download page is where people can download your product's latest release(s). This page describes how a release manager can put such a page together.</p> <p>Review</p> <ul> <li>the policy on <a href="release-distribution.html">release distribution</a> if you are unsure of the best way to use the project download page</li> <li>guidelines on <a href="release-signing.html">signing releases</a></li> </ul> <h2>Contents</h2> <ul> <li><a href="#links">Download links</a></li> <li><a href="#download-page">Your Apache project's download page</a></li> <li><a href="#download-scripts">Using the closer.lua download script</a></li> <li><a href="#best_practice">Best practices</a></li> <li><a href="#stats">Download statistics</a></li> <li><a href="#questions">Questions?</a></li> </ul> <h2 id="links">Download links<a class="headerlink" href="#links" title="Permanent link">¶</a></h2> <ul> <li>Your project's download page can only link to release artifacts that your PMC has approved.</li> <li>Do not link directly to <code>dist.apache.org</code>.</li> <li>The download page <strong>must</strong> include a link to the source distribution. It <strong>may</strong> include links to binary distributions.</li> <li>Use <strong>closer.lua</strong>, the standard mechanism to distribute Apache downloads. See below for details.</li> <li>All links to checksums, detached signatures and public keys <strong>must</strong> reference the Apache Distribution Directory (<a href="https://downloads.apache.org/" target="_blank">downloads.apache.org</a>) and use <code>https://</code> (SSL). For example: <code>https://downloads.apache.org/httpd/KEYS</code>.</li> <li>All releases are automatically <a href="https://www.apache.org/legal/release-policy.html#how-to-archive" target="_blank">archived</a>. You may continue to link to recent releases, as well as the latest one, from the download page, as a convenience for the user community. You <strong>should</strong> remove links to older releases that you no longer support.</li> <li>Remove all official pre-releases (e.g. milestones, alphas, betas) in a timely fashion once the project releases the final or GA version.</li> </ul> <h2 id="download-page">Your Apache project's download page<a class="headerlink" href="#download-page" title="Permanent link">¶</a></h2> <p>Your Apache project's download page:</p> <ul> <li><strong>must</strong> have at least one link to the current release. This link <strong>must</strong> use the <code>closer.lua</code> utility. For example: <code>https://www.apache.org/dyn/closer.lua/PROJECT/VERSION/SOURCE-RELEASE</code>. (Note: the <code>mirrors.cgi</code> and <code>closer.cgi</code> scripts have been deprecated. Calls to them redirect to <code>closer.lua</code>.)</li> <li><strong>must</strong> have a link to the checksum for the current release. These links <strong>must</strong> use direct links to the Apache distribution server. For example: <code>https://downloads.apache.org/PROJECT/VERSION/CHECKSUM</code>.</li> <li><strong>must</strong> have a link to the KEYS file for your project on the Apache distribution server. For example: <code>https://downloads.apache.org/PROJECT/KEYS</code>.</li> <li><strong>must</strong> have a link to the signature file for each release. See the <a href="release-signing.html">release signing</a> page for more information.</li> <li><strong>should</strong> have instructions on how to verify downloads. For this you can include a link to the <a href="https://www.apache.org/info/verification.html" target="_blank">Apache documentation on verification</a>.</li> <li><strong>must not</strong> include a download link to the top-level <code>closer.lua</code> utility (e.g. <code>http://www.apache.org/dyn/closer.lua/PROJECT</code>).</li> </ul> <h3 id="current-and-older-releases">Current and older releases<a class="headerlink" href="#current-and-older-releases" title="Permanent link">¶</a></h3> <ul> <li> <p>Do <strong>not</strong> keep software distributions on your project's website. Move them to one of the two software distribution sites:</p> </li> <li> <p><strong>Current public releases</strong> appear on <code>downloads.apache.org/</code>. Place current, official releases that the PMC has approved for end-users on the main public release site. Make all changes at <a href="https://dist.apache.org/repos/dist/release/" target="_blank"><code>https://dist.apache.org/repos/dist/release/</code></a>.</p> </li> <li> <p><strong>Older releases</strong> that you no longer recommend to the general public still appear on <code>archive.apache.org/dist/</code>. This site automatically contains all the content that has ever appeared on <code>downloads.apache.org/</code>. It is rarely necessary to touch this site, except during a reorganization. Once your project no longer recommends public use of a particular release, delete it from <code>downloads.apache.org/dist/</code> by removing it from <a href="https://dist.apache.org/repos/dist/release/" target="_blank"><a href="https://dist.apache.org/repos/dist/release/">https://dist.apache.org/repos/dist/release/</a></a>, and removing the link to it from your download page. It remain on the archive site.</p> </li> </ul> <p>To remove an old release from the release area, use a command of the form:</p> <p><code>svn del -m"Archiving release m.n" https://dist.apache.org/repos/dist/release/<project>/etc/m.n</code></p> <p>You can use this for release directories or individual files (if multiple releases are present in a single directory).</p> <h2 id="download-scripts">Using the closer.lua download script<a class="headerlink" href="#download-scripts" title="Permanent link">¶</a></h2> <p>Apache project download pages <strong>must</strong> use a closer.lua script. You'll find below a standard mechanism to let you easily create scripts that comply with the ASF distribution policy.</p> <p>There are two options:</p> <ul> <li>The <a href="#closer">closer.lua download script</a> is quick to set up. The project documentation links to it (rather than integrating it).</li> <li>A <a href="#custom">project-specific script</a>, which in the end calls <code>closer.lua</code> integrated with a page created in the normal way for the project and uses the project's standard document look and feel. This option takes more time to set up.</li> </ul> <h3 id="closer">Generic closer.lua download script<a class="headerlink" href="#closer" title="Permanent link">¶</a></h3> <p>The starting point for using the generic <code>closer.lua</code> script is a download page in your project's standard documentation which describes the releases. To use the generic script:</p> <ul> <li>Alter the page so the download link points to <code>closer.lua</code>.</li> <li>Pass in the relative path from the distribution root to the artifact as a parameter.</li> </ul> <p>If the artifact is <code>foo-5.5.1.zip</code> and it is located in <code>bar/foo</code> relative to <code>downloads.apache.org</code>, then the link <code>http://www.apache.org/dyn/closer.lua/bar/foo/foo-5.5.1.zip</code> provides the link for downloading.</p> <p>As an alternative, you can generate a direct download link using the following syntax:</p> <p><code>http://www.apache.org/dyn/closer.lua/bar/foo/foo-5.5.1.zip?action=download</code></p> <p><strong>Note</strong>: there is some information which every project should include on the download page (e.g. KEYS and signatures). Please read about <a href="#best_practice">best practices</a> for download pages.</p> <h3 id="custom">Project-specific download script<a class="headerlink" href="#custom" title="Permanent link">¶</a></h3> <p>To use a project-specific download script, create a project page containing information for the user about the release to download, together with variables the script populates with the appropriate values.</p> <p>Assuming you have called your download page <code>download.html</code>, you can invoke our global download script by using the URI <code>download.cgi</code>.</p> <p>This URI takes the path to the page as an input and passes it to <code>closer.lua</code>. When you link to the project page (for example, from the rest of the project documentation), it is important to target these links at the script address (and not the HTML page address).</p> <p>There is no requirement to name the script <code>download.cgi</code> and the download release page <code>download.html</code>, but the name of the script <strong>must</strong> correspond to the name of the download page. For example:</p> <ul> <li><code>release.cgi</code> and <code>release.html</code> will work</li> <li><code>download.cgi</code> and <code>release.html</code> will <strong>not</strong> work</li> </ul> <p>There are a number of elements that a good project download page should contain. See the content to generate that page <a href="https://svn.apache.org/repos/asf/httpd/site/trunk/content/download.mdtext" target="_blank">here</a>. Alternately, you can get inspiration from the <a href="https://github.com/apache/infrastructure-p6/blob/production/modules/closer_cgi/files/closer.html">default download template</a> that will be used when no custom HTML template exists for a project.</p> <p>A variable URL links to downloadable artifacts. The download script substitutes the correct base URL for the <code>[preferred]</code> variable. The rest of the URL should be the path to the artifact relative to the base of the Apache distribution directory.</p> <p>For example, for artifact <code>foo-1.0.0.tar.gz</code> contained in <code>bar/foo</code>, use <code>[preferred]/bar/foo/foo-1.0.0.tar.gz</code></p> <p>Provide links to the checksum and signature for the artifact next to the download link. It is important that users check the sum and verify the signature, so these links should be close and clear.</p> <p>For example, for artifact foo-1.0.0.tar.gz contained in bar/foo :</p> <pre><code>`<a href="[preferred]/bar/foo/foo-1.0.0.tar.gz">zip</a>` `<a href='https://downloads.apache.org/bar/foo/foo-1.0.0.tar.gz.asc'>PGP</a>` </code></pre> <p>More advice on creating a good project page is <a href="#best_practice">below</a>.</p> <p>All that remains is to wait for the main website to sync with the new page.</p> <h2 id="best_practice">Best practices<a class="headerlink" href="#best_practice" title="Permanent link">¶</a></h2> <h3 id="remind-users">Remind users to check sums and signatures</h3> <p>It is important that users understand that they should always verify the check sums and (if possible) the OpenPGP compatible signature of each file they download. The content of the release download page plays a critical role in this education process.</p> <p>Provide clear and easy links to the KEYS, sums and signatures from the download release page or include the information directly in the page itself. The <a href="https://httpd.apache.org/download.cgi" target="_blank">HTTPD page</a> is a good example.</p> <p>Include a reminder text with links to more information for users. For example:</p> <pre><code>Note: when downloading, please check the <a href="https://infra.apache.org/release-signing.html#sha-checksum" target="_blank">sha checksum</a> and verify the <a href="https://www.infra.apache.org/release-signing#openpgp" target="_blank">OpenPGP compatible signature</a> from the <a href="https://www.apache.org" target="_blank">main Apache site</a>. Links are provided above (next to the release download link). This <a href="https://downloads.apache.org/ws/axis2/KEYS" target="_blank">KEYS file</a> contains the public keys used for signing release. We recommend that you use a web of trust, if possible, to confirm the identity of these keys. For more information, please see the <a href="https://www.apache.org/dev/release.html" target="_blank">Apache Release FAQ</a>. </code></pre> <h3 id="linked-urls">Make sure the browser displays linked URLs<a class="headerlink" href="#linked-urls" title="Permanent link">¶</a></h3> <p>Users need to be able to verify the origin of the artifacts, signatures and sums they download. Check that the stylesheets your download site uses do not obscure the linked URLs. It is best to use a simple, plain style for download links. Note that some of the Maven-style sheets may obscure some external links in some browsers.</p> <h3 id="less-than-24hr">Timing your release announcement<a class="headerlink" href="#less-than-24hr" title="Permanent link">¶</a></h3> <p>Your release will be available almost immediately after you upload it to <code>https://downloads.apache.org/</code>, please refer to this <a href="release-publishing.html#timeline">release distribution timeline</a> document for details.</p> <h2 id="stats">Download statistics<a class="headerlink" href="#stats" title="Permanent link">¶</a></h2> <p>You can review downloads of your project's releases by day, week, month or quarter at our <a href="https://logs.apache.org/stats/">download statistics site</a>. Only project committers can access the page, but they can view download statistics for any Apache project.</p> <h2 id="questions">Questions?<a class="headerlink" href="#questions" title="Permanent link">¶</a></h2> <p>If you need assistance in implementing this policy, contact the <code>users@infra.apache.org</code> mailing list.</p> </div> </div> </div> <!-- footer --> <div class="row"> <div class="large-12 medium-12 columns"> <p style="font-style: italic; font-size: 0.8rem; text-align: center;"> Copyright 2025, <a href="https://www.apache.org/">The Apache Software Foundation</a>, Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.<br/> Apache® and the Apache feather logo are trademarks of The Apache Software Foundation. </p> </div> </div> <script type="application/ecmascript" src="/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"></script> </div> </main> <script>hljs.initHighlightingOnLoad();</script> </body> </html>