<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ezekiel Lawson</title>
    <description>The latest articles on DEV Community by Ezekiel Lawson (@silentdev).</description>
    <link>https://dev.to/silentdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F270389%2F2e1121c8-7a2d-435c-9f1d-9b722c2bc844.jpg</url>
      <title>DEV Community: Ezekiel Lawson</title>
      <link>https://dev.to/silentdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/silentdev"/>
    <language>en</language>
    <item>
      <title>5 Tips for Using Digital Avatars in Recruitment Videos</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Wed, 04 Dec 2024 09:51:39 +0000</pubDate>
      <link>https://dev.to/simli_ai/5-tips-for-using-digital-avatars-in-recruitment-videos-38cf</link>
      <guid>https://dev.to/simli_ai/5-tips-for-using-digital-avatars-in-recruitment-videos-38cf</guid>
      <description>&lt;p&gt;Recruiting good-fit talent these days can be challenging and time-consuming. Traditional hiring methods often involve lengthy interview rounds, each with high costs and logistical hurdles. To streamline this process, companies are increasingly turning to video-based recruitment—and even taking it a step further with digital avatars.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.simli.com/" rel="noopener noreferrer"&gt;Digital avatars&lt;/a&gt; offer a fresh, engaging approach to recruitment videos, enabling companies to create tailored, responsive interactions with potential hires. These AI avatars can handle initial candidate interactions, answer common questions, and give candidates a glimpse into company culture—without requiring live interactions at every stage. This frees up valuable time for hiring teams and offers candidates a better experience.&lt;/p&gt;

&lt;p&gt;Many organizations, such as Dropbox, Starbucks, and GE Aerospace, have embraced video recruitment to showcase their work environments and core values. Integrating digital avatars can amplify these benefits, making recruitment faster, more accessible, and even more appealing to today’s top talent.&lt;/p&gt;

&lt;p&gt;Since AI avatars are a relatively new technology, adopting them effectively requires strategy. This article will explore the top five tips to help you make the most of digital avatars in recruitment videos.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Digital Avatar?
&lt;/h2&gt;

&lt;p&gt;A digital avatar is a virtual character generated through AI that interacts with users in real time. Designed to resemble a realistic person or a stylized character, digital avatars are embedded with conversational abilities that make them suitable for interactive roles, like guiding candidates in recruitment videos. &lt;/p&gt;

&lt;p&gt;They can welcome applicants, provide information about the company, and answer common questions, giving candidates a feel for the company without requiring live interaction.&lt;/p&gt;

&lt;p&gt;The popularity of digital avatars is rising because they offer a flexible, scalable solution for candidate engagement. Instead of scheduling numerous initial calls, hiring teams can use avatars to interact with many candidates simultaneously, saving time and resources. &lt;/p&gt;

&lt;p&gt;Additionally, digital avatars add a layer of personalization, giving candidates an engaging experience that stands out from traditional recruitment methods. This approach appeals to today’s tech-savvy candidates who value innovation and convenience in their job search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps In Using Digital Avatars In Recruitment Videos
&lt;/h2&gt;

&lt;p&gt;Our tutorial, "&lt;strong&gt;Turn Job Descriptions Into a Recruitment Video With AI&lt;/strong&gt;," goes into transforming text-based job descriptions into interactive video interviews. By leveraging &lt;a href="https://docs.simli.com/get-started" rel="noopener noreferrer"&gt;Simli’s API&lt;/a&gt;, you can set up a virtual interviewer that delivers pre-generated questions based on the job description, making it possible to handle multiple applicants simultaneously and reducing recruitment time from weeks to just a few days.&lt;/p&gt;

&lt;p&gt;The tutorial covers all the necessary steps, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up Simli and OpenAI accounts.&lt;/li&gt;
&lt;li&gt;Configuring API keys to connect to these services.&lt;/li&gt;
&lt;li&gt;Generating interview questions and audio responses using OpenAI’s chat completions and text-to-speech APIs.&lt;/li&gt;
&lt;li&gt;Integrating Simli's API to generate a lip-synced AI avatar that presents questions to applicants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Head to the complete tutorial for code samples and setup instructions to create your AI-driven recruitment video setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Tips for Using Digital Avatars in Recruitment Videos
&lt;/h2&gt;

&lt;p&gt;Here are five practical steps to adopt this technology in your hiring videos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;strong&gt;Set Clear Objectives&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Are you looking to create an engaging pre-interview, introduce candidates to your company culture, or evaluate specific competencies? Defining the purpose of your avatar-based recruitment videos is critical. For instance, if you’re aiming to screen for technical skills, outline what the avatar will communicate about the role and gather from candidates.&lt;/p&gt;

&lt;p&gt;Specific objectives help shape the interview flow and question prompts, which can be tailored into concise, captivating segments delivered by the avatar. Without clear goals, the video may lack focus, affecting candidate engagement and data collection quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;strong&gt;Choose the Right Avatar Personality&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Selecting an avatar that aligns with your brand and the job role is key. A straightforward and professional avatar can convey the right tone for technical roles, whereas a more relaxed persona may be better suited for creative roles. Platforms like Simli offer a variety of avatars, and many tools allow for customization down to the voice.&lt;/p&gt;

&lt;p&gt;Opt for avatars that fit the technical expectations of the role, ensuring they set the appropriate atmosphere and leave a positive impression on candidates. A misaligned avatar can disrupt the candidate experience and dilute your brand’s message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;strong&gt;Use AI to Generate Tailored Interview Questions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Automate interview questions with an AI tool like OpenAI's chat completions API. This approach lets you dynamically create questions based on a job description, making the interaction more personalized.&lt;/p&gt;

&lt;p&gt;Feed the avatar prompts that match the technical and soft skills you're seeking, making certain the questions align with the real-world challenges of the role. This step can save time in interview preparation while providing candidates with an authentic glimpse into their potential responsibilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;strong&gt;Integrate Lip-Synced Audio for Realistic Interactions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create a natural feel in your videos, convert text-based questions to audio, then sync the audio with the avatar's lip movements using a platform like Simli. This process requires downsampling audio to 16kHz PCM to match typical &lt;a href="https://docs.simli.com/api-reference/webrtc-info" rel="noopener noreferrer"&gt;WebRTC&lt;/a&gt; audio standards, which many tools automate.&lt;/p&gt;

&lt;p&gt;Using lip-synced avatars allows candidates to experience a smoother, more lifelike conversation, making the interaction feel less automated and more engaging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; &lt;strong&gt;Test and Iterate Your Videos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before launching avatar-led interviews, conduct tests with a diverse group to gather feedback. Watch for awkward pauses, audio misalignments, or unclear prompts, and refine the script based on real interactions. Regularly update the avatar content to reflect current job demands, company culture, and candidate feedback. This iterative process will make your video content relevant and polished, maintaining a professional edge that resonates with your ideal candidates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scale Recruitment Efforts With Cost-efficient Digital Avatars
&lt;/h2&gt;

&lt;p&gt;Digital avatars are an accessible, budget-friendly way to scale recruitment. With tools like Simli, which offers pay-as-you-go pricing, you can keep costs low by paying only for what you use. &lt;/p&gt;

&lt;p&gt;Simli’s AI Video Avatar platform enables developers to &lt;a href="https://docs.simli.com/api-reference/available-faces#create-your-own-avatar-app-simli-com" rel="noopener noreferrer"&gt;create avatars&lt;/a&gt; that mimic human movement and speech convincingly, adding a personal touch to recruitment videos that resonates with candidates. &lt;/p&gt;

&lt;p&gt;Beyond hiring, Simli’s avatars can be adapted for &lt;strong&gt;employee interview practice&lt;/strong&gt;, &lt;strong&gt;sales support, language lessons&lt;/strong&gt;, and &lt;strong&gt;coaching&lt;/strong&gt;, making it a versatile tool for various business needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXcCRMm1dAChk6I0KzATJ3q6amvEU1jbDUqCro4D41E6Qdi4FOiEMqSiPQtmsYROvNNY3KRAV6MbjZZbW6xoye8epNOutVd79gBkECIAtxGJuO_tHcyKAjPT0BMTWThmzvVQtjTytHaCZjyBN9qJ5vzFCKI%3Fkey%3DoscBGAegBJr1lbnrP3g-tQ" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXcCRMm1dAChk6I0KzATJ3q6amvEU1jbDUqCro4D41E6Qdi4FOiEMqSiPQtmsYROvNNY3KRAV6MbjZZbW6xoye8epNOutVd79gBkECIAtxGJuO_tHcyKAjPT0BMTWThmzvVQtjTytHaCZjyBN9qJ5vzFCKI%3Fkey%3DoscBGAegBJr1lbnrP3g-tQ" alt="Characters from Simli Demo page" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Simli provides a demo page to explore character options and offers an open-source project that integrates with OpenAI, providing hands-on guidance for developers. Its &lt;a href="https://github.com/simliai" rel="noopener noreferrer"&gt;starter project&lt;/a&gt; lets developers clone and experiment with a digital avatar setup quickly, with 60 free minutes of API use and no credit card requirement. This trial period offers a low-risk way to experiment with the technology before committing to further usage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8y6xltrxxyee2144lkst.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8y6xltrxxyee2144lkst.png" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Digital avatars reduce the stress and time recruiters spend using traditional methods in employee interviews and cut the cost of hiring more recruiters. Tools like &lt;a href="https://docs.simli.com/introduction" rel="noopener noreferrer"&gt;Simli&lt;/a&gt; make it easy for companies to add AI avatars to their hiring process in just a few clicks. &lt;/p&gt;

&lt;p&gt;Simli has a &lt;a href="https://discord.gg/yQx49zNF4d" rel="noopener noreferrer"&gt;Discord channel&lt;/a&gt; where you can connect with other members and ask questions about an issue you encounter with the tool, and learn more about maximizing its features. &lt;/p&gt;

</description>
      <category>digitalavatars</category>
      <category>recruitmentvideos</category>
      <category>simli</category>
      <category>virtualavatar</category>
    </item>
    <item>
      <title>Build an Appwrite database search dashboard with Algolia</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Thu, 18 Jan 2024 15:02:32 +0000</pubDate>
      <link>https://dev.to/hackmamba/build-an-appwrite-database-search-dashboard-with-algolia-346i</link>
      <guid>https://dev.to/hackmamba/build-an-appwrite-database-search-dashboard-with-algolia-346i</guid>
      <description>&lt;p&gt;Crafting a compelling website search experience has historically posed certain challenges, causing pain points such as slow results and relevance problems as datasets expanded. However, Algolia has revolutionized this process. Its powerful API facilitates real-time data searches, solving speed, suggestion, relevance, and user experience concerns. Integrating Algolia guarantees fast and seamless search integration for websites and mobile applications. This article will show you how to build a database search dashboard with Appwrite and Algolia. You will use the built-in Appwrite Cloud Function template &lt;strong&gt;Sync with Algolia.&lt;/strong&gt; Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you proceed, you’ll need the following under your belt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A GitHub &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;account&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Appwrite Cloud &lt;a href="https://cloud.appwrite.io/login?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog" rel="noopener noreferrer"&gt;account&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;An &lt;a href="https://www.algolia.com/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog" rel="noopener noreferrer"&gt;Algolia account&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checkout the complete project on &lt;a href="https://github.com/Emilsone/sync-with-algolia" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’ve got all the necessary requisites, we can begin creating an Appwrite Cloud Function template is the subsequent step. However, before delving into the setup process, let's take a moment to talk a bit about what an Algolia search engine is and what it offers.&lt;/p&gt;

&lt;p&gt;First, what is Algolia? &lt;a href="https://www.algolia.com/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog" rel="noopener noreferrer"&gt;Algolia&lt;/a&gt; is a hosted search engine tool designed to empower businesses to optimize search and discovery speed while mitigating the challenges of relevance tuning through AI. This platform provides users with tools for tailoring their search experience, offering solutions that cater to various use cases. Algolia focuses on two key aspects: implementing search functionalities and comprehensive search analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up Appwrite Cloud Functions
&lt;/h2&gt;

&lt;p&gt;The first step will begin by creating a new Appwrite project. Navigate to the Appwrite's Cloud console and select &lt;strong&gt;Create project&lt;/strong&gt;. Creating a new project will give you access to the Appwrite Function, &lt;strong&gt;Project ID,&lt;/strong&gt; and &lt;strong&gt;API key.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702976814058_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702976814058_image.png" alt="Create Appwrite project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following that, you will proceed to creating your Database and Collection. Copy the corresponding IDs and store them in a readily accessible location — you’ll need them during the creation of the Appwrite Function. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703166490445_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703166490445_image.png" alt="Appwrite console overview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create your database, navigate to the left menu bar and click on &lt;strong&gt;Databases&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703166280913_create-database.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703166280913_create-database.png" alt="Create Appwrite database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is to create a collection, like a container for a list of documents.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703167122643_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703167122643_image.png" alt="Create Appwrite collection"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;Create&lt;/strong&gt; button to initiate your new collection. Afterward, go to the side menu, select &lt;strong&gt;Functions&lt;/strong&gt;, and click on &lt;strong&gt;Templates&lt;/strong&gt; for the next steps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702977345961_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702977345961_image.png" alt="Appwrite function templates"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you've finished the previous step, a list of available options will appear. Choose the template from this list that aligns with your project's requirements. You can use the search bar to quickly locate the specific template needed for this project, which, in my case, is &lt;strong&gt;Sync with Algolia&lt;/strong&gt;. Next, click on the &lt;strong&gt;Create function&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702978322002_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702978322002_image.png" alt="Sync with Algolia template"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select a Node.js runtime. Select 18.0 as the runtime in this example and click the &lt;strong&gt;Next&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702988474007_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702988474007_image.png" alt="Appwrite function configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The subsequent step involves adding environment variables for your function's runtime. Appwrite requires seven variables, as illustrated in the example below. Click on the &lt;strong&gt;Generate API key&lt;/strong&gt; option. Once created, this action will automatically create the &lt;strong&gt;APPWRITE_API_KEY&lt;/strong&gt; for your project and apply it to this function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702990430440_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702990430440_image.png" alt="Generate Appwrite API key"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, navigate to the location where you stored your &lt;code&gt;APPWRITE_DATABASE_ID&lt;/code&gt; and &lt;code&gt;APPWRITE_COLLECTION_ID&lt;/code&gt;. Copy the respective IDs and paste them into the right inputs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702990375224_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702990375224_image.png" alt="Appwrite Database and Collection ID"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afterward, navigate to your Algolia website and copy the following ID shown in the diagram below. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702990852437_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702990852437_image.png" alt="Algolia API variables"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get the following IDs, you must create an account with Algolia, as stated in the prerequisites. Now’s the time to log into your account and navigate to where you have your account profile. Click on the dropdown icon and click on &lt;strong&gt;Settings&lt;/strong&gt;. This will take you to the section where you can create a new application and the ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Algolia application and index
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702991613761_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702991613761_image.png" alt="Algolia application"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afterward, you'll be prompted to choose a region. Upon selecting a region, you'll have to complete a ReCaptcha test, and that concludes the application creation process!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702991724536_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702991724536_image.png" alt="Select region"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following that, copy the &lt;strong&gt;ALGOLIA_APP_ID&lt;/strong&gt; — the ID of the recently created application. To do so, return to the settings, under the &lt;strong&gt;Team and Access&lt;/strong&gt; section, click on &lt;strong&gt;API Keys&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702992330090_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702992330090_image.png" alt="Algolia API keys"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will give you access to where you will find the &lt;strong&gt;ALGOLIA_ADMIN_API_KEY&lt;/strong&gt; and &lt;strong&gt;ALGOLIA_SEARCH_API_KEY&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702992690066_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702992690066_image.png" alt="Algolia API keys"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last ID is the &lt;strong&gt;ALGOLIA_INDEX_ID&lt;/strong&gt;, and this is the ID of the index in Algolia where the documents are to be synced. Return to the overview page and navigate to the left-side menu of the dashboard. Click on the menu &lt;strong&gt;Search.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702993422306_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702993422306_image.png" alt="Locating the search menu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you’ll create an Index. This index is where you’ll import your Appwrite data. Click on the &lt;strong&gt;Create index button&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702993830754_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702993830754_image.png" alt="Algolia index"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When creating an index, it is crucial to exercise great caution in spelling, as even a minor error in word choice can lead to an error in your project. Algolia guides you on naming your index appropriately, offering strategies to mitigate the risk of such errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702995478583_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702995478583_image.png" alt="Create a new Algolia index"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have now successfully created your index! The next step is to get your Index ID. Your Index ID corresponds to the name you assigned to the index during creation. Copy this Index ID and paste it into the required section that prompts for the index ID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702995755023_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702995755023_image.png" alt="Algolia index created"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating your Index and Algolia Application, revisit the section where Appwrite initially requested the variables and paste the Algolia variables. &lt;/p&gt;

&lt;p&gt;Next, connect the function to a new or existing repository within a selected Git organization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703165654572_connect-repository.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703165654572_connect-repository.png" alt="Connect Appwrite function to Git organization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you will install Appwrite on your GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702997598567_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702997598567_image.png" alt="Install Appwrite"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the process of installing, Appwrite will request access to your GitHub. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703832849251_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703832849251_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After granting Appwrite access, you will be redirected to the Appwrite installation process. Click on the &lt;strong&gt;Repository&lt;/strong&gt; option to see an automatically generated repository. Feel free to modify the repository name to align with your preferences. Remember that you can uncheck the &lt;strong&gt;Keep repository private&lt;/strong&gt; checkbox if you prefer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702997793751_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1702997793751_image.png" alt="Selecet Git repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The final step in creating an Appwrite Function is to select your branch name. In this section, you can leave the branch name as &lt;strong&gt;main&lt;/strong&gt; or choose a different name based on your preference.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703167814332_connect-branch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703167814332_connect-branch.png" alt="Select Git branch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations! You have successfully created your Appwrite Function for syncing with Algolia. Following the creation of your function, you can locate your &lt;strong&gt;Deployment ID&lt;/strong&gt;, &lt;strong&gt;Domain&lt;/strong&gt;, and &lt;strong&gt;GitHub source code&lt;/strong&gt;, as illustrated in the diagram below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703833186753_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703833186753_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’re not quite done yet! The aim is to learn how to synchronize your Appwrite data with Algolia and subsequently query that data. Below is a screenshot of what your application should look like when you click on the &lt;strong&gt;Domains&lt;/strong&gt; URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703168951066_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703168951066_image.png" alt="Sync with Algolia demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To get this synchronization going, begin by navigating to the &lt;strong&gt;Databases&lt;/strong&gt; menu. Click on the specific database you created to be redirected to the associated &lt;strong&gt;Collections&lt;/strong&gt;. Within the collection, you will be directed to the &lt;strong&gt;Documents&lt;/strong&gt; page. Click on the button &lt;strong&gt;create attribute&lt;/strong&gt; to add and organize your data. &lt;/p&gt;

&lt;p&gt;You will notice four options for the attribute type you intend to create. Choose &lt;strong&gt;String,&lt;/strong&gt; as that's the first attribute type you will be working with.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703169329886_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703169329886_image.png" alt="Create new Appwrite document"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will create a data collection for a phone, focusing on three key pieces of information: &lt;strong&gt;Brand&lt;/strong&gt;, &lt;strong&gt;Model&lt;/strong&gt;, and &lt;strong&gt;Price&lt;/strong&gt;. Next, add the attribute key and size. Tick the &lt;strong&gt;Required&lt;/strong&gt; box if you want to make the string required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703170120381_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703170120381_image.png" alt="Create attribute"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703170393682_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703170393682_image.png" alt="Select attribute requirement"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Proceed to create the remaining two attributes, &lt;strong&gt;model&lt;/strong&gt; and &lt;strong&gt;price&lt;/strong&gt;. Below is an image illustrating the expected structure of the three attributes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703188644991_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703188644991_image.png" alt="Appwrite attribute created"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To proceed, update the attributes with the correct data. Navigate to the &lt;strong&gt;Documents&lt;/strong&gt; menu and click the &lt;strong&gt;Create document&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703190282310_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703190282310_image.png" alt="Update attribute with data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, choose the individuals who should access your documents and collections. Once you have configured the access settings, click the &lt;strong&gt;create&lt;/strong&gt; button to complete the process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703190381906_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703190381906_image.png" alt="Select document permission"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have now updated your attributes with the correct data — and you are getting closer to finishing up! The next step is to index the data in Algolia. To accomplish this, navigate to your &lt;strong&gt;Function&lt;/strong&gt; template and click the &lt;strong&gt;Execute Now&lt;/strong&gt; button. A modal will appear, prompting you to execute your function manually. Leave the path unchanged and switch the method from &lt;strong&gt;GET&lt;/strong&gt; to &lt;strong&gt;POST&lt;/strong&gt;. After making this adjustment, click the &lt;strong&gt;Execute&lt;/strong&gt; button to initiate the indexing process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703191709430_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703191709430_image.png" alt="Execute Appwrite function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After your function has been successfully executed, there's one more step. Verify the log to ensure that your data was synchronized with Algolia. Click on the &lt;strong&gt;Execution ID&lt;/strong&gt;, leading you to the &lt;strong&gt;Logs&lt;/strong&gt; input for a detailed examination.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703192466943_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703192466943_image.png" alt="Execution ID"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703192590765_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1703192590765_image.png" alt="Execution log"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is to confirm the data in the Algolia index. Head to the Algolia dashboard and refresh it; you will observe the new data you added to Appwrite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1704709258913_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_6234BA94EABA72A11547BEE945BA9C69D40CA16F87F8672B5B4E3CF51037390C_1704709258913_image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that you have confirmed that your Appwrite data has been successfully indexed in Algolia, the next step is to query the data using the search input. As you have seen, the Appwrite Cloud Function template seamlessly integrates with Algolia, offering developers flexibility in synchronizing data. In the Algolia dashboard, you can configure which attributes are irrelevant or have higher priority and sync the parameters you need, as seen in the customization option below. &lt;/p&gt;

&lt;h2&gt;
  
  
  Customization with Appwrite and Algolia
&lt;/h2&gt;

&lt;p&gt;The Appwrite and Algolia template allows you to customize and synchronize your required parameters. For example, suppose you only need three parameters: the phone's brand, model, and price. In that case, you can achieve this by accessing the &lt;code&gt;index.html&lt;/code&gt; file and replacing the existing code within the script tag in the &lt;code&gt;index.html&lt;/code&gt; file with the provided code below to change how data is displayed in the demo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
       &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;algolia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;algoliasearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{{ALGOLIA_APP_ID}}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{{ALGOLIA_SEARCH_API_KEY}}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
          &lt;span class="p"&gt;);&lt;/span&gt;

          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;instantsearch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;indexName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{{ALGOLIA_INDEX_ID}}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;searchClient&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;algolia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;

          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;instantsearch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;widgets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;searchBox&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#searchbox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;instantsearch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;widgets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#hits&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;templates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;components&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="s2"&gt;`
                &amp;lt;div class="card"&amp;gt;
                  &amp;lt;div class="card-body"&amp;gt;
                    &amp;lt;h5 class="card-title"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h5&amp;gt;
                    &amp;lt;p class="card-text"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;
                      &amp;lt;p class="card-text"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Price&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/p&amp;gt;
                    &amp;lt;!-- Add other properties as needed --&amp;gt;
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
              `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addWidgets&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;searchBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

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

&lt;/div&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/5e616240011345e28747a6d2a0f26f9b"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congrats! You’ve created a robust database search dashboard by leveraging the combination of Appwrite and Algolia. Using the Appwrite Cloud Function template for sync with Algolia, you can now incorporate an efficient search solution into your websites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appwrite.io/docs/references/cloud/client-web/functions?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog" rel="noopener noreferrer"&gt;Appwrite Cloud Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://appwrite.io/docs/references/cloud/client-web/databases?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog" rel="noopener noreferrer"&gt;Appwrite Database&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.algolia.com/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog" rel="noopener noreferrer"&gt;Algolia Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>algolia</category>
      <category>appwritecloud</category>
      <category>appwritedatabase</category>
      <category>appwritecloudfunction</category>
    </item>
    <item>
      <title>Keep your online community safe: Build automated message moderation with Appwrite Cloud Functions</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Wed, 06 Dec 2023 11:07:13 +0000</pubDate>
      <link>https://dev.to/hackmamba/keep-your-online-community-safe-build-automated-message-moderation-with-appwrite-cloud-functions-23eg</link>
      <guid>https://dev.to/hackmamba/keep-your-online-community-safe-build-automated-message-moderation-with-appwrite-cloud-functions-23eg</guid>
      <description>&lt;p&gt;Maintaining a safe and welcoming environment is a priority in today's online communities. Regardless of the type of online community we manage, be it a social platform or discussion forum, ensuring the security and protection of users from harmful or inappropriate content is a necessity. With the help of Appwrite Cloud Function template &lt;strong&gt;Analyze with PerspectiveAPI&lt;/strong&gt;, we can build an automated message moderation system that allows community managers and developers to protect their online spaces against hate speech and unhelpful criticism. &lt;/p&gt;

&lt;p&gt;In this tutorial, you’ll learn how to create an automated message moderation system to promote a friendlier and more constructive online atmosphere. To do so, we’ll use Appwrite Cloud Functions and integrate the "Analyze with PerspectiveAPI" template. Additionally, we will discuss customization options for how to tailor the message rules better to suit our community's unique needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You’ll need a few things before getting started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://support.google.com/accounts/answer/27441"&gt;Google account&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A working Appwrite account. Don’t have an account? Create one on the &lt;a href="https://cloud.appwrite.io/register?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;An API key from the &lt;a href="https://developers.perspectiveapi.com/s/?language=en_US"&gt;PerspectiveAPI website&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting up Appwrite Cloud Functions
&lt;/h2&gt;

&lt;p&gt;If you’ve got the prerequisites covered, the next phase involves setting up an Appwrite Cloud Function. However, before we delve into the setup process, let's first take a moment to understand an Appwrite Cloud Function. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://appwrite.io/docs/products/functions?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite Function&lt;/a&gt;&lt;a href="https://appwrite.io/docs/products/functions?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;s&lt;/a&gt; &lt;a href="https://appwrite.io/docs/products/functions?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;&lt;/a&gt;are serverless functions that empower us to write custom code and perform specific tasks responding to various triggers, such as HTTP requests or scheduled events. Running this code on the server side increases the functionalities of our application. This versatility makes it an effective tool for data processing, integrating third-party services, and automation. &lt;/p&gt;

&lt;p&gt;Appwrite Functions give us the power to create almost anything we can think of. Sometimes, it can be hard to figure out where to start — thus, the gift of a function template. Our first step will begin by creating a new Appwrite project. Log in to Appwrite’s cloud console and select &lt;strong&gt;Create project&lt;/strong&gt;. Next let’s create a new project, which will give us access to the Appwrite Function and other services like our &lt;strong&gt;Project ID&lt;/strong&gt; and &lt;strong&gt;API key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kL84n9mE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698677684195_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kL84n9mE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698677684195_image.png" alt="" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;Create&lt;/strong&gt; button, and the project will be created successfully. The next step is to create our Appwrite Function. To do that, navigate to the side menu and click on &lt;strong&gt;Functions.&lt;/strong&gt; Next, click on the &lt;strong&gt;Create function.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rRvWnAlz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698678086007_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rRvWnAlz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698678086007_image.png" alt="" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you clicked the &lt;strong&gt;Create function&lt;/strong&gt; button, you likely noticed that Appwrite Functions offered quick-start templates for us to begin with. If we can't find the specific template we need, then we can access additional templates by clicking on the &lt;strong&gt;All templates&lt;/strong&gt; option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4og5FWOG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1699539671704_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4og5FWOG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1699539671704_image.png" alt="" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After completing that step, a list of available options will be displayed. From this list, select the desired template, which, in this instance, is &lt;strong&gt;Analyze with PerspectiveAPI&lt;/strong&gt;. There are two methods to access the templates: using the search bar or scrolling to locate the desired template. In this case, we will utilize the search bar. To proceed, search for the template name and click &lt;strong&gt;Create function&lt;/strong&gt; to select it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8U05kWEs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698678566936_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8U05kWEs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698678566936_image.png" alt="" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Node.js - 18.0 as the runtime. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QmYUYlQZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698679011875_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QmYUYlQZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698679011875_image.png" alt="" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next part is adding a variable called the &lt;strong&gt;PERSPECTIVE_API_KEY&lt;/strong&gt;. This key is available only from the &lt;a href="https://developers.perspectiveapi.com/s/?language=en_US"&gt;PerspectiveAPI website&lt;/a&gt;. (You’ll remember this from the prequisites.) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w_FQg4bx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698684022251_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w_FQg4bx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698684022251_image.png" alt="" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we insert our API key, it will take us to the next phase of linking our Function to either a new repository or an existing one in a chosen Git organization. Choose the &lt;strong&gt;Create a new repository&lt;/strong&gt; option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SnwEr_CC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698847057243_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SnwEr_CC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698847057243_image.png" alt="" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, choose a Git repository to activate our function deployments upon updates. At present, GitHub is the only available Git repository option; others are still in development. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LwjFj-HW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698847369123_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LwjFj-HW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698847369123_image.png" alt="" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After choosing a Git provider, the next step will prompt us to grant Appwrite permission to access our GitHub account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ntv-0iu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698849193042_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ntv-0iu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698849193042_image.png" alt="" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we have given Appwrite access, it will lead us to Appwrite for further installation. Click on the &lt;strong&gt;Repository&lt;/strong&gt; option, and we will notice an automatically created repository. The repository name can be modified to match your preferences. Remember, we can choose to deselect the &lt;strong&gt;Keep repository private&lt;/strong&gt; checkbox.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wYbm9IUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698850171786_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wYbm9IUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698850171786_image.png" alt="" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is to select our branch name. In this section, we can leave the branch name as the &lt;strong&gt;main.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YLPoY2gQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698850632590_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YLPoY2gQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698850632590_image.png" alt="" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have effectively created an Appwrite Function. Below is a deployment diagram illustrating the ID, Build time, Size, and Domain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--itLY8-Di--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698851460079_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--itLY8-Di--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698851460079_image.png" alt="" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo integration with PerspectiveAPI
&lt;/h2&gt;

&lt;p&gt;We've completed the creation of our Appwrite Function and successfully configured our &lt;strong&gt;PerspectiveAPI&lt;/strong&gt;! Next, let’s take a look at the integration and demonstrate how the PerspectiveAPI filters toxic speech. See the code below of what our Appwrite function code will look like in the &lt;code&gt;main.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
   &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;undici&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getStaticFile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;throwIfMissing&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./utils.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;throwIfMissing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PERSPECTIVE_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getStaticFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/html; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;throwIfMissing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;`https://commentanalyzer.googleapis.com/v1alpha1/comments:analyze?key=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PERSPECTIVE_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;comment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PLAIN_TEXT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="na"&gt;requestedAttributes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;TOXICITY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching from perspective API&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="mi"&gt;500&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cm"&gt;/** @type {*} */&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attributeScores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TOXICITY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;summaryScore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error fetching from perspective API&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="mi"&gt;500&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The code above is where we modify our changes. After making changes and committing them to the file, Appwrite will seamlessly redeploy our function automatically, as seen in the diagram below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k-QFtJzY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698956629695_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k-QFtJzY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_3DC4D8ECA61FDD5FF11E8907A36FF2B75128E8D219907C0AF5EC267F0E8A1345_1698956629695_image.png" alt="" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To see a live demonstration of our project, navigate to the deployment section in the Appwrite console. You will also find the &lt;strong&gt;ID&lt;/strong&gt;, &lt;strong&gt;Build time&lt;/strong&gt;, and &lt;strong&gt;Size&lt;/strong&gt; there. Click on the generated &lt;strong&gt;Domain&lt;/strong&gt;. This live demonstration highlights PerspectiveAPI's functionality, displaying how it evaluates the toxicity score of the message.&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/06f1dba2c8bd427194f349bc4d756959"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Customization option for message moderation
&lt;/h2&gt;

&lt;p&gt;Appwrite allows us to customize and moderate messages to fit our specific requirements. In this segment, we will create a comment section within the blog. Here, we will adjust the toxicity threshold based on a percentage to effectively filter out toxic comments, enabling us to decide which comments to display and which to withhold from the view. To accomplish this, replace the existing code within the script tag in the &lt;code&gt;index.html&lt;/code&gt; file with the provided code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
            &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;

          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

          &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;

          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;percent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

          &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;percent&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Toxic comment hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Toxicity of your message is: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;percent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;


&lt;p&gt;View the outcome of the customized feature we implemented, designed to conceal toxic comments from public view.&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/767c9585afd84bf89a844c49275c0c72"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;






&lt;p&gt;In the preceding section, we implemented a feature for enabling users to add comments to the blog, assessing the comment's toxicity, and concealing it from public view. This functionality has effectively allowed us to filter out toxic comments and hate speech from our platform. The Appwrite Cloud Function templates offer significant advantages by providing pre-built integrations, enabling us to implement additional features. This significantly reduces the burden of building from scratch and speeds up the development process. &lt;/p&gt;

&lt;p&gt;Another customization option is to store toxic comments in an &lt;a href="https://appwrite.io/docs/products/databases/quick-start?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite Cloud Database&lt;/a&gt;. This allows us to track the total number of toxic comments from a user and, if needed, implement measures like banning the user from using the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This article elaborated on moderating messages and maintaining online community safety using Appwrite Cloud Functions and its template &lt;a href="https://developers.perspectiveapi.com/s/?language=en_US"&gt;&lt;strong&gt;Analyze with PerspectiveAPI&lt;/strong&gt;&lt;/a&gt;. We also covered customization options and provided an implemented example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appwrite.io/docs/references/cloud/client-web/functions?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite Cloud Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://perspectiveapi.com/"&gt;Perspective API&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>appwritecloud</category>
      <category>appwritefunction</category>
      <category>onlinecommunity</category>
    </item>
    <item>
      <title>5 ways Appwrite Cloud helps freelancers handle more clients with ease</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Wed, 09 Aug 2023 11:02:06 +0000</pubDate>
      <link>https://dev.to/hackmamba/5-ways-appwrite-cloud-helps-freelancers-handle-more-clients-with-ease-34dc</link>
      <guid>https://dev.to/hackmamba/5-ways-appwrite-cloud-helps-freelancers-handle-more-clients-with-ease-34dc</guid>
      <description>&lt;p&gt;The global market for freelancing is expected to be valued at $1.5 trillion and is growing at a compound annual growth rate (CAGR) of 15%, according to reports and &lt;a href="https://ddiy.co/freelance-statistics/"&gt;freelance statistics&lt;/a&gt;. As of 2023, there were approximately 1.57 billion freelancers worldwide, and that figure is anticipated to rise even further in the ensuing year. As their client base expands, freelancers seek new tools and technology to improve productivity and handle multiple clients more effectively. With the help of Appwrite Cloud's extensive features, you can easily handle additional clients. In this article, you will learn five ways freelancers can use Appwrite Cloud to handle more clients easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges freelancers face in managing multiple clients
&lt;/h2&gt;

&lt;p&gt;Managing several clients as a freelancer can be both lucrative and challenging. Although it provides the ability to work on various projects and boost your income, it also presents several difficulties. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poor tools or technology&lt;/strong&gt;&lt;br&gt;
Finding the right tools to deliver to clients is a difficult problem for a freelancer. Using the incorrect technology to handle a client project can result in unexpected technical problems. These problems include network outages, hardware failures, software faults, data loss, and compatibility challenges. All of these can cause workflow disruptions and delays in completing customer work. These difficulties can be time-consuming and frustrating for both you and your clients. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acquiring new skills and knowledge&lt;/strong&gt;&lt;br&gt;
You might have to use tools or technology you are unfamiliar with as a freelancer. This can create a new learning curve for you while also contending with tight deadlines. This could delay completing the client's work, as you must learn how to use the new tool(s) and gather materials before becoming sufficiently effective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrating and combining software&lt;/strong&gt;&lt;br&gt;
Another significant challenge is integrating numerous software systems and technologies that one’s clients might utilize. Ensuring compatibility between many platforms and data formats may demand additional effort and result in debugging. This difficulty occurs when clients have a specialized system or when you need to synchronize data across many tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;br&gt;
Security is a major concern when handling multiple clients, as it involves securely handling sensitive data, including financial and personal information. This can be done by implementing strong security measures, including data encryption, secure file exchange, and strict access limits. &lt;/p&gt;

&lt;h2&gt;
  
  
  Scaling freelance businesses and managing multiple clients with Appwrite Cloud
&lt;/h2&gt;

&lt;p&gt;Expanding a freelance business is a challenging task made less complex by leveraging cloud-based services like Appwrite. &lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite&lt;/a&gt; is an open-source and self-hosted backend as a service (BaaS) tool that manages the core backend needs. It provides easy-to-use Rest APIs and abstracts the complexity and repetitiveness required to build a modern backend API from scratch, allowing developers to build faster and more secure apps. &lt;/p&gt;

&lt;p&gt;Appwrite developed a cloud-based version, &lt;a href="https://appwrite.io/cloud/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite Cloud&lt;/a&gt;&lt;a href="https://cloud.appwrite.io/login"&gt;.&lt;/a&gt; This product alleviates the tension associated with hosting an Appwrite project in the cloud, providing developers with various tools and services that handle the various backend tasks. Consequently, you can concentrate more on development than managing infrastructure. &lt;/p&gt;

&lt;p&gt;Aside from that, it provides key features and services that can help you focus on building high-quality applications and delivering robust, scalable solutions to your clients. Here is how Appwrite Cloud can help you scale freelance businesses and handle more clients with ease:&lt;/p&gt;

&lt;p&gt;1.&lt;strong&gt;Centralized client data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the concerns you will face when managing clients is data centralization. With Appwrite Cloud, you can store and manage client data in one place with the managed database solution. This simplifies accessing client information and project histories, enabling superior client base management.&lt;/p&gt;

&lt;p&gt;When working with clients, organizing and maintaining all client information for simple access can be challenging. With Appwrite Cloud Console, you can manage customer information. You can also store project histories by keeping track of all the work you have completed for each client. &lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;Good backend infrastructure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Appwrite Cloud provides a scalable backend infrastructure that helps you focus more on your development without worrying about managing servers or infrastructure. It automatically manages server upkeep, upgrades, and scalability, allowing you to scale your applications easily as your client base grows. &lt;/p&gt;

&lt;p&gt;Being in charge of all the server-side functionalities makes it difficult to create a backend infrastructure for an application. With Appwrite Cloud, however, all server-side functionality is taken care of, allowing you to concentrate on development rather than worrying about storage, hosting, server management, and other issues.&lt;/p&gt;

&lt;p&gt;3.&lt;strong&gt;Secured data and privacy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Security becomes more difficult as your clientele grows, as strong and scalable security measures or tools must be deployed to help protect client data. Appwrite Cloud provides robust security measures such as data encryption, encrypted connections, and access controls. With these measures, you can manage clients’ credentials, control user permissions, ensure data privacy within your application, and build client trust. &lt;/p&gt;

&lt;p&gt;The Appwrite operations team also conducts routine security updates on third-party tools. It keeps track of security issues because most third-party tools have security holes that can lead to data breaches in your application and put the privacy of your clients at risk. Because of this, they offer various monitoring options to prevent and mitigate attacks on the platform.&lt;/p&gt;

&lt;p&gt;4.&lt;strong&gt;Custom integration system&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A unique feature when using Appwrite Cloud as a freelancer is that you can customize your integration with the third-party services and APIs Appwrite Cloud provides. You can also connect your favorite technology or external tools to your application. It allows seamless integrations such as payment gateways, email marketing platforms, and other tools that improve client base management. Below is a list of some popular technologies you can integrate with Appwrite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0MXIV-zt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_45139248BA4EEF55CAA4158F07C64D3CCDB0E5AF6F0BC7954619F0DB76273261_1687526459058_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0MXIV-zt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://paper-attachments.dropboxusercontent.com/s_45139248BA4EEF55CAA4158F07C64D3CCDB0E5AF6F0BC7954619F0DB76273261_1687526459058_image.png" alt="" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Appwrite Cloud provides all of the capabilities mentioned above to assist you in overcoming the difficulties of managing multiple clients. Even though Appwrite is a fantastic tool for expanding your freelancing work, it has certain drawbacks. The constraints and requirements of the specific project must be carefully considered before choosing Appwrite as a freelancer. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Appwrite Cloud is a fantastic solution for managing and handling freelance work, as it enables you to overcome all of the procedures that drive up project expenses and cause delays. It provides various services to help you overcome the difficulties covered in this post and expand your client base. &lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/hackmamba/build-fast-with-appwrite-cloud-accelerate-your-web-mobile-and-flutter-development-24co"&gt;Build fast with Appwrite Cloud&lt;/a&gt;
&lt;a href="https://dev.to/hackmamba/build-fast-with-appwrite-cloud-accelerate-your-web-mobile-and-flutter-development-24co"&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/appwrite?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Follow the Dev.to page to find more resources on how to get started with Appwrite as a freelancer&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; Join the &lt;a href="https://discord.com/invite/GSeTUeA"&gt;Appwrite community&lt;/a&gt; to meet other developers and solve problems &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>appwrite</category>
      <category>appwritecloud</category>
      <category>freelancers</category>
    </item>
    <item>
      <title>How Appwrite's database relationships can supercharge your mobile app development</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Fri, 16 Jun 2023 12:47:05 +0000</pubDate>
      <link>https://dev.to/hackmamba/how-appwrites-database-relationships-can-supercharge-your-mobile-app-development-4cea</link>
      <guid>https://dev.to/hackmamba/how-appwrites-database-relationships-can-supercharge-your-mobile-app-development-4cea</guid>
      <description>&lt;p&gt;The development of our mobile applications heavily relies on the relationships within the database because they reduce the repetition of data in our existing tables. Additionally, it decreases the volume of transactions while enhancing data integrity because joins, searches, and data sorting become a high cost as our data grows. With the &lt;a href="https://appwrite.io/docs/databases-relationships?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite database relationship,&lt;/a&gt; we can enhance the functionality and efficiency of our mobile app development as it allows us to quickly establish connections between different pieces of data in our database. &lt;/p&gt;

&lt;p&gt;In this article, we will learn how the Appwrite database can supercharge our mobile app development, the benefits, and best practices for using Appwrite's database relationship. &lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of using Appwrite's database relationships
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://appwrite.io/docs/databases-relationships?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;database relationships&lt;/a&gt; offered by &lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite&lt;/a&gt; offer a robust and convenient solution to manage data in creating our mobile applications. In addition, we can develop advanced apps with tons of features. Using Appwrite's database relationship has additional advantages, some of which include the following.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data handling made easier:&lt;/strong&gt; the Appwrite Database relationship allows us to easily link and recover data from different collections in our database; this simplifies the process and reduces the time used to manage and manipulate data. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Increased effectiveness:&lt;/strong&gt; With database relationships, we can avoid having to run several queries or join tables, which can enhance the speed and effectiveness of our app by merely lowering the amount of data repeated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility:&lt;/strong&gt; Appwrite's database relationships are designed to be extensible, allowing us to handle a large amount of data and traffic as our app grows and evolves. It encourages a systematic approach to managing our data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility:&lt;/strong&gt; The Appwrite NoSQL document-based database provides a flexible and schema-less approach to data modelling. This can be particularly useful when dealing with complex and evolving data structures.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How Appwrite's database relationships work
&lt;/h2&gt;

&lt;p&gt;Appwrite is an open-source backend server that provides us with tools and services for creating web and mobile applications. Its database module allows us to store and manage our data securely. One of the distinctive benefits of utilizing the Appwrite database module is the ability to define relationships between different collections. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://appwrite.io/docs/databases-relationships?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite database relationships&lt;/a&gt; simplify building complex applications that require data stored in multiple collections. By defining relationships between collections, we can create an integrated data model that enables flexible data retrieval and manipulation. &lt;/p&gt;

&lt;p&gt;Appwrite's database schema is built around the concept of &lt;a href="https://appwrite.io/docs/databases#collection?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;collections&lt;/a&gt; and &lt;a href="https://appwrite.io/docs/databases#create-documents?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;documents&lt;/a&gt;. A collection is a set of connected documents equivalent to a table in a conventional relational database. Each document in this collection is a JSON object that includes information about a particular item in the collection. &lt;/p&gt;

&lt;p&gt;To model data in Appwrite, we must define the structure of each document using a JSON Schema, which is a great format for describing the shape and content of JSON data. This allows us to define the type of data stored in each field and any validation policy or restrictions that should be applied to the data. It also supports various indexing and querying features, allowing us to retrieve data based on multiple criteria quickly. For example, we can create indexes of unspecific fields to speed up queries that filter or sort data based on those fields.&lt;/p&gt;

&lt;p&gt;There are types of database relationships available in Appwrite:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://appwrite.io/docs/databases-relationships#types?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;One-to-one relationship:&lt;/a&gt; This relationship is the simplest to describe in databases because each record in one collection is connected with one and only one form in another collection, and vice versa. Each profile is unique and represents a single identity in a one-to-one relationship.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://appwrite.io/docs/databases-relationships#types?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;One-to-many relationship&lt;/a&gt;: A relationship between two data collections, where one item from one collection is connected to many items in another. Consider a blog post with comments in each post. In this case, the connection between the blog post collection and comments collection would be one-to-many.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://appwrite.io/docs/databases-relationships#types?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Many-to-one relationship&lt;/a&gt; refers to a relationship between two collections in which numerous records in one collection can be linked with a single record in another collection. This type of relationship is commonly used when there is a need to link data between two entities in a database. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://appwrite.io/docs/databases-relationships#types?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Many-to-many relationship&lt;/a&gt;: In a many-to-many relationship, a single record in one collection can be linked to several records in another collection and vice versa. For instance, think of a school database where students can enroll for multiple courses, and each of those courses can have multiple students. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By understanding these relationship types, we can choose the one that suits our application's needs and build an efficient database management system. &lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices for using Appwrite's database relationships
&lt;/h2&gt;

&lt;p&gt;While Appwrite database relationships are a powerful feature that allows us to create relationships between different collections in our database, there are certain practices we must follow to ensure that our data is well-organized and easy to query:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data model planning:&lt;/strong&gt; When building our database relationship, it is necessary that we plan our data model carefully. We can plan our data model by identifying the business requirement, understanding the data that must be saved, used and consumed, and then defining the objects that will be included in the data model, creating database relationships and refining and documenting the data mode. All this will help ensure that our data is organized to fit our app and that we use the right types of relationships.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understand and differentiate the Types of Relationships:&lt;/strong&gt; Appwrite offers various types of relationships, as listed and explained in the previous section. We must carefully differentiate the different data types and choose the one that suits our application needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integrate Appwrite's Built-in Methods:&lt;/strong&gt; Appwrite provides us with various built-in methods to create and manage relationships, including createDocument and updateDocument. If you prefer not to manage your relationship manually, use this method. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use IDs to create Relationships:&lt;/strong&gt; We should use the ID of the related document and not the data types of values when creating a relationship. This method will help ensure that the relationships are accurately created and managed. This can simplify the process of updating or deleting related documents.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Cases for Appwrite's Database Relationships
&lt;/h2&gt;

&lt;p&gt;The database relationship offered by Appwrite has a wide range of applications. Consider a school or online learning platform as one of the use cases. We can establish two collections in these contexts by employing the one-to-many relationship. There are a few to mention which are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Social networking app&lt;/li&gt;
&lt;li&gt;E-commerce website&lt;/li&gt;
&lt;li&gt;Project management board &lt;/li&gt;
&lt;li&gt;Blog post&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Appwrite database relationship has a wide range of additional applications, so it's important to understand them all and choose the one that best fits our needs. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Appwrite's database relationships can potentially revolutionize the creation of mobile apps. Appwrite can handle a variety of uses causes and helps us build powerful mobile apps. The Appwrite database relationship can assist us in streamlining our data administration and ensuring the seamless operation of our app. Using Appwrite's database relationships will help to advance our mobile app. &lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Here are a few resources to help us get started with the Appwrite relationship database &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn more about the Appwrite database with the &lt;a href="https://dev.to/appwrite/30daysofappwrite-appwrite-database-22an"&gt;30daysofappwrite article&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Simplify your data management with these &lt;a href="https://dev.to/appwrite/simplify-your-data-management-with-relationships-11ma"&gt;Appwrite resources&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Understanding &lt;a href="https://phoenixnap.com/kb/database-relationships"&gt;&lt;strong&gt;Database Relationship Types &amp;amp; How They Are Established&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>appwrite</category>
      <category>appwritedatabase</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Breaking Through Growth Barriers: How Appwrite's Cloud Enables Scalability</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Thu, 27 Apr 2023 13:53:31 +0000</pubDate>
      <link>https://dev.to/hackmamba/breaking-through-growth-barriers-how-appwrites-cloud-enables-scalability-1f57</link>
      <guid>https://dev.to/hackmamba/breaking-through-growth-barriers-how-appwrites-cloud-enables-scalability-1f57</guid>
      <description>&lt;p&gt;As businesses expand, our customer base grows with this. We often encounter growth barriers that can impede our development. One of the biggest challenges is &lt;a href="https://dev.to/hackmamba/how-to-plan-for-software-scalability-and-building-for-growth-2kle"&gt;scalability&lt;/a&gt; - handling increased demand without sacrificing performance or quality. This is particularly true for businesses that rely on software applications to deliver their products or services.&lt;/p&gt;

&lt;p&gt;Thankfully, the development of cloud computing has given us access to strong technologies that can aid in overcoming these growth constraints. This article will examine how scalability is made possible by Appwrite's cloud and how we can use this platform to hasten their growth. We will discuss the features and advantages of using Appwrite cloud services. &lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Growth Barriers In Cloud Computing
&lt;/h2&gt;

&lt;p&gt;Growth barriers in &lt;a href="https://www.ibm.com/topics/cloud-computing"&gt;cloud computing&lt;/a&gt; are the challenges and obstacles we face when expanding our cloud computing services. The ability of cloud computing to handle rising workloads, users, or resource demands is hampered by several growth obstacles, some of which can be technological, operational, or non-technical issues. Some of these growth barriers consist of the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expenditure:&lt;/strong&gt;  When we utilize cloud computing more regularly, the cost to manage it rises. This can be caused by more data storage, higher bandwidth usage, and the requirement for more powerful processing efficiency. This problem will force us to increase our security spending and ensure we follow auditing guidelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration:&lt;/strong&gt; Integration is another great factor that hinders development because integrating cloud services with existing systems and applications can be complex. Making sure that integration is seamless gets harder for us as our cloud usage increases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance and Scalability:&lt;/strong&gt; As our cloud usage increases, maintaining excellent performance and capacity may become more challenging due to the need to invest in new infrastructure to manage rising demand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security and compliance:&lt;/strong&gt; With the growing amount of data being processed and housed in the cloud, security and compliance issues are becoming increasingly crucial. We might need to spend more on security measures and ensure we adhere to legal standards.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Overcoming Growth Barriers with Appwrite's Cloud
&lt;/h2&gt;

&lt;p&gt;Overcoming these barriers can be challenging, but with the help of tools, we can address the challenges associated with growth enabling us to scale our operations effectively and efficiently. One of the tools that can help us to scale our development is Appwrite. &lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite&lt;/a&gt; is a cloud-based backend-as-a-service platform which helps to overcome growth barriers. Aside from that, it offers other great features and services that can help us scale those barriers we face when using cloud computing services. Some of which are:&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalability
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://appwrite.io/cloud?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite’s Cloud&lt;/a&gt; is scalable; it can accommodate increasing demands as our application develops. It has the ability to automatically scale resources up or down in response to demand, ensuring that during times of high traffic, our application is always performing and responsive. &lt;/p&gt;

&lt;h2&gt;
  
  
  Time and Cost
&lt;/h2&gt;

&lt;p&gt;With Appwrite pre-built backend modules and APIs, we can save time and money by reducing the need to build custom backend infrastructure from scratch. This could facilitate a quicker and more affordable launch of our application. One unique advantage is that we pay for the services we use. This can reduce expenses and erect a proper infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Management of Data and Integration
&lt;/h2&gt;

&lt;p&gt;Working with a &lt;a href="https://appwrite.io/cloud?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;cloud service&lt;/a&gt; &lt;a href="https://appwrite.io/cloud?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;&lt;/a&gt;requires us to consider integration. With Appwrite cloud, we can easily integrate other services without breaking the application status. Appwrite provides a scalable database that can handle large amounts and millions of requests per second. This means our application will be able to manage a large user base without any issues. &lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;p&gt;Appwrite’s cloud leverages on powerful hardware and infrastructure to deliver fast and reliable performance to our users. Appwrite’s platform is optimized for high-performance computing and can handle complex workloads easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appwrite's Cloud: Features and Benefits
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://appwrite.io/cloud?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite cloud&lt;/a&gt; is an open-source platform that enables us to create and maintain backend services for web and mobile applications with its loud services; it provides more capabilities and advantages. The benefits and features of Appwrite cloud include the following:&lt;/p&gt;

&lt;h2&gt;
  
  
  Scalable Database
&lt;/h2&gt;

&lt;p&gt;Appwrite’s Cloud offers a scalable database to query, save, and manage large data sets. The database is designed to be flexible and can handle any data, which makes it very easy for us to manage our application's data effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  File Storage
&lt;/h2&gt;

&lt;p&gt;Appwrite’s cloud provides secure file storage for our applications, supporting file uploads, downloads, and management. It provides a built-in capacity to reduce and encrypt files, but this is only for smaller files. &lt;/p&gt;

&lt;h2&gt;
  
  
  Global Coverage
&lt;/h2&gt;

&lt;p&gt;The fact that Appwrite's cloud service is hosted on a global network of servers ensures excellent performance regardless of where our users are located. Based on the location of our users, we may additionally modify the &lt;a href="https://appwrite.io/docs/client/locale"&gt;Appwrite Location API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Easy Integration
&lt;/h2&gt;

&lt;p&gt;We can extend Appwrite’s functionality using our favorite framework language (React, Angular, Vue, etc.) with serverless functions that scale on demand without the need to manage servers or infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Secure Hosting
&lt;/h2&gt;

&lt;p&gt;We no longer need to run our servers because Appwrite’s cloud service provides safe and scalable hosting for our backend services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Domain
&lt;/h2&gt;

&lt;p&gt;With Appwrite cloud, we can now attach our domain to the Appwrite server using the new custom domain features. This enables us to employ first-party secure session cookies instead of third-party ones for web integrations and provides additional security and privacy protection. Also, this will facilitate the blocking of third-party cookies by modern browsers in the coming version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security &amp;amp; Privacy
&lt;/h2&gt;

&lt;p&gt;Appwrite provides an integrated SSL certificate and encryption that keeps information private between our app and users, stops bad actors from abusing our app, and maintains an account of when and how information was accessed. It provides role-based access control, which means only users with specific roles may access particular areas of our application, ensuring the safety and security of our application and users' data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Appwrite's Cloud Enables Scalability
&lt;/h2&gt;

&lt;p&gt;Appwrite’s cloud platform provides a scalable infrastructure that efficiently handles growing demand. Using the features below will ensure that our infrastructure can expand to accommodate them and always operate at its best.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Load Balancing:&lt;/strong&gt; Appwrite's cloud platform provides &lt;a href="https://www.nginx.com/resources/glossary/load-balancing/"&gt;load-balancing&lt;/a&gt; features that help distribute incoming traffic across multiple servers. This helps to ensure that the infrastructure can handle high levels of traffic and no single server becomes overwhelmed. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-Scaling:&lt;/strong&gt; The &lt;a href="https://www.datadoghq.com/knowledge-center/auto-scaling/"&gt;autoscaling&lt;/a&gt; capabilities of Appwrite allow it to modify the infrastructure resources to meet the current demand automatically. By doing this, our businesses can grow or shrink rapidly and effectively without manual processes.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deployment Across Multiple Regions:&lt;/strong&gt; We can deploy our infrastructure in several regions with the help of Appwrite’s cloud multi-region deployment capability. This offers redundancy and guarantees that our business can handle traffic from several regions without experiencing performance reduction. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;For businesses that need to overcome expansion constraints and achieve scalability, Appwrite’s cloud is a great option. Appwrite can assist businesses of all sizes in streamlining their development process and scaling their operations to meet the demands of a rising user base thanks to its adaptable design and strong features. Hopefully, this article will help to overcome growth barriers using Appwrite cloud services. &lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Here are some helpful resources to get started with Appwrite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/appwrite/appwrite"&gt;Appwrite Git&lt;/a&gt;&lt;a href="https://github.com/appwrite/appwrite"&gt;H&lt;/a&gt;&lt;a href="https://github.com/appwrite/appwrite"&gt;ub repositories&lt;/a&gt;
&lt;a href="https://github.com/appwrite/appwrite"&gt;&lt;/a&gt;- &lt;a href="https://appwrite.io/cloud?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite cloud service&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://appwrite.io/discord"&gt;Discord&lt;/a&gt; community to ask questions and also learn more about Appwrite
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>appwrite</category>
      <category>scalability</category>
      <category>cloud</category>
    </item>
    <item>
      <title>GraphQL APIs and the Future of Front-End Development</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Thu, 02 Mar 2023 10:37:18 +0000</pubDate>
      <link>https://dev.to/hackmamba/graphql-apis-and-the-future-of-front-end-development-4jbm</link>
      <guid>https://dev.to/hackmamba/graphql-apis-and-the-future-of-front-end-development-4jbm</guid>
      <description>&lt;p&gt;GraphQL is a powerful query language and runtime that enables developers to create efficient and flexible APIs. Its popularity among developers has risen due to its ability to handle complex queries and provide improved user experiences. As the future of front-end development is heavily influenced by how we consume and utilize APIs, GraphQL is expected to play a significant role in shaping it. &lt;br&gt;
In this article, we will learn about GraphQL, its benefits, its impact on the future of front-end development, and how it works with Appwrite's API protocol through a code example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To follow this article, we need the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prior knowledge of Vue and project installed on our local machine&lt;/li&gt;
&lt;li&gt;Docker installed on our machine to check the version of our Docker, we will use the command &lt;code&gt;docker --version&lt;/code&gt;. If Docker is not installed, we can install it from &lt;a href="https://docs.docker.com/get-docker/" rel="noopener noreferrer"&gt;Docker documentation&lt;/a&gt;. Click this &lt;a href="https://runnable.com/docker/install-docker-on-macos" rel="noopener noreferrer"&gt;link&lt;/a&gt; for a better explanation of how to install it on macOS.&lt;/li&gt;
&lt;li&gt;A running Appwrite instance (check out this article to &lt;a href="https://dev.to/hackmamba/create-a-local-appwrite-instance-in-3-steps-19n9?utm_source=hackmamba&amp;amp;utm_medium=hackmamba"&gt;create a local Appwrite instance&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Tailwind CSS installed in our Vue project&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is GraphQL?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://graphql.org/learn/" rel="noopener noreferrer"&gt;GraphQL&lt;/a&gt; is a query language and runtime for creating and executing API queries. It was created by the Facebook team in 2012 and was open-sourced in 2015. It provides the schema of the Data in the API and allows users to specify the required data structure they need and the server will only return the requested data. This can decrease the amount of data transmitted over the network and make working with APIs with complex data schemas, much easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Critical Appraisal of GraphQL
&lt;/h2&gt;

&lt;p&gt;One of GraphQL's advantages is its adaptability. Clients can specify exactly the data they require in a single request, making it more efficient than a REST API, which may require multiple requests to different endpoints to gather the same information. Furthermore, GraphQL supports real-time updates and subscriptions, which enables developers to create dynamic and responsive applications. Additionally, its ability to handle complex relationships is an invaluable asset as it allows nested queries, which brings the possibility of retrieving related data in one request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages of using GraphQL
&lt;/h2&gt;

&lt;p&gt;GraphQL is an increasingly popular API for front-end development that offers a variety of advantages, such as: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Improved Performance&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GraphQL increases our application performance by reducing the number of queries and providing us with the data we need.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better Development Tool&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GraphQL provides developers with different tools that make development and debugging easier. We can also test our GraphQL applications with those tools; some of the tools are GraphiQL, Apollo Studio, etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Strong Type System&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GraphQL provides a strong data typing system, better documentation, and simpler tooling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy Integration and Maintenance&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GraphQL is simple to integrate into existing systems, allowing us to start using it immediately without significantly modifying our current infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  GraphQL vs Rest API
&lt;/h2&gt;

&lt;p&gt;GraphQL and REST are the most widely used architectural patterns for developing web services. While they have some similarities, they also have significant differences that must be considered when deciding between them.&lt;/p&gt;

&lt;p&gt;GraphQL is a manipulation language for interacting with an API that retrieves data from a server or database and displays it in our application. With GraphQL, we can specify the data we need and the server will return only the requested data, which makes development easier and more flexible than Rest API.&lt;/p&gt;

&lt;p&gt;GraphQL is &lt;a href="https://www.apollographql.com/docs/apollo-server/schema/schema" rel="noopener noreferrer"&gt;schema-based&lt;/a&gt;, meaning we strictly define what goes to the server and what can leave the server. The schema is a compelling security point of view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rest API&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.edureka.co/blog/what-is-rest-api/" rel="noopener noreferrer"&gt;REST API&lt;/a&gt; is a software architecture method for creating web services. It outlines a collection of restrictions and specifications for building web services used to communicate with other systems and web applications over HTTP. It manipulates resources via HTTP methods, including GET, POST, PUT, DELETE, and returns JSON or XML data.&lt;/p&gt;

&lt;p&gt;Here are other side-by-side comparisons of GraphQL and Rest&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GraphQL&lt;/th&gt;
&lt;th&gt;Rest&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;It has a single endpoint (post/graphql)&lt;/td&gt;
&lt;td&gt;Rest has multiple endpoints (POST/form, GET/user)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphQL reduces the number of necessary API calls to ensure we get the right amount of data; this helps improve application performance&lt;/td&gt;
&lt;td&gt;It has slow performance due to under-fetching data, and unnecessary API calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It is client driven&lt;/td&gt;
&lt;td&gt;It is server-driven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It lacks an automatic caching mechanism and instead uses a library that is built on top of it&lt;/td&gt;
&lt;td&gt;It uses caching automatically without any library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphQL complicates the handling of HTTP status codes to identify errors&lt;/td&gt;
&lt;td&gt;Rest is easy to debug because it uses HTTP status codes to identify errors easily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It has a built-in meta validation&lt;/td&gt;
&lt;td&gt;The validation is implemented manually&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Finally, when deciding between GraphQL and REST for web services, developers should consider the type of application and data access requirements. If a large amount of data must be retrieved and updated in real time, GraphQL is the best option. However, if a simple, read-only application is being developed, REST is the better choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations of GraphQL&lt;/strong&gt;&lt;br&gt;
While GraphQL is an efficient query language that simplifies the process of obtaining data from an API, it does have certain limitations. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GraphQL makes it challenging to create complex queries that require data from multiple sources or relational databases.&lt;/li&gt;
&lt;li&gt;It cannot be used to access data outside of the API, making it less suitable for applications that require external data sources.&lt;/li&gt;
&lt;li&gt;GraphQL does not provide built-in security features; as developers, we must implement our authentication and authorization mechanisms to secure our GraphQL API.&lt;/li&gt;
&lt;li&gt;Error handling is complicated in GraphQL since it doesn’t use HTTP status codes like REST API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future of GraphQL API in Front-End Development
&lt;/h2&gt;

&lt;p&gt;The GraphQL API has a promising future in front-end programming. Due to its capacity to manage various data sources, reduce data over- or under-fetching, and make optimal use of network bandwidth, it is anticipated to grow in popularity. The availability of more APIs means the development process is getting quicker and more effective. One is the capacity to query many databases with a single query effectively. &lt;/p&gt;

&lt;p&gt;We can use GraphQL to create and maintain robust applications in our various languages and frameworks, including React, Angular, Vue, and Node.js.&lt;/p&gt;

&lt;p&gt;GraphQL is essential to &lt;a href="https://medium.com/tech-tajawal/backend-for-frontend-using-graphql-under-microservices-5b63bbfcd7d9" rel="noopener noreferrer"&gt;backend-for-frontend&lt;/a&gt; architecture because it allows clients to request the data they require, enabling developers to create backends specifically designed to meet the requirements of frontends like web apps. It offers a reliable and adaptable method to manage a data relationship, which can simplify the implementation of challenging BFF features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Powering GraphQL with Appwrite's API Protocol
&lt;/h2&gt;

&lt;p&gt;By integrating the &lt;a href="https://appwrite.io/docs/client/locale" rel="noopener noreferrer"&gt;Appwrite API&lt;/a&gt; server with our GraphQL API, we can leverage Appwrite's API protocol to power our GraphQL implementation. This integration also enables using Appwrite's administration tools for authentication, authorization, rate limiting, and logging to manage and secure our GraphQL API. The API protocol provided by Appwrite also enables the development of unique APIs to access data from other services. For instance, developers can create an API that we can use to retrieve data from a third-party database. It also offers a unified API gateway to gather and manage numerous APIs, including our GraphQL API, in one location.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example of Using Appwrite with GraphQL
&lt;/h2&gt;

&lt;p&gt;We will learn how to utilize Appwrite with GraphQL in this example; however, before moving on to the next step, there are a few things we need to understand and set up. All of the prerequisites are stated in the prerequisites section.&lt;/p&gt;

&lt;p&gt;If all the requirements have been completed, let's create a new Appwrite project. Using the &lt;a href="https://appwrite.io/docs/client/locale?sdk=graphql-default#localeListCurrencies" rel="noopener noreferrer"&gt;Appwrite Locale API&lt;/a&gt;, we will create a simple app that displays a country's currency symbol, name, plural, and decimal digits for all major and minor currencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a New Appwrite Project
&lt;/h2&gt;

&lt;p&gt;After creating our locale Appwrite instance and creating an account with Appwrite, we will be redirected to a page to create a new project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675366828721_Screenshot%2B2023-02-02%2Bat%2B20.39.44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675366828721_Screenshot%2B2023-02-02%2Bat%2B20.39.44.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this section, we will name our project &lt;code&gt;currency-app&lt;/code&gt; when we click on the “Create project” button, we will be redirected to our dashboard. &lt;/p&gt;

&lt;p&gt;Appwrite SDKs make it easier to add any platform we want to use; for instance, we have the Web App, Flutter App, Apple App, and Andriod App. Select the Web App platform since we are building for the web:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675366896278_Screenshot%2B2023-02-02%2Bat%2B20.41.15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675366896278_Screenshot%2B2023-02-02%2Bat%2B20.41.15.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/img/pixel.gif" class="article-body-image-wrapper"&gt;&lt;img src="/static/img/pixel.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we click on the Web App platform, we will be redirected to a page to register our web app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675288837696_Screenshot%2B2023-02-01%2Bat%2B22.58.30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675288837696_Screenshot%2B2023-02-01%2Bat%2B22.58.30.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is to get the Appwrite SDK we can choose our preferred method of adding Appwrite to our project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675289181814_Screenshot%2B2023-02-01%2Bat%2B23.04.59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675289181814_Screenshot%2B2023-02-01%2Bat%2B23.04.59.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install Appwrite in our Vue project, use the command below:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

    &lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;appwrite&lt;/span&gt; 


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

&lt;/div&gt;

&lt;p&gt;After installing Appwrite, the next step is to configure our Appwrite web SDK:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;client&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:90/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PROJECT ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Go to the project overview in the Appwrite console and click on settings to get the project ID. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675366339025_Screenshot%2B2023-02-02%2Bat%2B20.28.04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675366339025_Screenshot%2B2023-02-02%2Bat%2B20.28.04.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can also get the project ID when creating a new web project in Appwrite; see the example below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675335806918_Screenshot%2B2023-02-02%2Bat%2B11.59.49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropboxusercontent.com%2Fs_FAA126D11578696CF651935173EF9B28FA574D302BCE745E6CCCA72D636DAD43_1675335806918_Screenshot%2B2023-02-02%2Bat%2B11.59.49.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Application Layout
&lt;/h2&gt;

&lt;p&gt;The next step after installing and configuring Appwrite is to construct our application layout, which is where we will display the currency data we are collecting from the API.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 html

&amp;lt;template&amp;gt;
  &amp;lt;main&amp;gt;
    &amp;lt;section class="banner-image"&amp;gt;
    &amp;lt;/section&amp;gt;
    &amp;lt;section class="text-gray-600 body-font"&amp;gt;
      &amp;lt;div class="container px-5 py-16 mx-auto"&amp;gt;
        &amp;lt;div class="flex flex-col text-center w-full mb-20"&amp;gt;
          &amp;lt;h2 class="text-xs text-indigo-500 tracking-widest font-medium title-font mb-1"&amp;gt;Currency Application&amp;lt;/h2&amp;gt;
          &amp;lt;h1 class="sm:text-3xl text-3xl font-bold title-font text-gray-900"&amp;gt;List of Country Currencies and Symbols
          &amp;lt;/h1&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class="flex flex-wrap -m-4"&amp;gt;
          &amp;lt;div v-for="(currency, index) in currencies" :key="index" class="p-4 md:w-1/3"&amp;gt;
            &amp;lt;div class="flex rounded-lg h-full bg-gray-100 p-8 flex-col"&amp;gt;
              &amp;lt;div class="flex items-center mb-3"&amp;gt;
                &amp;lt;div
                  class="w-16 h-16 mr-3 inline-flex items-center justify-center text-gray-800 border border-gray-800 bg-white flex-shrink-0"&amp;gt;
                  &amp;lt;p class="text-black text-2xl"&amp;gt;{{ currency.symbol }}&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;h2 class="text-gray-900 text-lg title-font font-medium"&amp;gt;{{ currency.name }}&amp;lt;/h2&amp;gt;
              &amp;lt;/div&amp;gt;
              &amp;lt;div class="flex-grow"&amp;gt;
                &amp;lt;h2 class="text-gray-900 text-lg font-bold"&amp;gt;{{ currency.name }}&amp;lt;/h2&amp;gt;
              &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;

        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;
  &amp;lt;/main&amp;gt;
&amp;lt;/template&amp;gt;


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

&lt;/div&gt;

&lt;p&gt;The following step is to import the Client and GraphQL classes into our application. &lt;code&gt;CurrencyApp.vue&lt;/code&gt; from the Appwrite library. This will enable us to leverage GraphQL capabilities from Appwrite in our web application:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Graphql&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;appwrite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;client&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:90/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PROJECT ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;graphql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Graphql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CurrencyApp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Fetching the Currencies from Appwrite Locale API
&lt;/h2&gt;

&lt;p&gt;In the following example, we create a data property that returns the list of currencies and then create a GraphQL query in our Vue component to get the Appwrite Locale API's list of currencies:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Graphql&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;appwrite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;client&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:90/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PROJECT ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;graphql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Graphql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CurrencyApp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;currencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;fetchCountryCurrencies&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currencyQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
              &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="s2"&gt;` query{
              localeListCurrencies {
              total
              currencies {
                code
                symbol
                name
             }
            }
        }`&lt;/span&gt;
            &lt;span class="p"&gt;}));&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
           &lt;span class="nx"&gt;currencyQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localeListCurrencies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currencies&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="nf"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchCountryCurrencies&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;

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

&lt;/div&gt;

&lt;p&gt;The web application's final appearance is shown in the picture below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.dropbox.com%2Fs%2Fgs8wxo73nh7l82h%2Fcurrency-app.gif%3Fraw%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.dropbox.com%2Fs%2Fgs8wxo73nh7l82h%2Fcurrency-app.gif%3Fraw%3D1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dropbox.com/s/gs8wxo73nh7l82h/currency-app.gif?dl=0" rel="noopener noreferrer"&gt;https://www.dropbox.com/s/gs8wxo73nh7l82h/currency-app.gif?dl=0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/graphql" rel="noopener noreferrer"&gt;GraphQL APIs&lt;/a&gt; can transform front-end development by offering a more effective and simplified approach to getting data, significantly improving user experience, and opening up new doors for innovation in the web development industry. This post introduced us to GraphQL and provided an example of how to use Appwrite with GraphQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://graphql.org/" rel="noopener noreferrer"&gt;Introduction to GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.optisolbusiness.com/insight/top-5-advantages-of-graphql" rel="noopener noreferrer"&gt;Advantages of using GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://graphql.org/learn/best-practices/" rel="noopener noreferrer"&gt;GraphQL best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.howtographql.com/" rel="noopener noreferrer"&gt;GraphQL crash course&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.dropbox.com/scl/fi/88xiyj1krczbrhuycg15x/Why-You-Should-Use-GraphQL-APIs-in-Your-Next-Project.paper?dl=0&amp;amp;rlkey=jwjpkzwku3rl2xxfo3m7bhbqf" rel="noopener noreferrer"&gt;Why You Should Use GraphQL APIs in Your Next Project&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dropbox.com/scl/fi/d0r4gwybs0ixzbj5w7f48/Build-an-E-commerce-Product-Catalog-with-Nuxt.js-and-GraphQL.paper?dl=0&amp;amp;rlkey=9u035mvu7sc70ojb3tla6mhrz" rel="noopener noreferrer"&gt;Build an Ecommerce Product Catalog with Nuxt.js and GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://graphql.org/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>appwrite</category>
      <category>hackmamba</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Why You Should Rethink Your Technology Stack</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Thu, 22 Dec 2022 08:32:41 +0000</pubDate>
      <link>https://dev.to/hackmamba/-why-you-should-rethink-your-technology-stack-199</link>
      <guid>https://dev.to/hackmamba/-why-you-should-rethink-your-technology-stack-199</guid>
      <description>&lt;p&gt;Using a tech stack that is not functional or productive may result in missed opportunities, decreased productivity, and other drawbacks. And even though changing technology stacks can be challenging, businesses must assess their tech stack and make the necessary adjustments. This allows them to make sure that their technology supports their current and future business objectives and keeps them competitive in their sector.&lt;/p&gt;

&lt;p&gt;In this article, you will discover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The need to rethink your technology stack&lt;/li&gt;
&lt;li&gt;The opportunity cost of an inefficient tech stack&lt;/li&gt;
&lt;li&gt;Signs that your tech stack requires an audit&lt;/li&gt;
&lt;li&gt;The benefits of migrating to a better tech stack &lt;/li&gt;
&lt;li&gt;Are JAMstack and Appwrite right for you?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is a Technology Stack?
&lt;/h2&gt;

&lt;p&gt;Before diving into this topic, let's learn what a technology stack is. A technology or a tech stack is a list of technology tools, languages, and frameworks used in building software applications. You can employ a variety of &lt;a href="https://www.heap.io/topics/what-is-a-tech-stack" rel="noopener noreferrer"&gt;technology stacks&lt;/a&gt; for building websites and applications. Some examples of common tech stacks include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;LAMP stack is composed of Linux (the operating system), Apache (the web server), MySQL (the database), and PHP (the programming language). It is commonly used for building dynamic, database-driven websites and applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MEAN is a web development stack comprised of four technologies: MongoDB, Express.js, AngularJS, and Node.js. The &lt;a href="http://meanjs.org/" rel="noopener noreferrer"&gt;MEAN stack&lt;/a&gt; can be used to develop web applications that run on various platforms, such as desktop computers and mobile devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ruby on Rails is a web application development framework written in the Ruby programming language. It is mainly used in building an application that follows the model-view-controller (MVC) design pattern. It uses technologies like Ruby, which is the (programming language), and Rails, the (web framework.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.NET stack is a free, open-source, and cross-platform that allows you to construct a variety of applications, including online, mobile, desktop, gaming, and internet of things (IoT) apps. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jamstack.org/" rel="noopener noreferrer"&gt;JAMstack&lt;/a&gt; is the architecture for building modern websites, JavaScript (the programming language), APIs (for integrating with external services and data), and Markup (for defining the structure and content of the site or application). JAMstack is used for developing modern, high-performance, and secured websites and applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Opportunity Cost of Inefficient Tech Stacks
&lt;/h2&gt;

&lt;p&gt;The stack you use for your application determines the product you can develop and its effectiveness. Inefficient tech stacks can lead to slower performance, resulting in a poor user experience and a loss of potential customers. They can also require more resources to maintain and scale; increasing operating costs and reducing profitability. An inefficient tech stack can also limit a business's ability to take advantage of new technologies and opportunities, hindering its growth and competitiveness. Therefore, it is crucial for businesses to carefully evaluate their technology stack and ensure that it is effective and efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signs You Need A Tech Stack Audit
&lt;/h2&gt;

&lt;p&gt;The tech stack audit plays a vital role in your business as it helps to find and resolve any technical overlap in your stack and allows you to cut costs by removing features you don’t need. &lt;/p&gt;

&lt;p&gt;Here are some signs that your tech stack needs to be reviewed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If your company has grown or changed in some way, your current tech stack may no longer be well-suited to your needs. For example, if you have started offering new products or services or expanded into new markets, your tech stack may need to be updated to support these changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If your tech stack is causing frequent issues or downtime, it may be a sign that it is not operating optimally. This can lead to lost productivity, frustrated customers, and other problems that can impact your bottom line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you have low confidence in the security and accuracy of your data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When your stack can't support as many users as your application can handle and your business is sluggish due to inefficiencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, conducting a tech stack audit is a good idea if you are experiencing any of the above issues or want to ensure that your tech stack is operating at its best. This can help identify areas where your current stack is not performing better and provide guidance on improving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Migrating Tech Stacks
&lt;/h2&gt;

&lt;p&gt;The time for migration to a better stack is when your previous stack no longer meets your business requirements, is poorly maintained, lacks scalability, has low security, and has high development costs. All of these factors are crucial because the technology stack you use plays a significant role in your product's success. Before migrating your tech stack, here are the few things you need to ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does your business have the right tech stack?&lt;/li&gt;
&lt;li&gt; Will your current stack support your future goals? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If not, you need to migrate to a better stack that will fit all your requirements. Following are a few of the key benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  High Performance and Scalability
&lt;/h2&gt;

&lt;p&gt;One of the primary concerns to focus on is the user experience. Your application is a tool that demonstrates the quality of your business, and when your application performance is poor, it reduces the traffic and gives users a bad impression of your application. Migrating your stack to a better platform will increase your application performance and boost SEO, revenue, and conversion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Support for New Technologies and Features
&lt;/h2&gt;

&lt;p&gt;A new tech stack can provide better support for new technologies, such as artificial intelligence, machine learning, and the Internet of Things (IoT). This can help your company take advantage of these technologies and stay ahead of the curve in your industry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improved Security
&lt;/h2&gt;

&lt;p&gt;When using a tech stack, security is the main priority. To prevent cyberattacks and data breaches, moving to a new stack will enhance your security architecture and drive you to choose platforms with the best security measures and data encryption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reduced Maintenance Cost
&lt;/h2&gt;

&lt;p&gt;Migrating to a new stack can reduce maintenance costs as you transfer to the platform that has only the required resources and services you need. This will also help to cut out those features and third-party tools you don’t need. &lt;/p&gt;

&lt;h2&gt;
  
  
  Are JAMstack and Appwrite Right for You?
&lt;/h2&gt;

&lt;p&gt;You can create your application using JAMstack and Appwrite, two web development tools that are each suited to a certain need. JAMstack is used to create static websites and online applications that need to be fast and scalable, whereas Appwrite is a backend platform that offers a selection of tools and APIs for creating and maintaining web and mobile applications. You should evaluate both options and use them based on your needs and project requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you rethink your tech stack?
&lt;/h3&gt;

&lt;p&gt;Finding a solution that fits your project's goals and timeframe while lowering development costs is crucial. One of the options that enable you to fulfill such demands is JAMstack.&lt;/p&gt;

&lt;p&gt;It is known as the "modern web architecture" since it is secure, performant, up-to-date, and allows a lot of freedom to design an ideal finished result.&lt;/p&gt;

&lt;p&gt;Some of the benefits JAMstack provides are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A prebuilt markup file and assets through the CDN; making it the fastest way to deliver web content to users.&lt;/li&gt;
&lt;li&gt;Greater flexibility while building cutting-edge, user-friendly applications and websites. &lt;/li&gt;
&lt;li&gt;Making navigation on your website or application simple and engaging for consumers.&lt;/li&gt;
&lt;li&gt;Building and deploying your website on the JAMstack architecture will reduce the development cost because hosting the static file is affordable and accessible.&lt;/li&gt;
&lt;li&gt;It helps developers skip the stress of using a standard technology where it is difficult to build an end product and allows them to incorporate their favorite development tools while focusing on what matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using modern web technologies, you can leverage JAMstack with a BaaS solution like &lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt; to build fast, secure, and scalable web applications.&lt;/p&gt;

&lt;p&gt;Appwrite.io is a secure, open-source platform that allows developers to create fully functional web and mobile applications. It helps by cutting out the repetitive process of creating a modern application from the ground up and also reduces development costs since it is self-hosted and free to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of Using Appwrite as a BaaS Solution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It is self-hosted, meaning you can set up your server and network and handle all the maintenance in-house.&lt;/li&gt;
&lt;li&gt;It has the best security practices to keep your application safe and protects users' files and data from cyber attackers.&lt;/li&gt;
&lt;li&gt;It has a built-in file scanner and data encryption.&lt;/li&gt;
&lt;li&gt;The documentation and online resources are beginner friendly, and you can quickly start.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Since the technological landscape is ever-evolving, businesses must stay up-to-date to remain competitive. You may miss out on chances to enhance your operations and acquire a competitive edge if your present technology stack is not utilizing the most recent trends and advancements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Here are some helpful resources to get you started with Appwrite and JAMstack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/appwrite" rel="noopener noreferrer"&gt;Appwrite Github repositories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; community to ask questions and also learn more about the tool&lt;/li&gt;
&lt;li&gt;Appwrite &lt;a href="https://appwrite.io/docs?utm_source=hackmamba&amp;amp;utm_medium=blog&amp;amp;utm_campaign=hackmamba" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for quick guides on how to integrate Appwrite into your application&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appwrite.io/docs/getting-started-for-web" rel="noopener noreferrer"&gt;Getting started with Appwrite for web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Getting started with &lt;a href="https://jamstack.org/" rel="noopener noreferrer"&gt;JAMstack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.liquidweb.com/blog/tech-stack/" rel="noopener noreferrer"&gt;Introduction to Tech Stack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The App-Building Platform for the Next Generation of Developers</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Fri, 30 Sep 2022 09:50:22 +0000</pubDate>
      <link>https://dev.to/hackmamba/the-app-building-platform-for-the-next-generation-of-developers-o0i</link>
      <guid>https://dev.to/hackmamba/the-app-building-platform-for-the-next-generation-of-developers-o0i</guid>
      <description>&lt;p&gt;Application development app gives developers a centralized location containing all the tools required to build software apps. Many of these platforms provide services like code integration and mobile development, while others offer other elements of development tools, including code debugging, code review, collaboration, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite&lt;/a&gt; is one of the future platform developers use to develop their applications since it gives them all the fundamental functionalities and APIs needed to create any fast and efficient web or mobile application. This article will examine Appwrite's features and why it is one of the best platforms for building applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an Application Development Platform?
&lt;/h2&gt;

&lt;p&gt;An &lt;a href="https://www.suse.com/suse-defines/definition/application-development-platform/#:~:text=An%20application%20development%20platform%20is,of%20mobile%20and%20web%20apps."&gt;application development platform&lt;/a&gt; &lt;a href="https://www.suse.com/suse-defines/definition/application-development-platform/#:~:text=An%20application%20development%20platform%20is,of%20mobile%20and%20web%20apps."&gt;&lt;/a&gt;is software that gives developers all the tools they need to manage, test, deploy, and build a strong and secure application. These platforms are designed primarily to help the agile technique and accelerate the production of mobile and online applications. There are various programs for testing, managing, and building our applications, but let's focus on &lt;strong&gt;Appwrite&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Appwrite?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite&lt;/a&gt; is a new and secure open source platform that helps developers create core API (Application Programming Interface) for the web and mobile. It allows programmers to create quick applications. It is self-hosted, free to use, and easy to set up. However, you can pay for the cloud version if necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features of Appwrite
&lt;/h2&gt;

&lt;p&gt;Appwrite is a development platform that seeks to abstract the complexity of developing from the ground up and the repetitive processes required for creating a modern app. Appwrite provides a variety of services, including: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database Management&lt;/strong&gt;&lt;br&gt;
Appwrite allows developers to query, save, and manage access to their app data or document in real-time using a robust and flexible database. You can also create numerous databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;br&gt;
The Appwrite storage service allows users to upload, download, and manage their files securely and efficiently. Appwrite’s server offers the built-in capability to reduce and encrypt files, but only for smaller files. The latest version of Appwrite also permits massive file uploads, as opposed to prior versions, limiting your file to the amount of free space you have available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Control&lt;/strong&gt;&lt;br&gt;
Appwrite provides you full access and control over your data as a developer, allowing you to set up a self-hosted solution for your application simply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full Security&lt;/strong&gt;&lt;br&gt;
Security is crucial in the development process since you must monitor your application. Appwrite improves application security by providing end-to-end protection for your backend APIs from storage to the cloud or while the data is stored. &lt;/p&gt;

&lt;p&gt;Appwrite additionally safeguards your data from brute force assaults. This implies that all of your passwords and API keys will be encrypted using the &lt;a href="https://bcrypt.online/"&gt;Bcrypt&lt;/a&gt; method, making it difficult for attackers to decrypt saved passwords or get hold of your API keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple Authentication&lt;/strong&gt;&lt;br&gt;
With the Appwrite Authentication service, you can authenticate, confirm, and manage your users using several sign-in techniques. You can also use the system to change user information and retrieve user security data with current activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geo and Localization&lt;/strong&gt;&lt;br&gt;
With the Appwrite location API, you can customize your application based on your user's location. You can also track the user's IP address, Phone Codes, and list of countries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Appwrite the Building Platform for the Next Generation of Developers?
&lt;/h2&gt;

&lt;p&gt;Appwrite is believed to be one of the most excellent &lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Backend-as-a-Service platforms&lt;/a&gt; for web and mobile developers since it decreases the complexity and repetitiveness required to design an application. Developers can also create safe and speedier applications with the support of including user authentication and third-party technologies in their applications. Appwrite is fully secured and flexible to get started.&lt;/p&gt;

&lt;p&gt;It also provides tools to build rapid applications with various built-in features to assist you in getting started without writing from scratch. You can integrate some of your favorite technologies with Appwrite, such as JavaScript, Python, Node.js, React, PHP, Kotlin, Swift, Flutter, and Deno. Other tools provide comparable solutions to Appwrite; however, here are some reasons why Appwrite is ideal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is free and easy to set up.&lt;/li&gt;
&lt;li&gt;It is fast and secure with a built-in file scanner and encryption. &lt;/li&gt;
&lt;li&gt;It has a simple learning curve and other good resources to get you started. &lt;/li&gt;
&lt;li&gt;Appwrite includes end-to-end encryption for your backend API.&lt;/li&gt;
&lt;li&gt;You have complete access control to your data and files. The community is large and supportive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are some helpful resources to get you started with Appwrite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/appwrite"&gt;Appwrite Github repositories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Join the &lt;a href="https://appwrite.io/discord"&gt;&lt;/a&gt;&lt;a href="https://appwrite.io/discord"&gt;D&lt;/a&gt;&lt;a href="https://appwrite.io/discord"&gt;iscord&lt;/a&gt; community to ask questions and also learn more about the tool&lt;/li&gt;
&lt;li&gt;Appwrite &lt;a href="https://appwrite.io/docs?utm_source=hackmamba&amp;amp;utm_medium=blog&amp;amp;utm_campaign=hackmamba"&gt;documentation&lt;/a&gt; for quick guides on how to integrate Appwrite into your application&lt;/li&gt;
&lt;li&gt;&lt;a href="https://appwrite.io/docs/getting-started-for-web"&gt;Getting started with Appwrite for web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Finding the perfect Backend-as-a-Service platform that is versatile, secure, pleasant, supportive, and easy to set up when creating can be a burden, especially if you are coming from a place where you have to write all the backend code for the server, construct, and manage databases. &lt;a href="https://appwrite.io/?utm_source=hackmamba&amp;amp;utm_medium=hackmamba-blog"&gt;Appwrite&lt;/a&gt; is the most excellent solution because it simplifies the development process. In this article, we discussed one of the (BaaS) tools and why it is great for new developers.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>opensource</category>
      <category>developers</category>
      <category>hackmamba</category>
    </item>
    <item>
      <title>EIGHT SECURITY TIPS TO PREVENT YOUR WEB APPLICATION FROM BEING HACKED</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Fri, 24 Sep 2021 10:33:33 +0000</pubDate>
      <link>https://dev.to/silentdev/eight-security-tips-to-prevent-your-web-application-from-being-hacked-35n4</link>
      <guid>https://dev.to/silentdev/eight-security-tips-to-prevent-your-web-application-from-being-hacked-35n4</guid>
      <description>&lt;p&gt;EIGHT SECURITY TIPS TO PREVENT YOUR WEB APPLICATION FROM BEING HACKED&lt;/p&gt;

&lt;p&gt;Web application security is one major point in web app development that is not properly focused on when building an application. But it is a major priority if you plan on taking your application online. Luckily, in this article, I'm going to walk you through what web application security is, why it is important, and how to secure or prevent your web application from being hacked.&lt;/p&gt;

&lt;p&gt;Here are some of the security vulnerabilities we will cover in this tutorial &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unrestricted File Upload&lt;/li&gt;
&lt;li&gt;XSS Attack&lt;/li&gt;
&lt;li&gt;Software Update&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;End-to-End Encryption&lt;/li&gt;
&lt;li&gt;DDoS attacks&lt;/li&gt;
&lt;li&gt;Captcha
-Npm Dependency Vulnerabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is web application security?&lt;br&gt;
Web application security deals specifically with the security surrounding websites, web applications, and web services such as APIs from attacks by internet-based threats. In other words, the security measures at the application level that aim to prevent data or code within an application from being stolen or captured.&lt;/p&gt;

&lt;p&gt;Why is it important?&lt;br&gt;
It is important in today's applications because it is a central component of any web-based business. It prevents malicious agents and cyber thieves from accessing sensitive information from your applications.&lt;/p&gt;

&lt;p&gt;Now, let's look at some of the threats and how to prevent them.&lt;br&gt;
Unrestricted File Upload&lt;br&gt;
It is one of the security vulnerabilities that can cause or bring threats to your application. Some web applications allow users to upload files such as pictures, documents, videos, Which can cause threats by giving the malicious agent access to upload bad files.&lt;/p&gt;

&lt;p&gt;How to prevent it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You must check for vulnerabilities in a file that is uploaded to your application&lt;/li&gt;
&lt;li&gt;Only permit specific file type&lt;/li&gt;
&lt;li&gt;Rename files when they are uploaded&lt;/li&gt;
&lt;li&gt;Always scan your file for malware&lt;/li&gt;
&lt;li&gt;Confirm file formats and extensions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cross-site scripting  attack (XSS)&lt;br&gt;
Cross-site scripting (Which is known as XSS ) is a type of security vulnerability commonly found in web applications. These attacks enable attackers to insert client-side scripts into web pages viewed by other users. It occurs when a malicious script is injected directly into a vulnerable web application, XSS allows attackers to execute scripts in the victim’s browser which can hijack user sessions, destroy websites, or redirect the users to malicious websites.&lt;/p&gt;

&lt;p&gt;There are three types of XSS attacks&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reflected XSS&lt;/li&gt;
&lt;li&gt;Stored XSS&lt;/li&gt;
&lt;li&gt;Dom Based XSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will give a little definition of each of these attacks.&lt;/p&gt;

&lt;p&gt;Reflected XSS: Reflected XSS attacks, also known as non-persistent attacks, is a form XSS where the cross-site component occurs temporarily as a result of user input being reflected into the DOM&lt;/p&gt;

&lt;p&gt;Stored XSS:  In stored XSS, is a form of cross-site scripting script execution in which the payload (typically Javascript) is persisted typically in a database it is distributed by the application itself by nature of being rendered via application logic from the server's database&lt;/p&gt;

&lt;p&gt;Dom Based XSS: is an XSS attack that arises when an application contains some client-side JavaScript that processes data from an untrusted source in an unsafe way, It is usually caused by writing data to a potential sink within the Dom.&lt;br&gt;
One thing that can lead to this attack in your application is your HTML element&lt;/p&gt;

&lt;p&gt;One of the libraries we can use for sanitization is DomPurify.&lt;/p&gt;

&lt;p&gt;DOM Purify&lt;br&gt;
DomPurfiy is a library that we can use for the sanitization of HTML, MathML, and SVG. It's an XSS sanitizer.&lt;/p&gt;

&lt;p&gt;You can check out the package on Npm's official website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/dompurify"&gt;https://www.npmjs.com/package/dompurify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to prevent it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never insert untrusted data in your application&lt;/li&gt;
&lt;li&gt;Try to use interpolated expressions that are stringified and cannot be outputted on the browser&lt;/li&gt;
&lt;li&gt;Always ensure that the data coming from your code is sanitized and purified with Dom Purifier&lt;/li&gt;
&lt;li&gt;Ensure the data passed through prop is rendered the proper way be it v-html or document.write&lt;/li&gt;
&lt;li&gt;Always use what the framework suggests except v-html&lt;/li&gt;
&lt;li&gt;Do not render templates server-side keep them static&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Software / Library Update&lt;br&gt;
There is always a high risk involved when we use a package or libraries that are not up to the latest version it can cause harm to our application and give these hackers access to our application.&lt;/p&gt;

&lt;p&gt;How to prevent it&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Constantly update your packages or libraries manually to the latest and secured version&lt;/li&gt;
&lt;li&gt;Check the security flaws of this library or package to be sure they are not at risk.&lt;/li&gt;
&lt;li&gt;Always add the older version of your packages to the newer ones.&lt;/li&gt;
&lt;li&gt;Always use the selective third packages or libraries which are well-managed, well-documented, and recommended.&lt;/li&gt;
&lt;li&gt;Continuously update your Npm packages to avoid dependency errors.&lt;/li&gt;
&lt;li&gt;Always check them for known vulnerabilities use  Npm audit to fix them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QTh81iE9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_198B7736ABC55B8E38C951B493CFC92D19EE1EF2EF5DF35A1A812ABF610C7B85_1631355960768_audit.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QTh81iE9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_198B7736ABC55B8E38C951B493CFC92D19EE1EF2EF5DF35A1A812ABF610C7B85_1631355960768_audit.PNG" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code example&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm audit fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;End-to-End Encryption&lt;/p&gt;

&lt;p&gt;End-to-end encryption (E2EE) is a method of secure communication that prevents third parties from accessing data while it's transferred from one device to another. It is another way of securing your application from malicious users. E2EE is very necessary for application because it reduces the number of parties who might be able to interfere with the encryption&lt;/p&gt;

&lt;p&gt;Captcha&lt;br&gt;
It's another means of securing your application, It is used to authenticate that a real person or user is accessing your application in other to restrict spammers or bots that tries to access email address, Captcha is used for addressing larger audiences for a large scale project.&lt;/p&gt;

&lt;p&gt;Advantage&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It helps in preventing automated spam submissions&lt;/li&gt;
&lt;li&gt;It blocks robot software from submitting a fake request&lt;/li&gt;
&lt;li&gt;It protects the integrity of online by resisting hackers using robots to send in repeated false responses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Npm Dependency Vulnerabilities&lt;br&gt;
It is very good to audit your dependency packages to check if they are upgraded to the latest version or not&lt;/p&gt;

&lt;p&gt;Use the command npm audit to audit your packages and check for the outdated versions of packages, vulnerable packages and upgrade hem to the latest version&lt;/p&gt;

&lt;p&gt;Distributed denial-of-service attack (DDoS)&lt;br&gt;
A DDoS attack is an attempt by the attacker to create so much traffic to an internet application that prevents the traffic flow of normal visitors.&lt;/p&gt;

&lt;p&gt;Below is a sign of a DDoS attack&lt;/p&gt;

&lt;p&gt;Webpage Not Found: This is one of the signs of a DDoS attack, where a particular website can not open or is not found.&lt;/p&gt;

&lt;p&gt;Increase of EMail Spam: This is another sign where there is a very high increase in email spam.&lt;/p&gt;

&lt;p&gt;Slow Network Performance: This is a situation where the network is being slowed down when attempting to open files stored on the network or when accessing files in the application.&lt;/p&gt;

&lt;p&gt;How to prevent it :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Develop a response plan/team members&lt;/li&gt;
&lt;li&gt;Secure the network&lt;/li&gt;
&lt;li&gt;Practice a good network security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authentication&lt;br&gt;
Authentication is an action of verifying the identity of a user or process. When authentication is broken it can allow attackers to access the user's data or information and cause harm to your application. one of the ways attackers can access user's data through authentication is&lt;/p&gt;

&lt;p&gt;Improper login&lt;br&gt;
An improper login can lead to data exposure which can cause havoc by attackers to your web application.&lt;/p&gt;

&lt;p&gt;Displaying error messages for authentication&lt;br&gt;
While you are authenticating a form on your web application you must be very careful not to display just a single error message when a user enters a wrong password "Your password is incorrect" This can give the attacker the mindset that the email address or user id is valid while the password is wrong, This can allow the attacker to start suggesting the password for that user. The best way is to display this error is "Incorrect username or password"&lt;/p&gt;

&lt;p&gt;Here is a simple diagram example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rS_AGsUe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_198B7736ABC55B8E38C951B493CFC92D19EE1EF2EF5DF35A1A812ABF610C7B85_1631355880833_59805538-fbabd380-92c7-11e9-93d5-7bcd80f43c0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rS_AGsUe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_198B7736ABC55B8E38C951B493CFC92D19EE1EF2EF5DF35A1A812ABF610C7B85_1631355880833_59805538-fbabd380-92c7-11e9-93d5-7bcd80f43c0e.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O0qlo3BQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_198B7736ABC55B8E38C951B493CFC92D19EE1EF2EF5DF35A1A812ABF610C7B85_1631355880868_Sign%2Bin%2Bto%2BGitHu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O0qlo3BQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_198B7736ABC55B8E38C951B493CFC92D19EE1EF2EF5DF35A1A812ABF610C7B85_1631355880868_Sign%2Bin%2Bto%2BGitHu.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Session IDs exposed in a URL&lt;/p&gt;

&lt;p&gt;A session ID is a special number that a Web site's server assigns a specific user for the duration of that user's visit (session)&lt;/p&gt;

&lt;p&gt;If you place a session token directly in the URL, it increases the risk of an attacker capture and exploits it. When you connect to the webserver using HTTPS the risk is less than if you use HTTP but it is still a threat. HTTPS URLs are encrypted during transmission but are often stored in server logs.&lt;/p&gt;

&lt;p&gt;Improper Form Validation&lt;br&gt;
If the data entered into a form input is not properly validated, or in the right format, it will lead to injection attacks, memory leakage, and compromised systems.&lt;br&gt;
Validating your form is important in your  application because a form can be submitted without the user completing all the required fields. But this level ensures that all fields are confirmed when the user tries to submit the form.&lt;/p&gt;

&lt;p&gt;This is an example of a formatted input defining the input type as "email" it ensures the input is that of an email address&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;input type="email" name="email" placeholder="your_email@mail.com" required/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Form sanitization&lt;br&gt;
Form sanitization is the process of keeping your form input clean, filtered, and sanitized from a malicious agent.&lt;/p&gt;

&lt;p&gt;How to prevent all of these attacks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement proper logging by making sure a user is well authenticated with a two-factor authentication&lt;/li&gt;
&lt;li&gt;Never display a single error message this can give the user access to suggest each data that's missing and hack the user's data in your application&lt;/li&gt;
&lt;li&gt;Always use a strong password when suggesting passwords to your users in your application&lt;/li&gt;
&lt;li&gt;ensure you are using a "secure enough" random generator to build the token.&lt;/li&gt;
&lt;li&gt;Never store session id in a URL&lt;/li&gt;
&lt;li&gt;Always make sure user form input is properly validated and sanitized.&lt;/li&gt;
&lt;li&gt;Provide minimum authentication for your users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doppler is one company  trusted with serving hundreds of millions of secrets to developers and their apps in a secure, performant, and reliable way. A love for security is built into the core of our DNA.&lt;/p&gt;

&lt;p&gt;You can check their official website to learn more about security&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.doppler.com/security"&gt;https://www.doppler.com/security&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
Securing your application is necessary because it keeps hackers and cyber thieves from accessing sensitive information in your application. It also builds customer confidence by keeping their data secure.&lt;/p&gt;

&lt;p&gt;Wow, That was a great article. In this article, we have learned what web application security is, why it is important, and how to secure your  application form cyber thieves.&lt;/p&gt;

&lt;p&gt;Thanks for reading please feel free to add your idea on what I have covered let's improve the security of our application against malicious agents cheers!!!!&lt;/p&gt;

&lt;p&gt;REFERENCE&lt;/p&gt;

&lt;p&gt;&lt;a href="https://owasp.org/www-project-top-ten/"&gt;https://owasp.org/www-project-top-ten/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>webapplication</category>
    </item>
    <item>
      <title>WAYS TO BECOME A GOOD FRONT END DEVELOPER</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Mon, 20 Jul 2020 12:59:49 +0000</pubDate>
      <link>https://dev.to/silentdev/ways-to-become-a-good-front-end-developer-1afj</link>
      <guid>https://dev.to/silentdev/ways-to-become-a-good-front-end-developer-1afj</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Learn HTML &amp;amp; CSS. And become good at it.
I guess there’s no way around it. Learn HTML &amp;amp; CSS. Why? Because of the basics matter.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are all kinds of different online courses available on how to get started with HTML and CSS. First things first. Sign up at Online courses like Coursera or Team Treehouse. After finishing some initial courses, go ahead and create some static web pages and iterate over and over again.&lt;/p&gt;

&lt;p&gt;I also recommend developing some small UI elements for practicing your newly learned HTML &amp;amp; CSS skills. Codepen.io is a great playground for that. Browse other people’s projects and participate in the community there.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build things.
Playing around with (small) UI elements is one thing. Creating an actual landing page or website is something different. At some point, you will eventually start using JavaScript snippets.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Don’t forget to challenge yourself by building the first responsive elements.&lt;/p&gt;

&lt;p&gt;So there’s only one way to become better at what you’re doing: Keep learning, keep building.&lt;/p&gt;

&lt;p&gt;Putting these two together, build to learn! There’s no better way to learn than to get your hands dirty. You’ve probably heard this a hundred times by now, but it is for a good reason why this is the advice most often dished out.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read, read, read
I guess there’s no way around this. Believe it or not. Your reading skills greatly influence your path to becoming a great front-end developer. Especially when starting out, there’s a lot of reading required. Why?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At first, you’ll probably read a lot of articles, guides, and manuals on how to do different things. You’ll also start reading other people’s code.&lt;/p&gt;

&lt;p&gt;Or as Adam (UX Lead at CoachUp) would state:&lt;/p&gt;

&lt;p&gt;Combine that with a good book like Eloquent JavaScript, and you can up your programming game very quickly.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There’s more to front-end development than building a website
If you followed my tips from 1 to 3, you have probably already done a course or have read a lot of tutorials and are now able to throw together a website.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, that doesn’t equate to being a “front-end developer”. Knowing how to build a website is a very small part of the front-end puzzle.&lt;/p&gt;

&lt;p&gt;I apologize if that sounds demotivating. But that’s actually the case.&lt;/p&gt;

&lt;p&gt;There is a whole load of topics that you still should learn about. If we consider performance, testing, QA, and many other areas, then you really need to become a deep diver as a front-end developer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Know your tools
As you start your journey with front-end development, you will need to decide on your toolkit and the services you need to make your life easier. Learning about the different tooling options is an important thing. Great tools will help you enhance and automate your front-end development workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There will be an ocean of possibilities but soon enough, you’ll find yourself using certain tools and apps. One of those tools will definitely be the Chrome developer tools. Why? Because you can play with HTML, CSS, and JavaScript in real-time and this will give you the immediate feedback you need to learn quickly.&lt;br&gt;
Additionally, node, npm, bower, and many more excellent tools are there to facilitate your daily work. And don’t forget about versioning. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Version control will save your life.
OK, maybe this sounds a bit too exaggerated. But trust me on that. Version control will save you some sleepless nights.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of trying something and having it blow up in your face or hitting command+z a trillion times, you can simply trash your branch and roll back to what was working previously.&lt;/p&gt;

&lt;p&gt;So make sure to become an expert at Git.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do not rush.
Along the way, you will ask yourself why you do this and you may want to just stop. It may be tempting to just give up. But don’t. If you’re at that point, I have only one advice for you:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do. not. give. up.&lt;/p&gt;

&lt;p&gt;Set aside one or two hours every other day to learn. Take a lot of breaks and make sure that you really know the basics. And never rush.&lt;/p&gt;

&lt;p&gt;The basics form the foundation which will help you get to the next level.&lt;/p&gt;

&lt;p&gt;If you feel stuck, don’t be afraid to ask questions. Everyone goes through this phase and having the patience to stick it out will help you come out in the end as a pro in front-end development.&lt;/p&gt;

&lt;p&gt;Thanks for spending your time to read this hope it helps you out&lt;br&gt;
please feel free to add more&lt;/p&gt;

</description>
      <category>newbie</category>
      <category>frontend</category>
    </item>
    <item>
      <title>How to become a good programmer(Junior Programmer)</title>
      <dc:creator>Ezekiel Lawson</dc:creator>
      <pubDate>Wed, 13 Nov 2019 09:34:49 +0000</pubDate>
      <link>https://dev.to/silentdev/how-to-become-a-good-programmer-junior-programmer-58ah</link>
      <guid>https://dev.to/silentdev/how-to-become-a-good-programmer-junior-programmer-58ah</guid>
      <description>&lt;p&gt;Dear junior dev&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;don't be scared of making mistakes&lt;/li&gt;
&lt;li&gt;don't be scared of trying something new&lt;/li&gt;
&lt;li&gt;don't be afraid of airing your opinion&lt;/li&gt;
&lt;li&gt;don't be scared of losing&lt;/li&gt;
&lt;li&gt;believe in yourself&lt;/li&gt;
&lt;li&gt;take that risk&lt;/li&gt;
&lt;li&gt;no excuses&lt;/li&gt;
&lt;li&gt;take responsibility&lt;/li&gt;
&lt;li&gt;be brave&lt;/li&gt;
&lt;li&gt;show working&lt;/li&gt;
&lt;li&gt;live the dream
🔥🔥🔥🔥&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
