extend _components/base.pug

block pagetitle
    | Community 


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.
                    The 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.
            img.cmtyhero__img(src="/public/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="/public/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 At&nbsp;that time, Ignite is&nbsp;used as&nbsp;a&nbsp;distributed in-memory data fabric for computing and transacting on&nbsp;large-scale data sets in&nbsp;real-time, orders of&nbsp;magnitude faster than possible with traditional disk-based solutions.
                            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="/public/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="/public/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="/public/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 First, with the donation of&nbsp;the Ignite native persistence 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, that&rsquo;s 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. This trend continues in&nbsp;the years to&nbsp;come.
            // /.cmtyhistory3

            .cmtyhistory2.cmtyhistory4
                .cmtyhistory2__wrap.flexi
                    .cmtyhistory2__right
                        .cmtyhistory__year.cmtyhistory__year--right 2020
                        img(src="/public/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 Until now
                        img(src="/public/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 together 3.0 version is under way.
                    .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="/public/img/community/b4-img.svg", alt="")
    // /.cmty-meet



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





    section.cmty-committers 
        .container
            h2.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 <a href="https://ignite.apache.org/community/resources.html#people" target="_blank">Here is</a> 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="/public/img/icon-github.svg", alt="")
                            if obj["Apache profile"]
                                a.committer__apache(href=obj["Apache profile"])
                                    img(src="/public/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 
            h2.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 do other vital decisions.
            p.cmty-committers__small.pt-2 <a href="#">Here is</a> the list of PMC members for the project.
            


            mixin projectManagers(obj)
                article.cmty-pmitem
                    if obj["PMC"] == "PMC Chair"
                        .cmty-pmitem__proff
                            img(src="/public/img/community/b7-chair-star.svg", alt="")
                            span Chair
                    h3.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="/public/img/icon-github.svg", alt="")
                        if obj["Apache profile"]
                            a.cmty-pmitem__apache(href=obj["Apache profile"], target="_blank")
                                img(src="/public/img/icon-pero.svg", alt="")
            //- include _components/cmty-phs.pug

            .cmty-pm__wrap.pt-5
                each val, index in pmc
                    if index > 3
                        - 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 of how 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="/public/img/community/b8-img.svg", alt="")
    // /.cmty-startcont



    section.cmty-docs 
        .container 
            h2.h4 Code and technical documentation contributions
            .cmty-docs__wrap.flexi.pt-5
                .cmty-docblock 
                    .cmty-docblock__icon
                        img(src="/public/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="/public/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
            h2.h4.pb-1 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 <a href="https://issues.apache.org/jira/" target="_blank">ASF JIRA <br>account</a>, if&nbsp;you haven&rsquo;t got it&nbsp;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="/public/img/community/b11-stat1.jpg", alt="")
                    a(href="https://github.com/agoncharuk" target="_blank") 
                        img(src="/public/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 
            h2.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="/public/img/community/b12-code.svg", alt="").tplbox__icon
                    h3.h4.pb-2 Build the Project Awareness
                    p.fz20 You can contribute by doing any 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="/public/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 
            h2.fz30.pb-1 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
                    h3.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
                    h3.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
                    h3.h4.pb-1 Project Awareness <br>Top Contributors
                    p.h5.cmty-redstart__grey Previous Quarter 
                    h3.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="/public/img/community/b15-askimg.svg", alt="")
    // /.cmty-ask



    section.faq
        .container
            article.faqblock.flexi
                h3.faqblock__title.h5
                    img(src="/public/img/community/b16-icon-quest.svg", alt="")
                    span For General Questions
                .faqblock__right
                    h4 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="/public/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:user-unsubscribe@ignite.apache.org") 
                            img(src="/public/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="/public/img/icon-folder.svg", alt="")
                            span Archives
                    h4 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="/public/img/icon-stackoverflow.svg", alt="").faqblock__stackicon
                            span Ask question on StackOverflow
            // /.faqblock
            article.faqblock.flexi
                h3.faqblock__title.h5
                    img(src="/public/img/community/b16-icon-comments.svg", alt="")
                    span For Contribution Related <br>Questions and Discussions
                .faqblock__right
                    h4 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="/public/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:dev-unsubscribe@ignite.apache.org") 
                            img(src="/public/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="/public/img/icon-folder.svg", alt="")
                            span Archives
                    h4 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="/public/img/icon-stackoverflow.svg", alt="").faqblock__stackicon
                            span Ask question on StackOverflow
            // /.faqblock
            article.faqblock.flexi
                h3.faqblock__title.h5
                    img(src="/public/img/community/b16-icon-reports.svg", alt="")
                    span Report an Issue 
                .faqblock__right
                    h4 By e-mail
                    p For contribution-related discussions <a href="https://lists.apache.org/list.html?issues@ignite.apache.org">issues@ignite.apache.org</a>
                    .faqblock__buttons.flexi.pb-5.pt-2
                        a.faqblock__button.flexi(href="mailto:notifications-subscribe@ignite.apache.org") 
                            img(src="/public/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:issues-unsubscribe@ignite.apache.org") 
                            img(src="/public/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                        a.faqblock__button.flexi(href="https://lists.apache.org/list.html?issues@ignite.apache.org" target="_blank") 
                            img(src="/public/img/icon-folder.svg", alt="")
                            span Archives
                    h4 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="/public/img/icon-stackoverflow.svg", alt="").faqblock__stackicon
                            span Ask question on StackOverflow
            // /.faqblock





                