<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.reau.ca/feed/No-Code.xml" rel="self" type="application/atom+xml" /><link href="https://www.reau.ca/" rel="alternate" type="text/html" hreflang="fr" /><updated>2026-03-18T10:58:55+00:00</updated><id>https://www.reau.ca/feed/No-Code.xml</id><title type="html">reau.ca | No-code</title><subtitle>Geoff RÉAU is a confirmed Technology Delivery Lead with 20+ years of experience in Infrastructure Technology. From Design to Delivery and beyond, Geoff is dedicated to supporting clients every step of the way, ensuring trust and delivering impactful technology solutions.</subtitle><author><name>Geoff RÉAU</name><email>contact@reau.ca</email></author><entry xml:lang="en"><title type="html">Thunkable Tuto (2/2): Make your mobile app smart with the Google Gemini API</title><link href="https://www.reau.ca/2026/03/18/thunkable-tuto-part-2.html" rel="alternate" type="text/html" title="Thunkable Tuto (2/2): Make your mobile app smart with the Google Gemini API" /><published>2026-03-18T10:00:00+00:00</published><updated>2026-03-18T10:00:00+00:00</updated><id>https://www.reau.ca/2026/03/18/thunkable-tuto-part-2</id><content type="html" xml:base="https://www.reau.ca/2026/03/18/thunkable-tuto-part-2.html"><![CDATA[<p><img src="/content/images/thunkable-tuto-part2.jpg" alt="Thunkable Tuto - Integrate Gemini API" style="display: block; margin: 0 auto;" /></p>

<p>In <strong><a href="/2026/03/13/thunkable-tuto-part-1.html">the first part of this tutorial</a></strong>, we connected our mobile prototype to a Firebase database. This is a great practice, especially relevant if you plan to transition to coding with frameworks like React Native later on. However, this approach keeps us dependent on a pre-filled database.</p>

<p>Today, we are shifting into high gear. After 20 years in the IT industry, I am still fascinated by how easily we can now integrate artificial intelligence into an app with just a few clicks. We are going to replace our static database with the Google Gemini API to generate 100% custom quotes on the fly!
<!--more--></p>

<hr />
<p><strong><em>Foreword</em></strong>: <em>This article, enhanced with improvements generated by AI (<a href="https://gemini.google.com/">Google Gemini</a>), is made available under the</em> <span xmlns:cc="http://creativecommons.org/ns#"><i><a href="https://creativecommons.org/licenses/by-nd/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">CC BY-ND 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nd.svg?ref=chooser-v1" alt="" /></a></i></span></p>

<hr />

<h1 id="step-1-get-the-brains-keys-google-ai-studio">Step 1: Get the brain’s keys (Google AI Studio)</h1>
<p>To talk to Gemini from our app, we need a pass: an API key.</p>
<ul>
  <li>Go to <a href="https://aistudio.google.com/">Google AI Studio</a>.</li>
  <li>Sign in with your Google account.</li>
  <li>In the left menu, click on <strong>Get API key</strong> and then on the <strong>Create API key</strong> button.</li>
</ul>

<p><img src="/content/images/gemini_api_keygen_en.jpg" alt="Generate an API key on Google AI Studio" style="display: block; margin: 0 auto;" /><br /></p>

<ul>
  <li>Once the API key is created, click on it to display it.</li>
  <li>Copy this long string of characters and keep it safe (never share it publicly).
<img src="/content/images/gemini_api_key_en.jpg" alt="Display an API key on Google AI Studio" style="display: block; margin: 0 auto;" /><br /></li>
</ul>

<h1 id="step-2-adapt-motivapps-design">Step 2: Adapt MotivApp’s Design</h1>
<p>Let’s pick up our Thunkable project where we left off. We are going to add some interactivity.</p>
<ul>
  <li><strong>On Screen1 (Home):</strong> Add a <strong>Text Input</strong> component right above the “Inspire me!” button. Change its <em>Hint</em> property to display: “Enter a theme (e.g., Sports, Coding…)”. Rename this component <code class="language-plaintext highlighter-rouge">Input_Theme</code>.
<img src="/content/images/thunkable_gemini_design.jpg" alt="Updated design with text input" style="display: block; margin: 0 auto;" /><br /></li>
</ul>

<h1 id="step-3-prompt-engineering-with-risen">Step 3: Prompt Engineering with RISEN</h1>
<p>This is the core of the reactor. To prevent the AI from rambling, we will structure our request (prompt) with the professional <strong>RISEN</strong> framework. Here is how we will constrain the <code class="language-plaintext highlighter-rouge">gemini-2.5-flash</code> model:</p>
<ul>
  <li><strong>R (Role):</strong> Act as an expert motivational life coach.</li>
  <li><strong>I (Instruction):</strong> Write an original motivational quote based on the following theme: [Theme typed by the user].</li>
  <li><strong>S (Steps):</strong> 1. Analyze the theme. 2. Find an inspiring angle. 3. Formulate the quote. 4. Attribute it to a fictional or real author.</li>
  <li><strong>E (End Goal):</strong> The reader must feel an immediate urge to take action.</li>
  <li><strong>N (Narrowing):</strong> The response MUST follow this strict format: ‘Quote - Author’. Do not exceed 20 words. Do not include any greetings.</li>
</ul>

<p>Here is exactly the final text our app will assemble, replacing the end <code class="language-plaintext highlighter-rouge">app</code> variable with the theme chosen by the user:</p>

<figure class="highlight"><pre><code class="language-text" data-lang="text">Act as an expert motivational life coach. 
Write an original motivational quote based on the following theme: [USER'S THEME]. 
1. Analyze the theme. 2. Find an inspiring angle. 3. Formulate the quote. 4. Attribute it to a fictional or real author. 
The reader must feel an immediate urge to take action. 
The response MUST follow this strict format: 'Quote - Author'. Do not exceed 20 words. Do not include any greetings.</code></pre></figure>

<h1 id="step-4-logic-and-blocks">Step 4: Logic and Blocks</h1>

<h2 id="on-screen1">On Screen1</h2>
<h3 id="blocks-overview">Blocks overview</h3>
<p><img src="/content/images/thunkable_gemini_blocks_part1.jpg" alt="Screen1 Blocks overview" style="display: block; margin: 0 auto;" /><br /></p>

<h3 id="blocks-sequence">Blocks sequence</h3>

<p><strong>Initialisation</strong></p>
<ul>
  <li>When <code class="language-plaintext highlighter-rouge">Screen1</code> opens, empty the <code class="language-plaintext highlighter-rouge">Input_Theme</code>.</li>
  <li>When clicking on <code class="language-plaintext highlighter-rouge">Btn_Inspire</code>, we must check that the <code class="language-plaintext highlighter-rouge">Text</code> in the <code class="language-plaintext highlighter-rouge">Input_Theme</code> component is not empty before executing the next steps.</li>
</ul>

<p><strong>Building the API Request:</strong></p>
<ul>
  <li>
    <p>Create a <strong>Web API</strong> component : on the left list, uncollapse “Advanced”, then click on [+] at the right side of “Web APIs”. This will replace Firebase to communicate with Google’s servers.</p>

    <ul>
      <li>Rename it to <code class="language-plaintext highlighter-rouge">Gemini</code>.</li>
      <li>Configure the API URL: set the field “URL” to <code class="language-plaintext highlighter-rouge">https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent</code>.</li>
      <li>Configure your API key:
        <ul>
          <li>Set the field “Property” to <code class="language-plaintext highlighter-rouge">key</code></li>
          <li>Paste your API key in the field “Value”.</li>
          <li>Click on [Add].</li>
        </ul>
      </li>
      <li>Setup the header:
        <ul>
          <li>Set the field “Property” to <code class="language-plaintext highlighter-rouge">Content-Type</code></li>
          <li>Set the field “Value” to <code class="language-plaintext highlighter-rouge">application/json</code>.</li>
          <li>Click on [Add].</li>
        </ul>
      </li>
      <li>Click on [Done].</li>
    </ul>
  </li>
</ul>

<p><img src="/content/images/thunkable_webapi_config.jpg" alt="WebAPI configuration" style="display: block; margin: 0 auto;" /><br /></p>

<p>The Gemini API is very strict about the data format it receives. It expects a JSON object containing a <code class="language-plaintext highlighter-rouge">contents</code> list, which itself contains a <code class="language-plaintext highlighter-rouge">parts</code> list, which finally contains the <code class="language-plaintext highlighter-rouge">text</code> attribute with our prompt. In Thunkable, the easiest way to build this request body is to use a text block.</p>

<ol>
  <li>First, create an <code class="language-plaintext highlighter-rouge">app</code> variable named <code class="language-plaintext highlighter-rouge">full_prompt</code> and use a <code class="language-plaintext highlighter-rouge">join</code> block to stick the large RISEN text block (seen in step 3) with the <code class="language-plaintext highlighter-rouge">Text</code> in the <code class="language-plaintext highlighter-rouge">Input_Theme</code> component.</li>
  <li>Grab another advanced <code class="language-plaintext highlighter-rouge">join</code> block (which allows pasting several pieces of text together).</li>
  <li>In the first box, paste exactly this beginning of JSON code: <code class="language-plaintext highlighter-rouge">{"contents": [{"parts": [{"text": "</code></li>
  <li>In the second box, drag your <code class="language-plaintext highlighter-rouge">full_prompt</code> <code class="language-plaintext highlighter-rouge">app</code> variable.</li>
  <li>In the third box, close the JSON code with: <code class="language-plaintext highlighter-rouge">"}]}]}</code></li>
  <li>Assign the whole thing to the <code class="language-plaintext highlighter-rouge">set Web_API's Body to</code> block.</li>
</ol>

<p><img src="/content/images/thunkable_prompt_building.jpg" alt="Prompt building" style="display: block; margin: 0 auto;" /></p>

<p><strong>Extracting the JSON response:</strong></p>
<ul>
  <li>Trigger the call with the <code class="language-plaintext highlighter-rouge">call Gemini's Post</code> block.</li>
  <li>The API replies with a large block of complex textual data (<code class="language-plaintext highlighter-rouge">response</code>).</li>
  <li>In the <code class="language-plaintext highlighter-rouge">then do</code> section, we will isolate the text we want by nesting several blocks, much like Russian dolls. We will assign this entire path to a new <code class="language-plaintext highlighter-rouge">citation</code> <code class="language-plaintext highlighter-rouge">app</code> variable.</li>
  <li>To fully understand this large red and blue block, read it from right to left (from the inside out):
    <ol>
      <li>We turn the raw text into a manageable object: <code class="language-plaintext highlighter-rouge">get object from JSON [response]</code>.</li>
      <li>We extract the <code class="language-plaintext highlighter-rouge">candidates</code> property.</li>
      <li>This is a list, so we grab the first item: <code class="language-plaintext highlighter-rouge">in list [...] get # 1</code>.</li>
      <li>We extract the <code class="language-plaintext highlighter-rouge">content</code> property.</li>
      <li>We extract the <code class="language-plaintext highlighter-rouge">parts</code> property.</li>
      <li>This is also a list, so we grab the first item: <code class="language-plaintext highlighter-rouge">in list [...] get # 1</code>.</li>
      <li>We finally extract the <code class="language-plaintext highlighter-rouge">text</code> property.</li>
    </ol>
  </li>
  <li><strong>Separating the quote from the author:</strong>
    <ol>
      <li>Create an <code class="language-plaintext highlighter-rouge">app liste_reponse</code> <code class="language-plaintext highlighter-rouge">app</code> variable.</li>
      <li>Assign to it the <code class="language-plaintext highlighter-rouge">make list from text</code> block (in <em>Lists</em>), using our <code class="language-plaintext highlighter-rouge">citation</code> <code class="language-plaintext highlighter-rouge">app</code> variable, and type <code class="language-plaintext highlighter-rouge">" - "</code> in the <code class="language-plaintext highlighter-rouge">delimiter</code> box.</li>
      <li>Now that our data is clean and split, finish by dragging the <code class="language-plaintext highlighter-rouge">Maps to Screen2</code> block.</li>
    </ol>
  </li>
</ul>

<p><img src="/content/images/thunkable_gemini_json_extract.jpg" alt="Web API Call and JSON parsing" style="display: block; margin: 0 auto;" /><br /></p>

<h2 id="on-screen2">On Screen2</h2>
<ol>
  <li>Update <code class="language-plaintext highlighter-rouge">Label_Quote</code> by getting the first item of this list (<code class="language-plaintext highlighter-rouge">in list get # 1</code> block).</li>
  <li>Update <code class="language-plaintext highlighter-rouge">Label_Author</code> by getting the second item (<code class="language-plaintext highlighter-rouge">in list get # 2</code> block).</li>
</ol>

<p><img src="/content/images/thunkable_gemini_blocks_part2.jpg" alt="Display the quote" style="display: block; margin: 0 auto;" /><br /></p>

<h1 id="step-5-try-it-out">Step 5: Try it out!</h1>
<p>The moment of truth has arrived.</p>
<ul>
  <li>Launch the app via <strong>Thunkable Live</strong> on your phone (or via the web preview).</li>
  <li>On the first screen, type a theme you care about in the text input (for example: “Stress management”, “Pushing your limits”, or “Learning to play guitar”).</li>
  <li>Tap <strong>Inspire me!</strong>.</li>
  <li>After a brief second (the time it takes for Google’s model to generate its response), you will automatically switch to the second screen.</li>
  <li>And there you have it! A unique, perfectly formatted quote tailored to your theme appears right before your eyes. You can just click “Go Back” to try with a new idea!</li>
</ul>

<h1 id="conclusion">Conclusion</h1>

<p>Congratulations! You have just created a mobile app capable of generating endless content using artificial intelligence. The limits of <em>no-code</em> are being pushed every day, and now is the perfect time to experiment.</p>

<p>Feel free to modify the RISEN prompt to create a recipe generator, a poem creator, or even an interactive quiz. The floor is yours!</p>]]></content><author><name>Geoff RÉAU</name><email>contact@reau.ca</email></author><category term="Tutorials" /><category term="No-Code" /><category term="Artificial Intelligence" /><category term="Thunkable" /><category term="Gemini" /><category term="API" /><category term="Mobile Development" /><category term="Tutorial" /><category term="No-Code" /><category term="Prompt Engineering" /><summary type="html"><![CDATA[In the first part of this tutorial, we connected our mobile prototype to a Firebase database. This is a great practice, especially relevant if you plan to transition to coding with frameworks like React Native later on. However, this approach keeps us dependent on a pre-filled database. Today, we are shifting into high gear. After 20 years in the IT industry, I am still fascinated by how easily we can now integrate artificial intelligence into an app with just a few clicks. We are going to replace our static database with the Google Gemini API to generate 100% custom quotes on the fly!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.reau.ca/content/images/thunkable-gemini-tuto.jpg" /><media:content medium="image" url="https://www.reau.ca/content/images/thunkable-gemini-tuto.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="fr"><title type="html">Tuto Thunkable (2/2) : Rendre son application mobile intelligente avec l’API Gemini</title><link href="https://www.reau.ca/2026/03/18/thunkable-tuto-partie-2.html" rel="alternate" type="text/html" title="Tuto Thunkable (2/2) : Rendre son application mobile intelligente avec l’API Gemini" /><published>2026-03-18T10:00:00+00:00</published><updated>2026-03-18T10:00:00+00:00</updated><id>https://www.reau.ca/2026/03/18/thunkable-tuto-partie-2</id><content type="html" xml:base="https://www.reau.ca/2026/03/18/thunkable-tuto-partie-2.html"><![CDATA[<p><img src="/content/images/thunkable-tuto-part2.jpg" alt="Tuto Thunkable - Intégrer Gemini API" style="display: block; margin: 0 auto;" /></p>

<p>Dans <strong><a href="/2026/03/13/thunkable-tuto-part-1.html">la première partie de ce tutoriel</a></strong>, nous avons connecté notre prototype mobile à une base de données Firebase. C’est une excellente pratique, particulièrement pertinente si vous envisagez de basculer plus tard sur du développement avec des frameworks comme React Native. Cependant, cette approche nous rend dépendants d’une base de données pré-remplie.</p>

<p>Aujourd’hui, on passe à la vitesse supérieure. Après 20 ans dans l’industrie des TI, je suis toujours fasciné par la façon dont on peut désormais intégrer de l’intelligence artificielle dans une application en quelques clics. Nous allons remplacer notre base statique par l’API de Google Gemini pour générer des citations 100% sur mesure, à la volée !
<!--more--></p>

<hr />
<p><strong><em>Avant-propos</em></strong>: <em>Cet article, augmenté d’améliorations générées avec des IA (<a href="https://gemini.google.com/">Google Gemini</a>), est mis à disposition au travers de la license</em> <span xmlns:cc="http://creativecommons.org/ns#"><i><a href="https://creativecommons.org/licenses/by-nd/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">CC BY-ND 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nd.svg?ref=chooser-v1" alt="" /></a></i></span></p>

<hr />

<h1 id="étape-1--obtenir-les-clés-du-cerveau-google-ai-studio">Étape 1 : Obtenir les clés du cerveau (Google AI Studio)</h1>
<p>Pour parler à Gemini depuis notre application, il nous faut un laissez-passer : une clé d’API.</p>
<ul>
  <li>Rendez-vous sur <a href="https://aistudio.google.com/">Google AI Studio</a>.</li>
  <li>Connectez-vous avec votre compte Google.</li>
  <li>Dans le menu de gauche, cliquez sur <strong>Get API key</strong> puis sur le bouton <strong>Create API key</strong>.</li>
</ul>

<p><img src="/content/images/gemini_api_keygen.jpg" alt="Générer une clé API sur Google AI Studio" style="display: block; margin: 0 auto;" /><br /></p>

<ul>
  <li>Une fois la clé d’API créée, cliquez dessus pour l’afficher.</li>
  <li>Copiez cette longue suite de caractères et gardez-la précieusement (ne la partagez jamais publiquement).
<img src="/content/images/gemini_api_key.jpg" alt="Afficher une clé API sur Google AI Studio" style="display: block; margin: 0 auto;" /><br /></li>
</ul>

<h1 id="étape-2--adapter-le-design-de-motivapp">Étape 2 : Adapter le Design de MotivApp</h1>
<p>Reprenons notre projet Thunkable là où nous l’avons laissé. Nous allons ajouter un peu d’interactivité.</p>
<ul>
  <li><strong>Sur le Screen1 (Accueil) :</strong> Ajoutez un composant <strong>Text Input</strong> juste au-dessus du bouton “Inspire-moi !”. Modifiez son paramètre <em>Hint</em> (indice) pour afficher : “Entrez un thème (ex: Le sport, Le code…)”. Renommez ce composant <code class="language-plaintext highlighter-rouge">Input_Theme</code>.
<img src="/content/images/thunkable_gemini_design.jpg" alt="Design mis à jour avec le champ texte" style="display: block; margin: 0 auto;" /><br /></li>
</ul>

<h1 id="étape-3--le-prompt-engineering-avec-risen">Étape 3 : Le Prompt Engineering avec RISEN</h1>
<p>C’est le cœur du réacteur. Pour éviter que l’IA ne divague, nous allons structurer notre requête (prompt) avec le framework professionnel <strong>RISEN</strong>. Voici comment nous allons contraindre le modèle <code class="language-plaintext highlighter-rouge">gemini-2.5-flash</code> :</p>
<ul>
  <li><strong>R (Role) :</strong> Agis comme un coach de vie expert en motivation.</li>
  <li><strong>I (Instruction) :</strong> Écris une citation motivante inédite basée sur le thème suivant : [Thème tapé par l’utilisateur].</li>
  <li><strong>S (Steps) :</strong> 1. Analyse le thème. 2. Trouve un angle inspirant. 3. Formule la citation. 4. Attribue-la à un auteur fictif ou réel.</li>
  <li><strong>E (End Goal) :</strong> Le lecteur doit ressentir une envie immédiate de passer à l’action.</li>
  <li><strong>N (Narrowing) :</strong> La réponse DOIT suivre ce format strict : ‘Citation - Auteur’. Ne dépasse pas 20 mots. N’inclus aucune salutation.</li>
</ul>

<p>Voici exactement le texte final que notre application va assembler, en remplaçant la <code class="language-plaintext highlighter-rouge">app</code> variable de fin par le thème choisi par l’utilisateur :</p>

<figure class="highlight"><pre><code class="language-text" data-lang="text">Agis comme un coach de vie expert en motivation. 
Écris une citation motivante inédite basée sur le thème suivant : [THÈME DE L'UTILISATEUR]. 
1. Analyse le thème. 2. Trouve un angle inspirant. 3. Formule la citation. 4. Attribue-la à un auteur fictif ou réel. 
Le lecteur doit ressentir une envie immédiate de passer à l'action. 
La réponse DOIT suivre ce format strict : 'Citation - Auteur'. Ne dépasse pas 20 mots. N'inclus aucune salutation.</code></pre></figure>

<h1 id="étape-4--la-logique-et-les-blocs">Étape 4 : La Logique et les Blocs</h1>

<h2 id="sur-le-screen1">Sur le Screen1</h2>
<h3 id="aperçu-des-blocs">Aperçu des blocs</h3>
<p><img src="/content/images/thunkable_gemini_blocks_part1.jpg" alt="Aperçu des blocs du Screen1" style="display: block; margin: 0 auto;" /><br /></p>

<h3 id="séquence-des-blocs">Séquence des blocs</h3>

<p><strong>Initialisation</strong></p>
<ul>
  <li>À l’ouverture du <code class="language-plaintext highlighter-rouge">Screen1</code>, videz le champ <code class="language-plaintext highlighter-rouge">Input_Theme</code>.</li>
  <li>Lors du clic sur <code class="language-plaintext highlighter-rouge">Btn_Inspire</code>, nous devons vérifier que le texte <code class="language-plaintext highlighter-rouge">Text</code> du composant <code class="language-plaintext highlighter-rouge">Input_Theme</code> n’est pas vide avant d’exécuter les étapes suivantes.</li>
</ul>

<p><strong>Construire la requête API :</strong></p>
<ul>
  <li>
    <p>Créez un composant <strong>Web API</strong> : dans la liste de gauche, déroulez “Advanced”, puis cliquez sur le [+] à droite de “Web APIs”. C’est lui qui remplacera Firebase pour dialoguer avec les serveurs de Google.</p>

    <ul>
      <li>Renommez-le en <code class="language-plaintext highlighter-rouge">Gemini</code>.</li>
      <li>Configurez l’URL de l’API : définissez le champ “URL” à <code class="language-plaintext highlighter-rouge">https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent</code>.</li>
      <li>Configurez votre clé d’API :
        <ul>
          <li>Définissez le champ “Property” à <code class="language-plaintext highlighter-rouge">key</code>.</li>
          <li>Collez votre clé d’API dans le champ “Value”.</li>
          <li>Cliquez sur [Add].</li>
        </ul>
      </li>
      <li>Configurez l’en-tête (header) :
        <ul>
          <li>Définissez le champ “Property” à <code class="language-plaintext highlighter-rouge">Content-Type</code>.</li>
          <li>Tapez <code class="language-plaintext highlighter-rouge">application/json</code> dans le champ “Value”.</li>
          <li>Cliquez sur [Add].</li>
        </ul>
      </li>
      <li>Cliquez sur [Done].</li>
    </ul>
  </li>
</ul>

<p><img src="/content/images/thunkable_webapi_config.jpg" alt="Configuration de la WebAPI" style="display: block; margin: 0 auto;" /><br /></p>

<p>L’API de Gemini est très stricte sur le format des données qu’elle reçoit. Elle attend un objet JSON contenant une liste <code class="language-plaintext highlighter-rouge">contents</code>, qui contient elle-même une liste <code class="language-plaintext highlighter-rouge">parts</code>, qui contient enfin l’attribut <code class="language-plaintext highlighter-rouge">text</code> avec notre prompt. Dans Thunkable, la façon la plus simple de construire ce corps de requête (le <em>Body</em>) est d’utiliser un bloc de texte.</p>

<ol>
  <li>D’abord, créez une <code class="language-plaintext highlighter-rouge">app</code> variable <code class="language-plaintext highlighter-rouge">full_prompt</code> et utilisez un bloc <code class="language-plaintext highlighter-rouge">join</code> pour y coller le gros bloc de texte RISEN (vu à l’étape 3) avec le texte <code class="language-plaintext highlighter-rouge">Text</code> du composant <code class="language-plaintext highlighter-rouge">Input_Theme</code>.</li>
  <li>Prenez un autre bloc de texte avancé <code class="language-plaintext highlighter-rouge">join</code> (qui permet de coller plusieurs morceaux de texte ensemble).</li>
  <li>Dans la première case, collez exactement ce début de code JSON : <code class="language-plaintext highlighter-rouge">{"contents": [{"parts": [{"text": "</code></li>
  <li>Dans la deuxième case, glissez votre <code class="language-plaintext highlighter-rouge">app</code> variable <code class="language-plaintext highlighter-rouge">full_prompt</code>.</li>
  <li>Dans la troisième case, fermez le code JSON avec : <code class="language-plaintext highlighter-rouge">"}]}]}</code></li>
  <li>Assignez le tout au bloc <code class="language-plaintext highlighter-rouge">set Web_API's Body to</code>.</li>
</ol>

<p><img src="/content/images/thunkable_prompt_building.jpg" alt="Construction du prompt" style="display: block; margin: 0 auto;" /></p>

<p><strong>Extraire la réponse JSON :</strong></p>
<ul>
  <li>Lancez l’appel avec le bloc <code class="language-plaintext highlighter-rouge">call Gemini's Post</code>.</li>
  <li>L’API nous répond avec un gros bloc de données textuelles complexes (<code class="language-plaintext highlighter-rouge">response</code>).</li>
  <li>Dans la section <code class="language-plaintext highlighter-rouge">then do</code>, nous allons isoler le texte qui nous intéresse en imbriquant plusieurs blocs, un peu comme des poupées russes. Nous allons assigner tout ce cheminement à une nouvelle <code class="language-plaintext highlighter-rouge">app</code> variable <code class="language-plaintext highlighter-rouge">citation</code>.</li>
  <li>Pour bien comprendre ce grand bloc rouge et bleu, lisez-le de droite à gauche (de l’intérieur vers l’extérieur) :
    <ol>
      <li>On transforme le texte brut en objet manipulable : <code class="language-plaintext highlighter-rouge">get object from JSON [response]</code>.</li>
      <li>On extrait la propriété <code class="language-plaintext highlighter-rouge">candidates</code>.</li>
      <li>C’est une liste, on prend le premier élément : <code class="language-plaintext highlighter-rouge">in list [...] get # 1</code>.</li>
      <li>On extrait la propriété <code class="language-plaintext highlighter-rouge">content</code>.</li>
      <li>On extrait la propriété <code class="language-plaintext highlighter-rouge">parts</code>.</li>
      <li>C’est aussi une liste, on prend le premier élément : <code class="language-plaintext highlighter-rouge">in list [...] get # 1</code>.</li>
      <li>On extrait enfin la propriété <code class="language-plaintext highlighter-rouge">text</code>.</li>
    </ol>
  </li>
  <li><strong>Séparer la citation de l’auteur :</strong> 1. Créez une <code class="language-plaintext highlighter-rouge">app</code> variable <code class="language-plaintext highlighter-rouge">liste_reponse</code>.
    <ol>
      <li>Assignez-lui le bloc <code class="language-plaintext highlighter-rouge">make list from text</code> (dans <em>Lists</em>), en utilisant notre <code class="language-plaintext highlighter-rouge">app</code> variable <code class="language-plaintext highlighter-rouge">citation</code>, et tapez <code class="language-plaintext highlighter-rouge">" - "</code> dans la case <code class="language-plaintext highlighter-rouge">delimiter</code>.</li>
      <li>Maintenant que nos données sont propres et découpées, terminez en glissant le bloc <code class="language-plaintext highlighter-rouge">Navigate to Screen2</code>.</li>
    </ol>
  </li>
</ul>

<p><img src="/content/images/thunkable_gemini_json_extract.jpg" alt="Appel Web API et parsing JSON" style="display: block; margin: 0 auto;" /><br /></p>

<h2 id="sur-le-screen2">Sur le Screen2</h2>
<ol>
  <li>Mettez à jour le <code class="language-plaintext highlighter-rouge">Label_Quote</code> en allant chercher le premier élément de cette liste (bloc <code class="language-plaintext highlighter-rouge">in list get # 1</code>).</li>
  <li>Mettez à jour le <code class="language-plaintext highlighter-rouge">Label_Author</code> en allant chercher le deuxième élément (bloc <code class="language-plaintext highlighter-rouge">in list get # 2</code>).</li>
</ol>

<p><img src="/content/images/thunkable_gemini_blocks_part2.jpg" alt="Affichage de la citation" style="display: block; margin: 0 auto;" /><br /></p>

<h1 id="étape-5--essayez-">Étape 5 : Essayez !</h1>
<p>Le moment de vérité est arrivé.</p>
<ul>
  <li>Lancez l’application via <strong>Thunkable Live</strong> sur votre téléphone (ou via l’aperçu Web de la plateforme).</li>
  <li>Sur le premier écran, tapez un thème qui vous inspire dans le champ de texte (par exemple : “La gestion du stress”, “Le dépassement de soi” ou “L’apprentissage de la guitare”).</li>
  <li>Appuyez sur <strong>Inspire-moi !</strong>.</li>
  <li>Après une brève seconde (le temps que le modèle de Google génère sa réponse), vous basculez automatiquement sur le deuxième écran.</li>
  <li>Et voilà ! Une citation unique, parfaitement formatée et taillée sur mesure pour votre thème s’affiche sous vos yeux. Vous n’avez plus qu’à cliquer sur “Retour” pour tester avec une nouvelle idée !</li>
</ul>

<h1 id="conclusion">Conclusion</h1>

<p>Félicitations ! Vous venez de créer une application mobile capable de générer du contenu à l’infini grâce à l’intelligence artificielle. Les limites du <em>no-code</em> sont repoussées tous les jours, et c’est le moment idéal pour expérimenter.</p>

<p>N’hésitez pas à modifier le prompt RISEN pour créer un générateur de recettes de cuisine, un créateur de poèmes ou même un quiz interactif. À vous de jouer !</p>]]></content><author><name>Geoff RÉAU</name><email>contact@reau.ca</email></author><category term="Tutorials" /><category term="No-Code" /><category term="Artificial Intelligence" /><category term="Thunkable" /><category term="Gemini" /><category term="API" /><category term="Développement Mobile" /><category term="Tutoriel" /><category term="No-Code" /><category term="Prompt Engineering" /><summary type="html"><![CDATA[Dans la première partie de ce tutoriel, nous avons connecté notre prototype mobile à une base de données Firebase. C’est une excellente pratique, particulièrement pertinente si vous envisagez de basculer plus tard sur du développement avec des frameworks comme React Native. Cependant, cette approche nous rend dépendants d’une base de données pré-remplie. Aujourd’hui, on passe à la vitesse supérieure. Après 20 ans dans l’industrie des TI, je suis toujours fasciné par la façon dont on peut désormais intégrer de l’intelligence artificielle dans une application en quelques clics. Nous allons remplacer notre base statique par l’API de Google Gemini pour générer des citations 100% sur mesure, à la volée !]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.reau.ca/content/images/thunkable-gemini-tuto.jpg" /><media:content medium="image" url="https://www.reau.ca/content/images/thunkable-gemini-tuto.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">Thunkable Tuto (1/2): Create a Cloud-connected mobile app with Firebase, no-code</title><link href="https://www.reau.ca/2026/03/13/thunkable-tuto-part-1.html" rel="alternate" type="text/html" title="Thunkable Tuto (1/2): Create a Cloud-connected mobile app with Firebase, no-code" /><published>2026-03-13T10:00:00+00:00</published><updated>2026-03-13T10:00:00+00:00</updated><id>https://www.reau.ca/2026/03/13/thunkable-tuto-part-1</id><content type="html" xml:base="https://www.reau.ca/2026/03/13/thunkable-tuto-part-1.html"><![CDATA[<p><img src="/content/images/thunkable-tuto-part1.jpg" alt="Thunkable Tuto - Cloud-connected mobile app with Firebase" style="display: block; margin: 0 auto;" /></p>

<p>Starting this year, I have the opportunity to act as a mentor for the Technovation Montreal program. Seeing teams go from a simple idea to a functional mobile prototype in just a few weeks reminded me of one key thing: <em>no-code</em> is an absolutely fantastic driver of innovation.</p>

<p>Even when you aim to develop mobile apps from scratch using advanced frameworks like React Native, leveraging these visual platforms allows you to validate a backend architecture and an interface logic in a flash 🙂</p>

<p>To put my money where my mouth is, I’m proposing a new two-part tutorial series to build a dynamic, Cloud-connected iOS/Android mobile app, without writing a single line of traditional code.
<!--more--></p>

<hr />
<p><strong><em>Foreword</em></strong>: <em>This article, enhanced with improvements generated by AI (<a href="https://gemini.google.com/">Google Gemini</a>), is made available under the</em> <span xmlns:cc="http://creativecommons.org/ns#"><i><a href="https://creativecommons.org/licenses/by-nd/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">CC BY-ND 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nd.svg?ref=chooser-v1" alt="" /></a></i></span></p>

<hr />

<h1 id="whats-the-game-plan">What’s the game plan?</h1>
<p>The goal of this mini-series is to build a mobile app by progressively integrating professional concepts. Here is our roadmap:</p>
<ol>
  <li><strong>Today:</strong> Create the interface for a “Motivational Quotes” app (MotivApp) using <a href="https://thunkable.com/">Thunkable</a>, and connect it to a real, real-time Cloud database with <a href="https://firebase.google.com/">Firebase</a>.</li>
  <li><strong>Part 2:</strong> Make the app smart by replacing our database with calls to the Google Gemini API to generate unique quotes on the fly 🚀</li>
</ol>

<h1 id="15-minutes-flat-to-prototype-our-app">15 minutes flat to prototype our app!</h1>

<p>Our application will feature two screens: a home screen with an “Inspire me!” button, and a display screen that will randomly pull a quote stored in the Cloud.</p>

<h2 id="step-1-prepare-the-backend-with-firebase">Step 1: Prepare the backend with Firebase</h2>
<p>Firebase is Google’s platform that provides ready-to-use backend services. We are going to use its <strong>Realtime Database</strong>.</p>

<ol>
  <li>Log into the <a href="https://console.firebase.google.com/">Firebase Console</a> with a Google account and click on <strong>Create a project</strong> (name it <em>MotivApp</em>).</li>
  <li>In the left menu, go to <strong>Databases &amp; Storage</strong> &gt; <strong>Realtime Database</strong> and click on <strong>Create database</strong>. Choose the test mode to start easily.</li>
  <li>In the <strong>Data</strong> tab, we will structure our database with unique identifiers to make it robust. Click on the three little dots to the right of your database URL, choose <strong>Import JSON</strong>, and import a file containing this:</li>
</ol>

<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"quotes"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"quote_001"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Success is falling nine times and getting up ten."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"author"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Japanese Proverb"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"quote_002"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Make your life a dream, and a dream a reality."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"author"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Antoine de Saint-Exupéry"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"quote_003"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Innovation distinguishes between a leader and a follower."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"author"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Steve Jobs"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre></figure>

<p><img src="/content/images/firebase_rtdb_setup_en.jpg" alt="JSON structure in Firebase" style="display: block; margin: 0 auto;" /><br /></p>

<p><em>Keep your database URL and your Web API key (available in the Firebase project settings) handy, we’ll need them in Thunkable!</em></p>

<p>The easiest way to find your API key is to:</p>

<ol>
  <li>Go to the Project overview page in the Firebase console.</li>
  <li>Click on the button [+ Add app]</li>
  <li>Click on the button &lt;/&gt; to add a Web app.</li>
  <li>Put <em>MotivApp</em> as app nickname, then click on [Register app].</li>
  <li>You’ll get a pop up with the values you need.</li>
</ol>

<p><img src="/content/images/firebase_api_key.jpg" alt="Diplaying API key in Firebase console" style="display: block; margin: 0 auto;" /><br /></p>

<h2 id="step-2-the-design-visual-interface">Step 2: The Design (Visual Interface)</h2>

<p>Create a free account on <a href="https://x.thunkable.com/signup">Thunkable</a> and start a new project :</p>
<ul>
  <li>On the main screen, you’ll have a prompt box.</li>
  <li>At the bottom of that prompt box, find the line “Prefer to start from scratch?” then click on <u>Create Blank Project</u>”.</li>
</ul>

<p><img src="/content/images/thunkable_pbox.jpg" alt="Thunkable Prompt Box" style="display: block; margin: 0 auto;" /><br /></p>

<ul>
  <li>Put <em>MotivApp</em> as Project name, select <em>Health &amp; Fitness</em>, make sure that <em>Use the Drag and Drop Builder</em> is selected.</li>
  <li>Click on [Create].</li>
</ul>

<p><img src="/content/images/thunkable_app_def.jpg" alt="Thunkable App definition" style="display: block; margin: 0 auto;" /><br /></p>

<p><strong>On Screen1 (Home):</strong></p>
<ol>
  <li>Drag a <strong>Label</strong> component to the center of the screen with the text “Welcome to MotivApp!”. Center text and change font zsize using the options in the left tree view.</li>
  <li>Drag a <strong>Button</strong> component below it. Change its text to “Inspire me!”. Rename this component to <code class="language-plaintext highlighter-rouge">Btn_Inspire</code> in the left tree view.</li>
</ol>

<p><img src="/content/images/thunkable_screen_1.jpg" alt="Screen 1 of the MotivApp application" style="display: block; margin: 0 auto;" /><br /></p>

<p><strong>On Screen2 (Quote):</strong></p>
<ol>
  <li>Add a second screen (<code class="language-plaintext highlighter-rouge">Screen2</code>).</li>
  <li>Drag two <strong>Labels</strong> one below the other. The first one (main text) will be renamed <code class="language-plaintext highlighter-rouge">Label_Quote</code>, the second one (smaller, for the author) will be <code class="language-plaintext highlighter-rouge">Label_Author</code>.</li>
  <li>Drag a <strong>Button</strong> below with the text “Go Back” (<code class="language-plaintext highlighter-rouge">Btn_GoBack</code>).</li>
  <li><strong>Connect your Realtime Database</strong>
    <ul>
      <li>In your Thunkable tab, click the Settings gear icon in the sidebar.</li>
      <li>Scroll to the Firebase section and paste the “apiKey” into the “Firebase API Key” field.</li>
      <li>Still in the Firebase section, paste the “databaseURL” into the “Database URL” field.</li>
    </ul>
  </li>
</ol>

<p><img src="/content/images/thunkable_screen_2.jpg" alt="Screen 1 of the MotivApp application" style="display: block; margin: 0 auto;" /><br /></p>

<h2 id="step-3-the-logic-blocks">Step 3: The Logic (Blocks)</h2>
<p>Switch from the <strong>Design</strong> tab to the <strong>Blocks</strong> tab. This is where the magic happens!</p>

<p><strong>Screen1 Logic:</strong></p>
<ul>
  <li>Grab the <code class="language-plaintext highlighter-rouge">when Btn_Inspire Clicks do</code> block and drag the <code class="language-plaintext highlighter-rouge">Navigate to Screen2</code> block inside it.</li>
</ul>

<p><strong>Screen2 Logic (Extracting JSON data):</strong>
Here, we need to retrieve our dictionary of quotes, pick one at random, and then isolate its text and author.</p>

<ol>
  <li>Go to <em>Variables</em> and grab the <code class="language-plaintext highlighter-rouge">initialize cloud variable name</code> block. Name it <code class="language-plaintext highlighter-rouge">"quotes"</code> (this must <em>exactly</em> match the root node name of our JSON in Firebase so Thunkable syncs it automatically).</li>
  <li>Grab the <code class="language-plaintext highlighter-rouge">when Screen2 Opens do</code> block.</li>
  <li>Inside, we’ll first list our keys. Create a temporary variable <code class="language-plaintext highlighter-rouge">random_key</code>. Assign to it the <code class="language-plaintext highlighter-rouge">random item of list</code> block. The list to provide will be generated by the <code class="language-plaintext highlighter-rouge">get object properties of</code> block (in the <em>Objects</em> category) applied to our <code class="language-plaintext highlighter-rouge">quotes</code> cloud variable.</li>
  <li>Now that we have a random key (e.g., <em>quote_002</em>), let’s create a <code class="language-plaintext highlighter-rouge">chosen_quote</code> variable. Assign to it the property (<code class="language-plaintext highlighter-rouge">get property of object</code> block) corresponding to <code class="language-plaintext highlighter-rouge">random_key</code> extracted from our <code class="language-plaintext highlighter-rouge">cloud quotes</code> object.</li>
  <li>Finally, update your labels! Assign the <code class="language-plaintext highlighter-rouge">"text"</code> property of the <code class="language-plaintext highlighter-rouge">chosen_quote</code> object to <code class="language-plaintext highlighter-rouge">Label_Quote</code>, and its <code class="language-plaintext highlighter-rouge">"author"</code> property to <code class="language-plaintext highlighter-rouge">Label_Author</code>.</li>
  <li>Grab the <code class="language-plaintext highlighter-rouge">when Btn_Inspire Clicks do</code> block and drag the <code class="language-plaintext highlighter-rouge">Navigate to Screen1</code> block inside it.</li>
</ol>

<p><img src="/content/images/thunkable_firebase_blocks_en.jpg" alt="Thunkable logic blocks with Firebase" style="display: block; margin: 0 auto;" /><br /></p>

<h2 id="step-4-test-the-beast">Step 4: Test the beast!</h2>
<p>No need to compile!</p>
<ul>
  <li>Download the <strong>Thunkable Live</strong> app on your smartphone (iOS or Android).</li>
  <li>Log in with your account. Tap your project and test: you should see a new quote pulled directly from your Cloud database with every try 😉</li>
</ul>

<hr />

<h2 id="conclusion">Conclusion</h2>

<p>And there you have it! You’ve created a real mobile app connected to a professional backend. The huge advantage of this architecture is that you can now add, edit, or delete quotes directly from the Firebase console, and your users’ app will update instantly, without them having to re-download it.</p>

<p>But why stop there? In <strong><a href="2026/03/18/thunkable-tuto-part-2.html">part 2 of this tutorial</a></strong>, we will replace our Firebase database with the Gemini artificial intelligence API. Our app will no longer just read quotes, it will invent them on demand! Stay tuned.</p>]]></content><author><name>Geoff RÉAU</name><email>contact@reau.ca</email></author><category term="Tutorials" /><category term="No-Code" /><category term="Thunkable" /><category term="Firebase" /><category term="Mobile Development" /><category term="Tutorial" /><category term="App" /><category term="No-Code" /><summary type="html"><![CDATA[Starting this year, I have the opportunity to act as a mentor for the Technovation Montreal program. Seeing teams go from a simple idea to a functional mobile prototype in just a few weeks reminded me of one key thing: no-code is an absolutely fantastic driver of innovation. Even when you aim to develop mobile apps from scratch using advanced frameworks like React Native, leveraging these visual platforms allows you to validate a backend architecture and an interface logic in a flash 🙂 To put my money where my mouth is, I’m proposing a new two-part tutorial series to build a dynamic, Cloud-connected iOS/Android mobile app, without writing a single line of traditional code.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.reau.ca/content/images/thunkable-tuto-part1.jpg" /><media:content medium="image" url="https://www.reau.ca/content/images/thunkable-tuto-part1.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="fr"><title type="html">Tuto Thunkable (1/2) : Créer une app mobile connectée au Cloud avec Firebase, sans coder</title><link href="https://www.reau.ca/2026/03/13/thunkable-tuto-partie-1.html" rel="alternate" type="text/html" title="Tuto Thunkable (1/2) : Créer une app mobile connectée au Cloud avec Firebase, sans coder" /><published>2026-03-13T10:00:00+00:00</published><updated>2026-03-13T10:00:00+00:00</updated><id>https://www.reau.ca/2026/03/13/thunkable-tuto-partie-1</id><content type="html" xml:base="https://www.reau.ca/2026/03/13/thunkable-tuto-partie-1.html"><![CDATA[<p><img src="/content/images/thunkable-tuto-part1.jpg" alt="Tuto Thunkable - App mobile connectée avec Firebase" style="display: block; margin: 0 auto;" /></p>

<p>Depuis cette année, j’ai l’occasion d’agir comme mentor pour le programme Technovation Montréal. Voir des équipes passer d’une simple idée à un prototype mobile fonctionnel en quelques semaines m’a rappelé une chose essentielle : le <em>no-code</em> est un levier d’innovation absolument fantastique.</p>

<p>Même lorsque l’on ambitionne de développer soi-même des applications mobiles de A à Z avec des frameworks avancés comme React Native, passer par ces plateformes visuelles permet de valider une architecture backend et une logique d’interface en un éclair 🙂</p>

<p>Pour joindre le geste à la parole, je vous propose une nouvelle série de deux tutoriels pour créer une application mobile iOS/Android dynamique et connectée au Cloud, sans écrire une seule ligne de code classique.
<!--more--></p>

<hr />
<p><strong><em>Avant-propos</em></strong>: <em>Cet article, augmenté d’améliorations générées avec des IA (<a href="https://gemini.google.com/">Google Gemini</a>), est mis à disposition au travers de la license</em> <span xmlns:cc="http://creativecommons.org/ns#"><i><a href="https://creativecommons.org/licenses/by-nd/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">CC BY-ND 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt="" /><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nd.svg?ref=chooser-v1" alt="" /></a></i></span></p>

<hr />

<h1 id="cest-quoi-le-plan-de-match-">C’est quoi le plan de match ?</h1>
<p>L’objectif de cette mini-série est de construire une application mobile en y intégrant progressivement des concepts professionnels. Voici notre feuille de route :</p>
<ol>
  <li><strong>Aujourd’hui :</strong> Créer l’interface d’une application de “Citations Motivantes” (MotivApp) avec <a href="https://thunkable.com/">Thunkable</a>, et la connecter à une vraie base de données Cloud en temps réel avec <a href="https://firebase.google.com/">Firebase</a>.</li>
  <li><strong>Partie 2 :</strong> Rendre l’application intelligente en remplaçant notre base de données par des requêtes à l’API de Google Gemini pour générer des citations uniques à la volée 🚀</li>
</ol>

<h1 id="15-minutes-chrono-pour-prototyper-notre-application-">15 minutes chrono pour prototyper notre application !</h1>

<p>Notre application comportera deux écrans : un écran d’accueil avec un bouton “Inspire-moi !”, et un écran d’affichage qui ira piocher aléatoirement une citation stockée dans le Cloud.</p>

<h2 id="étape-1--préparer-le-backend-avec-firebase">Étape 1 : Préparer le backend avec Firebase</h2>
<p>Firebase est la plateforme de Google qui fournit des services backend prêts à l’emploi. Nous allons utiliser sa <strong>Realtime Database</strong>.</p>

<ol>
  <li>Connectez-vous à la <a href="https://console.firebase.google.com/">Console Firebase</a> avec un compte Google et cliquez sur <strong>Créer un projet</strong> (nommez-le <em>MotivApp</em>).</li>
  <li>Dans le menu de gauche, allez dans <strong>Bases de données et stockage d’objets</strong> &gt; <strong>Realtime Database</strong> et cliquez sur <strong>Créer une base de données</strong>. Sélectionner la région la plus proche de vous, puis choisissez le mode test pour commencer facilement.</li>
  <li>Dans l’onglet <strong>Données</strong>, nous allons structurer notre base avec des identifiants uniques pour que ce soit robuste. Cliquez sur les trois petits points à droite de l’URL de votre base, choisissez <strong>Importer un fichier JSON</strong>, et importez un fichier contenant ceci :</li>
</ol>

<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
  </span><span class="nl">"citations"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"quote_001"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"texte"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Le succès, c'est tomber sept fois, se relever huit."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"auteur"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Proverbe japonais"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"quote_002"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"texte"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Faites que le rêve dévore votre vie..."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"auteur"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Antoine de Saint-Exupéry"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"quote_003"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"texte"</span><span class="p">:</span><span class="w"> </span><span class="s2">"L'innovation distingue le leader du suiveur."</span><span class="p">,</span><span class="w">
      </span><span class="nl">"auteur"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Steve Jobs"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre></figure>

<p><img src="/content/images/firebase_rtdb_setup.jpg" alt="Structure JSON dans Firebase" style="display: block; margin: 0 auto;" /><br /></p>

<p><em>Gardez l’URL de votre base de données et votre clé d’API web sous la main, nous en aurons besoin dans Thunkable !</em></p>

<p>La manière la plus simple de trouver votre clé API et l’URL de votre base est de :</p>

<ol>
  <li>Se rendre sur la page Vue d’ensemble du projet dans la console Firebase.</li>
  <li>Cliquer sur le bouton [+ Ajouter une application]</li>
  <li>Cliquer sur le bouton &lt;/&gt; pour ajouter une application web.</li>
  <li>Mettez <em>MotivApp</em> en pseudo d’application, puis cliquer sur [Enregistrer l’application].</li>
  <li>Une fenêtre contextuelle s’affichera avec toutes les valeurs dont vous avez besoin.
<img src="/content/images/firebase_api_key.jpg" alt="Affichage de la clé API et de l'URL de la base de données dans la console Firebase" style="display: block; margin: 0 auto;" /><br /></li>
</ol>

<h2 id="étape-2--le-design-interface-visuelle">Étape 2 : Le Design (Interface Visuelle)</h2>

<p>Créez un compte gratuit sur <a href="https://x.thunkable.com/signup">Thunkable</a> et démarrez un nouveau projet:</p>
<ul>
  <li>Sur l’écran principal, vous trouverez une zone de saisie (prompt box).</li>
  <li>Au bas de cette zone, repérez la mention « Prefer to start from scratch? » puis cliquez sur <u>Create Blank Project</u>.</li>
</ul>

<p><img src="/content/images/thunkable_pbox.jpg" alt="Thunkable Prompt Box" style="display: block; margin: 0 auto;" /><br /></p>

<ul>
  <li>Saisissez <em>MotivApp</em> comme nom de projet (Project name), sélectionnez <em>Health &amp; Fitness</em>, et assurez-vous que l’option <em>Use the Drag and Drop Builder</em> est bien cochée.</li>
  <li>Cliquez sur [Create].</li>
</ul>

<p><img src="/content/images/thunkable_app_def.jpg" alt="Thunkable App definition" style="display: block; margin: 0 auto;" /><br /></p>

<p><strong>Sur le Screen1 (Accueil) :</strong></p>
<ol>
  <li>Glissez un composant <strong>Label</strong> au centre de l’écran avec le texte “Bienvenue sur MotivApp !”. Centrez le texte et changer la taille de police dans l’arborescence à gauche.</li>
  <li>Glissez un composant <strong>Button</strong> en dessous. Changez son texte pour “Inspire-moi !”. Renommez ce composant <code class="language-plaintext highlighter-rouge">Btn_Inspire</code> dans l’arborescence à gauche.</li>
</ol>

<p><img src="/content/images/thunkable_screen_1.jpg" alt="Écran 1 de l'application MotivApp" style="display: block; margin: 0 auto;" /><br /></p>

<p><strong>Sur le Screen2 (Citation) :</strong></p>
<ol>
  <li>Ajoutez un deuxième écran (<code class="language-plaintext highlighter-rouge">Screen2</code>).</li>
  <li>Glissez deux <strong>Labels</strong> l’un sous l’autre. Le premier (texte principal) sera renommé <code class="language-plaintext highlighter-rouge">Label_Quote</code>, le second (plus petit, pour l’auteur) sera <code class="language-plaintext highlighter-rouge">Label_Author</code>.</li>
  <li>Glissez un <strong>Button</strong> en dessous avec le texte “Retour” (<code class="language-plaintext highlighter-rouge">Btn_Retour</code>).</li>
  <li><strong>Connectez votre Realtime Database</strong>
    <ul>
      <li>Dans votre onglet Thunkable, cliquez sur l’icône d’engrenage (Settings) dans la barre latérale.</li>
      <li>Faites défiler jusqu’à la section Firebase et collez la valeur « apiKey » dans le champ « Firebase API Key ».</li>
      <li>Toujours dans la section Firebase, collez l’URL « databaseURL » dans le champ « Database URL ».</li>
    </ul>
  </li>
</ol>

<p><img src="/content/images/thunkable_screen_2.jpg" alt="Écran 2 de l'application MotivApp" style="display: block; margin: 0 auto;" /><br /></p>

<h2 id="étape-3--la-logique-les-blocs">Étape 3 : La Logique (Les Blocs)</h2>
<p>Passez de l’onglet <strong>Design</strong> à l’onglet <strong>Blocks</strong>. C’est ici que la magie opère !</p>

<p><strong>Logique du Screen1 :</strong></p>
<ul>
  <li>Prenez le bloc <code class="language-plaintext highlighter-rouge">when Btn_Inspire Clicks do</code> et glissez à l’intérieur le bloc <code class="language-plaintext highlighter-rouge">Navigate to Screen2</code>.</li>
</ul>

<p><strong>Logique du Screen2 (Extraction des données JSON) :</strong>
Ici, nous devons récupérer notre dictionnaire de citations, en choisir une au hasard, puis isoler son texte et son auteur.</p>

<ol>
  <li>Allez dans <em>Variables</em> et prenez le bloc <code class="language-plaintext highlighter-rouge">initialize cloud variable name</code>. Nommez-la <code class="language-plaintext highlighter-rouge">"citations"</code> (cela doit correspondre <em>exactement</em> au nom racine de notre JSON dans Firebase pour que Thunkable fasse la synchronisation automatiquement).</li>
  <li>Prenez le bloc <code class="language-plaintext highlighter-rouge">when Screen2 Opens do</code>.</li>
  <li>À l’intérieur, nous allons d’abord lister nos clés. Créez une variable temporaire <code class="language-plaintext highlighter-rouge">cle_aleatoire</code>. Assignez-lui le bloc <code class="language-plaintext highlighter-rouge">random item of list</code>. La liste à fournir sera générée par le bloc <code class="language-plaintext highlighter-rouge">get object properties of</code> (dans la catégorie <em>Objects</em>) appliqué à notre variable <code class="language-plaintext highlighter-rouge">cloud citations</code>.</li>
  <li>Maintenant que nous avons une clé au hasard (ex: <em>quote_002</em>), créons une variable <code class="language-plaintext highlighter-rouge">citation_choisie</code>. Assignez-lui la propriété (bloc <code class="language-plaintext highlighter-rouge">get property of object</code>) correspondant à <code class="language-plaintext highlighter-rouge">cle_aleatoire</code> extraite de notre variable cloud <code class="language-plaintext highlighter-rouge">citations</code>.</li>
  <li>Enfin, mettez à jour vos labels ! Attribuez au <code class="language-plaintext highlighter-rouge">Label_Quote</code> la propriété <code class="language-plaintext highlighter-rouge">"texte"</code> de l’objet <code class="language-plaintext highlighter-rouge">citation_choisie</code>, et au <code class="language-plaintext highlighter-rouge">Label_Author</code> sa propriété <code class="language-plaintext highlighter-rouge">"auteur"</code>.</li>
  <li>Prenez le bloc <code class="language-plaintext highlighter-rouge">when Btn_Retour Clicks do</code> et glissez à l’intérieur le bloc <code class="language-plaintext highlighter-rouge">Navigate to Screen1</code>.</li>
</ol>

<p><img src="/content/images/thunkable_firebase_blocks.jpg" alt="Blocs logiques Thunkable avec Firebase" style="display: block; margin: 0 auto;" /><br /></p>

<h2 id="étape-4--tester-la-bête-">Étape 4 : Tester la bête !</h2>
<p>Pas besoin de compiler !</p>
<ul>
  <li>Téléchargez l’application <strong>Thunkable Live</strong> sur votre smartphone (iOS ou Android).</li>
  <li>Connectez-vous avec votre compte. Touchez votre projet et testez : vous devriez voir une nouvelle citation tirée directement de votre base de données Cloud à chaque essai 😉</li>
</ul>

<hr />

<h1 id="conclusion">Conclusion</h1>

<p>Et voilà ! Vous avez créé une véritable application mobile connectée à un backend professionnel. L’avantage énorme de cette architecture, c’est que vous pouvez maintenant ajouter, modifier ou supprimer des citations directement depuis la console Firebase, et l’application de vos utilisateurs se mettra à jour instantanément, sans qu’ils n’aient à la retélécharger.</p>

<p>Mais pourquoi s’arrêter en si bon chemin ? Dans <strong><a href="/2026/03/18/thunkable-tuto-partie-2.html">la partie 2 de ce tutoriel</a></strong>, nous allons remplacer notre base Firebase par l’API de l’intelligence artificielle Gemini. Notre application ne se contentera plus de lire des citations, elle les inventera sur mesure ! Restez à l’écoute.</p>]]></content><author><name>Geoff RÉAU</name><email>contact@reau.ca</email></author><category term="Tutorials" /><category term="No-Code" /><category term="Thunkable" /><category term="Firebase" /><category term="Développement Mobile" /><category term="Tutoriel" /><category term="Application" /><category term="No-Code" /><summary type="html"><![CDATA[Depuis cette année, j’ai l’occasion d’agir comme mentor pour le programme Technovation Montréal. Voir des équipes passer d’une simple idée à un prototype mobile fonctionnel en quelques semaines m’a rappelé une chose essentielle : le no-code est un levier d’innovation absolument fantastique. Même lorsque l’on ambitionne de développer soi-même des applications mobiles de A à Z avec des frameworks avancés comme React Native, passer par ces plateformes visuelles permet de valider une architecture backend et une logique d’interface en un éclair 🙂 Pour joindre le geste à la parole, je vous propose une nouvelle série de deux tutoriels pour créer une application mobile iOS/Android dynamique et connectée au Cloud, sans écrire une seule ligne de code classique.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.reau.ca/content/images/thunkable-tuto-part1.jpg" /><media:content medium="image" url="https://www.reau.ca/content/images/thunkable-tuto-part1.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>