extend _components/base.pug

block pagetitle
    title Distributed Database - Apache Ignite&reg;
    meta(name="description", content="Apache Ignite is a best distributed database management system for high-performance computing with in-memory speed. Learn how to use the Ignite decentralized database system and get started.")
    link(rel="canonical", href="https://ignite.apache.org/")

    meta(property="og:title", content="Distributed Database - Apache Ignite&reg;")
    meta(property="og:type", content="article")
    meta(property="og:url", content="https://ignite.apache.org/")
    meta(property="og:image", content="/img/og-pic.png")
    meta(property="og:description", content="Apache Ignite is a best distributed database management system for high-performance computing with in-memory speed. Learn how to use the Ignite decentralized database system and get started.")

block css
    link(rel="stylesheet", href="../js/vendor/highlight/default.min.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/highlight/night-owl.css?ver=" + config.version)
    link(rel="stylesheet", href="../js/vendor/swiper/swiper-bundle.min.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/native-persistence.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/events.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/tooling.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/frontpage.css?ver=" + config.version)
    script(src="../js/vendor/highlight/highlight.min.js")
    script(src="../js/vendor/swiper/swiper-bundle.min.js")


block main
    - global.pageHref = ""
    - config.hdrClassName = "hdr__dark"

    .fronttop 
        include ./_components/header.pug

        section.innerhero.fronthero
            .container.innerhero__cont
                .innerhero__main.innerhero__main--long
                    //- .innerhero__pre.pb-3 Scale Across Memory And Disk With No Compromises
                    h1.h1.innerhero__h1.innerhero__mega Distributed Database <br>For High-Performance Computing
                    .innerhero__h2.h4.pt-2 Scale Across Memory And Disk With No Compromises
                    .innerhero__action.pt-5
                        a.button.fronthero__button(href="https://ignite.apache.org/docs/latest/index") Start Coding
        // /.innerhero



    section.frontblue
        aside.fronttopcards.flexi.container 
            a(href="https://blogs.apache.org/ignite/entry/apache-ignite-momentum-highlights-from", target="_blank").frontcard
                .frontcard__title.h5 A top-5 project of the Apache Software <br>Foundation
                .frontcard__prises.pt-3.flexi 
                    .frontcard__price.flexi
                        .frontcard__iconwrap
                            img(src="/img/frontpage/b1-prize1.svg", alt="")
                        span Big Data <br>Users Lists
                    .frontcard__price.flexi 
                        .frontcard__iconwrap.frontcard__iconwrap--blue
                            img(src="/img/frontpage/b1-prize1.svg", alt="")
                        span Users Lists
                    .frontcard__price.flexi 
                        .frontcard__iconwrap.frontcard__iconwrap--grey
                            img(src="/img/frontpage/b1-prize1.svg", alt="")
                        span Dev Lists
            // /.frontcard

            a(href="/use-cases/provenusecases.html").frontcard
                .frontcard__network
                    img(src="/img/frontpage/b1-planet.svg", alt="")
                .frontcard__title.h5.pt-3 Leading companies around the world select Ignite to&nbsp;power applications used daily by millions of&nbsp;people
            // /.frontcard
        // /.fronttopcards



        .container.forntcodes 
            h2.h3 Use Ignite Core Capabilities To Start Easily <br>And Scale Faster
            .forntcodes__wrap.flexi.jsTabWrap.pt-4
                .forntcodes__menu
                    ul.fz20
                        li
                            a(href="#", data-ftablink="frontcode-1").active Multi-Tier Storage
                        li
                            a(href="#", data-ftablink="frontcode-2") Distributed SQL
                        li
                            a(href="#", data-ftablink="frontcode-3") ACID Transactions
                        li
                            a(href="#", data-ftablink="frontcode-4") Compute APIs
                        li
                            a(href="#", data-ftablink="frontcode-5") Machine Learning
                        li
                            a(href="#", data-ftablink="frontcode-6") Continuous Queries
                    a.forntcodes__menumore.fz20(href="/features/") View all features
                
                .forntcodes__tabwraps 
                    .forntcodes__tab(data-ftab="frontcode-1").active
                        p.forntcodes__tabtitle.fz20.pb-1 Multi-Tier Storage
                        p Ignite scales up and out across memory and disk. By default, Ignite operates in a pure in-memory mode. But, by toggling a single configuration setting, you can turn a cluster into a database that can grow beyond the cluster's memory capacity:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="nativeTabXML").nativecode__link.active XML
                                a(href="#", data-tablink="nativeTabJava").nativecode__link Java
                                a(href="#", data-tablink="nativeTabNET").nativecode__link C#/.NET
                            -
                                let xmlMultiTierStorge = `<bean class="org.apache.ignite.configuration.IgniteConfiguration">
                                    <property name="dataStorageConfiguration">
                                        <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
                                            <property name="defaultDataRegionConfiguration">
                                                <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
                                                    <property name="persistenceEnabled" value="true"/>
                                                </bean>
                                            </property>
                                        </bean>
                                    </property>
                                </bean>`;

                                let javaMultiTierStorge = `IgniteConfiguration cfg = new IgniteConfiguration();

                                DataStorageConfiguration storageCfg = new DataStorageConfiguration();

                                // Enable Ignite Persistence
                                storageCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(true);

                                // Using the new storage configuration
                                cfg.setDataStorageConfiguration(storageCfg);
                                `;

                                let csharpMultiTierStorge = `var cfg = new IgniteConfiguration
                                {
                                    DataStorageConfiguration = new DataStorageConfiguration
                                    {
                                        DefaultDataRegionConfiguration = new DataRegionConfiguration
                                        {
                                            Name = "Default_Region",
                                            PersistenceEnabled = true
                                        }
                                    }
                                };
                                `;
                            .nativecode__tabs
                                .nativecode__tab(data-tab="nativeTabXML").active
                                    pre.nativecode__codebox 
                                        code.xml #{xmlMultiTierStorge}
                                .nativecode__tab(data-tab="nativeTabJava")
                                    pre.nativecode__codebox 
                                        code.java #{javaMultiTierStorge}
                                            
                                .nativecode__tab(data-tab="nativeTabNET")
                                    pre.nativecode__codebox 
                                        code.csharp #{csharpMultiTierStorge}
                            .forntcodes__bottom
                                a.button(href="https://ignite.apache.org/docs/latest/memory-architecture") Learn More About Multi-Tier Storage
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab1 (END Multi-Tier Storage)




                    .forntcodes__tab(data-ftab="frontcode-2")
                        p.forntcodes__tabtitle.fz20.pb-1 Distributed SQL
                        p Use Ignite as a traditional SQL database by leveraging JDBC drivers, ODBC drivers, or the native SQL APIs that are available for Java, C#, C++, Python, and other programming languages. Seamlessly join, group, aggregate, and order your distributed in-memory and on-disk data:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="sqlTabSQL").nativecode__link.active SQL
                            -
                                let sqlCode = `SELECT country.name, city.name, MAX(city.population) as max_pop
                                FROM country JOIN city ON city.countrycode = country.code
                                WHERE country.code IN ('USA','BRA','ESP','JPN')
                                GROUP BY country.name, city.name
                                ORDER BY max_pop DESC LIMIT 3;`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="sqlTabSQL").active
                                    pre.nativecode__codebox 
                                        code.sql #{sqlCode}
                            .forntcodes__bottom
                                a.button(href="https://ignite.apache.org/docs/latest/SQL/sql-introduction") Learn More About Distributed SQL
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab2 (END Distributed SQL)



                    .forntcodes__tab(data-ftab="frontcode-3")
                        p.forntcodes__tabtitle.fz20.pb-1 ACID Transactions
                        p Ignite can operate in a strongly consistent mode that provides full support for distributed ACID transactions. Transact across multiple cluster nodes, caches, tables, and partitions:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="acidTabJava").nativecode__link.active Java
                                a(href="#", data-tablink="acidTabSharp").nativecode__link C#/.NET
                            -
                                let acidJava = `IgniteTransactions transactions = ignite.transactions();

                                try (Transaction tx = transactions.txStart()) {
                                    Integer hello = cache.get("Hello");

                                    if (hello == 1)
                                        cache.put("Hello", 11);

                                    cache.put("World", 22);

                                    tx.commit();
                                }`;

                                let acidSharp = `var transactions = ignite.GetTransactions();

                                using (var tx = transactions.TxStart()) {
                                    int hello = cache.Get("Hello");

                                    if (hello == 1) {
                                        cache.Put("Hello", 11);
                                    }

                                    cache.Put("World", 22);

                                    tx.Commit();
                                }`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="acidTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{acidJava}
                                .nativecode__tab(data-tab="acidTabSharp")
                                    pre.nativecode__codebox 
                                        code.csharp #{acidSharp}
                            .forntcodes__bottom
                                a.button(href="https://ignite.apache.org/features/acid-transactions.html") Learn More About Transactions
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab3 (END ACID Transactions)





                    .forntcodes__tab(data-ftab="frontcode-4")
                        p.forntcodes__tabtitle.fz20.pb-1 Compute APIs In Java, Scala, Kotlin, C#, C++
                        p With traditional databases, for in-place calculations, you use stored procedures that are written in a language such as PL/SQL. With Ignite, you use modern JVM languages, C# or C++ to develop and execute custom tasks across your distributed database:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="compTabJava").nativecode__link.active Java
                                a(href="#", data-tablink="compTabSharp").nativecode__link C#/.NET
                            -
                                let compJava = `// Broadcast the task to server nodes only.
                                IgniteCompute compute = ignite.compute(ignite.cluster().forServers());

                                // Each remote server node will execute the logic of the task/lambda below.
                                compute.broadcast(() -> System.out.println(
                                    "Hello Node: " + ignite.cluster().localNode().id()));`;

                                let compSharp = `// Broadcast the task to server nodes only.
                                var compute = ignite.GetCluster().ForServers().GetCompute();

                                // Each remote server node will execute the custom PrintNodeIdAction task.
                                compute.Broadcast(new PrintNodeIdAction());`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="compTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{compJava}
                                .nativecode__tab(data-tab="compTabSharp")
                                    pre.nativecode__codebox 
                                        code.csharp #{compSharp}
                            .forntcodes__bottom
                                a.button(href="https://ignite.apache.org/docs/latest/distributed-computing/distributed-computing") Learn More About Compute APIs
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab4 (END Compute APIs)





                    .forntcodes__tab(data-ftab="frontcode-5")
                        p.forntcodes__tabtitle.fz20.pb-1 Built-In Machine Learning
                        p Ignite machine learning uses built-in algorithms and tools, as well as TensorFlow integration, to enable the building of scalable machine learning models and avoid costly data transfers. Train, deploy, evaluate, and update your ML and DL models continuously and at scale:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="machineTabJava").nativecode__link.active Java
                            -
                                let machineJava = `// Create the trainer
                                KNNClassificationTrainer trainer = new KNNClassificationTrainer()
                                .withK(3).withIdxType(SpatialIndexType.BALL_TREE)
                                .withDistanceMeasure(new EuclideanDistance())
                                .withWeighted(true);

                                // Train the model
                                KNNClassificationModel knnMdl = trainer.fit(ignite, dataCache, vectorizer);

                                // Make a prediction
                                double prediction = knnMdl.predict(observation);`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="machineTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{machineJava}
                            .forntcodes__bottom
                                a.button(href="https://ignite.apache.org/docs/latest/machine-learning/machine-learning") Learn More About Machine Learning
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab5 (END Machine Learning)




                    .forntcodes__tab(data-ftab="frontcode-6")
                        p.forntcodes__tabtitle.fz20.pb-1 Continuous Queries
                        p With relational databases, you use triggers to react to certain events. With Ignite, you deploy continuous queries that are written in a modern programming language such as Java or C# and process streams of changes on the database and application side:
                        
                        .forntcodes__innertabs.jsTabWrap
                            .nativecode__tabctrls.flexi
                                a(href="#", data-tablink="contTabJava").nativecode__link.active Java
                                a(href="#", data-tablink="contTabSharp").nativecode__link C#/.NET
                            -
                                let contJava = `ContinuousQuery qry = new ContinuousQuery<>();

                                // The callback that will be triggered on the application side.
                                qry.setLocalListener(new MyLocalListener());

                                // The callback that will be executed on the server side.
                                qry.setRemoteFilterFactory(new MyRemoteFilterFactory());

                                // Deploy the query in the cluster.
                                cache.query(query);`;

                                let contSharp = `var cache = ignite.GetOrCreateCache("myCache");

                                var query = new ContinuousQuery(
                                    new MyLocalListener(), // Will be triggered on the application side.
                                    new MyRemoteFilter()); // Will be executed on the server side.

                                // Deploy the query in the cluster.
                                var handle = cache.QueryContinuous(query);`;

                            .nativecode__tabs
                                .nativecode__tab(data-tab="contTabJava").active
                                    pre.nativecode__codebox 
                                        code.java #{contJava}
                                .nativecode__tab(data-tab="contTabSharp")
                                    pre.nativecode__codebox 
                                        code.csharp #{contSharp}
                            .forntcodes__bottom
                                a.button(href="https://ignite.apache.org/docs/latest/key-value-api/continuous-queries", target="_blank") Learn More About Continuous Queries
                        // /.forntcodes__innertabs
                    // /.forntcodes__tab6 (END Continuous Queries)
        // /.forntcodes
    // /.frontblue





    section.frontnewcards.container
        h2.h3 New To Ignite? <br>Three Primary Usage Scenarios
        .frontnewcards__wrap.pt-5
            article.frontsimplecard.cardsimple
                h4.cardsimple__title Applications Acceleration <br>& Scale Out
                .cardsimple__text.cardsimple__text--long.
                    Accelerate your existing applications by&nbsp;100x using Ignite as&nbsp;an&nbsp;in-memory cache or&nbsp;in-memory data grid that is&nbsp;deployed over one or&nbsp;more external databases.
                .cardsimple__bottom
                    a(href="/use-cases/#usecase2").cardsimple__button.button.button--shadow Learn More
            article.frontsimplecard.cardsimple
                h4.cardsimple__title Distributed Database For <br>HTAP Workloads
                .cardsimple__text.cardsimple__text--long.
                    Build applications that support transactional and&nbsp;analytical workloads by&nbsp;using Ignite as&nbsp;a&nbsp;database that scales beyond available memory capacity.
                .cardsimple__bottom
                    a(href="/use-cases/#database").cardsimple__button.button.button--shadow Learn More
            article.frontsimplecard.cardsimple
                h4.cardsimple__title Digital Integration Hub<br>&nbsp;
                .cardsimple__text.cardsimple__text--long.
                    Create an&nbsp;advanced platform architecture that aggregates multiple back-end systems and databases into a&nbsp;low-latency and shared data store.
                .cardsimple__bottom
                    a(href="/use-cases/digital-integration-hub.html").cardsimple__button.button.button--shadow Learn More
    // /.frontnewcards






    section.frontstories.container
        h2.h3 Ignite User Stories
        ul.frontstories__checkers.pt-5.capstext
            li Software & SaaS
            li Banking
            li Logistics & Transportation
            li Financial Services
            li Retail
            li Biotech
            li And others
        .frontstories__sliderwrap 
            button.ctrl.ctrl--prev
                img(src="/img/frontpage/icon-slider-arrow.svg", alt="")
            button.ctrl.ctrl--next
                img(src="/img/frontpage/icon-slider-arrow.svg", alt="")
            .swiper.jsFrontVideosSwiper
                .swiper-wrapper 
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=3FFexcYIpmA",
                            "/img/poweredby/videos/001.png",
                            "",
                            "Leveraging In&nbsp;Memory Compute Grids With Core Systems Of&nbsp;Record",
                            "comvideo__txt--small"
                        )
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=Mhtt2QL_qCQ",
                            "/img/poweredby/videos/002.png",
                            "",
                            "How To&nbsp;Use Apache Ignite To&nbsp;Rescue The Backend Of&nbsp;A&nbsp;Bank",
                            "comvideo__txt--black comvideo__txt--small"
                                )
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=z28rthKIrDk",
                            "/img/poweredby/videos/003.png",
                            "",
                            "S9D Using Apache Ignite As&nbsp;A&nbsp;Part Of&nbsp;Real Time Campaigning",
                            "comvideo__txt--small"
                        )
                    .swiper-slide
                        +powvideo(
                            "https://techblog.yahoo.co.jp/oss/yahoo_shopping_purchases_ignite/",
                            "/img/poweredby/videos/005.png",
                            "",
                            "In-Memory Computing Patterns For High Volume, Real Time Applications",
                            "comvideo__txt--small", false
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://www.youtube.com/watch?v=EdFOKJIjRSg",
                            "/img/poweredby/videos/008.png",
                            "",
                            "Fitness + In Memory Computing = Getting Ahead Of The Game",
                            "comvideo__txt--small"
                        )
                    .swiper-slide
                        +powvideo(
                            "https://www.youtube.com/watch?v=jF9T2cJB6t0",
                            "/img/poweredby/videos/009.png",
                            "",
                            "High Performance Exposure Management With Apache Ignite",
                            "comvideo__txt--black comvideo__txt--small"
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://www.youtube.com/watch?v=_mnZQ3JDcn8",
                            "/img/poweredby/videos/014.png",
                            "",
                            "Ignite Success Story: How Ignite Fuels The High Throughput Messaging In&nbsp;Sentienz Akiro",
                            "comvideo__txt--black  comvideo__txt--small"
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://techblog.yahoo.co.jp/oss/yahoo_shopping_purchases_ignite/",
                            "/img/poweredby/videos/004.png",
                            "",
                            "&laquo;Recent Purchases&raquo; With Apache Ignite",
                            "comvideo__txt--small", false
                        )
                    .swiper-slide 
                        +powvideo(
                            "https://www.youtube.com/watch?v=CPmwnjDJ1Sk",
                            "/img/poweredby/videos/006.png",
                            "",
                            "Embracing The Service Consumption Shift In&nbsp;Banking",
                            "comvideo__txt--small"
                        )
            .frontstories__pag
        .frontstories__bottom.pt-5
            a.button.button--shadow(href="/use-cases/provenusecases.html") Watch Other Stories
    // /.frontstories




    section.frontconfs.container 
        h2.h3 Join The Community At Events <br>And Meetups Worldwide
        .frontconfs__wrap
            a(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/", target="_blank").frontconfcard.frontconfcard--red
                .frontconfs__iconwrap.pb-3
                    img(src="/img/frontpage/events/001.svg", alt="")
                h4.h5.frontconfcard__title.pb-2 Ignite Virtual Meetup
                p Experts and practitioners give <strong>online-talks and presentations</strong> and share their Apache Ignite experience.
                .frontconfcard__bottom
                    p.capstext Online
                    .frontconfcard__cal Regularly
            
            a(href="https://ignite-summit.org/", target="_blank").frontconfcard.frontconfcard--blue
                .frontconfs__iconwrap.pb-3
                    img(src="/img/frontpage/events/002.svg", alt="")
                h4.h5.frontconfcard__title.pb-2 Ignite Summit
                p This <strong>virtual conference</strong> is a chance to learn more about up-to-date in-memory computing solutions.
                p There are speakers from industry-leading companies and hundreds of participants from all over the world.
                .frontconfcard__bottom
                    p.capstext Online
                    .frontconfcard__cal Annually

            a(href="/events.html#upcoming", target="_blank").frontconfcard
                .frontconfs__iconwrap.pb-3
                    img(src="/img/frontpage/events/003.svg", alt="")
                h4.h5.frontconfcard__title.pb-2 Other Events
                p Join us for <strong>conferences, presentations, and webinars</strong> to learn more about in-memory computing technologies.
                .frontconfcard__bottom
                    p.capstext ONLINE <small>and</small> OFFLINE
                    .frontconfcard__cal Regularly
        .frontconfs__bottom.pt-5
            a.button.button--shadow(href="/events.html") View All Events
    // /.frontconfs


    section.event-featured.container.fronteventsbanner
        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




    section.frontresourse.container 
        h2.h3 Resources To Elevate Your <br>Ignite Experience
        .frontresourse__subtitle.pt-2 Get access to a variety of free technical <br>and learning resources
        .frontresourse__wrap.flexi.fz20
            .frontresourse__col
                .capstext.pb-5 Technical resources
                .frontresitem.flexi.frontresitem--black 
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-docs.svg", alt="")
                    .frontresitem__text Apache Ignite technical documentation
                a(href="https://cwiki.apache.org/confluence/display/IGNITE/", target="_blank").frontresitem.flexi.frontresitem--gray
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-wiki.svg", alt="")
                    .frontresitem__text Ignite Wiki with a collection of low-level design documents and instructions
                a(href="/resources.html#git").frontresitem.flexi.frontresitem--gray
                    .frontresitem__icon 
                        img(src="/img/icon-github.svg", alt="")
                    .frontresitem__text Git repositories with Ignite source code and code samples and examples
            .frontresourse__col
                .capstext.pb-5 Learning resources
                .frontresitem.flexi.frontresitem--red 
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-videos.svg", alt="")
                    .frontresitem__text Dozens of essential videos and webinar <br>recordings
                a(href="/resources.html#training").frontresitem.flexi.frontresitem--rose
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-vebinar.svg", alt="")
                    .frontresitem__text Trainings and courses that help building high-performance and data-intensive applications with&nbsp;the Apache Ignite
                a(href="https://www.shamimbhuiyan.com/ignitebook", target="_blank").frontresitem.flexi.frontresitem--rose
                    .frontresitem__icon 
                        img(src="/img/frontpage/res-book.svg", alt="")
                    .frontresitem__text Apache Ignite book to expand your knowledge <br>in in-memory computing and distributed databases
        .frontconfs__bottom.pt-5
            a.button.button--shadow(href="/resources.html") View All Resources

    section.toolingend.toolingend--front
        .container.flexi
            .toolingend__main
                p.toolingend__title.h3
                    strong Ready To Start?
                p.h5.pt-2 Discover our quick start guides and build your first <br>application in 5-10 minutes
            .toolingend__action
                a.button(href="https://ignite.apache.org/docs/latest/", target="_blank") Discover Quick Start Guide



                        