<?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: Everly Precia Suresh</title>
    <description>The latest articles on DEV Community by Everly Precia Suresh (@everlygif).</description>
    <link>https://dev.to/everlygif</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%2F802514%2Fbdae2bfa-e83d-493a-9fdf-5cf205e20431.jpg</url>
      <title>DEV Community: Everly Precia Suresh</title>
      <link>https://dev.to/everlygif</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/everlygif"/>
    <language>en</language>
    <item>
      <title>🌐 Resource Preloading in HTML | One Byte Explainer</title>
      <dc:creator>Everly Precia Suresh</dc:creator>
      <pubDate>Sat, 15 Jun 2024 06:09:49 +0000</pubDate>
      <link>https://dev.to/everlygif/resource-preloading-in-html-one-byte-explainer-25pl</link>
      <guid>https://dev.to/everlygif/resource-preloading-in-html-one-byte-explainer-25pl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/cs"&gt;DEV Computer Science Challenge v24.06.12: One Byte Explainer&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explainer
&lt;/h2&gt;

&lt;p&gt;Resource preloading in HTML can be achieved using the &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; element with the &lt;code&gt;rel&lt;/code&gt; attribute to hint at the browser about resources that will be needed soon. Fetching resources in advance improves load time and webpage performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Context
&lt;/h2&gt;

&lt;p&gt;Here are some options you may consider :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;rel="preload"&lt;/code&gt;: Actively fetch the resource and cache it, as needed for current navigation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rel="prefetch"&lt;/code&gt;: Fetch the resource in advance as it is needed for follow-up navigation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rel="dns-prefetch"&lt;/code&gt;: Perform DNS resolution for the resource for easy fetching later.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rel="preconnect"&lt;/code&gt;: Perform a connection request to the resource and establish a connection for easy fetching later.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rel="prerender"&lt;/code&gt;: Preload the resource in the background. However, one should note that this might negatively affect the user's bandwidth.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>cschallenge</category>
      <category>computerscience</category>
      <category>beginners</category>
    </item>
    <item>
      <title>🌊 Beach Quest with Finley and Friends !</title>
      <dc:creator>Everly Precia Suresh</dc:creator>
      <pubDate>Thu, 06 Jun 2024 16:00:37 +0000</pubDate>
      <link>https://dev.to/everlygif/beach-quest-with-finley-and-friends--bmk</link>
      <guid>https://dev.to/everlygif/beach-quest-with-finley-and-friends--bmk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for [Frontend Challenge v24.04.17]((&lt;a href="https://dev.to/challenges/frontend-2024-05-29"&gt;https://dev.to/challenges/frontend-2024-05-29&lt;/a&gt;), Glam Up My Markup: Beaches&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I developed &lt;strong&gt;Beach Quest with Finley and Friends&lt;/strong&gt;, a visually stunning and interactive web app designed to showcase a list of beaches provided in the prompt. Being from a coastal city in India, I knew that static images wouldn't capture the true beauty of beaches, so I opted to use videos for the visuals. This led me to work closely with the &lt;strong&gt;HTML5 Video element and API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I envisioned the website as a &lt;strong&gt;virtual tour&lt;/strong&gt;. To achieve this, I synchronized background videos with the corresponding beach descriptions. This inspired another idea: adding &lt;strong&gt;tour guides&lt;/strong&gt; for each beach. That's where Finley and his friends come in—they guide users through the beaches and share their pro tips, making the website more informative.&lt;/p&gt;

&lt;p&gt;I built this website with &lt;strong&gt;a strong focus on accessibility, ensuring it is user-friendly for everyone&lt;/strong&gt;. To enhance user experience, &lt;strong&gt;I included a navigation menu for easy jumping between sections, a progress bar with previous and next buttons, a loader to handle dynamic video loading, and responsiveness for all devices.&lt;/strong&gt; Although I recommend visiting the website on a desktop to truly appreciate the visuals, it is also fully viewable on mobile devices.&lt;/p&gt;

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

&lt;p&gt;Below, I have added screenshots of all the features I mentioned and provided the deployed URL and GitHub source code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Landing screen with Tour Guide and CTA
&lt;/h3&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%2Fc3yqn2bil4j4sfwcwfxz.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%2Fc3yqn2bil4j4sfwcwfxz.png" alt="Landing screen with Tour Guide and CTA" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Intro Screen with Progress Bar
&lt;/h3&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%2F8bp87f6s4up42fd22i7g.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%2F8bp87f6s4up42fd22i7g.png" alt="Intro Screen with Progress Ba" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Beach Screen with Background Video
&lt;/h3&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%2Fsq0hz687lnucvcijqnpn.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%2Fsq0hz687lnucvcijqnpn.png" alt="Beach Screen with Background Video" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Accessibility Navigation Menu
&lt;/h3&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%2Fgrzongcnhxg9ecjpijmz.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%2Fgrzongcnhxg9ecjpijmz.png" alt="Accessibility Navigation Bar" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Responsiveness
&lt;/h3&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%2F2raj1enirjlz9jm7kqyq.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%2F2raj1enirjlz9jm7kqyq.png" alt="Mobile View" width="800" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: you'll only be able to see the loader if there is a delay in loading the video, if you have good internet speed, likely, you will not see it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have deployed the website on &lt;strong&gt;GitHub Pages&lt;/strong&gt; : &lt;a href="https://everly-gif.github.io/BeachQuest/" rel="noopener noreferrer"&gt;https://everly-gif.github.io/BeachQuest/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt; : &lt;a href="https://github.com/everly-gif/BeachQuest" rel="noopener noreferrer"&gt;https://github.com/everly-gif/BeachQuest&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;Building this wasn't as simple as I initially thought it would be. I faced numerous challenges throughout the process, especially since the rules strictly prohibited altering the markup directly. As a result, every interaction—from the tour guides and navigation bar to the buttons, loader, video element, video overlay and progress bar had to be added using pure JavaScript. Here below I write an overview of my journey.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;My first challenge was to find freely available videos of the beaches listed in the prompt. After extensive internet searching, I discovered &lt;a href="https://www.pexels.com/search/videos/beach/" rel="noopener noreferrer"&gt;Pexels.com&lt;/a&gt;. I am incredibly grateful for this resource, as the freely available videos for most of the beaches allowed me to bring my vision to life. &lt;em&gt;(Thank you, Pexels, all video credits to the rightful owners!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Secondly, I needed a tour guide. I went through a lot of different character sets before I found Finley and friends. I found them on &lt;a href="https://www.freepik.com/" rel="noopener noreferrer"&gt;freepik.com&lt;/a&gt;(credits to rightful owners). With this, I was all set to dive into logic!&lt;/p&gt;

&lt;h3&gt;
  
  
  Development
&lt;/h3&gt;

&lt;p&gt;At first, I began by directly injecting the additional HTML elements needed through JavaScript with the necessary classes and attributes. I then also modified the existing markup through javascript with the necessary attributes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Progress Bar
&lt;/h4&gt;

&lt;p&gt;I used an event listener, &lt;code&gt;click&lt;/code&gt;, to handle the previous and next functionality. I added a &lt;code&gt;data-index&lt;/code&gt; attribute for easy looping between sections. Later, using the &lt;code&gt;linear-gradient&lt;/code&gt; CSS property, I dynamically updated the bar color in JavaScript.&lt;/p&gt;

&lt;h4&gt;
  
  
  Beaches, Background Videos, Tour Guides, and Speech Bubbles
&lt;/h4&gt;

&lt;p&gt;I maintained data in an array structure for easy looping. The previously injected &lt;code&gt;data-index&lt;/code&gt; attribute facilitated easy retrieval of the index, allowing me to set the correct background video, tour guide, appropriate speech bubbles, and beach description for each view. I achieved this by toggling between the &lt;code&gt;display:none and block/flex&lt;/code&gt; properties.&lt;/p&gt;

&lt;h4&gt;
  
  
  Navigation Menu
&lt;/h4&gt;

&lt;p&gt;I extracted all the data from the markup and appended it to another separate div, &lt;code&gt;menu-items&lt;/code&gt;. Since the navigation menu was a separate view from the existing markup, I gave each item a &lt;code&gt;data-slide&lt;/code&gt; attribute to indicate which section to jump to when clicked. I achieved this by toggling between the &lt;code&gt;display: none&lt;/code&gt; and &lt;code&gt;block/flex&lt;/code&gt; properties.&lt;/p&gt;

&lt;h4&gt;
  
  
  Responsiveness and Other Styling
&lt;/h4&gt;

&lt;p&gt;I wrote a substantial amount of CSS to center-align the text on top of the background videos. I used properties such as &lt;code&gt;position&lt;/code&gt;, &lt;code&gt;z-index&lt;/code&gt;, &lt;code&gt;keyframes&lt;/code&gt; and &lt;code&gt;display&lt;/code&gt; throughout the website. Focusing on user-friendliness, I wrote media queries to ensure that the website looks great on all devices. The videos I used are dimensioned to support desktop viewing, so for mobile, I used the &lt;code&gt;min-height&lt;/code&gt; and &lt;code&gt;min-width&lt;/code&gt; properties to avoid any white spaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;p&gt;I was pretty happy with the development locally after working on it for quite a few days. It was time to take it to the next level!&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%2F153cic4wskwljrfudf1q.gif" 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%2F153cic4wskwljrfudf1q.gif" alt="Excited" width="500" height="226"&gt;&lt;/a&gt;&lt;br&gt;
GIF creds : &lt;a href="https://gifer.com/" rel="noopener noreferrer"&gt;Gifer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I first faced the file too large issue. That is when I realized my videos were huge. Locally, I never had an issue, so I hadn't considered the file size. I needed to optimize them to be able to push to GitHub. I used &lt;a href="https://www.freeconvert.com/video-compressor" rel="noopener noreferrer"&gt;FreeConvert&lt;/a&gt;, an online video compressor tool that helped me to significantly reduce the video file size. I was then able to push my code and deploy it to GitHub Pages.&lt;/p&gt;

&lt;p&gt;Later, I faced the grey screen issue while navigating the website using the prev and next buttons. This was happening because the video was taking time to load and set. Again, locally I never faced this issue; it only occurred after deployment. However, this severely affected the user experience of the website, so I had to address it. After much internet surfing, I found video attributes such as &lt;code&gt;poster&lt;/code&gt; that could contain a loading image/gif URL, which would be displayed before the video loads. But I wasn't really happy with what I was able to achieve with it. So the research continued. &lt;/p&gt;

&lt;p&gt;I came across event listeners &lt;code&gt;loadstart&lt;/code&gt; and &lt;code&gt;canplaythrough&lt;/code&gt;, which then simplified my issue. I decided to toggle between the &lt;code&gt;display: none&lt;/code&gt; and &lt;code&gt;display: flex&lt;/code&gt; properties based on these event listeners on a custom loader. I used a wave loader gif from &lt;a href="https://app.lottiefiles.com/animation/d6b7aa5a-4106-407b-b9ec-d5be3079433d" rel="noopener noreferrer"&gt;LottieFiles&lt;/a&gt;, centered it on a div with a custom background color, and used it as my loading screen.&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%2Fnekx8a4bcvqb75tynw6w.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%2Fnekx8a4bcvqb75tynw6w.png" alt="loader" width="682" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned and What I am proud of
&lt;/h2&gt;

&lt;p&gt;It was great to challenge myself to think outside the box and pick up a front-end challenge. It's been a good amount of time since I worked with plain JS, HTML, and CSS. So, this challenge was a nice re-brushup on those skills.&lt;/p&gt;

&lt;p&gt;I'm particularly proud that I was able to bring this vision to life despite the challenges I faced especially during deployment and finding assets.&lt;/p&gt;

&lt;p&gt;Websites like &lt;a href="https://stackoverflow.com/" rel="noopener noreferrer"&gt;StackOverflow&lt;/a&gt; and &lt;a href="https://www.w3schools.com/" rel="noopener noreferrer"&gt;w3schools&lt;/a&gt; were also a huge help in resolving my blockers.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Introducing $createdAt And $updatedAt On Each Resource</title>
      <dc:creator>Everly Precia Suresh</dc:creator>
      <pubDate>Tue, 28 Jun 2022 18:01:16 +0000</pubDate>
      <link>https://dev.to/appwrite/introducing-createdat-and-updatedat-on-each-resource-5pa</link>
      <guid>https://dev.to/appwrite/introducing-createdat-and-updatedat-on-each-resource-5pa</guid>
      <description>&lt;p&gt;&lt;a href="https://appwrite.io/" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt; is an open-source backend-as-a-service that abstracts all the complexity involved in building a modern application by providing you with a set of REST APIs for your core backend needs. Appwrite handles user authentication and authorization, real-time databases, cloud functions, webhooks, and much more! &lt;/p&gt;

&lt;p&gt;In our latest &lt;a href="https://dev.to/appwrite/announcing-appwrite-015-with-phone-authentication-more-5cjj"&gt;0.15 release&lt;/a&gt;, we introduced many exciting new features, one among them is the addition of two new timestamp attributes &lt;code&gt;$createdAt&lt;/code&gt; and &lt;code&gt;$updatedAt&lt;/code&gt; 🥳. We’ll talk about what one can do with it in this blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  👀 What’s New
&lt;/h2&gt;

&lt;p&gt;From &lt;strong&gt;0.15&lt;/strong&gt;, you should be able to see two newly added attributes to your resources. You can simply check this in the console by clicking on the document's &lt;strong&gt;View as JSON&lt;/strong&gt; option. Navigate to Databases -&amp;gt; [Your database] -&amp;gt; [Your collection] -&amp;gt; [Any document] and on the right side you should see an option to view as JSON. Clicking on that will reveal the newly added attributes.&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%2Fyn4zcshzr83oyk9wxd0u.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%2Fyn4zcshzr83oyk9wxd0u.png" alt="$createdAtand$updatedAt" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the name suggests, &lt;code&gt;$createdAt&lt;/code&gt; will hold the time the resource was created and &lt;code&gt;$updatedAt&lt;/code&gt; will hold the latest time the resource was last modified, both in &lt;strong&gt;UNIX time format in seconds&lt;/strong&gt;. These newly added attributes give more flexibility to developers and make the implementation of certain use cases fairly simple. Let's take a look at how! 😎    &lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Use Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1) ⚡ Sorting Documents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the use cases is the ability to sort documents based on the latest/oldest. This is ideal in a chat application.&lt;/p&gt;

&lt;p&gt;If you want to sort by latest, you can simply use the newly added attributes as an order parameter:&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;Databases&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;databases&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;Databases&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[DATABASE_ID]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// client should be Appwrite Client&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;documents&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;databases&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listDocuments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[COLLECTION_ID]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&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;$createdAt&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DESC&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will pull in the list of documents created and ordered by the latest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) 🕒 Displaying Time Information&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a blog application, you would want to display the time at which the blog was posted. Another example could be a Q/A forum application where you would also be interested in displaying when the content was last updated.&lt;/p&gt;

&lt;p&gt;You can do that by printing a date from a timestamp coming from Appwrite:&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;Databases&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;databases&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;Databases&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[DATABASE_ID]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// client should be Appwrite Client&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;document&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;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[COLLECTION_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;[DOCUMENT_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;created&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;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$createdAt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Date class expects milliseconds&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updated&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;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$updatedAt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Document was created on &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;created&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toGMTString&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;, and last updated on &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;updated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toGMTString&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3) 🤖 Querying Documents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The newly added attributes can be used with the Query API as well, If you want to only list the documents that were created in the last 7 days under the &lt;strong&gt;“latest”&lt;/strong&gt; tab of your application, you can simply do that by using &lt;code&gt;$createdAt&lt;/code&gt; in a query:&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;Databases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Query&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;databases&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;Databases&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[DATABASE_ID]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// client should be Appwrite Client&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lastWeekTimestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;604800000&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;documents&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;databases&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listDocuments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[COLLECTION_ID]&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="nx"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greaterEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;​​$createdAt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lastWeekTimestamp&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;This will pull in the documents created in the last 7 days.&lt;/p&gt;

&lt;p&gt;The above are some of the basic ways the attributes can be utilized. Earlier this would have only been possible with cloud functions making it a little complicated to implement but thanks to the latest release 🥳, it has made such use cases accessible. It now depends on the developers on how they want to utilize the attributes. In general, these attributes are useful to audit system data, order data, query data, and display time information.&lt;/p&gt;

&lt;p&gt;With this, we come to an end 🤩. If you have a project to share, need help, or simply want to become a part of the Appwrite community, I would love for you to join the official Appwrite &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord server&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Learn more
&lt;/h2&gt;

&lt;p&gt;You can use the following resources to learn more and get help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;a href="https://github.com/appwrite" rel="noopener noreferrer"&gt;Appwrite Github&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📜 &lt;a href="https://appwrite.io/docs" rel="noopener noreferrer"&gt;Appwrite Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord Community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>database</category>
      <category>javascript</category>
      <category>appwrite</category>
    </item>
    <item>
      <title>Appwrite Storage Meets Backblaze B2</title>
      <dc:creator>Everly Precia Suresh</dc:creator>
      <pubDate>Tue, 24 May 2022 15:07:38 +0000</pubDate>
      <link>https://dev.to/appwrite/appwrite-storage-meets-backblaze-b2-4m2e</link>
      <guid>https://dev.to/appwrite/appwrite-storage-meets-backblaze-b2-4m2e</guid>
      <description>&lt;p&gt;&lt;a href="https://appwrite.io/" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt; is an open-source backend-as-a-service that abstracts all the complexity involved in building a modern application by providing you with a set of REST APIs for your core backend needs. Appwrite handles user authentication and authorization, real-time databases, cloud functions, webhooks, and much more! &lt;/p&gt;

&lt;p&gt;One of the core functionalities of Appwrite is &lt;a href="https://appwrite.io/docs/storage" rel="noopener noreferrer"&gt;Appwrite Storage&lt;/a&gt;. It permits you to upload, view, download, and query your project files. Appwrite Storage not only takes care of encryption, compression and antivirus scans, it’s also built on top of Appwrite’s flexible, yet simple permission system. Appwrite lets you store any files such as text documents, icons, images, videos, and more.&lt;/p&gt;

&lt;p&gt;Recently, Appwrite introduced support for &lt;a href="https://www.backblaze.com/" rel="noopener noreferrer"&gt;Backblaze&lt;/a&gt; as a storage adapter, allowing you to use Appwrite while not having to worry about your storage running out! &lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Backblaze B2 Setup
&lt;/h2&gt;

&lt;p&gt;We’ll first need to set up our bucket and get some credentials before we can start using Backblaze storage with Appwrite.&lt;/p&gt;

&lt;p&gt;1) Sign up for a &lt;a href="https://secure.backblaze.com/user_signin.htm" rel="noopener noreferrer"&gt;Backblaze account&lt;/a&gt; and ensure  &lt;strong&gt;B2 Cloud Storage service is enabled&lt;/strong&gt; under &lt;strong&gt;Enabled Products&lt;/strong&gt; in your &lt;a href="https://secure.backblaze.com/user_signin.htm" rel="noopener noreferrer"&gt;account settings&lt;/a&gt;.&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%2Ffzdj9ore8vsmfeokc2lc.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%2Ffzdj9ore8vsmfeokc2lc.png" alt="backblaze account settings" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2) On the left navigation, you should see the products and their navigation display. Select the &lt;strong&gt;Buckets&lt;/strong&gt; option from the navigation menu.&lt;/p&gt;

&lt;p&gt;Navigating to &lt;strong&gt;Buckets&lt;/strong&gt; will give you the option to create a bucket and configure it.&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%2Fql0bd9lgvskob254bop1.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%2Fql0bd9lgvskob254bop1.png" alt="Backblaze console" width="800" height="391"&gt;&lt;/a&gt;&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%2Fn9t5tghm09llw79aqt05.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%2Fn9t5tghm09llw79aqt05.png" alt="creating a bucket" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3) Once you have your bucket created and configured, you can now go ahead and &lt;strong&gt;create your application key and key IDs&lt;/strong&gt;. To create your application key and key ID navigate to &lt;strong&gt;Account &amp;gt; App Keys&lt;/strong&gt; from the left navigation.&lt;/p&gt;

&lt;p&gt;Scroll down past the master key section to create a new application key.(&lt;em&gt;Please note that you should &lt;strong&gt;not&lt;/strong&gt; be creating a master key&lt;/em&gt;)&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%2Fuq6ws2r0263scetcdzw2.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%2Fuq6ws2r0263scetcdzw2.png" alt="backblaze credentials" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will give you your &lt;strong&gt;keyID&lt;/strong&gt; and &lt;strong&gt;applicationKey&lt;/strong&gt; which we will later use to connect Appwrite with Backblaze. &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%2F8rhrndjwexotr1nrfzqp.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%2F8rhrndjwexotr1nrfzqp.png" alt="credentials popup" width="546" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) You will also need to get your region for the integration. You will be able to get your region details easily from your s3 endpoint which can be found on your &lt;strong&gt;Buckets&lt;/strong&gt; page.&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%2Fdsudllssukaekisi04k6.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%2Fdsudllssukaekisi04k6.png" alt="bucket region" width="800" height="449"&gt;&lt;/a&gt;     &lt;/p&gt;

&lt;p&gt;The format of endpoints for the Backblaze S3 Compatible API looks as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3.&amp;lt;region&amp;gt;.backblazeb2.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hence, the region for the bucket &lt;code&gt;backblaze-demo&lt;/code&gt; is &lt;code&gt;us-west-004&lt;/code&gt;. Similarly, you can get your region from your bucket’s endpoint. &lt;/p&gt;

&lt;p&gt;With this we conclude the initial setup 💪 and now we will proceed to connect Backblaze B2 storage with Appwrite.  &lt;/p&gt;

&lt;h2&gt;
  
  
  🚀  Appwrite + Backblaze B2
&lt;/h2&gt;

&lt;p&gt;Before you start, make sure that you have your Appwrite instance up and running. Installation of Appwrite is as simple as running one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -it --rm \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    --entrypoint="install" \
    appwrite/appwrite:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about the installation process, you can check out our &lt;a href="https://appwrite.io/docs/installation" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We can now start configuring our &lt;code&gt;.env&lt;/code&gt; file to integrate Backblaze B2 with Appwrite.&lt;/p&gt;

&lt;p&gt;Here are some pointers before we start editing our &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;1) &lt;code&gt;_APP_STORAGE_DEVICE_BACKBLAZE_ACCESS_KEY&lt;/code&gt; will hold your keyID from the Backblaze console.&lt;/p&gt;

&lt;p&gt;2) &lt;code&gt;_APP_STORAGE_DEVICE_BACKBLAZE_SECRET&lt;/code&gt; will hold your applicationKey from the Backblaze console.&lt;/p&gt;

&lt;p&gt;As a first step, navigate to  &lt;code&gt;_APP_STORAGE_DEVICE&lt;/code&gt; in the &lt;code&gt;.env&lt;/code&gt; file and change it from &lt;code&gt;Local&lt;/code&gt; (default) to &lt;code&gt;Backblaze&lt;/code&gt;. This tells the Appwrite server to use Backblaze as the storage adapter and to expect Backblaze credentials in the other environment variables. &lt;/p&gt;

&lt;p&gt;You will also need to edit the following .env variables to get Appwrite connected with Backblaze.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_APP_STORAGE_DEVICE=Backblaze
_APP_STORAGE_DEVICE_BACKBLAZE_BUCKET=your bucket name
_APP_STORAGE_DEVICE_BACKBLAZE_REGION=region
_APP_STORAGE_DEVICE_BACKBLAZE_SECRET=your application key
_APP_STORAGE_DEVICE_BACKBLAZE_ACCESS_KEY=your key id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After editing your &lt;code&gt;.env&lt;/code&gt; file, you will need to restart Appwrite. This can be easily done by running the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once  Appwrite has restarted, create a new account and a new project. In the left menu, select ‘Storage’ and create a new bucket. Finally, upload a file into your bucket. You should see your uploaded files in the Backblaze console as well.&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%2Fhw3dxmwhe55q151fyk39.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%2Fhw3dxmwhe55q151fyk39.png" alt="files uploaded to the bucket" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍🎓 Conclusion
&lt;/h2&gt;

&lt;p&gt;With the newly released provider system for Appwrite Storage service, you can now connect Appwrite with external storage providers instead of storing the files on your system. This prevents exhausting hard drive and bandwidth limits, as well as lets you use your favorite provider alongside Appwrite. And as you have seen in the tutorial above, you can easily connect Appwrite with Backblaze B2 in just a few steps!&lt;/p&gt;

&lt;p&gt;If you have a project to share, need help, or simply want to become a part of the Appwrite community, I would love for you to join the official Appwrite &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord server&lt;/a&gt;. I can’t wait to see what you build!&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Learn more
&lt;/h2&gt;

&lt;p&gt;You can use the following resources to learn more and get help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;a href="https://github.com/appwrite" rel="noopener noreferrer"&gt;Appwrite Github&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📜 &lt;a href="https://appwrite.io/docs" rel="noopener noreferrer"&gt;Appwrite Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord Community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>appwrite</category>
      <category>tutorial</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Appwrite Storage Meets Wasabi Cloud Storage</title>
      <dc:creator>Everly Precia Suresh</dc:creator>
      <pubDate>Mon, 23 May 2022 17:36:05 +0000</pubDate>
      <link>https://dev.to/appwrite/appwrite-storage-meets-wasabi-cloud-storage-g4p</link>
      <guid>https://dev.to/appwrite/appwrite-storage-meets-wasabi-cloud-storage-g4p</guid>
      <description>&lt;p&gt;&lt;a href="https://appwrite.io/" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt; is an open-source backend-as-a-service that abstracts all the complexity involved in building a modern application by providing you with a set of REST APIs for your core backend needs. Appwrite handles user authentication and authorization, real-time databases, cloud functions, webhooks, and much more! &lt;/p&gt;

&lt;p&gt;One of the core functionalities of Appwrite is &lt;a href="https://appwrite.io/docs/storage" rel="noopener noreferrer"&gt;Appwrite Storage&lt;/a&gt;. It permits you to upload, view, download, and query your project files. Appwrite Storage not only takes care of encryption, compression and antivirus scans, it’s also built on top of Appwrite’s flexible, yet simple permission system. Appwrite lets you store any files such as text documents, icons, images, videos, and more.&lt;/p&gt;

&lt;p&gt;Recently, Appwrite introduced support for &lt;a href="https://wasabi.com/" rel="noopener noreferrer"&gt;Wasabi&lt;/a&gt; as a storage adapter, allowing you to use Appwrite while not having to worry about your storage running out!&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Wasabi Cloud Storage Setup
&lt;/h2&gt;

&lt;p&gt;To get started we’ll first need to set up our bucket and get our credentials before we can start using Wasabi Cloud storage with Appwrite.&lt;/p&gt;

&lt;p&gt;1) Sign up for a &lt;a href="https://console.wasabisys.com/#/login" rel="noopener noreferrer"&gt;Wasabi account&lt;/a&gt; and navigate to the &lt;strong&gt;Buckets&lt;/strong&gt; menu in your Wasabi console to create a bucket.&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%2Fyn0k00yufih58owdysx2.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%2Fyn0k00yufih58owdysx2.png" alt="Wasabi console" width="800" height="360"&gt;&lt;/a&gt;&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%2Fn1gt8ug3b3x9w0tgbqfb.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%2Fn1gt8ug3b3x9w0tgbqfb.png" alt="Wasabi bucket" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2) Once you have your bucket created and configured, you can now go ahead and create your access key and secret. You will be able to do this by navigating to the &lt;strong&gt;Access Keys&lt;/strong&gt; tab present in the left-side navigation.&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%2Fyhmyi10dodmbrkttbzjc.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%2Fyhmyi10dodmbrkttbzjc.png" alt="Wasabi credentials" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will give you your access key and secret which we will later use to connect Appwrite with Wasabi. &lt;/p&gt;

&lt;p&gt;3) You will also need to get your region for the integration. You would have selected your region when you created your bucket. Here, The region for the bucket we created is &lt;code&gt;eu-central-1&lt;/code&gt;.  &lt;/p&gt;

&lt;p&gt;Hence, With this we conclude the initial setup 💪 and now we will proceed to connect Wasabi Cloud storage with Appwrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Appwrite + Wasabi Cloud Storage
&lt;/h2&gt;

&lt;p&gt;Before you start, make sure that you have the Appwrite instance up and running. Installation of Appwrite is as simple as running one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -it --rm \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    --entrypoint="install" \
    appwrite/appwrite:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about the installation process, you can check out our &lt;a href="https://appwrite.io/docs/installation" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We can now start configuring the &lt;code&gt;.env&lt;/code&gt; file to integrate Wasabi Cloud storage with Appwrite.&lt;/p&gt;

&lt;p&gt;As a first step, navigate to  &lt;code&gt;_APP_STORAGE_DEVICE&lt;/code&gt; in the &lt;code&gt;.env&lt;/code&gt; file and change it from &lt;code&gt;Local&lt;/code&gt; (default) to &lt;code&gt;Wasabi&lt;/code&gt;. This tells the Appwrite server to use Wasabi as the storage adapter and to expect Wasabi credentials in the other environment variables. &lt;/p&gt;

&lt;p&gt;You will also need to edit the following .env variables to get Appwrite connected with Wasabi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_APP_STORAGE_DEVICE=Wasabi
_APP_STORAGE_DEVICE_WASABI_BUCKET=your bucket name
_APP_STORAGE_DEVICE_WASABI_REGION=region
_APP_STORAGE_DEVICE_WASABI_SECRET=your secret
_APP_STORAGE_DEVICE_WASABI_ACCESS_KEY=your access key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After editing your &lt;code&gt;.env&lt;/code&gt; file, you will need to restart Appwrite. This can be easily done by running the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once Appwrite has restarted, create a new account and a new project. In the left menu, select &lt;strong&gt;Storage&lt;/strong&gt; and create a new bucket. Finally, upload a file into your bucket. You should see your uploaded files in the Wasabi console as well.&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%2Flbtjf08q4rh23l2jzzyk.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%2Flbtjf08q4rh23l2jzzyk.png" alt="Uploaded files in wasabi bucket" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍🎓 Conclusion
&lt;/h2&gt;

&lt;p&gt;With the newly released provider system for Appwrite Storage service, you can now connect Appwrite with external storage providers instead of storing the files on your system. This prevents exhausting hard drive and bandwidth limits, as well as lets you use your favorite provider alongside Appwrite. And as you have seen in the tutorial above, you can easily connect Appwrite with Wasabi Cloud storage in just a few steps!&lt;/p&gt;

&lt;p&gt;If you have a project to share, need help, or simply want to become a part of the Appwrite community, I would love for you to join the official Appwrite &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord server&lt;/a&gt;. I can’t wait to see what you build!&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Learn more
&lt;/h2&gt;

&lt;p&gt;You can use the following resources to learn more and get help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;a href="https://github.com/appwrite" rel="noopener noreferrer"&gt;Appwrite Github&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📜 &lt;a href="https://appwrite.io/docs" rel="noopener noreferrer"&gt;Appwrite Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord Community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>appwrite</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Appwrite Storage Meets Linode Object Storage</title>
      <dc:creator>Everly Precia Suresh</dc:creator>
      <pubDate>Sat, 14 May 2022 05:16:47 +0000</pubDate>
      <link>https://dev.to/appwrite/appwrite-storage-meets-linode-object-storage-e03</link>
      <guid>https://dev.to/appwrite/appwrite-storage-meets-linode-object-storage-e03</guid>
      <description>&lt;p&gt;&lt;a href="https://appwrite.io/" rel="noopener noreferrer"&gt;Appwrite&lt;/a&gt; is an open-source backend-as-a-service that abstracts all the complexity involved in building a modern application by providing you with a set of REST APIs for your core backend needs. Appwrite handles user authentication and authorization, real-time databases, cloud functions, webhooks, and much more! &lt;/p&gt;

&lt;p&gt;One of the core functionalities of Appwrite is &lt;a href="https://appwrite.io/docs/storage" rel="noopener noreferrer"&gt;Appwrite Storage&lt;/a&gt;. It permits you to upload, view, download, and query your project files. Appwrite Storage not only takes care of encryption, compression and antivirus scans, it’s also built on top of Appwrite’s flexible, yet simple permission system. Appwrite lets you store any files such as text documents, icons, images, videos, and more.&lt;/p&gt;

&lt;p&gt;Recently, Appwrite introduced support for &lt;a href="https://www.linode.com" rel="noopener noreferrer"&gt;Linode&lt;/a&gt; as a storage adapter, allowing you to use Appwrite while not having to worry about your storage running out!&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Linode Object Storage Setup
&lt;/h2&gt;

&lt;p&gt;To get started we’ll first need to set up our bucket and get our credentials before we can start using Linode Object Storage with Appwrite.   &lt;/p&gt;

&lt;p&gt;1.Sign up for a &lt;a href="https://login.linode.com/" rel="noopener noreferrer"&gt;Linode account&lt;/a&gt; and navigate to &lt;strong&gt;Object storage&lt;/strong&gt; in your Linode console to create a bucket.  &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%2Ftbekrfi3t1qqkp7fuvnu.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%2Ftbekrfi3t1qqkp7fuvnu.png" alt="Linode console" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Once you have your bucket created and configured, you can now go ahead and create your access key and secret. You will be able to do this by navigating to the &lt;strong&gt;Access Keys&lt;/strong&gt; tab present in the Object storage console.  &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%2Flarpzla9w9nof80ihjt4.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%2Flarpzla9w9nof80ihjt4.png" alt="Linode access key" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will give you your access key and secret which we will later use to connect Appwrite with Linode. &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%2Fgbk8gj4ik4drfg4oeg0n.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%2Fgbk8gj4ik4drfg4oeg0n.png" alt="linode access keys" width="789" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.You will also need to get your region for the integration which you would have chosen when you created your bucket. However, if you can’t remember, your region can be easily found from the endpoint displayed under your bucket.&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%2F9nmks1bx46m0ue2kga0f.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%2F9nmks1bx46m0ue2kga0f.png" alt="linode region" width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The format of endpoints for Linode Object Storage looks as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;bucket_name&amp;gt;.&amp;lt;region&amp;gt;.linodeobjects.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hence, the region for the bucket we created here is &lt;code&gt;eu-central-1&lt;/code&gt;.  Similarly, you can get your region from your endpoint. &lt;/p&gt;

&lt;p&gt;With this we conclude the initial setup 💪 and now we will proceed to connect Linode Object Storage with Appwrite.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Appwrite + Linode Object Storage
&lt;/h2&gt;

&lt;p&gt;Before you start, make sure that you have your Appwrite instance up and running. Installation of Appwrite is as simple as running one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -it --rm \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    --entrypoint="install" \
    appwrite/appwrite:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To learn more about the installation process, you can check out our &lt;a href="https://appwrite.io/docs/installation" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We can now start configuring the &lt;code&gt;.env&lt;/code&gt; file to integrate Linode Object Storage with Appwrite.&lt;/p&gt;

&lt;p&gt;As a first step, navigate to  &lt;code&gt;_APP_STORAGE_DEVICE&lt;/code&gt; in the &lt;code&gt;.env&lt;/code&gt; file and change it from &lt;code&gt;Local&lt;/code&gt; (default) to &lt;code&gt;Linode&lt;/code&gt;. This tells the Appwrite server to use Linode as the storage adapter and to expect Linode credentials in the other environment variables.&lt;/p&gt;

&lt;p&gt;You will also need to edit the following .env variables to get Appwrite connected with Linode.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_APP_STORAGE_DEVICE=Linode
_APP_STORAGE_DEVICE_LINODE_BUCKET=your bucket name
_APP_STORAGE_DEVICE_LINODE_REGION= region
_APP_STORAGE_DEVICE_LINODE_SECRET= your secret
_APP_STORAGE_DEVICE_LINODE_ACCESS_KEY=your access key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After editing your &lt;code&gt;.env&lt;/code&gt; file, you will need to restart Appwrite. This can be easily done by running the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once Appwrite has restarted, create a new account and a new project. In the left menu, select ‘Storage’ and create a new bucket. Finally, upload a file into your bucket. You should see your uploaded files in the Linode console as well.&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%2Fnsmt3xk6x38xqadftifp.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%2Fnsmt3xk6x38xqadftifp.png" alt="linode bucket files" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍🎓 Conclusion
&lt;/h2&gt;

&lt;p&gt;With the newly released provider system for Appwrite Storage service, you can now connect Appwrite with external storage providers instead of storing the files on your system. This prevents exhausting hard drive and bandwidth limits, as well as lets you use your favorite provider alongside Appwrite. And as you have seen in the tutorial above, you can easily connect Appwrite with Linode Object Storage in just a few steps!&lt;/p&gt;

&lt;p&gt;If you have a project to share, need help, or simply want to become a part of the Appwrite community, I would love for you to join the official Appwrite &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord server&lt;/a&gt;. I can’t wait to see what you build!&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Learn more
&lt;/h2&gt;

&lt;p&gt;You can use the following resources to learn more and get help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;a href="https://github.com/appwrite" rel="noopener noreferrer"&gt;Appwrite Github&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📜 &lt;a href="https://appwrite.io/docs" rel="noopener noreferrer"&gt;Appwrite Docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;a href="https://appwrite.io/discord" rel="noopener noreferrer"&gt;Discord Community&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>appwrite</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
