<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    
    
    <script type="text/javascript">
        if(window.location.protocol != 'https:') {
            location.href =   location.href.replace("http://", "https://");
        }
    </script>
    


    <title>Apache Wayang - Community</title>
    <link rel="icon" href="https://wayang.apache.org/assets/img/logo/favicon-pluma.ico">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
    <link rel="stylesheet" href="https://wayang.apache.org/assets/css/color.css">
    <link rel="stylesheet" href="https://pro.fontawesome.com/releases/v5.10.0/css/all.css" integrity="sha384-AYmEC3Yw5cVb3ZcuHtOA93w35dYTsvhLPVnYs9eStHfGJvOvKxVfELGroGkvsg+p" crossorigin="anonymous"/>

    <link rel="stylesheet" href="https://wayang.apache.org/assets/css/monokai.css">
    <link rel="stylesheet" href="https://wayang.apache.org/assets/css/home.css">

</head>
<body>



    
    

    
    

    
    

    
    

    
    

    
    
        
    


<nav class="navbar navbar-expand-lg navbar-light bg-light sticky-top shadow-lg">
    <div class="container d-flex justify-content-between w-100">
            <div class="mr-auto p-2 w-100">
                <div class="d-flex">
                    <a class="navbar-brand mr-auto" href="/">
                        <img style="max-height: 75px" src="https://wayang.apache.org/assets/img/logo/logo_400x160.png"/>
                    </a>
                    <button class="navbar-toggler ml-auto align-self-center" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                    </button>
                </div>

            </div>

            <div>
                <div class="p-2 collapse navbar-collapse" id="navbarSupportedContent">
                    <div class="navbar-nav">
                        
                        

                        
                        
                        <li class="nav-item ">
                            <a class="nav-link" href="https://wayang.apache.org/">
                                Home
                            </a>
                        </li>
                        
                        
                        

                        
                        
                        <li class="nav-item ">
                            <a class="nav-link" href="https://wayang.apache.org/about">
                                About
                            </a>
                        </li>
                        
                        
                        

                        
                        
                        <li class="nav-item ">
                            <a class="nav-link" href="https://wayang.apache.org/community">
                                Community
                            </a>
                        </li>
                        
                        
                        

                        
                        
                        <li class="nav-item ">
                            <a class="nav-link" href="https://wayang.apache.org/documentation">
                                Documentation
                            </a>
                        </li>
                        
                        
                        

                        
                        
                        <li class="nav-item ">
                            <a class="nav-link" href="https://wayang.apache.org/publications-home">
                                Publications
                            </a>
                        </li>
                        
                        
                        

                        
                        
                        <li class="nav-item dropdown ">
                            <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
                                Apache
                            </a>
                            <div class="dropdown-menu">
                                
                                <a class="dropdown-item" href="http://www.apache.org/foundation/how-it-works.html">
                                    Apache Software Foundation
                                </a>
                                
                                <a class="dropdown-item" href="http://www.apache.org/licenses/">
                                    Apache License
                                </a>
                                
                                <a class="dropdown-item" href="http://www.apache.org/foundation/sponsorship.html">
                                    Sponsorship
                                </a>
                                
                                <a class="dropdown-item" href="http://www.apache.org/foundation/thanks.html">
                                    Thanks
                                </a>
                                
                            </div>
                        </li>
                        
                        
                    </div>
                </div>
            </div>
        </div>
    </div>



</nav>
<div class="container-fluid p-0">
  <div class="title-post mb-3 mt-n5 d-flex align-items-center shadow" >
    <div class="col pt-4" style="text-align: center">
        <h1 class="mb-n2 mt-1" style="color: white; font-size: 4em">Community</h1>
        
    </div>
</div>

<div class="row">
    <div class="container">
        <div class="col-12 community">
            <p>The Apache Wayang team happily welcomes contributors and supporters of this nice Podling.</p>

<p>Contributions, bug reports, and suggestions are welcome to Wayang code, website, documentation, and everything else! Inside the documentation, you can find How to contribute with more details. The Team is waiting for you join to this Podling.</p>

<h1 id="mailing-list">Mailing List</h1>

<p>Mailing list is where we discuss in public and keep everything tracked. You are welcomed to subscribe it if you wish:</p>

<ul>
  <li>To be informed about bug reports or feature requests.</li>
  <li>To discuss developing plans or specific issues.</li>
  <li>To offer helps to those who ask questions by email.</li>
  <li>Give us ideas to make Wayang better for you and all the community.</li>
</ul>

<p>The emails where you can get subscribe are:</p>
<ul>
  <li><a href="mailto:dev@wayang.apache.org">dev@wayang.apache.org</a> holds other general discussions.</li>
  <li><a href="mailto:commits@wayang.apache.org">commits@wayang.apache.org </a>focuses on the commit logs.</li>
</ul>

<h2 id="how-to-subscribe-to-a-mailing-list">How to subscribe to a mailing list</h2>

<p>Send an email without any contents or subject to LISTNAME-subscribe@wayang.apache.org. (replace LISTNAME with dev, commits, ..)
    Wait till you receive an email with the subject “confirm subscribe to LISTNAME@wayang.apache.org”. Reply to that email, without editing the subject or including any contents
    Wait till you receive an email with the subject “WELCOME to LISTNAME@wayang.apache.org”.</p>

<p>If you send us an email with a code snippet, make sure that:</p>

<ul>
  <li>you do not link to files in external services as such files can change, get deleted, or the link might break and thus make an archived email thread useless</li>
  <li>you paste text instead of screenshots of text</li>
  <li>you keep formatting when pasting code in order to keep the code readable</li>
  <li>there are enough import statements to avoid ambiguities</li>
  <li>if you are using some platform, please specify the version</li>
</ul>

<h2 id="watch-the-email-without-subscribe">Watch the email without subscribe</h2>
<p>These two channels are public mailing list, and you can get access to them on Website without subscribing.</p>
<ul>
  <li><a href="https://lists.apache.org/list.html?commits@wayang.apache.org">Emails of commits@wayang.apache.org</a></li>
  <li><a href="https://lists.apache.org/list.html?dev@wayang.apache.org">Emails of dev@wayang.apache.org</a></li>
</ul>

<h1 id="community-hubs">Community Hubs</h1>

<h3 id="-source-code-repositories"><i class="fa-1x fab fa-git-alt"></i> Source Code Repositories</h3>

<h4 id="-wayang-core-repository"><span style="margin-left:1.5em"></span> Wayang Core Repository</h4>

<p><i class="fas fa-feather" style="color:#ff8724; margin-left: 3.5em"></i> ASF repository : <a href="https://gitbox.apache.org/repos/asf/incubator-wayang.git">https://gitbox.apache.org/repos/asf/incubator-wayang.git</a></p>

<p><i class="fab fa-github" style="color:#ff8724; margin-left: 3.5em"></i> GitHub mirror : <a href="https://github.com/apache/incubator-wayang.git">https://github.com/apache/incubator-wayang.git</a></p>

<h4 id="-wayang-web-page-repository"><span style="margin-left:1.5em"></span> Wayang Web Page Repository</h4>

<p><i class="fas fa-feather" style="color:#ff8724; margin-left: 3.5em"></i> ASF repository : <a href="https://gitbox.apache.org/repos/asf/incubator-wayang-website.git">https://gitbox.apache.org/repos/asf/incubator-wayang-website.git</a></p>

<p><i class="fab fa-github" style="color:#ff8724; margin-left: 3.5em"></i> GitHub mirror : <a href="https://github.com/apache/incubator-wayang-website.git">https://github.com/apache/incubator-wayang-website.git</a></p>

<h3 id="-issues-bugs-and-features"><i class="fa-1x fas fa-bug"></i> Issues, Bugs and Features</h3>

<p>If you have a specific bug to report or feature request, we suggest opening an issue in <a href="https://issues.apache.org/jira/projects/WAYANG/issue">Jira</a>.</p>

<h1 id="people">People</h1>

<h2 id="contributors">Contributors</h2>

<table class="table table-bordered table-striped table-hover">
  <thead>
    <tr>
      <th>Name</th>
      <th style="text-align: center">Role</th>
      <th>Apache ID</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Alexander Alten</td>
      <td style="text-align: center">PPMC, Committer</td>
      <td>aloalt</td>
    </tr>
    <tr>
      <td>Anis Troudi</td>
      <td style="text-align: center">PPMC, Committer</td>
      <td>atroudi</td>
    </tr>
    <tr>
      <td>Bertty Contreras</td>
      <td style="text-align: center">PPMC, Committer</td>
      <td>bertty</td>
    </tr>
    <tr>
      <td>Jorge Quiané</td>
      <td style="text-align: center">PPMC, Committer</td>
      <td>quiaru</td>
    </tr>
    <tr>
      <td>Rodrigo Pardo Meza</td>
      <td style="text-align: center">PPMC, Committer</td>
      <td>rpardomeza</td>
    </tr>
    <tr>
      <td>Zoi Kaoudi</td>
      <td style="text-align: center">PPMC, Committer</td>
      <td>zkaoudi</td>
    </tr>
  </tbody>
</table>

<p>You can reach committers directly at &lt;apache-id&gt;@apache.org</p>

<h2 id="former-mentors">Former mentors</h2>

<p>The following people were very kind to mentor the project while in incubation.</p>

<table class="table table-bordered table-striped table-hover">
  <thead>
    <tr>
      <th>Name</th>
      <th>Apache ID</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bernd Fondermann</td>
      <td>berndf</td>
    </tr>
    <tr>
      <td>Christofer Dutz</td>
      <td>cdutz</td>
    </tr>
    <tr>
      <td>Jean-Baptiste Onofré</td>
      <td>jbonofre</td>
    </tr>
    <tr>
      <td>Lars George</td>
      <td>larsgeorge</td>
    </tr>
  </tbody>
</table>

<h2 id="donations-to-wayang">Donations to Wayang</h2>

<p>The <a href="http://wayang.apache.org/assets/img/logo/Apache_Wayang/Apache_Wayang.pdf">Logo</a> and design style of the webpage it was donate by <a href="https://www.linkedin.com/in/brian-vera-hablares-17a663b8/">Brian Vera</a></p>


        </div>
    </div>
</div>





</div>

<footer class="footer position-sticky sticky-bottom">
    <nav class="navbar navbar-light bg-light"  style="background: #A6A6A6;">
        <div class="container">
            <div class="row">
                <div class="col text-center">
                    <a href="http://incubator.apache.org/" >
                        <img style="max-height: 15vw" src="https://wayang.apache.org/assets/img/egg-logo.png">
                    </a>
                    <br />
                    <p style="text-align: justify">
                        Apache Wayang is an effort undergoing Incubation at The Apache Software Foundation (ASF), sponsored by the Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
                    </p>
                    <p class="text-center">
                        Copyright &#169; 2021 The Apache Software Foundation.<br />
                        Licensed under the Apache License, Version 2.0.<br />
                        Apache, the Apache Feather logo, and the Apache Incubator project logo are trademarks of The Apache Software Foundation.
                    </p>
                </div>
            </div>
        </div>
    </nav>
</footer>


<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script>

<script src="https://wayang.apache.org/assets/js/add_numbers.js"></script>
</body>

</html>
