CINXE.COM
Homebrew Governance — Homebrew Documentation
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Security-Policy" content="default-src 'none'; connect-src https://D9HG3G8GS4-dsn.algolia.net; font-src data: https://fonts.gstatic.com; img-src 'self' https://avatars2.githubusercontent.com https://avatars.githubusercontent.com; object-src 'none'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net ; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; "> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Homebrew Governance — Homebrew Documentation</title> <!-- Begin Jekyll SEO tag v2.8.0 --> <meta name="generator" content="Jekyll v3.10.0"> <meta property="og:title" content="Homebrew Governance"> <meta property="og:locale" content="en_US"> <meta name="description" content="Documentation for the missing package manager for macOS (or Linux)."> <meta property="og:description" content="Documentation for the missing package manager for macOS (or Linux)."> <link rel="canonical" href="https://docs.brew.sh/Homebrew-Governance"> <meta property="og:url" content="https://docs.brew.sh/Homebrew-Governance"> <meta property="og:site_name" content="Homebrew Documentation"> <meta property="og:image" content="https://docs.brew.sh/assets/img/homebrew-256x256.png"> <meta property="og:type" content="website"> <meta name="twitter:card" content="summary_large_image"> <meta property="twitter:image" content="https://docs.brew.sh/assets/img/homebrew-256x256.png"> <meta property="twitter:title" content="Homebrew Governance"> <meta name="twitter:site" content="@MacHomebrew"> <meta property="article:publisher" content="https://www.facebook.com/machomebrew/"> <script type="application/ld+json"> {"@context":"https://schema.org","@type":"WebPage","description":"Documentation for the missing package manager for macOS (or Linux).","headline":"Homebrew Governance","image":"https://docs.brew.sh/assets/img/homebrew-256x256.png","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://docs.brew.sh/assets/img/homebrew.svg"}},"url":"https://docs.brew.sh/Homebrew-Governance"}</script> <!-- End Jekyll SEO tag --> <meta name="viewport" content="width=device-width"> <link rel="icon" href="/assets/img/favicon.ico" sizes="48x48"> <link rel="icon" href="/assets/img/homebrew.svg" sizes="any" type="image/svg+xml"> <link rel="apple-touch-icon" href="/assets/img/apple-touch-icon.png"> <link rel="stylesheet" href="/assets/css/style.css" type="text/css" media="screen"> <link rel="preconnect" href="https://D9HG3G8GS4-dsn.algolia.net" crossorigin> <link rel="preload" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3/dist/style.min.css" as="style" media="screen" onload="this.onload=null;this.rel='stylesheet'"> </head> <body> <div id="wrap"> <div id="header"> <img alt="Homebrew Documentation logo" src="/assets/img/homebrew.svg" width="128" height="128"> <h1><a href="/">Homebrew Documentation</a></h1> <div id="search-container"></div> </div> <div id="page"> <h1 id="homebrew-governance">Homebrew Governance</h1> <h2 id="1-definitions">1. Definitions</h2> <ul> <li>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in <a href="https://www.ietf.org/rfc/rfc2119.txt">RFC 2119</a>.</li> <li>PLC: Project Leadership Committee</li> <li>TSC: Technical Steering Committee</li> <li>AGM: Annual General Meeting</li> <li>An ordinary resolution requires a majority of the votes cast.</li> <li>A special resolution requires a two-thirds supermajority of the votes cast.</li> <li>Primary repositories: the three highest-traffic, security-critical repositories in the Homebrew project: <ul> <li><a href="https://github.com/Homebrew/brew">Homebrew/brew</a> (<a href="https://github.com/Homebrew/brew/graphs/contributors">contributions</a>),</li> <li><a href="https://github.com/Homebrew/homebrew-core">Homebrew/homebrew-core</a> (<a href="https://github.com/Homebrew/homebrew-core/graphs/contributors">contributions</a>),</li> <li><a href="https://github.com/Homebrew/homebrew-cask">Homebrew/homebrew-cask</a> (<a href="https://github.com/Homebrew/homebrew-cask/graphs/contributors">contributions</a>)</li> </ul> </li> </ul> <h2 id="2-members">2. Members</h2> <ol> <li> <p>New members (unless nominated as maintainers, see below) will be admitted by an ordinary resolution of the PLC and added to the Homebrew organisation on GitHub.</p> </li> <li> <p>Members are expected to remain active within Homebrew. Members who are not active maintainers or active committee members must affirm their continued interest in Homebrew membership annually by voting on annual measures, even if voting abstention. Inactive, non-affirmed, non-voting members will be removed within 14 days after the annual meeting unless excused by the PLC.</p> </li> <li> <p>A member may be removed from Homebrew by an ordinary resolution of the PLC. A removed member may be reinstated by the usual admission process.</p> </li> <li> <p>All members will follow the <a href="https://github.com/Homebrew/.github/blob/HEAD/CODE_OF_CONDUCT.md#code-of-conduct">Homebrew Code of Conduct</a>. Changes to the code of conduct must be approved by the PLC.</p> </li> <li> <p>Members should abstain from voting when they have a conflict of interest not shared by other members. No one may be compelled to abstain from voting.</p> </li> </ol> <h2 id="3-general-meetings-of-members">3. General Meetings of Members</h2> <ol> <li> <p>A general meeting of the members may be called by either an ordinary resolution of the PLC or a majority of the entire membership. The membership must be given at least three weeks’ notice of a general meeting. The Annual General Meeting should be conducted in person and may provide online video conferencing for those unable to attend. Other general meetings should be an online video conference.</p> </li> <li> <p>The quorum to vote on resolutions and elections at a general meeting is 3 voting members or 10% of the voting members, whichever is greater. A general meeting with no business except voting should be asynchronous. Otherwise, it must be a synchronous online video conference. The voting will occur using an online voting system chosen by the PLC. The voting period closes after one week or after the outcome of the vote would not be changed by any subsequent votes. If a synchronous meeting is happening, the meeting must occur before the votes can be tallied.</p> </li> <li> <p>Homebrew members will meet at the annual general meeting (AGM) in a manner determined by the PLC.</p> </li> <li> <p>Elections will be held at the AGM.</p> </li> <li> <p>The PLC will announce candidates and proposals three weeks prior to the election date.</p> </li> <li> <p>Members should cast their vote any time up to three weeks prior to the election date.</p> </li> </ol> <h3 id="31-amendments-to-these-bylaws">3.1. Amendments to these bylaws</h3> <ol> <li> <p>These bylaws must only be amended by a special resolution at a general meeting of the members.</p> </li> <li> <p>Any member may propose an amendment via pull request on GitHub against this document. Proposed amendments may be merged for consideration in aggregate with other amendments once more than half of the PLC has approved the pull request.</p> </li> <li> <p>Members must vote on any amendments. All votes will be tallied. Voting will open for three weeks once one or more amendment proposals are accepted unless the AGM is within one month, in which case the proposed amendments will be voted on at the same time as elections.</p> </li> <li> <p>Any approved amendments will take effect three weeks after the close of voting.</p> </li> </ol> <h2 id="4-project-leadership-committee">4. Project Leadership Committee</h2> <ol> <li> <p>The financial administration of Homebrew, organisation of the AGM, enforcement of the code of conduct and removal of members are performed by the PLC. The PLC will represent Homebrew in all dealings with Open Collective.</p> </li> <li> <p>The PLC consists of five members, one of whom is the Project Leader. The other committee members are elected by Homebrew members in a <a href="https://en.wikipedia.org/wiki/Counting_single_transferable_votes#Meek">Meek Single Transferable Vote</a> election using the Droop quota. Each PLC member will serve a term of two years or until the member’s successor is elected. The maximum number of consecutive terms a (non-PL) PLC member can serve is two, even if this means they have no successor. Any sudden vacancy in the PLC will be filled by the usual procedure for electing PLC members at the next general meeting, typically the next AGM.</p> </li> <li> <p>When a PLC seat is up for election or is vacant, any member may become a candidate for the PLC by providing a brief statement in the <code class="language-plaintext highlighter-rouge">#members</code> channel in Homebrew’s Slack expressing relevant experience and intentions if elected no later than three weeks before the AGM. The PLC will maintain the candidate list until ballots are sent out one week before the AGM, during which time members should cast their votes. Candidates should deliver remarks in writing or verbally before or during the AGM but votes already cast are not changeable. The current PLC should vote on and publish a statement recommending their preferred candidates within the three-week period between the candidate deadline and the AGM.</p> </li> <li> <p>The PLC must report all minutes, participants in discussions and breakdowns of any votes cast to Homebrew members in the Homebrew/homebrew-governance-private GitHub repository no later than one week after the action has been taken. At the AGM, the PLC must present a summary of their activities and decisions since the last AGM. Financial statements can be viewed by anyone on the internet on <a href="https://opencollective.com/homebrew">Homebrew’s OpenCollective</a>.</p> </li> <li> <p>No more than two employees of the same employer may serve on the PLC.</p> </li> <li> <p>A member of the PLC must only be removed from the PLC by a special resolution of the membership.</p> </li> <li> <p>All members of the PLC will be “billing managers” and “moderators” of the GitHub organisation and any related resources (e.g. Slack, 1Password where possible).</p> </li> <li> <p>One member of the PLC other than the PL will have an <code class="language-plaintext highlighter-rouge">Owner</code> role in the GitHub organization and any related resources. The PLC will choose this person, with preference given to any PLC members who are current Homebrew maintainers. If no PLC members are Homebrew maintainers, any PLC member qualifies for the <code class="language-plaintext highlighter-rouge">Owner</code> role.</p> </li> </ol> <h2 id="5-meetings-of-the-project-leadership-committee">5. Meetings of the Project Leadership Committee</h2> <ol> <li> <p>All members of the PLC must meet by synchronous video call or in person at least once per year. This meeting should be in person at the AGM with at least two months’ notice.</p> </li> <li> <p>The quorum to vote on resolutions of the PLC is a majority of its members. In an electronic vote, a voting period of one week replaces the quorum requirement. Any approved resolution will take effect immediately.</p> </li> <li> <p>A majority of the entire membership of the PLC is required to pass an ordinary resolution.</p> </li> <li> <p>The PLC will annually review the status of all members and remove members who did not vote in the AGM and then did not re-affirm a commitment to Homebrew. Voting in the AGM confirms that a member wishes to remain active with the project. After the AGM, the PLC will ask the members who did not vote whether they wish to remain active with the project. The PLC removes any members who don’t respond to this second request after three weeks.</p> </li> <li> <p>The PLC will appoint the members of the TSC.</p> </li> <li> <p>Any member may refer any financial questions, AGM questions or code of conduct violations to the PLC. All technical matters must instead be referred to the Project Leader and technical disputes to the TSC. Members will make a good faith effort to resolve any disputes with compromise prior to referral to the PLC, Project Leader or TSC.</p> </li> </ol> <h2 id="6-project-leader">6. Project Leader</h2> <ol> <li> <p>The Project Leader will represent Homebrew publicly, manage all day-to-day technical decisions, and resolve disputes related to the operation of Homebrew between maintainers, members, other contributors, and users.</p> </li> <li> <p>The Project Leader will be elected every two years by Homebrew members in a <a href="https://en.wikipedia.org/wiki/Schulze_method">Schulze Condorcet method</a> (aka ‘beatpath’) election. The PLC will nominate at least one candidate for Project Leader. Any member may nominate a candidate, or self-nominate. Nominations must be announced to the membership three weeks before the AGM.</p> </li> <li> <p>Any vacancy of the Project Leader will be filled by appointment of the PLC.</p> </li> <li> <p>A technical decision of the Project Leader may be overruled by an ordinary resolution of the TSC.</p> </li> <li> <p>A non-technical decision of the Project Leader may be overruled by an ordinary resolution of the PLC.</p> </li> <li> <p>The Project Leader must only be removed from the position by a special resolution of the membership.</p> </li> <li> <p>The Project Leader must be included in all PLC communications with or about Open Collective and in all communications related to joint responsibilities.</p> </li> <li> <p>The Project Leader must be a maintainer, not just a member.</p> </li> <li> <p>The Project Leader will be an “Owner” of the GitHub organization, Slack, 1Password and any related resources.</p> </li> </ol> <h2 id="7-technical-steering-committee">7. Technical Steering Committee</h2> <ol> <li> <p>The TSC has the authority to decide on any technical disputes between any maintainer and the Project Leader. Disputes not involving the Project Leader must be addressed through the Project Leader.</p> </li> <li> <p>The PL is one member of the TSC. The PLC will appoint between three and five maintainers to be members of the TSC. PLC members should not be any of these appointees. Appointed TSC members will serve a term of one year or until the member’s successor is appointed.</p> </li> <li> <p>Any member may refer any technical question or dispute to the TSC. Members will make a good faith effort to resolve any disputes with compromise prior to referral to the TSC.</p> </li> <li> <p>No more than two employees of the same employer may serve on the TSC.</p> </li> <li> <p>A member of the TSC, except the Project Leader, must only be removed from the TSC by an ordinary resolution of the PLC.</p> </li> <li> <p>All members of the TSC will be “moderators” of the GitHub organisation.</p> </li> <li> <p>One member of the TSC (not the PL) will be an “Owner” of the GitHub organisation, Slack, 1Password and any related resources.</p> </li> </ol> <h2 id="8-maintainers">8. Maintainers</h2> <ol> <li> <p>All maintainers are automatically members. Some, not all, members are maintainers.</p> </li> <li> <p>Maintainers are members with commit/write-access to at least one primary repository.</p> </li> <li> <p>New maintainers can be nominated by any existing maintainer. To become a maintainer, a nomination requires approval from one of the PL or any member of the TSC with no opposition from any of these people within a 24-hour period, excluding 19:00 UTC on Friday until 19:00 UTC on the following Monday. If there is opposition, the TSC must vote on the nomination in the #tsc private Slack channel, with the vote closing after one week or after the outcome of the vote would not be changed by any subsequent votes (such as when a majority of the TSC has voted in favour or against). The nomination will succeed by a simple majority vote of the votes cast.</p> </li> <li> <p>In accordance with Homebrew’s organisational security posture, which requires operating under the principle of least privilege, the PL will review maintainers’ write/commit access no later than six weeks before the AGM. The PL will remove maintainer privileges from those who have not consistently met these criteria:</p> </li> </ol> <ul> <li>having more contributions to primary repositories than the majority of non-maintainer contributors in at least one of these repositories</li> <li>reviewing and merging of PRs of other maintainers and contributors in primary repositories <ul> <li>the PL will exclude from consideration non-essential pull requests submitted and merged by the same person</li> </ul> </li> <li>reviewing any direct GitHub review requests or GitHub reviews for any sub-teams they are part of (e.g. Homebrew/linux) in any repository in the Homebrew organisation</li> <li>responding to direct mentions on GitHub and direct mentions in Slack from the PL and other maintainers</li> <li>maintaining a positive working relationship with the PL and other maintainers</li> <li>engaging actively to resolve conflict with the PL or other maintainers, with a neutral intermediary upon request</li> </ul> <p>Maintainers who do not fulfil these requirements will be removed as a maintainer but may remain a member if they wish.</p> <p>The PL will not consider the following activities because they do not require commit or write access on security-critical repositories:</p> <ul> <li>contributions to the wider Homebrew organisation, repositories excluding the main, security-critical repositories, or the greater Homebrew ecosystem</li> <li>contributions in previous years as a maintainer or contributor</li> <li>contributions to the governance documents, the PLC, GSoC, MLH, social media, Homebrew’s discussion forum, etc.</li> </ul> <p>If a maintainer wishes to appeal their removal, they may request a TSC review of the decision. This appeal must be lodged within 72 hours of removal. The appellant will confirm their intent to address any unfulfilled criteria which caused the removal. The TSC will review the decision within one week. A member of the TSC, who is not the PL, will respond immediately upon upholding or reversing the decision. The PL will restore access as soon as is feasible if the TSC votes to reverse the removal. If the TSC or PL feels that the maintainer has not made sufficient progress on the criteria for any reversed removal, they may request a second TSC review no sooner than 30 days after the initial reversal. The TSC or PL may request a review in the event of noticeable no communication inactivity or unresponsiveness. The TSC will consider appeals no more than once per quarter per maintainer until the next AGM. The TSC will not consider any maintainer removal review until three months after the 2023 AGM.</p> <p>In emergency situations, including but not limited to malicious commits, suspicious activity, abuse of resources, or any action or activity that could harm the security posture of the Homebrew codebase, systems, or organisation, the PL or anyone with the capability to remove privileges should remove any or all of a maintainer’s access rights (e.g. to GitHub, Slack, 1Password, etc.). Upon doing so, they must inform the PLC and the TSC. The PLC will discuss the situation. The TSC will review the removal of any maintainer removed under this clause within two weeks and instruct the PL to restore the maintainer’s privileges only if the situation is resolved. This is considered to be the maintainer removal appeal process, as mentioned above. The TSC will document the situation in an incident report to be shared with members and recommend changes to security settings, maintainer policy, this governance document or any additional measures required to prevent the situation from occurring again.</p> </div> </div> <a href="https://github.com/Homebrew/brew/edit/master/docs/Homebrew-Governance.md"><img id="forkme" src="/assets/img/forkme_right_gray_6d6d6d.svg" alt="Fork me on GitHub"></a> <script> function loadLanguage(lang) { if (lang === null) { return; } else if (lang === 'en') { window.location.assign('/'); } else { window.location.assign('/' + lang); } } function loadAnchors() { anchors.options = { placement: 'left', visible: 'hover', }; anchors.add('#page > h2, #page > h3, #page > h4, #page > h5, #page > h6'); }; function loadSearch(lang, site) { docsearch(Object.assign( { searchParameters: { facetFilters: ['site: ' + site] } }, { initialQuery: new URLSearchParams(window.location.search).get('search') }, { placeholder: "Search Documentation" }, {"apiKey":"e3369d62b2366b374c54b2c5a2835a00","indexName":"brew_all","appId":"D9HG3G8GS4","container":"#search-container"} )); }; let escapeHTML = (identity) => identity; if (window.trustedTypes && window.trustedTypes.createPolicy) { let policy = trustedTypes.createPolicy( "forceInner", { createHTML: (to_escape) => to_escape } ); escapeHTML = (html) => policy.createHTML(html); }; async function setupCopyables() { if (navigator.clipboard) { for (const element of document.getElementsByClassName('copyable')) { let text = element.innerText.trim(); if (text.startsWith('$')) { text = text.substr(1).trimLeft(); } const button = document.createElement('button'); button.innerHTML = escapeHTML('📋'); button.setAttribute('aria-label', 'Copy to clipboard'); button.onclick = () => { navigator.clipboard.writeText(text); button.innerHTML = escapeHTML('✅'); setTimeout(() => button.innerHTML=escapeHTML('📋'), 1000); } element.appendChild(button); } } } window.addEventListener("DOMContentLoaded", function() { setupCopyables(); }); </script> <script src="https://cdn.jsdelivr.net/npm/anchor-js@5.0.0/anchor.min.js" integrity="sha256-aQmOEF2ZD4NM/xt4hthzREIo/2PFkOX/g01WjxEV7Ys=" crossorigin="anonymous" onload="loadAnchors()" async></script> <script src="https://cdn.jsdelivr.net/npm/@docsearch/js@3/dist/umd/index.min.js" onload="loadSearch('', 'docs')" async></script> </body> </html>