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/schedule/", target="_blank").event-featured__banner.pt-5
            picture
                source(srcset="/img/events/event-banner-vert.jpg" media="(max-width: 767px)")
                img(src="/img/events/event-banner.jpg", alt="")
            //- .event-featured__placeholder(style="background:#E8F2FA; height:340px;")
    // /.event-featured



    section.evsummit.container#summit
        .evsummit__date.flexi 
            .evsummit__day 16
            .evsummit__month.h5 NOVEMBER <br>2021
        .evsummit__info.flexi.pt-5
            .evsummit__logo 
                img(src="/img/events/b2-summit.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
        

    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/ru-RU/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/ru-RU/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/ru-RU/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/ru-RU/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/ru-RU/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.pt-4
            h2.h4.eventupcoming__head.pb-5 Online events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 9
                    p.eventcomingitem__month November 
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Apache Ignite 2.11: Improvements and .NET Upgrades, Apache Ignite 3 Alpha 3: The Journey Continues
                    p.eventcomingitem__descr.pt-1 A quick overview of Apache Ignite 2.11. This release resolved a number of issues, problems with the internal architecture and technical bugs. Plus we will discuss Apache Ignite 2.11 updates related to .NET. Just now, the Apache Ignite community released the latest version of Ignite 3—Alpha 3! Val Kulichenko, the Ignite 3.0 Release manager, will demonstrate the updates and the latest API changes.
                    a.eventcomingitem__more(href="https://www.meetup.com/Apache-Ignite-Virtual-Meetup/events/281596817", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker.
                            Maxim Muzafarov<br>
                            Pavel Tupitsyn<br>
                            Val Kulichenko
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/meetup.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 15-16
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 On November 15 and 16, 2021a free virtual event—Ignite Summit: Cloud Edition will be held. The conference is for architects and developers who use or are interested in using Apache Ignite in the cloud. On November 15, 2021, free training sessions for EMEA and the Americas will be offered. On November 16, 2021, Ignite experts will share architectural insights and practical tips for solving challenges in cloud environments.
                    a.eventcomingitem__more(href="https://ignite-summit.org/", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Cloud Edition
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/summit.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

        .eventupcoming__wrap.pt-4
            h2.h4.py-4 Offline events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 13
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Backward compatibility on the example of Apache Ignite. Why does it hurt so much?
                    p.eventcomingitem__descr.pt-1 I am developing an Apache Ignite distributed database. Our product provides backward compatibility between versions. What do you need to think about for backward compatibility? What is Backward Compatibility for Developers? How do I test it? Why does it hurt so much? How to relieve pain? I will tell you about all this with the code examples.
                    a.eventcomingitem__more(href="https://mergeconf.ru/development/opensource/izhikov", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker  Nikolay Izhikov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/merge.svg", alt="")
                        .eventcomingitem__address Innopolis, Russia
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 18
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 The report will present the concept of historical rebalancing, implemented in the Apache Ignite distributed database.
                    a.eventcomingitem__more(href="https://www.highload.ru/moscow/2021/abstracts/7989", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Vlad Pyatkov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/img/events/content/hl++.svg", alt="")
                        .eventcomingitem__address Moscow, Russia
            // /.eventcomingitem
    // /.eventupcoming




    section.eventspast#past.container.jsTabWrap
        h3.capstext.pb-5 Past Events
        .eventspast__tablinks.flexi 
            button.eventpast__link(data-tablink="e2021").active 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="e2021").active
                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
        



    