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")
                            blockquote.cmtyhistory__quote.
                                It was a time of intense learning. Whilst in the incubator, people learnt how to build <br>a vibrant community, how to create releases, and  how to do things that other open source projects 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 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 a "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 boasts hundreds of thousands of downloads a 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 Contributors
                    .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 – you may have created your applications, or your services may 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 developers
                    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 recognize 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 out to&nbsp;our community if&nbsp;you have <br>any questions, doubts or&nbsp;proposals. There are a&nbsp;few <br>ways to&nbsp;do&nbsp;this.
                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





                