<?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>Forem: Carlos Lopez</title>
    <description>The latest articles on Forem by Carlos Lopez (@calo001).</description>
    <link>https://forem.com/calo001</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%2F848496%2F079512f0-b819-4b9f-bef4-313a35d929fa.png</url>
      <title>Forem: Carlos Lopez</title>
      <link>https://forem.com/calo001</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/calo001"/>
    <language>en</language>
    <item>
      <title>Building Nigma, a simple puzzle App Game using AppWrite</title>
      <dc:creator>Carlos Lopez</dc:creator>
      <pubDate>Tue, 03 May 2022 02:13:06 +0000</pubDate>
      <link>https://forem.com/calo001/building-nigma-a-simple-puzzle-app-game-using-appwrite-4f0o</link>
      <guid>https://forem.com/calo001/building-nigma-a-simple-puzzle-app-game-using-appwrite-4f0o</guid>
      <description>&lt;h3&gt;
  
  
  (͠≖ ͜ʖ͠≖)👌 Overview of Nigma
&lt;/h3&gt;

&lt;p&gt;The Nigma app was born from a simple inspiration: wasting time! Well, not quite. But solving puzzles is a great way to kill time when you're waiting for anything, like compiling software, waiting for the bus, waiting for a flight ...&lt;/p&gt;

&lt;p&gt;Also, the UI is widely inspired by the famous and all fashioned material you!. This feature provides you with a simple but entertaining game, that challenges your visual skills.&lt;/p&gt;

&lt;p&gt;And of course, the &lt;strong&gt;AppWrite Hackathon&lt;/strong&gt; motivated me to finally create my first Game App!&lt;/p&gt;

&lt;p&gt;How I built The Nigma App.&lt;/p&gt;

&lt;p&gt;Firstly, I'm a visual person and I wanted to create an MVP app witch covers the main idea and uses various of the AppWrite features. So, my first step was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I went to &lt;strong&gt;Figma&lt;/strong&gt; and started to design the login screen, register, puzzle creator, puzzle resolver, etc. This way I can figure out what to code and avoid rethinking a lot of things on the go.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9722cejuj8sf4xlxua1k.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9722cejuj8sf4xlxua1k.png" alt="Figma project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then I opened my &lt;strong&gt;Android Studio&lt;/strong&gt; ...&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfs75msxnmljtmbojoko.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfs75msxnmljtmbojoko.png" alt="Opening Android Studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I configured my dependencies and potentially needed libraries like accompanist, hilt, Lottie &amp;lt;3 and of course the &lt;strong&gt;AppWrite SDK&lt;/strong&gt;; then I started to code.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hcpt0y4xsesr4ktn0ob.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hcpt0y4xsesr4ktn0ob.png" alt="Android Studio screenshots"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;And finally the most exciting part of the project: the AppWrite Integration. The final result is seen in the screenshots and video below :)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/brHaCdJqCXijm/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/brHaCdJqCXijm/giphy.gif" alt="Waiting!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  My thoughts about AppWrite are:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The installation is &lt;em&gt;very easy&lt;/em&gt;. The docker-compose file provides an easy installation and lets you start using AppWrite really fast, the installation is as simple as a copy-paste in a terminal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;em&gt;documentation&lt;/em&gt; is a gem. The SDK (at least for Android/Kotlin) is clearly explained and the thing I like more is that examples are using either the SDK or HTTP Request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The SDK uses &lt;em&gt;kotlin-coroutines&lt;/em&gt;! It was a surprise for me that coroutines have first-class support for the developer that use any of the functionalities. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below you can find how easy is to use the SDK inside a suspendable function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;savePuzzle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Puzzle&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;collectionId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"puzzle-collection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;documentId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"unique()"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s"&gt;"img_file_id"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fileId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s"&gt;"puzzles_completed"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&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="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;AppwriteException&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&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="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;failure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&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;And then, call this inside a Coroutine Scope (in this case the ViewModelScope) to finally update States that the UI will react to.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;uploadPuzzle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;viewModelScope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dispatchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;resultUpload&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uploadPuzzleInteractor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;savePuzzle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uploadedFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;resultUpload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isSuccess&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_puzzleCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tryEmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AddPuzzleStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;resultUpload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isFailure&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_puzzleCreator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tryEmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AddPuzzleStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultUpload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exceptionOrNull&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="nc"&gt;NullPointerException&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;h3&gt;
  
  
  (¬‿¬) Submission Category: Mobile Moguls
&lt;/h3&gt;

&lt;p&gt;Nigma is an &lt;strong&gt;Android App&lt;/strong&gt;. Built with &lt;em&gt;Jetpack Compose&lt;/em&gt;, tea ☕ and a lot of curiosity about using AppWrite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/fjgccj3kdQXKl8Ekil/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/fjgccj3kdQXKl8Ekil/giphy.gif" alt="Android"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  ( ≖.≖) Link to Code
&lt;/h3&gt;

&lt;p&gt;Here is the link to the &lt;em&gt;enigmatic code&lt;/em&gt;:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calo001" rel="noopener noreferrer"&gt;
        calo001
      &lt;/a&gt; / &lt;a href="https://github.com/calo001/Nigma" rel="noopener noreferrer"&gt;
        Nigma
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;The Nigma App&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/calo001/Nigma/resources/Githubdisplay.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcalo001%2FNigma%2Fresources%2FGithubdisplay.png" alt="Nigma App"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Nigma App is a puzzle game created with Jetpack compose and bootsted with AppWrite.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;App overview&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;You can register a new account by typing in a username, email, and password. The user is saved in the User feature of AppWrite.&lt;/li&gt;
&lt;li&gt;You can log in with your email and password. AppWrite provides the login mechanism.&lt;/li&gt;
&lt;li&gt;The list of puzzles is shown by fetching from the AppWrite database and is watching for changes in real-time.&lt;/li&gt;
&lt;li&gt;You can create a new puzzle by writing a name and description and selecting an image from your storage. Then the database is updated and the image is uploaded to the AppWrite storage feature.&lt;/li&gt;
&lt;li&gt;When you complete a puzzle the database update the corresponding document by adding the userId. When the userId is set, the Realtime feature sends a callback that a puzzle document changes, and then, the list is updated removing the…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/calo001/Nigma" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;
  
  
  (◐.̃◐) Additional Resources / Info
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Nigma app works as follows:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;You can &lt;strong&gt;register&lt;/strong&gt; a new account by typing in a username, email, and password. The user is saved in the &lt;em&gt;User feature&lt;/em&gt; of AppWrite.&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;log in&lt;/strong&gt; with your email and password. AppWrite provides the &lt;em&gt;login&lt;/em&gt; mechanism.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;list of puzzles&lt;/strong&gt; is shown by fetching from the &lt;em&gt;AppWrite database&lt;/em&gt; and is watching for changes in &lt;em&gt;real-time&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;create a new puzzle&lt;/strong&gt; by writing a name and description and selecting an image from your storage. Then the database is updated and the image is uploaded to the AppWrite storage feature. &lt;em&gt;(All user will see your new puzzle and you will see all new puzzles uploaded by others.)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;When you &lt;strong&gt;complete a puzzle&lt;/strong&gt; the &lt;em&gt;database update&lt;/em&gt; the corresponding document by adding the userId. When the userId is set, the Realtime feature sends a callback that a puzzle document changes, and then, the list is updated removing the puzzles resolved by the authenticated user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Puzzles resolved&lt;/strong&gt; by the user are shown in the profile section.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;profile section&lt;/strong&gt; allows you to: change the username, change the image profile, and log out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, some screenshots and a promo video.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7515d04c1ewtat88uxn1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7515d04c1ewtat88uxn1.png" alt="Nigma signin"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ruy9jb5if728mtbrdf.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ruy9jb5if728mtbrdf.png" alt="Puzzle creator"&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtanal1ngs517dmjcmzu.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdtanal1ngs517dmjcmzu.png" alt="Real time and profile"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/57lLLiQwAY0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  ( ͡❛ ● ͡❛) Final thoughts
&lt;/h3&gt;

&lt;p&gt;I know about AppWrite since a time ago and I always have the curiosity because it looks like a nice alternative to Firebase. This time with the hackathon I don't want to delay the chance of trying it and I did it!&lt;/p&gt;

&lt;p&gt;The more enjoyable thing about AppWrite is that the dashboard and SDKs look very well built and documented with examples and public repositories.&lt;/p&gt;

&lt;p&gt;Even there are a lot of positive things in my mind, is inevitable to think about some opportunity areas like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A more flexible way of configuring the SMTP data.&lt;/li&gt;
&lt;li&gt;I'd love to have some extra features like an Analitycs Kit and a relational database.&lt;/li&gt;
&lt;li&gt;A way to import/export the configuration (documents properties, files, etc).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And finally, I'm excited about their Cloud Services that soon will be available and I hope this project continues growing!&lt;/p&gt;

&lt;p&gt;Created with 🧡 by Carlos Lopez Romero 🦦&lt;/p&gt;

</description>
      <category>appwritehack</category>
      <category>android</category>
      <category>jetpackcompose</category>
      <category>kotlin</category>
    </item>
  </channel>
</rss>
