extend _components/base.pug

block pagetitle
    title Apache Ignite Events - Meetups, Summit, Conference
    meta(name="description", content="Join our upcoming events: in-memory computing meetups, Apache Ignite summits or conferences. Find an Apache Ignite meetup/group near you.")
    link(rel="canonical", href="https://ignite.apache.org/events.html")

    meta(property="og:title", content="Apache Ignite Events - Meetups, Summit, Conference")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/events.html")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Join our upcoming events: in-memory computing meetups, Apache Ignite summits or conferences. Find an Apache Ignite meetup/group near you.")

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

block main
    - global.pageHref = "events.html"
    include ./_components/header.pug



    section.eventhero
        .container
            .eventhero__main
                h1.h2.
                    Join The Apache Ignite <br>
                    Community At&nbsp;Conferences, <br>
                    Summits And Other Events
                .h5.pt-3.
                    The community meets online and offline regularly. <br>
                    Join our meetup groups and events to learn from <br>Ignite experts or to share your Ignite experience.
            img.eventhero__img(src="/img/events/b1-mainpic.svg", alt="Join the Apache Ignite Community at Conferences, Summits and Other Events")
    // /.eventhero


    section.cmtynavblock 
        .container
            ul.cmtynavblock__list.flexi 
                li
                    a.cmtynavblock__active(href="#summit")  Ignite Summit
                li
                    a(href="#meetups") Meetups Worldwide
                li
                    a(href="#upcoming") Upcoming Events
                li
                    a(href="#past") Past Events
    // /.cmtynavblock



    section.event-featured.container 
        p.capstext Featured Event
        a(href="https://ignite-summit.org/2024/", target="_blank").event-featured__banner.pt-5
            picture
                source(srcset="/images/promos/ignite-Summit-call-for-speakers.jpg" media="(max-width: 767px)")
                img(src="/images/promos/ignite-Summit-call-for-speakers.jpg", alt="Ignite Summit call for speakers")
            //- .event-featured__placeholder(style="background:#E8F2FA; height:340px;")
    // /.event-featured



    section.evsummit.container#summit
        .evsummit__date.flexi 
            .evsummit__day 6
            .evsummit__month.h5 JUNE <br>2023
        .evsummit__info.flexi.pt-5
            .evsummit__logo 
                img(src="/img/events/ignite-summit-logo.svg", alt="")
            .evsummit__descr
                h2.h3 Apache Ignite Summit
                p.h5.pt-2.
                    This virtual conference will feature speakers from industry-leading companies <br>
                    and hundreds of participants from all over the world. 
        //.evsummit__blocks.pt-5.flexi 
            a(href="https://hopin.com/events/ignite-summit-cloud-edition", target="_blank").evsummblock.evsummblock--speaker
                p.h4.evsummblock__title Become a speaker
                p.fz20.pt-1x.evsummblock__descr Submit a talk by October 15
                p.evsummblock__listtitle.pt-4
                    strong We are looking for:
                ul.evsummblock__list.dashlist.pt-1
                    li Ignite cloud-related deployment stories
                    li technical deep dives
                    li integration experiences
            .evsummblock.evsummblock--join
                p.h4.evsummblock__title Join Summit online
                p.fz20.pt-1x.evsummblock__descr.
                    Become a&nbsp;part of&nbsp;a&nbsp;true community event 
                    and learn more about up-to-date<br>
                    in-memory computing solutions.
        .evsummit__twobanners.pt-5
            a(href="https://ignite-summit.org/2024/", target="_blank").evsummit__twobannerslink
                img(src="/img/events/banner-bott-6.jpg", alt="")
            a(href="https://ignite-summit.org/2023-june/", target="_blank").evsummit__twobannerslink
                img(src="/img/events/banner-bott-5.jpg", alt="")
            a(href="https://ignite-summit.org/2022-november/", target="_blank").evsummit__twobannerslink
                img(src="/img/events/banner-bott-4.jpg", alt="")
            a(href="https://ignite-summit.org/2022-june/", target="_blank").evsummit__twobannerslink
                img(src="/img/events/banner-bott-3.jpg", alt="")
            a(href="https://www.youtube.com/playlist?list=PLMc7NR20hA-JvgLWtvp2R9tEnD5vlp9l0", target="_blank").evsummit__twobannerslink
                img(src="/img/events/banner-bott-1.jpg", alt="")
            a(href="https://www.youtube.com/playlist?list=PLMc7NR20hA-KF8c_hVICKpzKnWkjzfC2V", target="_blank").evsummit__twobannerslink
                img(src="/img/events/banner-bott-2.jpg", alt="") 
    // /.evsummit
        

    section.event-planet#meetups
        .container
            .event-planet__wrap.flexi 
                .event-planet__main 
                    h2.h3.pb-1 Apache Ignite Meetups Worldwide
                    p.h5.pt-5 Meet the community&nbsp;&mdash; developers, experts, and practitioners&nbsp;&mdash; face-to-face, virtually, or&nbsp;onsite in&nbsp;your city.
                .event-planet__pic 
                    img(src="/img/events/b4-world.svg", alt="")
    // /.event-planet
        


    section.event-virtual.container#virtual
        .eventvirt.flexi 
            .eventvirt__left 
                h3.h4 Virtual Apache Ignite Meetup
                p.pt-2 Join Ignite users, developers, committers, contributors, and architects from all over the world and&nbsp;get access to&nbsp;the online talks and presentations by&nbsp;Apache Ignite experts and practitioners.
            .eventvirt__right 
                a.button(href="https://www.meetup.com/Apache-Ignite-Virtual-Meetup/", target="_blank") Join Virtual Meetup

        .event-virtbot
            .event-virtbot__col
                h4.h4 Recordings Of Past Meetups
                p.pt-2 Find a collection of past Virtual Apache Ignite Meetup <br>presentations, talks, and webinars.
            .event-virtbot__col.event-virtbot__col--long
                h4.h4 Upcoming Virtual Meetup
                .event-dynamicsect
                    h3.fz20 Join our group and don’t <br>miss an&nbsp;upcoming virtual event
            .event-virtbot__col
                .event-recording.pb-2
                    a(href="https://www.youtube.com/watch?v=f2ArcJPH4iU&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=1", target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/f2ArcJPH4iU/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=lCiZ3x8IRvI&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=2" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/lCiZ3x8IRvI/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=7UjENQBFvIQ&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=3" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/7UjENQBFvIQ/maxresdefault.jpg", alt="")
                a.event-recbutton.button.button--shadow(href="https://www.youtube.com/playlist?list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ", target="_blank")
                    <i><svg width="9" height="10" viewBox="0 0 9 10" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <path d="M8.71423 4.99993L0.142805 9.94865L0.142805 0.0512134L8.71423 4.99993Z"/>
                    </svg></i>
                    span Watch Virtual Meetup videos
            .event-virtbot__col
                img.event-dynamicsect__pic(src="/img/events/logo-meetup.svg", alt="") 
                a.button.button--shadow.event-recmorebutton(href="https://www.meetup.com/Apache-Ignite-Virtual-Meetup", target="_blank") Learn more
    // /.event-virtual



    section.eventyoucity.container 
        h2.h4 Apache Ignite Meetups In Your City
        .eventyoucity__wrap.pt-5
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/img/events/flag-uk.svg", alt="")
                .eventyoucity__town.h5
                    strong London
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/Apache-Ignite-London/" target="_blank")
                        img(src="/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong St.Petersburg
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/St-Petersburg-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong Moscow
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/Moscow-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/img/events/icon-plus.svg", alt="")
                        span Join
            article.eventyoucity__last
                p.fz20.pb-3 Start an onsite Apache Ignite Meetup in your city.
                small Take the first step.
                small Send us a note to <br><a href="mailto:dev@ignite.apache.org">dev@ignite.apache.org</a> <br>and we'll see what can be done.
    // /.eventyoucity


    
    section.eventupcoming.container#upcoming 
        .capstext.pb-1 Upcoming Events Schedule
        //.eventupcoming__wrap.py-4
            h2.h4.eventupcoming__head.pb-5 Online events (1)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 16
                    p.eventcomingitem__month JUNE
                    p.eventcomingitem__year.pt-3 2022
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 How to write a high-performance database driver
                    p.eventcomingitem__descr.pt-1 Databases are at the heart of most services and applications. How do we communicate with our database? How does the driver (client) work, how to design and implement it? This report covers all the steps - working with TCP sockets, message format, serialization, fault tolerance, resource allocation, and much more.
                    a.eventcomingitem__more(href="https://dotnext.ru/", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker.
                            Pavel Tupitsyn
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/dotnext.svg", alt="")
                        .eventcomingitem__camera Online, Russia
            // /.eventcomingitem

        .eventupcoming__wrap.py-4
            h2.h4.pb-4 Offline events (3)

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 8
                    p.eventcomingitem__month OCTOBER
                    p.eventcomingitem__year.pt-3 2023
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Scalable Distributed Computing with Groovy Using Apache Ignite
                    a.eventcomingitem__more(href="https://communityovercode.org/schedule-list/#GR008", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Jeremy Meyer
                    .eventcomingitem__loc
                        .eventcomingitem__loctitle Community Over Code
                        .eventcomingitem__address Halifax, Canada

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 8
                    p.eventcomingitem__month OCTOBER
                    p.eventcomingitem__year.pt-3 2023
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Whiskey Clustering with Apache Groovy and Apache Ignite
                    a.eventcomingitem__more(href="https://communityovercode.org/schedule-list/#GR007", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Paul King
                    .eventcomingitem__loc
                        .eventcomingitem__loctitle Community Over Code
                        .eventcomingitem__address Halifax, Canada

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 9
                    p.eventcomingitem__month OCTOBER
                    p.eventcomingitem__year.pt-3 2023
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Enhancing Apache Ignite 3.0 with the Power of Open-Source
                    a.eventcomingitem__more(href="https://communityovercode.org/schedule-list/#BDC006", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Stanislav Lukyanov
                    .eventcomingitem__loc
                        .eventcomingitem__loctitle Community Over Code
                        .eventcomingitem__address Halifax, Canada
            // /.eventcomingitem

    // /.eventupcoming




    section.eventspast#past.container.jsTabWrap
        h3.capstext.pb-5 Past Events
        .eventspast__tablinks.flexi
            button.eventpast__link(data-tablink="e2022").active 2022
            button.eventpast__link(data-tablink="e2021") 2021
            button.eventpast__link(data-tablink="e2020") 2020
            button.eventpast__link(data-tablink="e2019") 2019
            button.eventpast__link(data-tablink="e2018") 2018
            button.eventpast__link(data-tablink="e2017") 2017
            button.eventpast__link(data-tablink="e2016") 2016
            button.eventpast__link(data-tablink="e2015") 2015
            button.eventpast__link(data-tablink="e2014") 2014
        .eventspast__tabs
            .eventspast__tabwrap(data-tab="e2022").active
                include ./_components/events/2022.pug
            // /.eventspast__tabwrap 2022

            .eventspast__tabwrap(data-tab="e2021")
                include ./_components/events/2021.pug
            // /.eventspast__tabwrap 2021
            
            .eventspast__tabwrap(data-tab="e2020")
                include ./_components/events/2020.pug
            // /.eventspast__tabwrap 2020

            .eventspast__tabwrap(data-tab="e2019")
                include ./_components/events/2019.pug
            // /.eventspast__tabwrap 2019

            .eventspast__tabwrap(data-tab="e2018")
                include ./_components/events/2018.pug
            // /.eventspast__tabwrap 2018

            .eventspast__tabwrap(data-tab="e2017")
                include ./_components/events/2017.pug
            // /.eventspast__tabwrap 2017

            .eventspast__tabwrap(data-tab="e2016")
                include ./_components/events/2016.pug
            // /.eventspast__tabwrap 2016

            .eventspast__tabwrap(data-tab="e2015")
                include ./_components/events/2015.pug
            // /.eventspast__tabwrap 2015

            .eventspast__tabwrap(data-tab="e2014")
                include ./_components/events/2014.pug
            // /.eventspast__tabwrap 2014
    // /.eventspast
        



    