<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Julia Community 🟣: Pere Giménez</title>
    <description>The latest articles on Julia Community 🟣 by Pere Giménez (@pgimenez).</description>
    <link>https://forem.julialang.org/pgimenez</link>
    <image>
      <url>https://forem.julialang.org/images/yT1bDoApYWR3Tq-cSU0Fo1Zzjv9DS7umzJeGlyrNja4/rs:fill:90:90/g:sm/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L3VzZXIvcHJvZmls/ZV9pbWFnZS84MDIv/OTZmMGQzNDEtNzA5/ZS00NGE4LThkMDQt/N2M1MTUzOTJhOTQz/LmpwZw</url>
      <title>Julia Community 🟣: Pere Giménez</title>
      <link>https://forem.julialang.org/pgimenez</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.julialang.org/feed/pgimenez"/>
    <language>en</language>
    <item>
      <title>Importing Genie Builder apps for deployment on Genie Cloud</title>
      <dc:creator>Pere Giménez</dc:creator>
      <pubDate>Tue, 13 Jun 2023 14:51:55 +0000</pubDate>
      <link>https://forem.julialang.org/pgimenez/importing-genie-builder-apps-for-deployment-on-genie-cloud-58oo</link>
      <guid>https://forem.julialang.org/pgimenez/importing-genie-builder-apps-for-deployment-on-genie-cloud-58oo</guid>
      <description>&lt;p&gt;Today we’re rolling out some major upgrades to Genie Cloud; see the changelog &lt;a href="https://learn.geniecloud.io/changelog/0-1"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; We’ve made it easier for Genie Builder users to import their apps for deployment on Genie Cloud. Simply zip and 📤 upload your Genie Builder app via the import menu, or clone the code straight from a GitHub repo. Check our walkthrough video to see how it works. 👇 &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/vUTJiVGcW3w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;For those with Genie Framework apps - support is on the horizon, so stay tuned!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; 💡 We've pre-loaded two demo apps in your workspace to help you explore Genie Cloud.&lt;/p&gt;

&lt;p&gt;You can experiment with them in the development environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edit or add UI components using our drag &amp;amp; drop no-code editor&lt;/li&gt;
&lt;li&gt;Try the Genie UI Assistant (powered by GPT-4!) to edit, add and style components with natural language&lt;/li&gt;
&lt;li&gt;Deploy on a public URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; 💪 Genie Cloud is more stable and faster. We've upgraded the platform to Julia 1.9 for increased performance and have enhanced our infrastructure for better resilience. Plus, we've squashed all major bugs. 🚫🪲&lt;/p&gt;

&lt;p&gt;Genie Cloud is  in private beta but we’re inviting users regularly. &lt;/p&gt;

&lt;p&gt;If you haven’t signed up for a free account yet, it’s a great moment to do so:  &lt;a href="https://www.geniecloud.io/"&gt;https://www.geniecloud.io/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introducing Genie UI Assistant: the AI-powered UI builder for Genie apps</title>
      <dc:creator>Pere Giménez</dc:creator>
      <pubDate>Tue, 09 May 2023 16:22:41 +0000</pubDate>
      <link>https://forem.julialang.org/pgimenez/introducing-genie-ui-assistant-the-ai-powered-ui-builder-for-genie-apps-3jpe</link>
      <guid>https://forem.julialang.org/pgimenez/introducing-genie-ui-assistant-the-ai-powered-ui-builder-for-genie-apps-3jpe</guid>
      <description>&lt;p&gt;We are excited to announce the release of Genie UI Assistant – an AI-powered UI builder designed to help Genie users create UIs faster, using natural language.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Powered by GPT-4, tailored to Genie users
&lt;/h2&gt;

&lt;p&gt;Developed with GPT-4, Genie UI Assistant enables Genie Cloud and Genie Builder users to quickly add and edit UI components - simply by prompting. And it goes beyond just passing user prompts to GPT-4. By knowing the context of a Genie app, Genie UI Assistant is able to output more accurately the frontend code Genie users need for their web apps, saving them valuable time.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrated with our no-code editor to help you build web apps faster
&lt;/h2&gt;

&lt;p&gt;Genie UI Assistant seamlessly integrates with our no-code editor, enabling users to streamline frontend development of their web apps by combining AI prompting with our drag-and-drop builder.&lt;/p&gt;

&lt;p&gt;For instance, users can swiftly create layouts by dragging and dropping UI components, then prompt Genie UI Assistant to edit, configure, and style those components quickly, without needing to interact with a properties editor or write any HTML/CSS/JavaScript code. This integration makes developing sophisticated, visually appealing UIs more efficient, empowering Genie users to build web apps faster than ever.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;In the no-code editor, navigate to the properties menu on the right and locate the Genie UI Assistant. Select the component you'd like to edit, and describe how you'd like to change it in the prompt field. Submit your prompt, and preview the change after a few seconds. You can change and resubmit the prompt or discard the change altogether. If you like the preview, save your file in the no-code editor and continue building your app.&lt;/p&gt;

&lt;p&gt;Let's see Genie UI Assistant in action with a few examples below.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/kOQ70PsLOaQ"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get Genie UI Assistant
&lt;/h2&gt;

&lt;p&gt;To start using Genie UI Assistant users have two options:&lt;/p&gt;

&lt;p&gt;1) Download Genie Builder, our plugin for VSCode: open the no-code editor, navigate to properties, locate the Genie UI Assistant menu, and follow the instructions.&lt;/p&gt;

&lt;p&gt;2) Sign up for a Genie Cloud account and await private beta access. Genie Cloud offers a hosted version of Genie Builder, complete with the integrated Genie UI Assistant. It also allows users to deploy their apps effortlessly in just one click.&lt;/p&gt;

&lt;p&gt;Genie UI Assistant is free for testing with some usage limits. If you need more extensive access, please contact us. And don’t forget to share your feedback on Discord to help us make it better with the next iterations.&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Genie team&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Genie Builder v0.3 makes it easier to build UIs with no-code</title>
      <dc:creator>Pere Giménez</dc:creator>
      <pubDate>Tue, 18 Apr 2023 16:03:28 +0000</pubDate>
      <link>https://forem.julialang.org/pgimenez/genie-builder-v03-makes-it-easier-to-build-uis-with-no-code-1k5c</link>
      <guid>https://forem.julialang.org/pgimenez/genie-builder-v03-makes-it-easier-to-build-uis-with-no-code-1k5c</guid>
      <description>&lt;p&gt;Hey everyone 🚀! We’ve released Genie Builder v0.3, an improved version of our no-code UI builder. 🌟 Key updates include:&lt;br&gt;
1️⃣ Side-by-side app preview for seamless development&lt;br&gt;
2️⃣ Quick app export via download button&lt;br&gt;
3️⃣ Enhanced tooltips to better understand component properties&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/Ue03mJHYa6p87RyDZKgBnBYwzQEhErLHRWYsImf9SDQ/w:800/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL3k0/Y285bXN4bGl0NHY1/d2locXRsLmpwZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/Ue03mJHYa6p87RyDZKgBnBYwzQEhErLHRWYsImf9SDQ/w:800/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL3k0/Y285bXN4bGl0NHY1/d2locXRsLmpwZw" alt="" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉You can download or upgrade Genie Builder via VSCode to run it locally: &lt;a href="https://marketplace.visualstudio.com/items?itemName=GenieBuilder.geniebuilder"&gt;https://marketplace.visualstudio.com/items?itemName=GenieBuilder.geniebuilder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 OR Sign up for a free Genie Cloud account for a managed version with one-click deploys: &lt;a href="https://www.geniecloud.io/"&gt;https://www.geniecloud.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>genie</category>
      <category>web</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Genie Cloud: the new standard for building Julia web apps</title>
      <dc:creator>Pere Giménez</dc:creator>
      <pubDate>Wed, 29 Mar 2023 15:05:47 +0000</pubDate>
      <link>https://forem.julialang.org/pgimenez/genie-cloud-the-new-standard-for-building-julia-web-apps-2h91</link>
      <guid>https://forem.julialang.org/pgimenez/genie-cloud-the-new-standard-for-building-julia-web-apps-2h91</guid>
      <description>&lt;p&gt;We're thrilled to announce the launch of Genie Cloud, a low/no-code platform for quickly building web applications around your Julia code.&lt;/p&gt;

&lt;p&gt;Genie Cloud is designed to help data scientists and researchers productize their Julia models with interactive, shareable web apps - without having to worry about frontend, backend development, or hosting. &lt;/p&gt;

&lt;h2&gt;
  
  
  Powered by the Genie Framework
&lt;/h2&gt;

&lt;p&gt;Genie Cloud is built on top of &lt;a href="https://genieframework.com"&gt;Genie Framework&lt;/a&gt;, the open-source Julia web framework we've been developing since 2016. Thanks to the Julia community and its contributors, Genie Framework has become the most widely adopted package for building web apps and APIs in Julia, accumulating 2k &lt;a href="https://github.com/GenieFramework/Genie.jl"&gt;GitHub&lt;/a&gt; stars and over 65k downloads.&lt;/p&gt;

&lt;p&gt;But the feedback we've been consistently receiving from the community is that Genie Framework can be daunting for the typical Julia user - a data or research scientist with little to no web development skills. &lt;/p&gt;

&lt;p&gt;So our team set out to abstract away the complexities of web development with easy-to-use and highly productive no-code tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built around Genie Builder, our popular no-code plugin
&lt;/h2&gt;

&lt;p&gt;In 2022, we raised venture capital to bring our vision to life and launched our first no-code product - &lt;a href="https://marketplace.visualstudio.com/items?itemName=GenieBuilder.geniebuilder"&gt;Genie Builder&lt;/a&gt;, a VSCode extension with a drag &amp;amp; drop UI builder. Since its release in late July 2022, Genie Builder has been used by over 1,000 data scientists and R&amp;amp;D engineers around the world.&lt;/p&gt;

&lt;p&gt;Genie Cloud takes Genie Builder to the cloud, offering a smoother, more productive user experience, including improved no-code UI capabilities and for the first time, one-click deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  For beginners and power users alike
&lt;/h2&gt;

&lt;p&gt;Beginners will find Genie Cloud easy to use. Building a simple dashboard app for example, only takes a few minutes. Add your Julia data analysis code, build the UI with the no-code editor, implement the app logic with macros, and deploy with one click.&lt;/p&gt;

&lt;p&gt;For the power users who want to build more complex data products, Genie Cloud can be extended by Genie Framework which offers a low-code UI library, 1st party plugins, backend and ORM libraries.&lt;/p&gt;

&lt;p&gt;Our users are building a wide variety of apps with Genie Cloud already. Data scientists are building dashboards for data exploration and analytics; actuaries are creating data products for risk modeling; ML engineers and researchers are building apps that run (and show off!) ML models or simulations. Software engineers are building internal tools like frontends for info management systems; aerospace engineers are creating apps to manage lab equipment. We can't wait to see what more they will build with Genie Cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launching in private beta, with a free community tier
&lt;/h2&gt;

&lt;p&gt;Genie Cloud is launching in private beta, with new invites being sent gradually every week. &lt;a href="https://geniecloud.app/register"&gt;Register&lt;/a&gt; to join the waitlist or &lt;a href="https://meetings.hubspot.com/cinzia-palumbo/genie-cloud-demo"&gt;book a demo&lt;/a&gt; if your team or company wants a walkthrough.&lt;/p&gt;

&lt;p&gt;Julia is a language on the rise for computationally demanding applications. At Genie, we strive to serve the Julia community with highly productive, accessible web development tools that enable them to share their work more easily and have greater impact on their organizations.&lt;/p&gt;

&lt;p&gt;So we're excited to make Genie Cloud available with a free community tier. To get started, check our &lt;a href="https://learn.geniecloud.io/"&gt;Resource Hub&lt;/a&gt; for guides and tutorials, and join our &lt;a href="https://discord.gg/9zyZbD6J7H"&gt;Discord&lt;/a&gt; for community support.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Genie team&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

</description>
      <category>genie</category>
      <category>cloud</category>
      <category>web</category>
      <category>framework</category>
    </item>
    <item>
      <title>How to quickly turn your Julia code into a web app with Genie Builder</title>
      <dc:creator>Pere Giménez</dc:creator>
      <pubDate>Wed, 14 Dec 2022 17:36:00 +0000</pubDate>
      <link>https://forem.julialang.org/pgimenez/how-to-quickly-turn-your-julia-code-into-a-web-app-with-genie-builder-35i3</link>
      <guid>https://forem.julialang.org/pgimenez/how-to-quickly-turn-your-julia-code-into-a-web-app-with-genie-builder-35i3</guid>
      <description>&lt;p&gt;Data scientists don't usually start writing full-blown web apps from the get-go. Instead, we begin with the typical including data cleaning, exploratory analysis, testing of several models, etc., and only when we're confident in the quality of the insights extracted from the data do we start thinking about publicly sharing them with a web application. The Genie Framework comes in very handy for this last step as it allows you to implement an interactive web UI so that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can share your insights with just a link. &lt;/li&gt;
&lt;li&gt;Other people can re-run the analysis and fine-tune the insights through the controls in the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this without writing a single line of HTML or Javascript thanks to &lt;u&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=GenieBuilder.geniebuilder"&gt;Genie Builder&lt;/a&gt;&lt;/u&gt;'s no-code editor. &lt;/p&gt;

&lt;p&gt;In this week's tutorial, I'll show you how to go from your existing Julia code to a Genie app in just a few steps. The code for the example app can be downloaded &lt;u&gt;&lt;a href="https://github.com/GenieFramework/GenieBuilderDemos"&gt;here&lt;/a&gt;&lt;/u&gt;, take a look at the figure below to see what it looks like in a browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/2uBstxVtGk5Nia9NYwXrMY0Xa4f1se1ntw4SEPEDBoc/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2ln/aWc0cjRqYTk5djVs/bXgycWJ1LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/2uBstxVtGk5Nia9NYwXrMY0Xa4f1se1ntw4SEPEDBoc/w:880/mb:500000/ar:1/aHR0cHM6Ly9mb3Jl/bS5qdWxpYWxhbmcu/b3JnL3JlbW90ZWlt/YWdlcy91cGxvYWRz/L2FydGljbGVzL2ln/aWc0cjRqYTk5djVs/bXgycWJ1LnBuZw" alt="Image description" width="880" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of contents:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;u&gt;Writing the data analysis code&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Creating a new app in Genie Builder&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Designing the UI in Genie Builder's no-code editor&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Implementing the app's logic&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;
&lt;u&gt;&lt;a href="//#5.-running-the-app-outside-of-genie-builder"&gt;Running the app outside of Genie Builder&lt;/a&gt;&lt;/u&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Writing the data analysis code
&lt;/h3&gt;

&lt;p&gt;To illustrate the Genie workflow, we'll write some code to extract insights from the &lt;u&gt;&lt;a href="https://www.kaggle.com/datasets/uciml/german-credit"&gt;German Credit Risk dataset&lt;/a&gt;&lt;/u&gt;. This dataset contains information about 1000 people, where each person is described by 20 features such as age, sex or credit amount. Additionally, every person has been manually labelled as "good credit risk" or "bad credit risk" according to the feature values.&lt;/p&gt;

&lt;p&gt;Say we want to extract the following insights from the dataset: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Number and monetary amount in good and bad credits.
&lt;/li&gt;
&lt;li&gt;Credit amounts and creditor ages.
&lt;/li&gt;
&lt;li&gt;Number of credits by age range.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To calculate these metrics, save the code below to a script &lt;code&gt;germancredits.jl&lt;/code&gt; and execute it in a Julia REPL to make sure everything is working.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;DataFrames&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dates&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderedCollections&lt;/span&gt;

 &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; good_bad_credits_stats&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="n"&gt;good_credits_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt; &lt;span class="o"&gt;.==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt;&lt;span class="x"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nrow&lt;/span&gt;
     &lt;span class="n"&gt;bad_credits_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt; &lt;span class="o"&gt;.==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt;&lt;span class="x"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nrow&lt;/span&gt;
     &lt;span class="n"&gt;good_credits_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt; &lt;span class="o"&gt;.==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="x"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;
     &lt;span class="n"&gt;bad_credits_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt; &lt;span class="o"&gt;.==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="x"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Array&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;

     &lt;span class="x"&gt;(;&lt;/span&gt; &lt;span class="n"&gt;good_credits_count&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bad_credits_count&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;good_credits_amount&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bad_credits_amount&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

 &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; credit_age_amount&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt; &lt;span class="o"&gt;.==&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="x"&gt;]]&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

 &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; credit_no_by_age&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="n"&gt;age_stats&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LittleDict&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="x"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LittleDict&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;
       &lt;span class="n"&gt;age_stats&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;∈&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="x"&gt;])&lt;/span&gt; &lt;span class="o"&gt;.&amp;amp;&lt;/span&gt; &lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt; &lt;span class="o"&gt;.==&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Good_Rating&lt;/span&gt;&lt;span class="x"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nrow&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
     &lt;span class="n"&gt;age_stats&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

 &lt;span class="c"&gt;# testing the functions&lt;/span&gt;
 &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;CSV&lt;/span&gt;
 &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CSV&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"german_credits.csv"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;DataFrame&lt;/span&gt;
 &lt;span class="nd"&gt;@show&lt;/span&gt; &lt;span class="n"&gt;good_bad_credits_stats&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
 &lt;span class="nd"&gt;@show&lt;/span&gt; &lt;span class="n"&gt;credit_age_amount&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
 &lt;span class="nd"&gt;@show&lt;/span&gt; &lt;span class="n"&gt;credit_no_by_age&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that the analysis code is finished and working, it's time to make it into a Genie app.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Creating a new app in Genie Builder
&lt;/h3&gt;

&lt;p&gt;We'll use the &lt;u&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=GenieBuilder.geniebuilder"&gt;Genie Builder&lt;/a&gt;&lt;/u&gt; plugin for VSCode to build the app. After installing the plugin, start the GB server and create a new app named GermanCredits. Click yes when asked if you want to start it, and the no-code editor will appear.&lt;/p&gt;

&lt;p&gt;In the workspace tab, you'll find that the newly-created app's code is split into two files:  &lt;code&gt;app.jl&lt;/code&gt; and &lt;code&gt;app.jl.html&lt;/code&gt;. Of the two, &lt;code&gt;app.jl&lt;/code&gt; is the one to be manually edited whereas &lt;code&gt;app.jl.html&lt;/code&gt; is written to by the no-code editor. At this point, you can add the script &lt;code&gt;germancredits.jl&lt;/code&gt; to the workspace to have all your files in one place. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/Kul2SdjABNyUBJ8StiGfmqEyWrnAq8dT-Rz63g0ndd0/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvd29ya3Nw/YWNlLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/Kul2SdjABNyUBJ8StiGfmqEyWrnAq8dT-Rz63g0ndd0/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvd29ya3Nw/YWNlLnBuZw" width="332" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To avoid conflicts, it is recommended to wrap the code in a module and remove any testing code. So, edit &lt;code&gt;germancredits.jl&lt;/code&gt; to make it look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;GermanCredits&lt;/span&gt;
     &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;good_bad_credits_stats&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credit_age_amount_duration&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credit_data_by_age&lt;/span&gt;
     &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;DataFrames&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dates&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderedCollections&lt;/span&gt;

     &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; good_bad_credits_stats&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
         &lt;span class="o"&gt;...&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
     &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; credit_age_amount&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
         &lt;span class="o"&gt;...&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
     &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nf"&gt; credit_no_by_age&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kt"&gt;Bool&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
         &lt;span class="o"&gt;...&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install the required packages &lt;code&gt;DataFrames&lt;/code&gt;, &lt;code&gt;Dates&lt;/code&gt; and &lt;code&gt;OrderedCollections&lt;/code&gt; within the app, launch Genie Builder's Package Manager by right-clicking on the app's name on the left sidebar. You'll see the installation progress in the REPL, and the package versions will be added to the &lt;code&gt;Project.toml&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/zpPK0x49J0YIYfDewveWEV2IiZKpkJ-kO4c5fuZJxC0/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvcGFja21h/bmFnZXIucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/zpPK0x49J0YIYfDewveWEV2IiZKpkJ-kO4c5fuZJxC0/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvcGFja21h/bmFnZXIucG5n" width="880" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we'll design the UI to display the data insights. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. Designing the UI in Genie Builder's no-code editor
&lt;/h3&gt;

&lt;p&gt;For the German Credits UI, we want to have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page title header.&lt;/li&gt;
&lt;li&gt;Badges showing the number of credits and their monetary amount.&lt;/li&gt;
&lt;li&gt;A range control to filter the age of the people whose data is displayed.&lt;/li&gt;
&lt;li&gt;A bar chart displaying the number of credits by age.&lt;/li&gt;
&lt;li&gt;A scatter plot displaying age vs. amount for each credit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To build the UI with the no-code editor, look for the components you need in the right sidebar and drag them onto the canvas. Start with the header, rows and columns to set the page layout:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/WMop0PW5JJO6OtfwR7T47sf0Mvz1kbz3pFckAN_7bOs/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvbGF5b3V0/LnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/WMop0PW5JJO6OtfwR7T47sf0Mvz1kbz3pFckAN_7bOs/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvbGF5b3V0/LnBuZw" width="880" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, add the following components: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paragraph (x4).&lt;/li&gt;
&lt;li&gt;Range.&lt;/li&gt;
&lt;li&gt;Bar.&lt;/li&gt;
&lt;li&gt;Scatter. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/nl1muGRgdTVZVBSF9dOeYWkfVQFpvqZ8q6n3F-4amys/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvbm9jb2Rl/dWkucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/nl1muGRgdTVZVBSF9dOeYWkfVQFpvqZ8q6n3F-4amys/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvbm9jb2Rl/dWkucG5n" width="880" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, let's make the font of the number badges bigger. Click on the &lt;strong&gt;&lt;code&gt;&amp;lt;/&amp;gt;&lt;/code&gt;&lt;/strong&gt; icon and change the class of the &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; element to &lt;code&gt;bignumber&lt;/code&gt;. Then, add a new CSS style &lt;code&gt;.bignumber{font-size:40px; text-align:center;}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/fi9wia0iMDGv-HfXerOZFoP8WxjLQyYIc_pHt_Nja3Q/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvc3R5bGUu/cG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/fi9wia0iMDGv-HfXerOZFoP8WxjLQyYIc_pHt_Nja3Q/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvc3R5bGUu/cG5n" width="880" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To preview the UI, click on the monitor icon next to the GET tab in the left sidebar. Note that nothing works yet, you still have to implement the app's logic and bind the UI components to the Julia code.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Implementing the app's logic
&lt;/h3&gt;

&lt;p&gt;To make the app interactive you have to implement its logic by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exposing reactive variables from the Julia code to the UI.&lt;/li&gt;
&lt;li&gt;Writing reactive code to handle user interaction.&lt;/li&gt;
&lt;li&gt;Binding the exposed variables to the UI components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The file &lt;code&gt;app.jl&lt;/code&gt; in the workspace is the main entry point to the app, and it's where you'll write the logic. This is what the file looks like by default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;GenieFramework&lt;/span&gt;
 &lt;span class="nd"&gt;@genietools&lt;/span&gt;

 &lt;span class="nd"&gt;@handlers&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
   &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;
   &lt;span class="nd"&gt;@onchange&lt;/span&gt; &lt;span class="n"&gt;isready&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
     &lt;span class="nd"&gt;@show&lt;/span&gt; &lt;span class="s"&gt;"App is loaded"&lt;/span&gt;
   &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;

 &lt;span class="nd"&gt;@page&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"app.jl.html"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To start with a clean app, delete the contents of the block delimited by the &lt;code&gt;@handlers&lt;/code&gt; macro. Then, include the GermanCredits package and load the dataset by adding the following code before it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"germancredits.jl"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GermanCredits&lt;/span&gt;
 &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="n"&gt;GenieFramework&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CSV&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DataFrames&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderedCollections&lt;/span&gt;

 &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CSV&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"german_credits.csv"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;DataFrame&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we'll add the reactive variables and code for each element in the UI. Since we want to filter the data to show only a certain age range, let's start with the range selector.&lt;/p&gt;

&lt;h4&gt;
  
  
  Range selector
&lt;/h4&gt;

&lt;p&gt;In Genie apps, reactivity is based around two concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables are exposed to the UI by tagging them with the &lt;code&gt;@in&lt;/code&gt; macro if they take their value from the UI, or with the &lt;code&gt;@out&lt;/code&gt; macro if they output their value to the UI.
&lt;/li&gt;
&lt;li&gt;The code to handle interactions is written in the block delimited by the &lt;code&gt;@onchange&lt;/code&gt; macro, which watches a variable and whenever it changes executes the code in the block. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To filter the data via the range selector in the UI, we need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A variable of type &lt;code&gt;RangeData&lt;/code&gt; to store the range selected in the UI.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;DataFrame&lt;/code&gt; to hold the filtered data.&lt;/li&gt;
&lt;li&gt;A function call to update the available data when an age range is selected. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To implement these elements, add the following code inside the &lt;code&gt;@handlers&lt;/code&gt; macro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="nd"&gt;@handlers&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
     &lt;span class="nd"&gt;@in&lt;/span&gt; &lt;span class="n"&gt;age_range&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RangeData&lt;/span&gt;&lt;span class="x"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="x"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RangeData&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;filtered_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DataFrame&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
     &lt;span class="nd"&gt;@onchange&lt;/span&gt; &lt;span class="n"&gt;age_range&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
         &lt;span class="n"&gt;filtered_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;age_range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;.&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt; &lt;span class="o"&gt;.&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;age_range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="x"&gt;),&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the variables have default values so that the UI can be rendered when the page loads. Now, go to the no code editor, select the Range component and assign the &lt;code&gt;age_range&lt;/code&gt; variable to its Data Binding field. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/DVFiI742Wyq-JkghhyMUUWyr5H5OFWlM2hbWT_gNJ7k/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvcmFuZ2Vi/aW5kaW5nLnBuZw" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/DVFiI742Wyq-JkghhyMUUWyr5H5OFWlM2hbWT_gNJ7k/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9ob3ct/dG8tcXVpY2tseS10/dXJuLXlvdXItanVs/aWEtY29kZS1pbnRv/LWEtd2ViLWFwcC13/aXRoLWdlbmllLWJ1/aWxkZXIvcmFuZ2Vi/aW5kaW5nLnBuZw" width="698" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it for the range selector. Any time you move one end of the slider in the UI, the contents of &lt;code&gt;filtered_data&lt;/code&gt; will be updated. Let's continue with the next element to show the updated insights.&lt;/p&gt;

&lt;h4&gt;
  
  
  Number badges
&lt;/h4&gt;

&lt;p&gt;To display the number and amount in credits, you'll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables to store the quantities.&lt;/li&gt;
&lt;li&gt;A call to &lt;code&gt;good_bad_credits_stats&lt;/code&gt; to update the variables when a new range is selected.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="nd"&gt;@handlers&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
     &lt;span class="o"&gt;...&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;good_credits_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; 
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;bad_credits_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;good_credits_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;bad_credits_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
     &lt;span class="nd"&gt;@onchange&lt;/span&gt; &lt;span class="n"&gt;age_range&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
         &lt;span class="o"&gt;...&lt;/span&gt;
         &lt;span class="n"&gt;good_credits_count&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bad_credits_count&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;good_credits_amount&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;bad_credits_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;good_bad_credits_stats&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_data&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To show the number badges in the UI, assign each variable to the Text Binding field of a Paragraph component.&lt;/p&gt;

&lt;h4&gt;
  
  
  Number of credits by age plot
&lt;/h4&gt;

&lt;p&gt;We'll plot the credits by age with a bar plot indexed by the age ranges in 10 year increments. For this, you'll need: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An array to hold the x axis labels.&lt;/li&gt;
&lt;li&gt;An array of &lt;code&gt;PlotData&lt;/code&gt; to hold the plot data.&lt;/li&gt;
&lt;li&gt;A variable of type &lt;code&gt;PlotLayout&lt;/code&gt; to specify the plot layout.&lt;/li&gt;
&lt;li&gt;Reactive code to update the plots with the values calculated by &lt;code&gt;credit_no_by_age&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="nd"&gt;@handlers&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
     &lt;span class="o"&gt;...&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;age_slots&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"20-30"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"30-40"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"40-50"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"50-60"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"60-70"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"70-80"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"80-90"&lt;/span&gt;&lt;span class="x"&gt;]&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;credit_no_by_age_plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotData&lt;/span&gt;&lt;span class="x"&gt;[]&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;credit_no_by_age_plot_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotLayout&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;barmode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"group"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;showlegend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="nd"&gt;@onchange&lt;/span&gt; &lt;span class="n"&gt;age_range&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
         &lt;span class="o"&gt;...&lt;/span&gt;
         &lt;span class="n"&gt;credit_no_by_age_plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;
             &lt;span class="n"&gt;PlotData&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;
                 &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age_slots&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credit_no_by_age&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_data&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;))),&lt;/span&gt;
                 &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Good credits"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StipplePlotly&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Charts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PLOT_TYPE_BAR&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotDataMarker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"#72C8A9"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
             &lt;span class="x"&gt;),&lt;/span&gt;
             &lt;span class="n"&gt;PlotData&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;
                 &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age_slots&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;collect&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;credit_no_by_age&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_data&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;))),&lt;/span&gt;
                 &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Bad credits"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StipplePlotly&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Charts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PLOT_TYPE_BAR&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotDataMarker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"#BD5631"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
             &lt;span class="x"&gt;)&lt;/span&gt;
         &lt;span class="x"&gt;]&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Age vs. credit amount scatter plot
&lt;/h4&gt;

&lt;p&gt;For this plot, you'll require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An array of &lt;code&gt;PlotData&lt;/code&gt; to hold the plot data.&lt;/li&gt;
&lt;li&gt;A variable of type &lt;code&gt;PlotLayout&lt;/code&gt; to specify the plot layout.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="nd"&gt;@handlers&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
     &lt;span class="o"&gt;...&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;age_amount_plot_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotLayout&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;showlegend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
     &lt;span class="nd"&gt;@out&lt;/span&gt; &lt;span class="n"&gt;age_amount_plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotData&lt;/span&gt;&lt;span class="x"&gt;[]&lt;/span&gt;

     &lt;span class="nd"&gt;@onchangeany&lt;/span&gt; &lt;span class="n"&gt;age_range&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
         &lt;span class="o"&gt;...&lt;/span&gt;
         &lt;span class="n"&gt;dgood&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;credit_age_amount&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_data&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
         &lt;span class="n"&gt;dbad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;credit_age_amount&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered_data&lt;/span&gt;&lt;span class="x"&gt;;&lt;/span&gt; &lt;span class="n"&gt;good_rating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
         &lt;span class="n"&gt;age_amount_plot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="x"&gt;[&lt;/span&gt;
             &lt;span class="n"&gt;PlotData&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;
                 &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dgood&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dgood&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Good credits"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"markers"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotDataMarker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"#72C8A9"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"circle"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
             &lt;span class="x"&gt;),&lt;/span&gt;
             &lt;span class="n"&gt;PlotData&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;
                 &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbad&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbad&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Bad credits"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; 
                 &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"markers"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt;
                 &lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PlotDataMarker&lt;/span&gt;&lt;span class="x"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"#BD5631"&lt;/span&gt;&lt;span class="x"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"cross"&lt;/span&gt;&lt;span class="x"&gt;)&lt;/span&gt;
             &lt;span class="x"&gt;)&lt;/span&gt;
         &lt;span class="x"&gt;]&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And with this last component, you've finished your Genie app!&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Running the app outside of Genie Builder
&lt;/h3&gt;

&lt;p&gt;You can run your app locally within VSCode from the Genie Builder Apps menu in the sidebar. However, if you want to run your app outside of Genie Builder, the app's files are located in the folder &lt;code&gt;~/.julia/geniebuilder/apps/GermanCredits/&lt;/code&gt;. Before running the app, you'll have to tell Genie to start a server by adding the following line at the end of &lt;code&gt;app.jl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight julia"&gt;&lt;code&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isrunning&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="x"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, open a REPL with &lt;code&gt;julia --project&lt;/code&gt; in the app's folder and type &lt;code&gt;include("app.jl")&lt;/code&gt; to launch the &lt;strong&gt;app.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>genie</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Genie Builder v0.2: speed up your Julia app development</title>
      <dc:creator>Pere Giménez</dc:creator>
      <pubDate>Wed, 23 Nov 2022 18:07:47 +0000</pubDate>
      <link>https://forem.julialang.org/pgimenez/genie-builder-v02-speed-up-your-julia-app-development-47g8</link>
      <guid>https://forem.julialang.org/pgimenez/genie-builder-v02-speed-up-your-julia-app-development-47g8</guid>
      <description>&lt;p&gt;One of the projects our team at Genie is most excited about is Genie Builder, our no-code UI plugin for VSCode. With it, you can create a UI for your Julia apps without writing a single line of HTML or Javascript. All you have to do is drag and drop the UI components and connect them to the variables in the backend code. Pretty amazing, right?&lt;/p&gt;

&lt;p&gt;Today, we're releasing &lt;u&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=GenieBuilder.geniebuilder"&gt;Genie Builder v0.2&lt;/a&gt;&lt;/u&gt;, a majorly improved version to help you build Julia apps more quickly and productively.  &lt;/p&gt;

&lt;h4&gt;
  
  
  What's new?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;We've integrated the new Genie Framework API to create apps with significantly less code.&lt;/li&gt;
&lt;li&gt;The no-code UI editor is more powerful and polished, with new default menu selections, automatic loading of binding variables, and much more.&lt;/li&gt;
&lt;li&gt;The starting project template is more streamlined, consisting of only two files: one for the logic and one for the view.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get the new version, simply update Genie Builder in VSCode. &lt;/p&gt;



&lt;h4&gt;
  
  
  Build your data app in 3 simple steps
&lt;/h4&gt;

&lt;p&gt;Genie Builder streamlines the app development by splitting the implementation into 3 simple steps: &lt;/p&gt;

&lt;p&gt;1) Write the data analysis code as you would usually do, no need to worry about UI stuff!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/rMW7mqW5oROWbjvV7fMxOnTAOPISB5WaAWW5OdL4gJU/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9nZW5p/ZS1idWlsZGVyLXYw/Mi1zcGVlZC11cC1q/dWxpYS1hcHAtZGV2/ZWxvcG1lbnQvY29k/ZTAucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/rMW7mqW5oROWbjvV7fMxOnTAOPISB5WaAWW5OdL4gJU/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9nZW5p/ZS1idWlsZGVyLXYw/Mi1zcGVlZC11cC1q/dWxpYS1hcHAtZGV2/ZWxvcG1lbnQvY29k/ZTAucG5n" width="880" height="194"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;2) Design the UI with Genie Builder's no-code editor in a matter of minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/r3Dk60dTG_WrP6KLtGD-UdZ-HxtfB5C42og121wokpY/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9nZW5p/ZS1idWlsZGVyLXYw/Mi1zcGVlZC11cC1q/dWxpYS1hcHAtZGV2/ZWxvcG1lbnQvdWli/dWlsZC5naWY" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/r3Dk60dTG_WrP6KLtGD-UdZ-HxtfB5C42og121wokpY/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9nZW5p/ZS1idWlsZGVyLXYw/Mi1zcGVlZC11cC1q/dWxpYS1hcHAtZGV2/ZWxvcG1lbnQvdWli/dWlsZC5naWY" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;3) Link your Julia code to the UI by exposing variables with the &lt;code&gt;@in&lt;/code&gt; and &lt;code&gt;out&lt;/code&gt; macros, selecting the data bindings in the no-code editor, and adding reactive code in the &lt;code&gt;@onchangeany&lt;/code&gt; macro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forem.julialang.org/images/ZZmJGvPyKlfDkRMw3bxtq9pLZaBv19sHQkzRMSg01IY/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9nZW5p/ZS1idWlsZGVyLXYw/Mi1zcGVlZC11cC1q/dWxpYS1hcHAtZGV2/ZWxvcG1lbnQvY29k/ZTMucG5n" class="article-body-image-wrapper"&gt;&lt;img src="https://forem.julialang.org/images/ZZmJGvPyKlfDkRMw3bxtq9pLZaBv19sHQkzRMSg01IY/w:880/mb:500000/ar:1/aHR0cHM6Ly9nZW5p/ZWZyYW1ld29yay5j/b20vYmxvZy9nZW5p/ZS1idWlsZGVyLXYw/Mi1zcGVlZC11cC1q/dWxpYS1hcHAtZGV2/ZWxvcG1lbnQvY29k/ZTMucG5n" width="880" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Tutorials
&lt;/h4&gt;

&lt;p&gt;Check out the video below for a step-by-step tutorial in which we build the Iris Clustering demo app using Genie Builder v0.2. &lt;/p&gt;

&lt;p&gt;If you need support or have feedback and suggestions, make sure to join our &lt;u&gt;&lt;a href="https://discord.com/invite/9zyZbD6J7H"&gt;Discord&lt;/a&gt;&lt;/u&gt;. See you there!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/FQFD2YYqtpA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>genie</category>
      <category>web</category>
      <category>nocode</category>
      <category>data</category>
    </item>
  </channel>
</rss>
