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.
                    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="/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 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="/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 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="/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="/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="/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 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="/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 <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="/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 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="/img/community/b7-chair-star.svg", alt="")
                            span 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
                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="/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 <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="/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 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="/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 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="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:issues-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?issues@ignite.apache.org" target="_blank") 
                            img(src="/img/icon-folder.svg", alt="")
                            span Archives
                    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





                