<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Daniel Migizi]]></title><description><![CDATA[Ex-Athlete turned Product Engineer, building software with no code and low code tools. This blog is about tech, emotional intelligence, and entrepreneurship.]]></description><link>https://www.danielmigizi.com</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 09:00:59 GMT</lastBuildDate><atom:link href="https://www.danielmigizi.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Embracing Experimentation in Visual Development: A Guide for Beginners]]></title><description><![CDATA[Visual development has unlocked vast potential for new developers, enabling them to build powerful applications without traditional coding. But as any experienced developer will tell you, a key to success lies in your approach and methodology.
If you...]]></description><link>https://www.danielmigizi.com/embracing-experimentation-in-visual-development-a-guide-for-beginners</link><guid isPermaLink="true">https://www.danielmigizi.com/embracing-experimentation-in-visual-development-a-guide-for-beginners</guid><category><![CDATA[visual developer]]></category><category><![CDATA[No Code]]></category><category><![CDATA[Low Code]]></category><category><![CDATA[jr software engineer ]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Daniel Migizi]]></dc:creator><pubDate>Thu, 14 Nov 2024 11:59:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/jpkxJAcp6a4/upload/f44d4473a95593edcae6cd991bf5ca71.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Visual development has unlocked vast potential for new developers, enabling them to build powerful applications without traditional coding. But as any experienced developer will tell you, a key to success lies in your approach and methodology.</p>
<p>If you’re new to visual development, focusing on structured experimentation, small tests, and forgiving your own mistakes is invaluable. Here’s how to create a solid foundation for your work as you navigate the complexities of building applications visually.</p>
<h2 id="heading-1-embrace-experimentation-why-multiple-right-ways-exist">1. Embrace Experimentation: Why Multiple Right Ways Exist</h2>
<p>Visual development frameworks like WeWeb, Xano, and Webflow provide powerful tools that make building apps fast and approachable. But in contrast to some traditional development mindsets that focus on “doing it right,” visual development benefits from a more flexible approach. Here’s why:</p>
<ul>
<li><p><strong>Avoid Perfection Paralysis</strong>: When you’re starting, it’s tempting to search for the “best” or “right” way to approach a problem. Visual tools reduce coding barriers, but complexity remains in design choices, workflows, and backend integrations. Expect that multiple paths can lead to success, and try to focus less on choosing the perfect approach and more on finding something that works for you.</p>
</li>
<li><p><strong>Conduct Small Experiments</strong>: Each tool in visual development has its quirks, limitations, and advantages. Instead of planning an entire feature upfront, try breaking it down into smaller pieces. Build an initial version, test it, and be prepared to discard it. For example, if you’re integrating an API call, create a small test version of that call, see how it interacts with your tool’s authentication and data handling, and learn from the outcome.</p>
</li>
</ul>
<h2 id="heading-2-give-yourself-permission-to-fail">2. Give Yourself Permission to Fail</h2>
<p>In visual development, failure is an essential part of the process. Many developers who are new to the field feel the need to avoid mistakes, but errors are part of a productive learning curve. Let’s explore why failure matters and how to lean into it:</p>
<ul>
<li><p><strong>Iterative Improvement Over Immediate Success</strong>: The first version of your app, feature, or integration is unlikely to be perfect. And that’s okay. Each experiment gives you valuable feedback, improving your understanding of your tool and allowing you to build with confidence in subsequent iterations.</p>
</li>
<li><p><strong>Ownability and Custom Fit</strong>: Just because a particular solution worked for someone else doesn’t mean it’s best for you. Consider your strengths and familiarity with the tools, as well as your app’s specific needs. The path you take to build a solution should align with your understanding and comfort level, which will naturally deepen over time.</p>
</li>
</ul>
<h2 id="heading-3-cultivate-patience-and-a-learning-mindset">3. Cultivate Patience and a Learning Mindset</h2>
<p>A significant part of the visual development journey is learning how to troubleshoot and adapt as new information emerges. What seems like the right solution one day might reveal inefficiencies or limitations down the road. Here’s how to build a lasting mindset for success:</p>
<ul>
<li><p><strong>“Ship Knowledge” Rather than Immediate Code</strong>: In traditional development, shipping code is the primary objective, but visual development emphasizes learning the tools as much as delivering results. By focusing on what you’re learning with each experiment, you build a library of knowledge that will make future projects easier and more efficient.</p>
</li>
<li><p><strong>Practice Repetition to Build Familiarity</strong>: Visual tools can still be technically demanding—authentication flows, API integrations, and database setups require a strong grasp of underlying concepts, even when simplified. The more you experiment and repeat processes, the better you’ll become at troubleshooting, understanding nuances, and executing efficiently.</p>
</li>
</ul>
<h2 id="heading-4-stay-agile-and-embrace-change">4. Stay Agile and Embrace Change</h2>
<p>One of the greatest benefits of visual development is its agility. However, agility can feel intimidating if you’re new and trying to commit to a specific direction. To keep your work adaptable:</p>
<ul>
<li><p><strong>Expect to Revisit Early Work</strong>: As you gain experience, you’ll likely look back at your initial solutions and wonder how you could have done it differently. Don’t hesitate to revisit, refactor, or rebuild parts of your application as you discover new methods.</p>
</li>
<li><p><strong>Build a Growth-Friendly Workflow</strong>: Approach your project with the understanding that your skills and understanding will change over time. Building in flexibility, such as using modular components or maintaining clear naming conventions, will make iteration easier.</p>
</li>
</ul>
<h2 id="heading-5-tools-are-just-toolscomplexity-still-exists">5. Tools Are Just Tools—Complexity Still Exists</h2>
<p>No-code and low-code development platforms may make app-building accessible, but the underlying principles are still rooted in traditional complexity. Security, API integrations, and database management, for example, remain as essential as ever:</p>
<ul>
<li><p><strong>Understand the Fundamentals</strong>: Each time you encounter an authentication flow, API setup, or data connection, take the opportunity to understand why and how it works. Ask questions like “What does this API endpoint do?” or “How does OAuth keep my app secure?”</p>
</li>
<li><p><strong>Use Resources</strong>: Visual development has a vast community of users and resources. Engage with forums, documentation, and guides to deepen your understanding, and don’t hesitate to experiment with more technical concepts. Over time, concepts that initially seemed complex will become second nature.</p>
</li>
</ul>
<h2 id="heading-6-make-experimentation-a-core-part-of-your-development-process">6. Make Experimentation a Core Part of Your Development Process</h2>
<p>Many developers skip steps in the name of efficiency but ultimately struggle when they hit limitations or bugs. Instead, incorporate experimentation as a step-by-step approach to learning and solving issues in real-time:</p>
<ul>
<li><p><strong>Create Sandbox Versions</strong>: When attempting something complex, like connecting a backend database or integrating third-party software, set up a sandbox or test version of your project. This setup lets you explore how your app will handle different inputs and scenarios without impacting your live environment.</p>
</li>
<li><p><strong>Document and Reflect</strong>: After each experiment, note what you learned, including what worked, what didn’t, and any nuances you encountered. Keeping track of these insights is essential, especially as your project grows.</p>
</li>
</ul>
<h2 id="heading-building-confidence-through-experimentation">Building Confidence Through Experimentation</h2>
<p>Visual development opens doors to powerful app-building without the steep learning curve of traditional coding, but a strong methodology is key to leveraging it effectively. By embracing experimentation, allowing yourself to make mistakes, and continuously building on what you’ve learned, you’ll develop the confidence to tackle larger projects and solve increasingly complex problems. Whether you’re building your first project or adding advanced functionality, remember: there’s no one “right way”—just the way that works best for you and your growth as a developer.</p>
<p>If you’re interested in learning how to become a Visual Developer I invite you to <a target="_blank" href="https://community.startupskin.com/invitation?code=B52J63">join the Startup Skin Visual Development Community</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Prevent Race Conditions in Xano with Record Locking]]></title><description><![CDATA[This problem, often referred to as a race condition, can lead to conflicting updates. Here’s a breakdown of what race conditions are, how they arise, and how to use Xano’s database locks and transactions to address them.
What is a Race Condition?
A r...]]></description><link>https://www.danielmigizi.com/prevent-race-conditions-in-xano-with-record-locking</link><guid isPermaLink="true">https://www.danielmigizi.com/prevent-race-conditions-in-xano-with-record-locking</guid><category><![CDATA[visual developer]]></category><category><![CDATA[XANO]]></category><category><![CDATA[No Code]]></category><category><![CDATA[race-condition]]></category><category><![CDATA[performance]]></category><category><![CDATA[Databases]]></category><dc:creator><![CDATA[Daniel Migizi]]></dc:creator><pubDate>Wed, 06 Nov 2024 03:52:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1730864337677/bbffa397-269a-40d1-be89-77dc3def2398.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This problem, often referred to as a <em>race condition</em>, can lead to conflicting updates. Here’s a breakdown of what race conditions are, how they arise, and how to use Xano’s <a target="_blank" href="https://docs.xano.com/working-with-data/functions/database-requests/query-all-records/output-tab#lock">database locks</a> and <a target="_blank" href="https://docs.xano.com/working-with-data/functions/database-requests/database-transaction">transactions</a> to address them.</p>
<h3 id="heading-what-is-a-race-condition">What is a Race Condition?</h3>
<p>A <em>race condition</em> occurs when two or more processes attempt to access and modify the same data at the same time. If the processes are not properly managed, their final output depends on the timing and sequence of execution, which can cause inconsistencies. For example:</p>
<ol>
<li><p>User A reads a record and begins making updates.</p>
</li>
<li><p>Before User A saves their changes, User B reads the same record and begins their own modifications based on the original data.</p>
</li>
<li><p>Both users save their changes, potentially overwriting each other’s updates and leaving the data in an inconsistent state.</p>
</li>
</ol>
<p>In high-traffic applications, managing these conflicts is crucial to maintaining data integrity.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1730861463607/1faefbc0-d41c-43fd-b3e9-9c5d13584032.png" alt="Mermaid diagram displaying race conditions" class="image--center mx-auto" /></p>
<h3 id="heading-database-transactions">Database Transactions</h3>
<p>In Xano, <strong>database transactions</strong> allow you to group multiple database operations <em>(like reading and writing records)</em> into a single, atomic process, ensuring that all operations succeed or fail together. Transactions ensure that all the actions within them execute as one cohesive unit, reducing the chance of conflicting updates from simultaneous users.</p>
<ul>
<li><p><strong>How it Works</strong>: A transaction opens with an operation (like retrieving a record) and only commits changes when all operations in the transaction succeed. If any operation fails, none of the changes are applied.</p>
</li>
<li><p><strong>Benefit</strong>: By grouping critical actions, transactions make sure other processes cannot interfere mid-operation. This is especially useful for complex processes, such as financial transactions or booking systems, where incomplete actions could cause significant errors.</p>
</li>
<li><p><strong>Important Note</strong>: Database locks in Xano only function when placed inside a database transaction. Without a transaction, a lock alone won’t prevent conflicts.</p>
</li>
</ul>
<h3 id="heading-database-locks-when-used-in-transactions">Database Locks <em>(When Used in Transactions)</em></h3>
<p><strong>Database locks</strong> prevent records from being modified by other processes until the lock is released. Locks are particularly helpful when dealing with a high volume of requests to the same records, such as in an application with an incrementing counter or any shared resource.</p>
<ul>
<li><p><strong>How to Use</strong>: In Xano, a lock can be applied to a “get record” or “query all records” function, and it works by blocking any access attempts to the locked record while another transaction is actively modifying it.</p>
</li>
<li><p><strong>Transaction Requirement</strong>: Locks only function effectively within a database transaction, so it’s essential to wrap lock-enabled actions within a transaction to ensure reliable behavior.</p>
</li>
</ul>
<p><a target="_blank" href="https://twitter.com/ray_deck">Ray Deck</a> from <a target="_blank" href="https://statechange.ai/">Statechange</a> does a remarkable job guiding us on how to set up database transactions and locks in Xano to solve race conditions, in the video below.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/6UHx8RF5oZQ?si=k5OuyO3LxuqXO7bj">https://youtu.be/6UHx8RF5oZQ?si=k5OuyO3LxuqXO7bj</a></div>
<p> </p>
<h3 id="heading-handling-performance-and-queue-management">Handling Performance and Queue Management</h3>
<p>While locks and transactions solve race conditions, they may introduce delays if multiple processes are waiting to access the same data. To manage high-traffic queues effectively, you can use <strong>asynchronous processing</strong> (like Xano’s <em>post-processing</em>), which lets database updates occur in the background, reducing wait times for users.</p>
<ul>
<li><p><strong>Post-Processing</strong>: This method is ideal for updates that do not need immediate feedback on the front end</p>
</li>
<li><p><strong>When to Use</strong>: Post-processing works best when you don’t need instant results on the user interface. For example, with batch updates or when calling an LLM, post-processing helps keep the front end responsive while the back-end operations complete in sequence.</p>
</li>
</ul>
<h3 id="heading-summary">Summary</h3>
<p>Race conditions can disrupt data consistency in multi-user environments, but Xano offers no code tools to address them. By combining database transactions and locks, you can:</p>
<ul>
<li><p>Ensure critical actions complete without interference.</p>
</li>
<li><p>Block conflicting access to specific records until a transaction completes.</p>
</li>
<li><p>Use asynchronous processing to manage heavy request queues without slowing down the user experience.</p>
</li>
</ul>
<p>By implementing these practices, you’ll improve data reliability and maintain a responsive, high-integrity system for your users.</p>
]]></content:encoded></item><item><title><![CDATA[Welcome to Startup Skin]]></title><description><![CDATA[Hello, makers and builders!
We’re in the middle of a technological transformation where the barriers to creating web applications are falling fast. Visual Development, commonly known as “No-code and low-code development” is the future, making it poss...]]></description><link>https://www.danielmigizi.com/welcome-to-startup-skin</link><guid isPermaLink="true">https://www.danielmigizi.com/welcome-to-startup-skin</guid><category><![CDATA[No Code]]></category><category><![CDATA[Low Code]]></category><category><![CDATA[Tech community]]></category><category><![CDATA[weweb]]></category><category><![CDATA[XANO]]></category><dc:creator><![CDATA[Daniel Migizi]]></dc:creator><pubDate>Tue, 05 Nov 2024 18:51:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1730832759901/3b910ef0-82b6-48b9-b9e0-14193a1eb94e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, makers and builders!</p>
<p>We’re in the middle of a technological transformation where the barriers to creating web applications are falling fast. Visual Development, commonly known as “No-code and low-code development” is the future, making it possible for anyone with an idea to build powerful digital tools and integrations without a deep background in coding. And that’s exactly what <strong>Startup Skin</strong> is here to support.</p>
<p>I'm <a target="_blank" href="https://x.com/danielmigizi"><strong>Daniel Migizi</strong></a>, the founder of <a target="_blank" href="https://community.startupskin.com/invitation?code=B52J63">Startup Skin</a>, a community created to empower visual developers of all levels. With a focus on tools like <a target="_blank" href="https://dashboard.weweb.io/sign-up/78fa222a-3c06-4616-938a-b57a53c3bc58">WeWeb(1)</a> and <strong>Xano</strong>, our community is a dynamic, collaborative hub for those eager to turn ideas into applications quickly, effectively, and professionally.</p>
<h3 id="heading-what-is-startup-skin-all-about">What is Startup Skin All About?</h3>
<p>Our core focus on <strong>WeWeb</strong> and <strong>Xano</strong> allow us to help members leverage these platforms to their fullest potential. Together, these tools open up powerful possibilities for building everything from simple web applications to sophisticated enterprise-grade software.</p>
<p>Startup Skin welcomes builders using tools like <strong>Webflow, Wized, Zapier,</strong> and <strong>Airtable</strong>, along with other no-code tools that fit seamlessly into today’s visual development landscape.</p>
<h3 id="heading-why-join-startup-skin">Why Join Startup Skin?</h3>
<p>Whether you’re an entrepreneur, a developer, or someone with an innovative idea and a desire to build it, Startup Skin has something to offer. Here’s a glimpse into what you’ll find as a member:</p>
<ul>
<li><p><strong>Hands-On Tutorials &amp; In-Depth Guides:</strong> Our content is focused on empowering you to understand and leverage no-code and low-code tools. Dive into practical guides that show you the ropes and help you overcome common challenges.</p>
</li>
<li><p><strong>Community Expertise &amp; Support:</strong> Need a second opinion, some fresh ideas, or just a sounding board? Startup Skin’s members come from diverse backgrounds and expertise, all ready to support and inspire each other.</p>
</li>
<li><p><strong>Innovative Use Cases &amp; Real-World Examples:</strong> See how others are applying no-code solutions to real-world projects, helping you gather insights and inspiration to elevate your own work.</p>
</li>
<li><p><strong>Learning Resources Across Platforms:</strong> Beyond WeWeb and Xano, we offer knowledge and resources in many visual development tools. It’s about finding the right combination of tools to match your project’s needs.</p>
</li>
</ul>
<h3 id="heading-who-should-join">Who Should Join?</h3>
<p>If you’re interested in building web applications, Startup Skin is for you—no matter your skill level. We welcome everyone from beginners to seasoned developers. Even if you’re not currently using WeWeb or Xano, you’ll find that the community offers something valuable for all visual development enthusiasts.</p>
<h3 id="heading-ready-to-join-the-startup-skin-community">Ready to Join the Startup Skin Community?</h3>
<p>At Startup Skin, our vision is to create a place where <strong>ideas flourish, solutions emerge, and projects become reality.</strong> I personally invite you to join us, explore new tools, gain insights from peers, and discover ways to grow in your visual development journey. Whether you’re launching your first app or scaling up, you’ll find a community of like-minded creators ready to support and collaborate with you.</p>
<p>Welcome to Startup Skin. We can’t wait to see what you’ll create.</p>
<p><a target="_blank" href="https://community.startupskin.com/invitation?code=B52J63">Click here to join the community</a></p>
<h3 id="heading-references">References</h3>
<p>References are displayed next to the link in the article as parentheses (1).</p>
<ol>
<li><a target="_blank" href="https://dashboard.weweb.io/sign-up/78fa222a-3c06-4616-938a-b57a53c3bc58"><em>WeWeb affilate link - Get 10% OFF all price plans</em></a></li>
</ol>
]]></content:encoded></item><item><title><![CDATA[How to Select Highlighted Text in a Rich Text Input Using Custom JavaScript in WeWeb]]></title><description><![CDATA[https://youtu.be/BekMQS_hqyw
 

Set up the Rich Text Input:

Add a rich text input to your page.


Create a Workflow:

Go to the workflow section for your rich text input.

Add a new workflow and give it a name.

Set the trigger to "On Click".



Add...]]></description><link>https://www.danielmigizi.com/how-to-select-highlighted-text-in-a-rich-text-input-using-custom-javascript-in-weweb</link><guid isPermaLink="true">https://www.danielmigizi.com/how-to-select-highlighted-text-in-a-rich-text-input-using-custom-javascript-in-weweb</guid><category><![CDATA[weweb]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Low Code]]></category><dc:creator><![CDATA[Daniel Migizi]]></dc:creator><pubDate>Sun, 20 Oct 2024 21:35:30 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1729459917853/91f8d1a5-b38f-4e63-9399-6226a79b0f1d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/BekMQS_hqyw">https://youtu.be/BekMQS_hqyw</a></div>
<p> </p>
<ol>
<li><p><strong>Set up the Rich Text Input:</strong></p>
<ul>
<li>Add a rich text input to your page.</li>
</ul>
</li>
<li><p><strong>Create a Workflow:</strong></p>
<ul>
<li><p>Go to the workflow section for your rich text input.</p>
</li>
<li><p>Add a new workflow and give it a name.</p>
</li>
<li><p>Set the trigger to <strong>"On Click"</strong>.</p>
</li>
</ul>
</li>
<li><p><strong>Add Custom JavaScript:</strong></p>
<ul>
<li><p>In the workflow, choose <strong>"Custom JavaScript"</strong> as the action.</p>
</li>
<li><p>Enter the following code:</p>
<pre><code class="lang-javascript">  <span class="hljs-keyword">return</span> <span class="hljs-built_in">window</span>.getSelection().toString().trim()
</code></pre>
</li>
</ul>
</li>
</ol>
<p>    This code selects the highlighted text when clicked.</p>
<ol start="4">
<li><p><strong>Create a Variable:</strong></p>
<ul>
<li><p>Go to the variables section of your project.</p>
</li>
<li><p>Create a new variable (e.g., <strong>"selectedTextDemo"</strong>).</p>
</li>
<li><p>Set the variable type to "Text".</p>
</li>
<li><p>Enable "Preserve on navigation" if you want the selected text to persist between page loads.</p>
</li>
</ul>
</li>
<li><p><strong>Update the Variable:</strong></p>
<ul>
<li><p>In your <strong>"Workflow"</strong> on the rich text input, add another action after the Custom JavaScript.</p>
</li>
<li><p>Choose <strong>"Update variable value"</strong>.</p>
</li>
<li><p>Select your newly created variable (e.g., <strong>"selectedTextDemo"</strong>).</p>
</li>
<li><p>Set its value to the result of the Custom JavaScript action.</p>
</li>
</ul>
</li>
<li><p><strong><em>Display the Selected Text (Optional):</em></strong></p>
<ul>
<li><p>Add a heading element to your page.</p>
</li>
<li><p>In the heading's properties, go to the <strong>"Text"</strong> section.</p>
</li>
<li><p>Bind the text to your variable (e.g., <strong>"selectedTextDemo"</strong>). This will display the selected text in real-time.</p>
</li>
</ul>
</li>
<li><p><strong><em>Copy to Clipboard (Optional):</em></strong></p>
<ul>
<li><p>In your workflow, add a <strong>"Copy to clipboard"</strong> action after updating the variable.</p>
</li>
<li><p>Set the content to copy as your variable (e.g., <strong>"selectedTextDemo"</strong>).</p>
</li>
</ul>
</li>
<li><p><strong>Test Your Implementation:</strong></p>
<ul>
<li><p>Preview your page.</p>
</li>
<li><p>Type some text in the rich text input.</p>
</li>
<li><p>Highlight a portion of the text and click on it.</p>
</li>
<li><p>The selected text should appear in the heading (if you added one).</p>
</li>
<li><p>The selected text should also be copied to your clipboard.</p>
</li>
</ul>
</li>
</ol>
<p>By following these steps, you've created a system that selects highlighted text in a rich text input, stores it in a variable, optionally displays it on the page, and copies it to the clipboard - all without writing complex code - just one line of javascript.</p>
]]></content:encoded></item><item><title><![CDATA[Connecting Xano and Webflow: A Guide to Handling Form Submissions]]></title><description><![CDATA[https://youtu.be/K4luVws3C8w?si=zua5MwVf9GJJQFPO
 
In the world of modern web development, the ability to create powerful, database-driven websites without extensive coding is a game-changer. Two platforms at the forefront of this revolution are Webf...]]></description><link>https://www.danielmigizi.com/connecting-xano-and-webflow-a-guide-to-handling-form-submissions</link><guid isPermaLink="true">https://www.danielmigizi.com/connecting-xano-and-webflow-a-guide-to-handling-form-submissions</guid><category><![CDATA[XANO]]></category><category><![CDATA[Low Code]]></category><category><![CDATA[AI]]></category><category><![CDATA[webflow]]></category><category><![CDATA[No Code]]></category><dc:creator><![CDATA[Daniel Migizi]]></dc:creator><pubDate>Mon, 12 Aug 2024 02:37:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1723429813834/11a5a8dc-c075-445b-8fe3-09e399e68151.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/K4luVws3C8w?si=zua5MwVf9GJJQFPO">https://youtu.be/K4luVws3C8w?si=zua5MwVf9GJJQFPO</a></div>
<p> </p>
<p>In the world of modern web development, the ability to create powerful, database-driven websites without extensive coding is a game-changer. Two platforms at the forefront of this revolution are <a target="_blank" href="https://webflow.com/">Webflow</a>, a visual web design tool, and <a target="_blank" href="https://www.xano.com/">Xano</a>, a no-code backend development platform. When combined, they offer a robust solution for creating dynamic websites with sophisticated data management capabilities.</p>
<p><strong>One common use case for this integration is handling form submissions. Here's a streamlined process to connect your Webflow forms to a Xano backend:</strong></p>
<ol>
<li><p><strong>Set Up Your Xano Backend:</strong> Begin by creating a database table in Xano to store your form submissions. Then, create an API endpoint that accepts <code>POST</code> requests containing the form data. This endpoint will serve as the bridge between your Webflow form and your Xano database.</p>
</li>
<li><p><strong>Configure Your Webflow Form:</strong> In Webflow, design your form as usual. Then, in the form settings, set the action to your Xano API endpoint URL. This tells Webflow where to send the form data.</p>
</li>
<li><p><strong>Implement Custom Code:</strong> To ensure a smooth user experience and handle the form submission process more effectively, add a custom code snippet to your Webflow site. This JavaScript code will intercept the form submission, send the data to Xano via an AJAX request, and handle the response.</p>
</li>
<li><p><strong>Create a Transition Effect:</strong> For an extra touch of polish, implement a transition effect after successful form submission. This can be achieved using animation libraries like <a target="_blank" href="https://gsap.com/">GSAP</a>, creating a visually appealing experience as the user is redirected or shown a success message.</p>
</li>
<li><p><strong>Test and Refine:</strong> Thoroughly test your form submission process, ensuring data is correctly sent to Xano and stored in your database. Refine the user experience based on these tests, adjusting error handling and success messages as needed.</p>
</li>
</ol>
<h2 id="heading-leveraging-ai-for-code-generation">Leveraging AI for Code Generation:</h2>
<p>One of the most exciting developments in this space is the ability to use AI, like Claude, to generate the necessary code for connecting Xano and Webflow. By providing Claude with specific requirements, such as the need for a form submission handler with a custom transition effect, you can quickly obtain a working code snippet.</p>
<p>For example, you might prompt Claude with: "I need JavaScript code to handle a Webflow form submission, send the data to a Xano API, and create a transition effect using GSAP after successful submission."</p>
<h3 id="heading-claude-can-then-generate-a-code-snippet-that-includes"><strong>Claude can then generate a code snippet that includes:</strong></h3>
<ul>
<li><p>Event listeners for form submission</p>
</li>
<li><p>AJAX requests to the Xano API</p>
</li>
<li><p>Error handling</p>
</li>
<li><p>GSAP animations for a smooth transition effect</p>
</li>
</ul>
<p>This AI-assisted approach significantly reduces the time and expertise needed to implement complex functionality. It allows designers and entrepreneurs to focus on their core product while still implementing sophisticated features.</p>
<p>By following these steps and utilizing AI assistance, you create a seamless connection between your Webflow front-end and Xano back-end. This integration allows you to collect and store form data efficiently, opening up possibilities for further data processing, automated responses, or integration with other services.</p>
<p>The beauty of this setup lies in its flexibility and scalability. As your needs grow, you can easily expand your Xano backend to handle more complex data operations, all while maintaining the visual design control that Webflow offers.</p>
<p>This approach uses Webflow and Xano without Wized. But another way to connect your webflow form to xano is through Wized. We will touch on that another time.</p>
<p><strong>Below is the code snippet used on my contact page to send the form data to xano and animate on form submission.</strong></p>
<pre><code class="lang-javascript">&lt;script src=<span class="hljs-string">"https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"</span>&gt;&lt;/script&gt;
<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
<span class="hljs-built_in">document</span>.addEventListener(<span class="hljs-string">'DOMContentLoaded'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-comment">// Create transition overlay</span>
  <span class="hljs-keyword">const</span> overlay = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">'div'</span>);
  overlay.style.position = <span class="hljs-string">'fixed'</span>;
  overlay.style.top = <span class="hljs-string">'0'</span>;
  overlay.style.left = <span class="hljs-string">'0'</span>;
  overlay.style.width = <span class="hljs-string">'100%'</span>;
  overlay.style.height = <span class="hljs-string">'100%'</span>;
  overlay.style.backgroundColor = <span class="hljs-string">'transparent'</span>;
  overlay.style.zIndex = <span class="hljs-string">'9999'</span>;
  overlay.style.pointerEvents = <span class="hljs-string">'none'</span>;
  <span class="hljs-built_in">document</span>.body.appendChild(overlay);

  <span class="hljs-comment">// Create circles</span>
  <span class="hljs-keyword">const</span> circleCount = <span class="hljs-number">5</span>;
  <span class="hljs-keyword">const</span> circles = [];
  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; circleCount; i++) {
    <span class="hljs-keyword">const</span> circle = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">'div'</span>);
    circle.style.position = <span class="hljs-string">'absolute'</span>;
    circle.style.borderRadius = <span class="hljs-string">'50%'</span>;
    circle.style.backgroundColor = <span class="hljs-string">'#725f73'</span>;
    circle.style.width = <span class="hljs-string">'20px'</span>;
    circle.style.height = <span class="hljs-string">'20px'</span>;
    circle.style.transform = <span class="hljs-string">'scale(0)'</span>;
    overlay.appendChild(circle);
    circles.push(circle);
  }

  <span class="hljs-keyword">const</span> form = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">'form'</span>); <span class="hljs-comment">// Adjust selector if needed</span>
  form.addEventListener(<span class="hljs-string">'submit'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>) </span>{
    e.preventDefault();
    <span class="hljs-keyword">const</span> formData = <span class="hljs-keyword">new</span> FormData(form);
    <span class="hljs-keyword">const</span> data = <span class="hljs-built_in">Object</span>.fromEntries(formData);

    fetch(<span class="hljs-string">'PLACE-YOUR-XANO-ENDPOINT-HERE'</span>, {
      <span class="hljs-attr">method</span>: <span class="hljs-string">'POST'</span>,
      <span class="hljs-attr">headers</span>: {
        <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>,
      },
      <span class="hljs-attr">body</span>: <span class="hljs-built_in">JSON</span>.stringify(data),
    })
    .then(<span class="hljs-function"><span class="hljs-params">response</span> =&gt;</span> response.json())
    .then(<span class="hljs-function"><span class="hljs-params">result</span> =&gt;</span> {
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Success:'</span>, result);

      <span class="hljs-comment">// Position circles randomly</span>
      circles.forEach(<span class="hljs-function"><span class="hljs-params">circle</span> =&gt;</span> {
        circle.style.left = <span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-built_in">Math</span>.random() * <span class="hljs-number">100</span>}</span>%`</span>;
        circle.style.top = <span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-built_in">Math</span>.random() * <span class="hljs-number">100</span>}</span>%`</span>;
      });

      <span class="hljs-comment">// Animate circles and transition to new page</span>
      <span class="hljs-keyword">const</span> tl = gsap.timeline();

      tl.to(circles, {
        <span class="hljs-attr">scale</span>: <span class="hljs-number">50</span>,
        <span class="hljs-attr">duration</span>: <span class="hljs-number">1</span>,
        <span class="hljs-attr">stagger</span>: <span class="hljs-number">0.1</span>,
        <span class="hljs-attr">ease</span>: <span class="hljs-string">"power2.in"</span>,
      })
      .to(overlay, {
        <span class="hljs-attr">backgroundColor</span>: <span class="hljs-string">'#725f73'</span>,
        <span class="hljs-attr">duration</span>: <span class="hljs-number">0.2</span>,
        <span class="hljs-attr">onComplete</span>: <span class="hljs-function">() =&gt;</span> {
          <span class="hljs-built_in">window</span>.location.href = <span class="hljs-string">'https://www.danielmigizi.com/'</span>;
        }
      }, <span class="hljs-string">"-=0.5"</span>);
    })
    .catch(<span class="hljs-function"><span class="hljs-params">error</span> =&gt;</span> {
      <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Error:'</span>, error);
      alert(<span class="hljs-string">'There was an error submitting your form. Please try again.'</span>);
    });
  });
});
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></span>
</code></pre>
<h2 id="heading-heres-a-walk-through-of-whats-happening-in-the-above-code">Here's a walk-through of what's happening in the above code:</h2>
<ol>
<li><p>First, the script loads the GSAP (GreenSock Animation Platform) library from a CDN.</p>
</li>
<li><p>The code waits for the DOM to be fully loaded before executing (using <code>DOMContentLoaded</code> event).</p>
</li>
<li><p>It creates a full-screen overlay:</p>
<ul>
<li><p>A <code>div</code> element is created and styled to cover the entire viewport.</p>
</li>
<li><p>It's initially transparent and doesn't interfere with user interactions.</p>
</li>
</ul>
</li>
<li><p>Next, it creates 5 circle elements:</p>
<ul>
<li><p>Each circle is a <code>div</code> styled to be round and colored #725f73.</p>
</li>
<li><p>They're initially invisible (scaled to 0) and positioned absolutely within the overlay.</p>
</li>
<li><p>These circles are stored in an array for later use.</p>
</li>
</ul>
</li>
<li><p>The script then finds the form on the page and adds a submit event listener.</p>
</li>
<li><p>When the form is submitted:</p>
<ul>
<li><p>The default form submission is prevented.</p>
</li>
<li><p>Form data is collected and formatted.</p>
</li>
</ul>
</li>
<li><p>A fetch request is made to submit the form data to a Xano API endpoint.</p>
</li>
<li><p>If the submission is successful:</p>
<ul>
<li><p>The circles are randomly positioned across the screen.</p>
</li>
<li><p>A GSAP timeline is created for the animation sequence.</p>
</li>
<li><p>The circles are animated to scale up dramatically (50 times their original size).</p>
</li>
<li><p>The animation is staggered, so each circle starts its animation slightly after the previous one.</p>
</li>
<li><p>After the circles have mostly covered the screen, the overlay's background color is set to #725f73 to fill any gaps.</p>
</li>
<li><p>Once the animation completes, the page redirects to the homepage.</p>
</li>
</ul>
</li>
<li><p>If there's an error in form submission:</p>
<ul>
<li><p>An error is logged to the console.</p>
</li>
<li><p>An alert is shown to the user.</p>
</li>
</ul>
</li>
</ol>
<p>This code creates a visually interesting transition effect after a successful form submission, where circles expand from random points on the screen to cover it before redirecting to a new page. The effect is smooth and engaging, providing visual feedback for the form submission process.</p>
<p><a target="_blank" href="https://www.danielmigizi.com/contact-me">Let me know what you think?</a></p>
]]></content:encoded></item></channel></rss>