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#story
        .container
            .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 GridGain donates the core of its in-memory computing platform to the Apache Software Foundation under the name of "Apache Ignite"🚀. The <a href="https://incubator.apache.org/projects/ignite.html" target="_blank">project enters the Apache Incubator</a>. 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
                include ./_components/committers.pug
                - 
                    const arrayCommitters = JSON.parse(committers);
                    const pmc = arrayCommitters.filter((el) => {
                        return el.PMC;
                    });
                
                each val, index in arrayCommitters
                    if index > 13
                        - break;
                    +committerNew(val)

            .committers__more.jsOpener(data-hidebox="committersMore")
                each val, index in arrayCommitters
                    if index <= 13
                        - continue;
                    +committerNew(val)
            a.committers__morelink(href="#", data-hideopen="committersMore")
                i Load more
                span Hide
    // /.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
                    div.fz20
                        | Join 
                        span.cmty-pushupwrap(data-poplink="cont-link1")
                            span 
                                em dev mailing list
                            .pushup(data-pop="cont-link1")
                                p By sending a 
                                    a(href="mailto:dev-subscribe@ignite.apache.org?subject=Subscribe&body=Hello") default e-mail
                                p By sending Hello to this e-mail <b>dev-subscribe@ignite.apache.org</b>
                        | 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
                    div 
                        span.cmty-pushupwrap(data-poplink="cont-link2")
                            span 
                                em Join dev mailing list
                            .pushup(data-pop="cont-link2")
                                p By sending a 
                                    a(href="mailto:dev-subscribe@ignite.apache.org?subject=Subscribe&body=Hello") default e-mail
                                p By sending Hello to this e-mail <b>dev-subscribe@ignite.apache.org</b>
                        | 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
                    div 
                        | Look for new questions on the 
                        span.cmty-pushupwrap(data-poplink="cont-link3")
                            span 
                                em user mailing list
                            .pushup(data-pop="cont-link3")
                                p By sending a 
                                    a(href="mailto:user-subscribe@ignite.apache.org") default e-mail
                                p By sending Hello to this e-mail <b>user-subscribe@ignite.apache.org</b> 
                        | 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
                        .faqblock__button.flexi(data-poplink="gen-sub")
                            img(src="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                            .pushup(data-pop="gen-sub")
                                p By sending a 
                                    a(href="mailto:user-subscribe@ignite.apache.org") default e-mail
                                p By sending Hello to this e-mail <b>user-subscribe@ignite.apache.org</b> 
                        .faqblock__button.flexi(data-poplink="gen-unsub")
                            img(src="/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                            .pushup(data-pop="gen-unsub")
                                p By sending a 
                                    a(href="mailto:user-unsubscribe@ignite.apache.org?subject=Unsubscribe&body=Stop") default e-mail
                                p By sending Stop to this e-mail <b>user-unsubscribe@ignite.apache.org</b>
                        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
                        .faqblock__button.flexi(data-poplink="cont-sub")
                            img(src="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                            .pushup(data-pop="cont-sub")
                                p By sending a 
                                    a(href="mailto:dev-subscribe@ignite.apache.org?subject=Subscribe&body=Hello") default e-mail
                                p By sending Hello to this e-mail <b>dev-subscribe@ignite.apache.org</b> 
                        .faqblock__button.flexi(data-poplink="cont-unsub")
                            img(src="/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                            .pushup(data-pop="cont-unsub")
                                p By sending a 
                                    a(href="mailto:dev-unsubscribe@ignite.apache.org?subject=Unsubscribe&body=Stop") default e-mail
                                p By sending Stop to this e-mail <b>dev-unsubscribe@ignite.apache.org</b>
                        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





                