<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>AI &amp; Digital Transformation Consultant</title>
  <subtitle>20+ years technologist specializing in AI integration, Retool development, and digital transformation for startups and SMBs.</subtitle>
  <link href="https://fabiofranchino.com/feed.xml" rel="self"/>
  <link href="https://fabiofranchino.com/"/>
  <updated>2025-01-21T00:00:00Z</updated>
  <id>https://fabiofranchino.com/</id>
  <author>
    <name>Fabio Franchino</name>
    <email>hello@fabiofranchino.com</email>
  </author>
  <entry>
    <title>How to fix TableSearchFilter not defined error</title>
    <link href="https://fabiofranchino.com/blog/how-to-fix-tablesearchfilter-not-defined-error/"/>
    <updated>2025-01-21T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/how-to-fix-tablesearchfilter-not-defined-error/</id>
    <content type="html">&lt;p&gt;If you’re using tables in your application and encounter the warning &amp;quot;tableSearchFilter is not defined,&amp;quot; follow these troubleshooting steps to resolve the issue.&lt;/p&gt;
&lt;h3 id=&quot;identify-the-source-of-the-warning&quot; tabindex=&quot;-1&quot;&gt;identify the source of the warning &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#identify-the-source-of-the-warning&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;understand the error&lt;/strong&gt;: this warning often appears when there’s a mismatch between the search input and the actual data linked to the table. it usually occurs if you’ve deleted or modified the variable that filters your table.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;follow-these-steps&quot; tabindex=&quot;-1&quot;&gt;follow these steps &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#follow-these-steps&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;check the search input variable&lt;/strong&gt;: ensure the search variable is correctly defined and linked to your table. if it was removed unintentionally, you’ll need to redefine it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;disable server-side pagination&lt;/strong&gt;: if you are utilizing server-side pagination, disable this feature temporarily. this allows you to see if the search term input is causing the warning.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;implement-changes&quot; tabindex=&quot;-1&quot;&gt;implement changes &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#implement-changes&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;remove undefined variables&lt;/strong&gt;: once you’ve disabled server-side pagination, go through your settings and remove any variables that may be defined as &amp;quot;undefined.&amp;quot; this might include unused search term inputs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;re-enable server-side pagination&lt;/strong&gt;: after following the above steps, re-enable server-side pagination. ensure that any filters or search inputs align with the expected variables in your data&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;verify-the-solution&quot; tabindex=&quot;-1&quot;&gt;verify the solution &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#verify-the-solution&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;strong&gt;check table appearance&lt;/strong&gt;: finally, verify that your table displays correctly without the border issues you were experiencing before. if everything is set up properly, the table should function without warnings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;by following these steps, you should resolve the &amp;quot;tableSearchFilter is not defined&amp;quot; issue and ensure your table runs smoothly.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What is RAG</title>
    <link href="https://fabiofranchino.com/blog/what-is-rag/"/>
    <updated>2025-01-20T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/what-is-rag/</id>
    <content type="html">&lt;h2 id=&quot;what-is-rag%3F&quot; tabindex=&quot;-1&quot;&gt;What is RAG? &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#what-is-rag%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Retrieval-Augmented Generation (RAG) is a framework that combines large language models (LLMs) with external knowledge sources. Instead of relying purely on the model’s internal parameters—where it has been trained on massive but generalized datasets—RAG allows you to retrieve relevant documents or data from an external database or knowledge base. The retrieved information then augments the generation process, ensuring that the output is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accurate:&lt;/strong&gt; Because it uses the most recent or specific documents relevant to your question.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Up-to-date:&lt;/strong&gt; If your knowledge base gets updated, your model can use these new documents without requiring an expensive re-training.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specific:&lt;/strong&gt; RAG pulls data from domain-specific or context-specific sources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In essence, RAG prevents the “hallucination” problem by grounding the model’s responses in real data.&lt;/p&gt;
&lt;h2 id=&quot;challenge-of-a-rag-system&quot; tabindex=&quot;-1&quot;&gt;Challenge of a RAG system &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#challenge-of-a-rag-system&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While RAG provides a robust way to handle up-to-date and domain-specific knowledge, it does come with a few challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Document Management:&lt;/strong&gt; You need a place to store your documents or data. This usually involves creating embeddings (vector representations) and storing them in a database that supports efficient similarity search.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complexity of Setup:&lt;/strong&gt; There are multiple moving parts—an embedding model, a vector store, possibly a metadata store, and a well-designed pipeline to retrieve relevant documents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Pipeline Reliability:&lt;/strong&gt; Ensuring that new documents are processed (cleaned, chunked, embedded) and made available for retrieval can be tricky. If the pipeline fails, the user might get incomplete or outdated answers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost:&lt;/strong&gt; Large-scale retrieval or embedding generation can be costly. It’s crucial to design a pipeline that’s both efficient and scalable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-content-type&quot; tabindex=&quot;-1&quot;&gt;The content type &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#the-content-type&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before building any RAG system, you need clarity on the kinds of documents you plan to use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Text-based documents (Markdown, PDFs, CSVs, etc.):&lt;/strong&gt; The most common scenario where you chunk text into smaller pieces before creating embeddings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured data (databases, spreadsheets, knowledge graphs):&lt;/strong&gt; May require a different pipeline or transformation before being embedded.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multimedia files (images, videos, audio):&lt;/strong&gt; Potentially more complex because embedding these requires specialized models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Identify how large your documents are, how often they change, and how you want them chunked. Chunk sizes (usually between 200-800 tokens) can drastically affect retrieval quality.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#conclusion&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In summary, &lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt; represents a powerful paradigm for leveraging up-to-date and domain-specific data in large language models. By designing a robust pipeline for &lt;strong&gt;document management&lt;/strong&gt;, ensuring &lt;strong&gt;reliable data ingestion&lt;/strong&gt;, and choosing the &lt;strong&gt;right content types&lt;/strong&gt; and &lt;strong&gt;embedding strategies&lt;/strong&gt;, you can maximize the accuracy and relevance of your AI-driven applications. While the setup can be complex—and potentially costly—these challenges are outweighed by the benefits of delivering answers grounded in real-world information, ensuring both &lt;strong&gt;credibility&lt;/strong&gt; and &lt;strong&gt;flexibility&lt;/strong&gt; in an ever-evolving data landscape.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How to add gradient background to Retool containers</title>
    <link href="https://fabiofranchino.com/blog/how-to-add-gradient-background-to-retool-containers/"/>
    <updated>2024-12-03T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/how-to-add-gradient-background-to-retool-containers/</id>
    <content type="html">&lt;p&gt;Here’s a quick tip to set a gradient color for the background of a Retool container:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Detach the Style from the Token&lt;/strong&gt;: Before customizing, ensure the style isn’t tied to any existing token.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Add the Gradient in the Style Panel&lt;/strong&gt;: Use CSS syntax in the background style panel, wrapped in double curly brackets.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/how-to-add-gradient-background-to-retool-containers/00.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Example for a linear gradient:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;linear-gradient(45deg, red, blue)&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;examples-of-gradient-styles%3A&quot; tabindex=&quot;-1&quot;&gt;Examples of Gradient Styles: &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#examples-of-gradient-styles%3A&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;linear-gradient%3A&quot; tabindex=&quot;-1&quot;&gt;Linear Gradient: &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#linear-gradient%3A&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/how-to-add-gradient-background-to-retool-containers/01.png&quot; alt=&quot;Linear Gradient&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;radial-gradient%3A&quot; tabindex=&quot;-1&quot;&gt;Radial Gradient: &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#radial-gradient%3A&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/how-to-add-gradient-background-to-retool-containers/02.png&quot; alt=&quot;Radial Gradient&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;with-usable-colors%3A&quot; tabindex=&quot;-1&quot;&gt;With Usable Colors: &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#with-usable-colors%3A&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/how-to-add-gradient-background-to-retool-containers/03.png&quot; alt=&quot;Usable Colors&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Customize to enhance your interface with appealing gradient backgrounds!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Personal English writer assistant tool</title>
    <link href="https://fabiofranchino.com/blog/personal-english-writer-assistant-tool/"/>
    <updated>2024-12-02T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/personal-english-writer-assistant-tool/</id>
    <content type="html">&lt;p&gt;We’re thrilled to unveil the latest addition to the &lt;a href=&quot;https://metatools.eloquentops.com/&quot;&gt;MetaTools&lt;/a&gt; suite: &lt;strong&gt;a personal English writing assistant&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Designed with the modern writer in mind, this tool is more than just a spellchecker, it’s a dynamic partner in refining your writing process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/personal-english-writing-assistant/01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-makes-it-special%3F&quot; tabindex=&quot;-1&quot;&gt;What makes it special? &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#what-makes-it-special%3F&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;AI-powered suggestions&lt;/strong&gt;: This tool leverages advanced AI to propose variations of your text, ensuring your message shines through while keeping your unique voice intact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable prompts&lt;/strong&gt;: One size doesn’t fit all. You can configure the prompts yourself to fine-tune the kind of suggestions you receive, putting you in control of your creative process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Translation for clarity&lt;/strong&gt;: It offers translated versions of your text, so you can double-check the meaning and accuracy across different languages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cherry-Picking at its best&lt;/strong&gt;: You’re not bound by a single suggestion. Choose the best sentence variations from the two provided versions, mixing and matching to craft your perfect output.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/personal-english-writing-assistant/02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;why-you%E2%80%99ll-love-it&quot; tabindex=&quot;-1&quot;&gt;Why you’ll love it &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#why-you%E2%80%99ll-love-it&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This assistant isn’t just a tool; it’s an interactive experience. It helps you write accurately, encourages exploration with new variations, and offers an opportunity to learn and improve over time. Beware, it’s highly addictive, as it makes writing fun and rewarding.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/personal-english-writing-assistant/03.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Explore the joy of writing with a companion that evolves with you. Give it a try and see your words transform like never before.&lt;/p&gt;
&lt;p&gt;You can reach it &lt;a href=&quot;https://my-writing-assistant.netlify.app/&quot;&gt;here!&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Retool tip expand to fit container and padding</title>
    <link href="https://fabiofranchino.com/blog/retool-tip-expand-to-fit-container-and-padding/"/>
    <updated>2024-11-29T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/retool-tip-expand-to-fit-container-and-padding/</id>
    <content type="html">&lt;p&gt;Retool added the option “expand content to fit” to containers.&lt;/p&gt;
&lt;p&gt;It’s neat since it allows creating a fully fluid layout that adapts nicely to any window size.&lt;/p&gt;
&lt;p&gt;However, there’s a downside to this.&lt;/p&gt;
&lt;p&gt;The option forces you into two constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Having a single component in the container&lt;/li&gt;
&lt;li&gt;Not having margin or padding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While we can manage having a single component, getting rid of padding might be an issue.&lt;/p&gt;
&lt;h3 id=&quot;update%3A-there%E2%80%99s-a-way&quot; tabindex=&quot;-1&quot;&gt;Update: there’s a way &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#update%3A-there%E2%80%99s-a-way&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We found a way to use the “expand content to fit” option in a container while preserving paddings and margins for its child. The trick is to add an additional container and:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set its layout to Stack.&lt;/li&gt;
&lt;li&gt;Set the width and height of the child component to Fill.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The effect is not visible in edit mode:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-tip-expand-to-fit-container-and-padding/03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;but once in view mode, it works perfectly:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-tip-expand-to-fit-container-and-padding/04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is why we didn’t come up with this solution in the first instance, as it was not evident in edit mode.&lt;/p&gt;
&lt;p&gt;Still, the CSS technique below remains relevant for more advanced layout operations.&lt;/p&gt;
&lt;h3 id=&quot;let%E2%80%99s-work-around-this-with-a-bit-of-css&quot; tabindex=&quot;-1&quot;&gt;Let’s work around this with a bit of CSS &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#let%E2%80%99s-work-around-this-with-a-bit-of-css&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You know, Retool is pretty much fully hackable.&lt;/p&gt;
&lt;p&gt;You can add CSS to change some defaults.&lt;/p&gt;
&lt;p&gt;In this case, we want to add padding to a container that doesn’t allow a padding setting—this happens when the “expand content to fit” option is enabled.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-tip-expand-to-fit-container-and-padding/01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Let’s suppose the container we want to fix is named &lt;code&gt;container1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To have fully functional padding on a container with the “expand-content-to-fit” option enabled, here’s the CSS you need to add in the CSS settings panel:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;[data-testid=&quot;RetoolGrid:container1&quot;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0 20px&lt;span class=&quot;token important&quot;&gt;!important&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-tip-expand-to-fit-container-and-padding/02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Keep in mind that the component name need to be preserved, or just keep updated the CSS selector with the component name.&lt;/p&gt;
&lt;p&gt;Here you can see the effect, with yellow highlighting the padding.&lt;/p&gt;
&lt;p&gt;Happy hacking!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Free micro tool to generate organic SVG shapes</title>
    <link href="https://fabiofranchino.com/blog/free-micro-tool-to-generate-organic-svg-shapes/"/>
    <updated>2024-11-27T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/free-micro-tool-to-generate-organic-svg-shapes/</id>
    <content type="html">&lt;p&gt;We released another micro-tool created with Bolt.New, our preferred AI code assistant of the moment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/tools/organic-shaper/01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The purpose of this tool is to function as a shape generator, enabling users to create various forms effortlessly.&lt;/p&gt;
&lt;p&gt;It allows customization by defining parameters such as the number of points, the level of randomness, and the desired color palette, offering a high degree of flexibility.&lt;/p&gt;
&lt;p&gt;With these options, users can generate an endless array of unique variations, ensuring a tailored design for any purpose.&lt;/p&gt;
&lt;p&gt;Once satisfied with the result, users can easily export their preferred shape as an SVG file, ready for use in digital or design projects.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/tools/organic-shaper/02.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The best part? It’s completely free to use. You can explore and try it out by visiting &lt;a href=&quot;https://organic-shaper.netlify.app/&quot;&gt;this link&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Retool app to generate and export QR code with Metatools</title>
    <link href="https://fabiofranchino.com/blog/retool-app-to-generate-and-export-qr-code-with-metatools/"/>
    <updated>2024-11-26T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/retool-app-to-generate-and-export-qr-code-with-metatools/</id>
    <content type="html">&lt;p&gt;In this second tutorial about QRCode generation using the &lt;a href=&quot;https://metatools.eloquentops.com/&quot;&gt;MetaTools&lt;/a&gt; suite API, here is the &lt;a href=&quot;https://fabiofranchino.com/blog/create-a-qr-code-generator-with-bolt-new-and-metatools&quot;&gt;first one&lt;/a&gt;, you’ll learn how to set up a &lt;a href=&quot;https://retool.com/&quot;&gt;Retool&lt;/a&gt; app that generates a QRCode for each table row and provides the ability to export it as an SVG file.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Set up a data source in Retool and add a table component. The data should contain a &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;url&lt;/code&gt; property for our purpose, as we want to generate a QRCode that points to a specific company URL. Here’s an example of how the setup might look:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Next, configure the &lt;a href=&quot;https://metatools.eloquentops.com/qrcode&quot;&gt;MetaTools QRCode API&lt;/a&gt; endpoint using its intuitive configurator. This step involves setting the parameters required for the API call, such as the desired output format and the QRCode content:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Once the configuration is complete, retrieve the endpoint configuration from the API Snippet modal. This provides the necessary details such as the URL and the payload structure, as shown below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Go back to Retool to configure a Query Resource using a REST resource. Add the API URL, include the Authorization token in the header, and define the JSON payload. The &lt;code&gt;content&lt;/code&gt; field should be dynamically linked to the selected row value in the table. Set the &lt;code&gt;format&lt;/code&gt; field to &lt;code&gt;json&lt;/code&gt;, as Retool automatically converts &lt;code&gt;raw&lt;/code&gt; values to JSON:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By triggering this query on each row selection event in the table, you’ll be able to generate a new QRCode for each item in the table.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;To display the generated QRCode in an Image component, convert the SVG string into a base64 string. This can be achieved using a small snippet of JavaScript code, as shown here:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data:image/svg+xml;base64,&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;btoa&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;qrcode&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/05a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Although this code can be set in the &lt;strong&gt;Transform Result&lt;/strong&gt; of the Query, it’s better to include it in the Image component if you also plan to use the SVG source for a download button:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/05b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here’s how the table looks with the QRCode displayed alongside it. The QRCode is dynamically generated for the selected row:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/06.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;To allow users to download the QRCode, set up a button with JavaScript to handle the SVG download. Since the QRCode is already in SVG format, the code to enable downloading is straightforward:&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;downloadFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;qrcode&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; table1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;selectedRow&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;svg&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/07.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here’s the final Retool app in action, complete with QRCode generation and export capabilities:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/retool-app-to-generate-and-export-qrcode-with-metatools/08.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Create a QR code generator with Bolt new and Metatools</title>
    <link href="https://fabiofranchino.com/blog/create-a-qr-code-generator-with-bolt-new-and-metatools/"/>
    <updated>2024-11-25T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/create-a-qr-code-generator-with-bolt-new-and-metatools/</id>
    <content type="html">&lt;p&gt;&lt;strong&gt;QR codes&lt;/strong&gt;, short for “Quick Response” codes, are a versatile and efficient way to encode data. From marketing campaigns to contactless payments, they enable instantaneous access to information through a simple scan. Their adaptability in various industries—like logistics for tracking, healthcare for patient information, and retail for discount codes—makes them indispensable in today’s fast-paced digital world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bolt.New&lt;/strong&gt; stands as a groundbreaking tool that converts natural language prompts into fully functional full-stack applications. By streamlining app development, it bridges the gap between conceptual ideas and working code. Whether you’re a non-technical innovator or a seasoned developer, Bolt.New accelerates the journey from prototype to production.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;MetaTools QRCode API&lt;/strong&gt; simplifies QR code creation. With just a straightforward API call, you can customize and generate high-quality QR codes in formats like SVG. It’s an excellent resource for developers looking to integrate QR functionality into their projects without dealing with complex libraries.&lt;/p&gt;
&lt;h3 id=&quot;step-by-step-about-how-to-create-a-working-qr-code-generator-app&quot; tabindex=&quot;-1&quot;&gt;Step by step about how to create a working QR-Code generator app &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#step-by-step-about-how-to-create-a-working-qr-code-generator-app&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;step-1%3A-craft-the-front-end-with-bolt.new&quot; tabindex=&quot;-1&quot;&gt;Step 1: Craft the Front-End with Bolt.New &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#step-1%3A-craft-the-front-end-with-bolt.new&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;To start, let’s use &lt;strong&gt;Bolt.New&lt;/strong&gt; for the front-end of our QR code generator app.&lt;/p&gt;
&lt;h5&gt;Prompt for Bolt.New:&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;Create a small app that presents the user with a textfield and a button. When the button is pressed, an API fetch is triggered to generate a QR code. Additionally, the user can select background and foreground colors. The API responds with an SVG QR code, which is displayed on the right side.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/create-a-qr-code-generator-with-bolt-new-and-metatools/02.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;step-2%3A-configure-metatools-api&quot; tabindex=&quot;-1&quot;&gt;Step 2: Configure MetaTools API &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#step-2%3A-configure-metatools-api&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Visit API Documentation&lt;/strong&gt;: Head to the &lt;a href=&quot;https://metatools.eloquentops.com/qrcode&quot;&gt;MetaTools QRCode API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Register and Obtain an API Key&lt;/strong&gt;: Create an account if required and secure the API key for authentication.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/create-a-qr-code-generator-with-bolt-new-and-metatools/01.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To integrate &lt;strong&gt;MetaTools&lt;/strong&gt; into the &lt;strong&gt;Bolt.New&lt;/strong&gt; project, just copy the &lt;strong&gt;Prompt snippet&lt;/strong&gt; from the API snippet button. Then add in the Bolt.New prompt something like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is the API specs: [PASTE-THE-SNIPPET-HERE]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/create-a-qr-code-generator-with-bolt-new-and-metatools/03.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That’s it! Run the magic button in Bolt.New to create your app. Here the final version up and running:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/blog/create-a-qr-code-generator-with-bolt-new-and-metatools/04.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We’ll also published this app, both as Bolt.New available project and as available app as well.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Add easy cache to your endpoint with Metatools</title>
    <link href="https://fabiofranchino.com/blog/add-easy-cache-to-your-endpoint-with-metatools/"/>
    <updated>2024-11-23T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/add-easy-cache-to-your-endpoint-with-metatools/</id>
    <content type="html">&lt;p&gt;In today’s tech ecosystem, APIs play a pivotal role in connecting services. Tools like Zapier, Make, and Retool Workflows have revolutionized how we integrate functionality, often without writing a single line of code.&lt;/p&gt;
&lt;p&gt;These platforms, known for their simplicity, enable you to create and deploy API endpoints or webhooks quickly.&lt;/p&gt;
&lt;p&gt;However, convenience comes at a cost.&lt;/p&gt;
&lt;h3 id=&quot;the-limitations-of-no-code%2Flow-code-webhooks&quot; tabindex=&quot;-1&quot;&gt;The Limitations of No-Code/Low-Code Webhooks &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#the-limitations-of-no-code%2Flow-code-webhooks&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While these solutions simplify integration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Request-Based Billing&lt;/strong&gt;: Many charge per API call, making frequent requests costly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency Issues&lt;/strong&gt;: Public endpoints, especially on platforms like Retool Workflows, may exhibit slow response times due to infrequent updates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frontend Compatibility&lt;/strong&gt;: Directly calling such APIs from browsers often results in CORS (Cross-Origin Resource Sharing) errors.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;solving-the-challenges-with-proxy-and-cache&quot; tabindex=&quot;-1&quot;&gt;Solving the Challenges with Proxy and Cache &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#solving-the-challenges-with-proxy-and-cache&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Here’s where tools like Proxy MetaTools shine. Acting as an intermediary, proxies can enhance the efficiency and accessibility of your APIs in several ways:&lt;/p&gt;
&lt;h4 id=&quot;proxy-functionality&quot; tabindex=&quot;-1&quot;&gt;Proxy Functionality &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#proxy-functionality&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CORS Handling&lt;/strong&gt;: A proxy resolves CORS issues by sitting between the frontend and the target API. Instead of dealing with complex configurations, you can route calls through the proxy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Security&lt;/strong&gt;: Sensitive endpoints can be hidden behind the proxy, reducing exposure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;api-caching&quot; tabindex=&quot;-1&quot;&gt;API Caching &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#api-caching&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Frequent API calls? Set up a cache with Proxy MetaTools to reduce redundant requests and improve response times:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Optimized Billing&lt;/strong&gt;: Platforms like MetaTools only charge when the cache is refreshed, unlike others that bill per request.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency Reduction&lt;/strong&gt;: Cached data ensures that most requests are served instantly, especially useful for APIs with infrequent updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;example%3A-integrating-with-retool-workflows&quot; tabindex=&quot;-1&quot;&gt;Example: Integrating with Retool Workflows &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#example%3A-integrating-with-retool-workflows&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Suppose you’re using Retool Workflows to trigger processes. By leveraging Proxy MetaTools:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configure the &lt;strong&gt;proxy&lt;/strong&gt; for CORS-friendly access from your frontend.&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;cache&lt;/strong&gt; layer to limit repetitive calls, ensuring cost efficiency and improved performance.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;why-proxies-and-caches-matter&quot; tabindex=&quot;-1&quot;&gt;Why Proxies and Caches Matter &lt;a class=&quot;anchor-link&quot; href=&quot;https://fabiofranchino.com/#why-proxies-and-caches-matter&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Proxies and caches are more than just tools; they’re enablers. They allow you to scale applications, reduce costs, and overcome technical limitations imposed by third-party platforms.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Metatools simple translator tool</title>
    <link href="https://fabiofranchino.com/blog/metatools-simple-translator-tool/"/>
    <updated>2024-11-15T00:00:00Z</updated>
    <id>https://fabiofranchino.com/blog/metatools-simple-translator-tool/</id>
    <content type="html">&lt;p&gt;We’re releasing our first micro-tool, powered by &lt;a href=&quot;https://metatools.eloquentops.com/&quot;&gt;MetaTools&lt;/a&gt; suite, developed with &lt;a href=&quot;https://bolt.new/&quot;&gt;Bolt.New&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It’s a translation tool that lets you input text and get it translated into different languages.&lt;/p&gt;
&lt;p&gt;You can select the language you need, and see the results in seconds. It’s simple and effective.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://fabiofranchino.com/assets/tools/simple-translator/thumb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The tool was developed on Bolt.New, a cutting-edge environment that simplifies development. This is the first in a series of tools we’re building with MetaTools integration, showcasing not just the tech but also the potential for innovation.&lt;/p&gt;
&lt;p&gt;You &lt;strong&gt;can try&lt;/strong&gt; the tool live here: &lt;a href=&quot;https://gorgeous-sundae-3a16ff.netlify.app/&quot;&gt;Translation Tool&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Want to dive deeper?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You &lt;strong&gt;can fork&lt;/strong&gt; the tool directly from here and enhance it with your own creativity: &lt;a href=&quot;https://bolt.new/~/sb1-tr7f2a&quot;&gt;Bolt.New Project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;MetaTools is designed to make integration and development faster, smarter, and more adaptable. Learn more about the MetaTools ecosystem at &lt;a href=&quot;https://metatools.eloquentops.com/&quot;&gt;MetaTools Website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The translation tool is just the beginning. Whether you’re exploring possibilities or building the next big thing, MetaTools and Bolt.New are here to empower your journey. Try it out, fork it, and start creating.&lt;/p&gt;
</content>
  </entry>
</feed>
