extend _components/base.pug

block pagetitle
    title Apache Ignite Community - Start Contributing
    meta(name="description", content="Meet an Apache Ignite community and get help. Contribute to Ignite by helping answer user questions, coding, changing technical documentation, or becoming a committer and PMC member.")
    link(rel="canonical", href="https://ignite.apache.org/community.html")

    meta(property="og:title", content="Apache Ignite Community - Start Contributing")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/community.html")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Meet an Apache Ignite community and get help. Contribute to Ignite by helping answer user questions, coding, changing technical documentation, or becoming a committer and PMC member.")


block css 
    link(rel="stylesheet", href="../css/communnity.css?ver=" + config.version)

block main
    - global.pageHref = "community.html"
    include ./_components/header.pug
    section.cmtyhero
        .container
            .cmtyhero__main
                h1.cmtyhero__h1.
                    Welcome To The Apache <br>Ignite Community
                .cmtyhero__text.
                    A community of software engineers, tech writers, and technologists who drive the evolution of a top-5 project of the Apache Software Foundation
                .cmtyhero__sub
                    a(href="https://blogs.apache.org/ignite/entry/apache-ignite-momentum-highlights-from" target="_blank") Learn more 
                    | about Ignite ranking in various categories.
            a(href="https://blogs.apache.org/ignite/entry/apache-ignite-momentum-highlights-from", target="_blank").cmtyhero__img
                img(src="/img/community/b1-photo.svg", alt="Welcome to the Apache Ignite Community")
    // /.cmtyhero


    
    section.cmtynavblock.jsNavBlock
        .container
            ul.cmtynavblock__list.flexi 
                li
                    a.cmtynavblock__active(href="#story")  Learn Our Story
                li
                    a(href="#community") Meet the Community
                li
                    a(href="#contributing") Start Contributing
                li
                    a(href="#faq") Ask a Question
    // /.cmtynavblock

    
    section.cmtyhistory
        .container#story
            .cmtyhistory1
                h2.cmtyhistory1__title Apache Ignite Story
                .cmtyhistory1__wrap.flexi
                    .cmtyhistory1__left
                        .cmtyhistory__year 2014
                        img(src="/img/community/b3-rocket1.svg", alt="")
                    .cmtyhistory1__right
                        h3.cmtyhistory1__h3.fz30.pb-3 Ignite is contributed to ASF
                        p A <a href="https://incubator.apache.org/projects/ignite.html" target="_blank">new project enters the Apache Software Foundation incubator</a> under the name of "Apache Ignite"🚀. The first members form its community.
                        .cmtyhistory__hr(data-hideopen="cmtyhistory1")
                            i
                            span
                        .cmtyhistory__more(data-hidebox="cmtyhistory1")
                            p It&nbsp;was a&nbsp;time of&nbsp;intensive learning. While being in&nbsp;the incubator, everyone was learning how to&nbsp;build a&nbsp;vibrant community, create releases, and do&nbsp;things other open-source projects&nbsp;do.
                            blockquote.cmtyhistory__quote.
                                It&nbsp;was time of&nbsp;intensive learning experience. While being in&nbsp;the Incubator, guys were learning how to&nbsp;build a&nbsp;vibrant community, create releases and do&nbsp;tings other open source projects&nbsp;do.
                            .cmtyhistory__avaavtor.pt-2.flexi
                                .cmtyhistory__ava
                                    img(src="/img/community/b2-cos.jpg", alt="")
                                .cmtyhistory__avaright 
                                    .cmtyhistory__avaname Cos Boudnik
                                    .cmtyhistory__avaproff ASF member, Apache Ignite Mentor
            // /.cmtyhistory1

            .cmtyhistory2
                .cmtyhistory2__wrap.flexi
                    .cmtyhistory2__right
                        .cmtyhistory__year.cmtyhistory__year--right 2015
                        img(src="/img/community/b3-rocket2.svg", alt="")
                    .cmtyhistory2__left
                        h3.cmtyhistory1__h3.fz30.pb-3 Ignite graduates from the incubator
                        p In&nbsp;less than a&nbsp;year <a href="https://blogs.apache.org/foundation/entry/the_apache_software_foundation_announces79" target="_blank">Ignite successfully graduates</a> from the ASF incubator and became a&nbsp;top-level project of&nbsp;the Apache Software Foundation.
                        .cmtyhistory__hr(data-hideopen="cmtyhistory2")
                            i
                            span
                        .cmtyhistory__more(data-hidebox="cmtyhistory2")
                            p The community keeps expanding rapidly. Hundreds of&nbsp;developers and architects start using Ignite as&nbsp;a&nbsp;distributed in-memory data grid (aka. write-through/read-through cache) for its native support of&nbsp;SQL, ACID transactions and high-performance computing APIs.
            // /.cmtyhistory2

            .cmtyhistory3
                .cmtyhistory3__wrap.flexi
                    .cmtyhistory3__left
                        .cmtyhistory__year 2017
                        img(src="/img/community/b3-rocket3.svg", alt="")
                    .cmtyhistory3__right
                        h3.cmtyhistory1__h3.fz30.pb-3 Ignite introduces Native Persistence and becomes a Top-5 Project
                        p In 2017, two notable events happened. 
                        .cmtyhistory__hr(data-hideopen="cmtyhistory3")
                            i
                            span
                        .cmtyhistory__more(data-hidebox="cmtyhistory3")
                            p.pb-3 <a href="https://incubator.apache.org/ip-clearance/persistent-distributed-store-ignite.html" target="_blank">First, with the donation of&nbsp;the Ignite native persistence</a> to&nbsp;the project&rsquo;s codebase, a&nbsp;new chapter in&nbsp;the Ignite story begins. Since then, many will be&nbsp;using Ignite as&nbsp;a&nbsp;distributed database that scales across memory and disk with no&nbsp;compromises💥.
                            p Second, this is&nbsp;the year when Ignite is&nbsp;ranked as&nbsp;a&nbsp;top-5 project of&nbsp;the ASF in&nbsp;various categories 🏆 for the first time. A&nbsp;trend that will continue in&nbsp;the years to&nbsp;come.
            // /.cmtyhistory3

            .cmtyhistory2.cmtyhistory4
                .cmtyhistory2__wrap.flexi
                    .cmtyhistory2__right
                        .cmtyhistory__year.cmtyhistory__year--right 2020
                        img(src="/img/community/b3-rocket4.svg", alt="")
                    .cmtyhistory2__left
                        h3.cmtyhistory1__h3.fz30.pb-3 Ignite becomes (officially) <br>a distributed database
                        p In 3 years, after the initial release of the Ignite native persistence, the community and application developers carried on improving and adopting this capability for mission-critical production workloads. 
                        .cmtyhistory__hr(data-hideopen="cmtyhistory4")
                            i
                            span
                        .cmtyhistory__more(data-hidebox="cmtyhistory4")
                            p Finally, after seeing the rapid adoption of Ignite as a database by application developers, the community repositions Ignite as "distributed database for high-performance computing with in-memory speed". 
            // /.cmtyhistory4

            .cmtyhistory3.cmtyhistory5
                .cmtyhistory3__wrap.flexi
                    .cmtyhistory3__left
                        .cmtyhistory__year Today
                        img(src="/img/community/b3-rocket5.svg", alt="")
                    .cmtyhistory3__right
                        h3.cmtyhistory1__h3.fz30.pb-3 Ignite 3.0 version is under way
                        p Even when your project can boast of&nbsp;hundreds of&nbsp;thousands of&nbsp;downloads a&nbsp;month and is&nbsp;being selected by&nbsp;elite developers and architects for applications that are used by&nbsp;millions of&nbsp;people daily, there is&nbsp;still room for innovation.
                        .cmtyhistory__hr(data-hideopen="cmtyhistory5")
                            i
                            span
                        .cmtyhistory__more(data-hidebox="cmtyhistory5")
                            p Ignite 3&nbsp;is a&nbsp;significant leap forward for both the project and its community. Join or&nbsp;support&nbsp;us in&nbsp;an&nbsp;effort to&nbsp;create a&nbsp;cutting-edge distributed database...
            // /.cmtyhistory5
    // /.cmtyhistory



    section.cmty-meet#community
        .container
            .cmty-meet__wrap.flexi
                .cmty-meet__main
                    h2.cmty-meet__h2 Meet The Community
                    .cmty-meet__text.pt-3.
                        A global community of professionals with different skills and experiences who drive the evolution of Ignite.
                    .cmty-meet__sub <a href="http://www.apache.org/theapacheway/" target="_blank">The Apache Way</a> &ndash; get to know our collaboration and contribution values with principles.
                .cmty-meet__pic 
                    img(src="/img/community/b4-img.svg", alt="")
    // /.cmty-meet



    section.cmty-contrib 
        .container 
            .cmty-contrib__wrap.flexi
                .cmty-contrib__main 
                    h3.h4 Contributers
                    .cmty-contrib__text.pt-2.
                        More than 100 members help the project grow and progress daily. Code contributions, documentation creation, project awareness, developer support — <strong>this is just a sample of the contributions that we recognize.</strong>
                .cmty-contrib__pic 
                    img(src="/img/community/b5-img.png", alt="")
    // /.cmty-contrib





    section.cmty-committers 
        .container
            h3.h4 Committers
            .cmty-committers__text.pt-2 Most active contributors who make a&nbsp;significant contribution <br>to&nbsp;the project become Apache Ignite committers.
            p.cmty-committers__small.pt-2 Here is the list of committers for the project.
            .committers__wrap.flexi 


                mixin committerNew(obj)
                    if obj["Comitter"]
                        .committer.flexi
                            .committer__name #{obj["Name"]}
                            if obj["GitHub"]
                                a.committer__github(href=obj["GitHub"])
                                    img(src="/img/icon-github.svg", alt="")
                            if obj["Apache profile"]
                                a.committer__apache(href=obj["Apache profile"])
                                    img(src="/img/icon-pero.svg", alt="")
                            else
                                span.committer__apache


                include ./_components/committers.pug
                -
                    let arrayCommitters = JSON.parse(committers);
                    let committersLeft = arrayCommitters.slice(0,arrayCommitters.length / 2);
                    let committersRight = arrayCommitters.slice(arrayCommitters.length / 2);
                    let pmc = arrayCommitters.filter((el) => {
                        return el.PMC;
                    })
                .committers__left
                    each val, index in committersLeft
                        if index > 6
                            - break;
                        +committerNew(val)
                    a.committers__morelink(href="#", data-hideopen="committersLeft", data-invis="1") Load more
                    .committers__more.jsOpener(data-hidebox="committersLeft")
                        .jsOpenerWrap
                            each val, index in committersLeft
                                if index <= 6
                                    - continue;
                                +committerNew(val)
                .committers__right
                    each val, index in committersRight
                        if index > 6
                            - break;
                        +committerNew(val)
                    a.committers__morelink(href="#", data-hideopen="committersRight", data-invis="1") Load more
                    .committers__more.jsOpener(data-hidebox="committersRight")
                        .jsOpenerWrap
                            each val, index in committersRight
                                if index <= 6
                                    - continue;
                                +committerNew(val)
                //- include _components/cmty-committers.pug
    // /.cmty-committers 



    section.cmty-pm 
        .container 
            h3.fz30 Project Management Committee
            .cmty-committers__text.pt-2 A group of Ignite committers who oversee project management and operational matters. <br>They vote on new committers, releases and make other vital decisions.
            p.cmty-committers__small.pt-2 Here is the list of PMC members for the project.
            


            mixin projectManagers(obj)
                article.cmty-pmitem
                    if obj["PMC"] == "PMC Chair"
                        .cmty-pmitem__proff
                            img(src="/img/community/b7-chair-star.svg", alt="")
                            span PMC CHAIR
                    p.cmty-pmitem__name.h5 !{obj["Name"]}
                    small.cmty-pmitem__work.pt-2 #{obj["Company"]}
                    .cmty-pmitem__links.flexi 
                        if obj["GitHub"]
                            a.cmty-pmitem__github(href=obj["GitHub"], target="_blank")
                                img(src="/img/icon-github.svg", alt="")
                        if obj["Apache profile"]
                            a.cmty-pmitem__apache(href=obj["Apache profile"], target="_blank")
                                img(src="/img/icon-pero.svg", alt="")
            //- include _components/cmty-phs.pug

            .cmty-pm__wrap.pt-5
                +projectManagers({
                    "Name": "Dmitriy Govorukhin",
                    "Comitter": "YES",
                    "PMC": "PMC Chair",
                    "GitHub": "https://github.com/dgovorukhin",
                    "Apache profile": "",
                    "Company": "",
                })
                each val, index in pmc
                    if index > 2
                        - break;
                    +projectManagers(val)
            .cmty-pm__more.jsOpener(data-hidebox="pmMore")
                .jsOpenerWrap.cmty-pm__wrap
                    each val, index in pmc
                        if index < 4
                            - continue;
                        +projectManagers(val)
            a.cmty-pm__morelink(href="#", data-hideopen="pmMore") 
                i Load more
                span Hide
    // /.cmty-pm



    section.cmty-startcont#contributing
        .container
            .cmty-startcont__wrap.flexi 
                .cmty-startcont__main 
                    h2.h3.cmty-startcont__title Start Contributing
                    .cmty-startcont__text.h5.pt-3.
                        There are multiple ways you can contribute to Ignite &mdash; contribute to the codebase, help developers on the mailing lists, write technical docs or popularize our technology!
                .cmty-startcont__pic 
                    img(src="/img/community/b8-img.svg", alt="")
    // /.cmty-startcont



    section.cmty-docs 
        .container 
            h3.h4 Code and technical documentation contributions
            .cmty-docs__wrap.flexi.pt-5
                .cmty-docblock 
                    .cmty-docblock__icon
                        img(src="/img/community/b9-icon-code.svg", alt="")
                    h3.cmty-docblock__title.h4 Develop Ignite
                    .cmty-docblock__text.pt-2.fz20
                        p Contribute to the Apache Ignite:
                    ul.cmty-docblock__list 
                        li code base
                        li integrations and extensions
                        li programming languages, such as .NET, Python, Node.JS, or other programming languages different from Java
                .cmty-docblock.cmty-docblock--bg
                    .cmty-docblock__icon
                        img(src="/img/community/b9-icon-paper.svg", alt="")
                    h3.cmty-docblock__title.h4 Improve technical documentation
                    .cmty-docblock__text.pt-2.fz20
                        p Documentation educates users about Ignite capabilities, configuration techniques, optimization aspects and many other things.
                    ul.cmty-docblock__list 
                        li Produce and maintain the documentation pages <br>or API references
                        li Edit and correct existing content
    // /.cmty-docs



    section.cmty-ready
        .container
            .h4.pb-1
                strong Ready to start?
            .cmty-ready__text.fz20 4 Steps to Start Contributing to the Code and Technical Documentation
            .cmty-ready__wrap.pt-4
                .cmty-ready__item 
                    i 01
                    p.fz20 Create an <a href="https://issues.apache.org/jira/" target="_blank">ASF JIRA <br>account</a>, if&nbsp;you haven&rsquo;t <br>got one yet
                .cmty-ready__item 
                    i 02
                    p.fz20 Join <a href="mailto:dev-subscribe@ignite.apache.org" target="_blank">dev mailing list</a> and introduce yourself
                .cmty-ready__item 
                    i 03
                    p.fz20.pb-2 Pick a ticket to start with
                    p 
                        span.cmty-ready__openlink(data-hideopen="cmtyready3") Chose the tickets to develop Apache Ignite:
                    .cmty-ready__hider(data-hidebox="cmtyready3")
                        p <a href="https://issues.apache.org/jira/projects/IGNITE/issues/IGNITE-15437?filter=allopenissues" target="_blank">Click here</a> to view the tickets for code contribution
                        p <a href="https://issues.apache.org/jira/browse/IGNITE-15644?jql=project%20%3D%20IGNITE%20AND%20component%20%3D%20documentation" target="_blank">Click here</a> to view the tickets for technical documentation
                .cmty-ready__item 
                    i 04
                    p.fz20 To get more details, check out the <a href="https://cwiki.apache.org/confluence/display/IGNITE/How+to+Contribute" target="_blank">Contribution and Development</a> process
            .cmty-ready__bottom.flexi
                h3.cmty-ready__botttl
                    .h5 Top contributors 💪<br>
                    .cmty-ready__botlinks.pt-1.
                        <a href="https://github.com/apache/ignite/graphs/contributors" target="_blank">@Ignite Core and <br>Documentation</a><br>
                        <a href="https://github.com/apache/ignite-extensions/graphs/contributors" target="_blank">@Ignite Extensions</a><br>
                        <a href="https://github.com/apache/ignite-teamcity-bot/graphs/contributors" target="_blank">@Ignite Team City </a><br>
                        <a href="https://github.com/apache/ignite-website" target="_blank">@Ignite Website</a><br>
                .cmty-ready__screens
                    a(href="https://github.com/sboikov" target="_blank") 
                        img(src="/img/community/b11-stat1.jpg", alt="")
                    a(href="https://github.com/agoncharuk" target="_blank") 
                        img(src="/img/community/b11-stat2.jpg", alt="")
                .cmty-ready__more 
                    a(href="https://github.com/apache/ignite/graphs/contributors" target="_blank") Load more
    // /.cmty-ready

    
    section.cmty-red
        .container 
            h3.h4 Contribute By Building The Awareness <br>Of Ignite And Helping Fellow Developers
            .cmty-red__wrap
                article.cmty-redblock.cmty-red__wrap--bg.tplbox
                    img(src="/img/community/b12-code.svg", alt="").tplbox__icon
                    h3.h4.pb-2 Build the project awareness
                    p.fz20 You can contribute by taking part in project awareness activities.
                    ul.dashlist.pt-5
                        li 
                            a(href="https://recognition.gridgain.com/main?product=ignite", target="_blank") Create demos
                        li 
                            a(href="https://recognition.gridgain.com/main?product=ignite", target="_blank") Write a blog post
                        li 
                            a(href="https://recognition.gridgain.com/main?product=ignite", target="_blank") Talk about Ignite at conferences and other events
                article.cmty-redblock.tplbox
                    img.cmty-redblock__questimg(src="/img/community/b12-icon-quest.svg", alt="").tplbox__icon
                    h3.h4.pb-2 Help application developers
                    p.fz20 If you already have some experience with Apache Ignite, for instance, you created your applications, or your services use AI, come and help others.
                    ul.dashlist.pt-5
                        li <a href="mailto:user@ignite.apache.org">Answer on the user list</a>
                        li <a href="https://stackoverflow.com/questions/tagged/ignite" target="_blank">Answer on StackOverflow</a>
    // /.cmty-red



    section.cmty-redstart 
        .container 
            .fz30.pb-1 
                strong Ready to start?
            p.fz20 2 steps to start contributing by building the awareness and helping developers
            .cmty-redstart__wrap.pt-4
                article.cmty-redstep.cmty-redstep--1
                    i 01
                    p <a href="mailto:dev-subscribe@ignite.apache.org">Join dev mailing list</a> and introduce yourself
                article.cmty-redstep.cmty-redstep--2
                    i 02
                    .cmty-redstep__h3 If you want to build project awareness
                    p <a href="https://recognition.gridgain.com/about" target="_blank">Get instructions</a> and start spreading the word about Apache Ignite.
                article.cmty-redstep.cmty-redstep--3
                    i 02
                    .cmty-redstep__h3 If you want to help application developpers
                    p Look for new questions on the <a href="mailto:user-subscribe@ignite.apache.org">user mailing list</a> or <a href="https://stackoverflow.com/questions/tagged/ignite" target="_blank">StackOverflow</a> (#ignite) and help others to use Ignite successfully.
            .cmty-redstart__bottom.flexi
                .cmty-redstart__left
                    .h4.pb-1 
                        strong Project Awareness <br>Top Contributors
                    p.h5.cmty-redstart__grey Previous Quarter 
                    .cmty-redstart__bottitle.h5.pt-4.pb-3
                        p We do recognise and welcome non-code contributions. There are dozens of Apache Ignite community members who contribute this way.
                .cmty-redstart__botright
                    iframe(src="https://recognition-dev.gridgain.com/leaderboard-frame?limit=10&interval=prev-quarter", frameborder="0").cmty-redstart__iframe.themescroll
                    a(href="https://recognition.gridgain.com/main?product=ignite", target="_blank") See all contributors 
    // /.cmty-redstart



    section.cmty-ask.boxpiccenter#faq
        .container
            .cmty-ask__wrap.flexi
                .cmty-ask__main
                    h2.cmty-ask__title.fz50.pb-3 Ask a Question
                    .cmty-ask__text.h5 Feel free to&nbsp;reach to&nbsp;our community if&nbsp;you have any <br>questions, doubts or&nbsp;proposals. There are a&nbsp;few <br>ways to&nbsp;do&nbsp;that.
                img.cmty-ask__bg(src="/img/community/b15-askimg.svg", alt="")
    // /.cmty-ask



    section.faq
        .container
            article.faqblock.flexi
                h3.faqblock__title.h5
                    img(src="/img/community/b16-icon-quest.svg", alt="")
                    span For General Questions
                .faqblock__right
                    p.faqblock__rightitle By e-mail
                    p For general questions about Ignite <a href="mailto:user@ignite.apache.org">user@ignite.apache.org</a>
                    .faqblock__buttons.flexi.pb-5.pt-2
                        a.faqblock__button.flexi(href="mailto:user-subscribe@ignite.apache.org") 
                            img(src="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:user-unsubscribe@ignite.apache.org") 
                            img(src="/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                        a.faqblock__button.flexi(href="https://lists.apache.org/list.html?user@ignite.apache.org" target="_blank") 
                            img(src="/img/icon-folder.svg", alt="")
                            span Archives
                    p.faqblock__rightitle On StackOverflow
                    p Many Ignite community members watch <a href="http://stackoverflow.com/questions/tagged/ignite" target="_blank">Stack Overflow</a> for the tag "ignite" or "apacheignite", so you can post your questions there as well.
                    .faqblock__buttons.flexi.pt-2
                        a.faqblock__button.flexi(href="http://stackoverflow.com/questions/tagged/ignite" target="_blank") 
                            img(src="/img/icon-stackoverflow.svg", alt="").faqblock__stackicon
                            span Ask question on StackOverflow
            // /.faqblock
            article.faqblock.flexi
                h3.faqblock__title.h5
                    img(src="/img/community/b16-icon-comments.svg", alt="")
                    span For Contribution Related <br>Questions And Discussions
                .faqblock__right
                    p.faqblock__rightitle By e-mail
                    p For contribution-related discussions <a href="mailto:dev@ignite.apache.org">dev@ignite.apache.org</a>
                    .faqblock__buttons.flexi.pb-4.pt-2
                        a.faqblock__button.flexi(href="mailto:dev-subscribe@ignite.apache.org") 
                            img(src="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:dev-unsubscribe@ignite.apache.org") 
                            img(src="/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                        a.faqblock__button.flexi(href="https://lists.apache.org/list.html?user@ignite.apache.org" target="_blank") 
                            img(src="/img/icon-folder.svg", alt="")
                            span Archives
                    p.faqblock__rightitle On StackOverflow
                    p Many Ignite community contributors monitor <a href="http://stackoverflow.com/questions/tagged/ignite" target="_blank">Stack Overflow</a> for the tag "ignite" or "apacheignite" to support Ignite developers, so you can post your questions there as well.
                    .faqblock__buttons.flexi.pt-2
                        a.faqblock__button.flexi(href="http://stackoverflow.com/questions/tagged/ignite") 
                            img(src="/img/icon-stackoverflow.svg", alt="").faqblock__stackicon
                            span Ask question on StackOverflow
            // /.faqblock
            article.faqblock.flexi
                h3.faqblock__title.h5
                    img(src="/img/community/b16-icon-reports.svg", alt="")
                    span Report An Issue 
                .faqblock__right
                    p.faqblock__rightitle On Jira
                    p Visit <a href="https://issues.apache.org/jira/browse/IGNITE" target="_blank">Ignite Jira</a> if you would like to file a new issue or view existing issues.
                    .faqblock__buttons.flexi.pt-2
                        a.faqblock__button.flexi(href="http://stackoverflow.com/questions/tagged/ignite" target="_blank") 
                            img(src="/img/icon-stackoverflow.svg", alt="").faqblock__stackicon
                            span Ask question on StackOverflow
            // /.faqblock





                