<?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: Mateus Abelli</title>
    <description>The latest articles on DEV Community by Mateus Abelli (@mateusabelli).</description>
    <link>https://dev.to/mateusabelli</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%2F960116%2F7cf47b16-5232-4a31-b643-fd3b8805250c.png</url>
      <title>DEV Community: Mateus Abelli</title>
      <link>https://dev.to/mateusabelli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mateusabelli"/>
    <language>en</language>
    <item>
      <title>The History API in 256 characters!</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Thu, 21 Mar 2024 12:00:00 +0000</pubDate>
      <link>https://dev.to/mateusabelli/the-history-api-in-256-characters-435</link>
      <guid>https://dev.to/mateusabelli/the-history-api-in-256-characters-435</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for DEV Challenge v24.03.20, One Byte Explainer: Browser API or Feature.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Move back and forward between your page history!&lt;/strong&gt; All you need is access to the window global object then call &lt;code&gt;history.forward()&lt;/code&gt; or &lt;code&gt;history.back()&lt;/code&gt;, but you can also jump to a specific index with &lt;code&gt;history.go(2)&lt;/code&gt;, use &lt;code&gt;history.length&lt;/code&gt; to see the total of entries.&lt;/p&gt;

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

&lt;p&gt;I picked this one for the challenge because I knew it would not be very complex to write in a tutorial format. I used &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API"&gt;MDN&lt;/a&gt; as reference and &lt;a href="https://www.charactercountonline.com/"&gt;charactercountonline&lt;/a&gt; to count the characters while composing the text.&lt;/p&gt;

&lt;p&gt;I hope this packs enough info to actually help you learn about the history API, it is indeed that simple.&lt;/p&gt;

&lt;p&gt;Cover Art created with &lt;a href="https://www.gimp.org/"&gt;GIMP&lt;/a&gt;&lt;br&gt;
Photo by Suzy Hazelwood at &lt;a href="https://www.pexels.com/photo/photography-of-opened-book-1172018/"&gt;Pexels&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>#DEVResolutions2024</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Wed, 31 Jan 2024 02:50:15 +0000</pubDate>
      <link>https://dev.to/mateusabelli/devresolutions2024-47od</link>
      <guid>https://dev.to/mateusabelli/devresolutions2024-47od</guid>
      <description>&lt;p&gt;I'm a bit late to the party but here it is my dev resolutions for 2024.&lt;/p&gt;

&lt;h2&gt;
  
  
  Professional Goals:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Learn C# ASP.NET Core, SQL Server and Azure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action Steps:&lt;/strong&gt; Study on Microsoft Learn and YouTube.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeline:&lt;/strong&gt; I think within 3 months I'll be able to develop some cool projects.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Personal Aspirations:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Aspiration:&lt;/strong&gt; This year I'd like to take better care of my health.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why it Matters:&lt;/strong&gt; Coding all day could be a fun and cool activity but not so cool on your body.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support System:&lt;/strong&gt; I'm starting to play with a small ball outside at least a few minutes a day.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  DEV Community Contributions:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Contribution Goal:&lt;/strong&gt; Although I'm not a good writer, posting on DEV seems like an awesome goal but I'm probably going to contribute to the FOREM project on GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration Plans:&lt;/strong&gt; I'd like to help enhance the experience for other members, fix bugs and close some issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measuring Impact:&lt;/strong&gt; The amount of PR's merged seems like a good way to measure it.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devresolutions2024</category>
    </item>
    <item>
      <title>File transfer through SSH is easy!</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Sun, 20 Aug 2023 18:51:42 +0000</pubDate>
      <link>https://dev.to/mateusabelli/file-transfer-through-ssh-is-easy-5193</link>
      <guid>https://dev.to/mateusabelli/file-transfer-through-ssh-is-easy-5193</guid>
      <description>&lt;p&gt;For newcomers, SSH itself might look hard at first and file transferring even more complicated. How to connect to a remote machine to send or copy files from it?&lt;/p&gt;

&lt;p&gt;I'm going to show you that it is not as complicated as it looks. As a matter of fact, it's quite easy!&lt;/p&gt;

&lt;p&gt;First let's define the appearance of our remote connection for our examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User: &lt;code&gt;dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Address: &lt;code&gt;123.45.67.89&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replace it with your real remote machine connection while following the examples&lt;/p&gt;

&lt;h2&gt;
  
  
  The interactive way
&lt;/h2&gt;

&lt;p&gt;Let's use the &lt;strong&gt;SSH File Transfer Protocol&lt;/strong&gt;, or SFTP.&lt;/p&gt;

&lt;p&gt;With this tool, we connect to our remote machine and use it with a &lt;em&gt;bash-like&lt;/em&gt; shell. Let's see how it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sftp dev@123.45.67.89
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With SFTP we rely on file browsing to either receive or send files, after opening our connection let's explore the remote and local working directories. &lt;/p&gt;

&lt;p&gt;Inside the remote we can navigate freely using &lt;code&gt;cd&lt;/code&gt; and &lt;code&gt;ls&lt;/code&gt; commands. See all available commands with &lt;code&gt;help&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sftp&amp;gt; &lt;span class="nb"&gt;pwd
&lt;/span&gt;Remote working directory: /home/dev

sftp&amp;gt; lpwd
Local working directory: /c/Users/User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sending files from 💻 local machine to the 🌐 remote machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sftp&amp;gt; put &lt;span class="c"&gt;# Press Tab&lt;/span&gt;
myfile1.txt 
myfile2.txt

sftp&amp;gt; put myfile2.txt &lt;span class="c"&gt;# 👈 Send myfile2.txt to the remote working directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Receiving files or folders from 🌐 remote machine to 💻 local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sftp&amp;gt; &lt;span class="nb"&gt;ls
&lt;/span&gt;file1.txt
file2.txt
folder

sftp&amp;gt; get file1.txt &lt;span class="c"&gt;# 👈 Gets file1.txt to the local working directory&lt;/span&gt;

sftp&amp;gt; get &lt;span class="nt"&gt;-r&lt;/span&gt; folder
        &lt;span class="c"&gt;# 👆 To get an entire directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The non-interactive way
&lt;/h2&gt;

&lt;p&gt;We will be using the &lt;strong&gt;Secure Copy Protocol&lt;/strong&gt;, or SCP.&lt;/p&gt;

&lt;p&gt;It's a nice and quick way and all it takes is a &lt;em&gt;ssh-like&lt;/em&gt; command with the file paths, a login prompt and there you go! &lt;/p&gt;

&lt;p&gt;Sending files from 💻 local machine to the 🌐 remote machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp ./file.txt dev@123.45.67.89:/home/dev/file.txt
    &lt;span class="c"&gt;# 👆 Your local file path   👆 Where to place it on the remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Receiving files or folders from 🌐 remote machine to 💻 local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;                                      &lt;span class="c"&gt;# 👇 Where to place it on the local&lt;/span&gt;
scp dev@123.45.67.89:/home/dev/file.txt ./file.txt
                  &lt;span class="c"&gt;# 👆 The remote file path&lt;/span&gt;

scp &lt;span class="nt"&gt;-r&lt;/span&gt; dev@123.45.67.89:/home/dev/folder ./folder
  &lt;span class="c"&gt;# 👆 To copy an entire directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although this is an easy way for a quick file transfer there are some caveats.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;According to &lt;a href="https://en.wikipedia.org/wiki/OpenSSH"&gt;OpenSSH&lt;/a&gt; developers in April 2019, SCP is outdated, inflexible and not readily fixed; they recommend the use of more modern protocols like &lt;a href="https://en.wikipedia.org/wiki/Secure_file_transfer_program"&gt;SFTP&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Rsync"&gt;rsync&lt;/a&gt; for file transfer.&lt;a href="https://en.wikipedia.org/wiki/Secure_copy_protocol#cite_note-3"&gt;[3]&lt;/a&gt; As of OpenSSH version 9.0, &lt;code&gt;scp&lt;/code&gt; client therefore uses SFTP for file transfers by default instead of the legacy SCP/RCP protocol.[&lt;a href="https://en.wikipedia.org/wiki/Secure_copy_protocol#cite_note-ossh9-4"&gt;4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— &lt;cite&gt;Wikipedia&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;As you can see, file transferring through SSH is not that hard. There are a few methods to accomplish it and after you get used to it, it's just like doing a regular connection. &lt;/p&gt;

&lt;p&gt;Now you can get that file or send it to your remote box, have fun!&lt;/p&gt;

&lt;h2&gt;
  
  
  Attributions and Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Photo by Brett Sayles from Pexels: &lt;a href="https://www.pexels.com/photo/ethernet-cables-plugged-in-network-switch-2881224/"&gt;https://www.pexels.com/photo/ethernet-cables-plugged-in-network-switch-2881224/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Secure_copy_protocol"&gt;https://en.wikipedia.org/wiki/Secure_copy_protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol"&gt;https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://superuser.com/questions/134901/whats-the-difference-between-scp-and-sftp"&gt;https://superuser.com/questions/134901/whats-the-difference-between-scp-and-sftp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server"&gt;https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ssh</category>
      <category>linux</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Prompteer - AI Prompts &amp; Engaging comments</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Thu, 20 Jul 2023 00:13:02 +0000</pubDate>
      <link>https://dev.to/mateusabelli/prompteer-ai-prompts-engaging-comments-3h7o</link>
      <guid>https://dev.to/mateusabelli/prompteer-ai-prompts-engaging-comments-3h7o</guid>
      <description>&lt;h2&gt;
  
  
  🧪 What I built
&lt;/h2&gt;

&lt;p&gt;I built a prompt sharing platform where users can share their AI prompts and receive comments&lt;/p&gt;

&lt;h2&gt;
  
  
  🥗  My recipe
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nextjs&lt;/strong&gt;, because a great SaaS needs server side rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;typescript&lt;/strong&gt;, to stay safe from the javascript horrors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;next-auth&lt;/strong&gt;, to make authentication with nextjs nice and easy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;prisma&lt;/strong&gt;, to make databases best friends with frontend devs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;supabase&lt;/strong&gt;, to store all the data consumed by the app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;refine&lt;/strong&gt;, to easily handle and manage the app's CRUD operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;material-ui&lt;/strong&gt;, for a streamlined look and feel&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🏆 Category Submission:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Best Overall Project&lt;/li&gt;
&lt;li&gt;Most Visually Pleasing&lt;/li&gt;
&lt;li&gt;Most Technical Impressive&lt;/li&gt;
&lt;li&gt;Best Project built using Supabase as the main data provider for the refine app.&lt;/li&gt;
&lt;li&gt;Best Project built using Material UI as the main UI framework for the refine app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔗 App Link
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://prompteer.netlify.app/"&gt;https://prompteer.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🖼 Video demonstration
&lt;/h3&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://drive.google.com/file/d/1kDMl_BBfjXtUEfMrl51pdZE1r6nOyuKv/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
          2023-07-18 20-20-08.mkv - Google Drive
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--QRcP2nCr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://ssl.gstatic.com/images/branding/product/1x/drive_2020q4_32dp.png" width="32" height="32"&gt;
        drive.google.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  🖼 Screenshots
&lt;/h3&gt;

&lt;p&gt;Prompt listing page&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgl6v1po1g3jd9zhryitg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgl6v1po1g3jd9zhryitg.png" alt="Image description" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;View prompt page&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l22grydaaef7ye09spi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l22grydaaef7ye09spi.png" alt="Image description" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create prompt&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3s3z26lgaqwr1pgj2ho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi3s3z26lgaqwr1pgj2ho.png" alt="Image description" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 Description
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prompteer&lt;/strong&gt; is a web app that allows you to share your creative AI prompts and receive feedback through comments, you can also comment on other peoples prompts.&lt;/p&gt;

&lt;p&gt;In the Free plan you're allowed to publish prompts containing a title, the prompt itself, choose the AI Model and language written. Upgrading your account the Pro plan unlocks additional fields to write your prompts, such as Parameters and Details.&lt;/p&gt;

&lt;p&gt;The app uses OAuth (GitHub or Discord) to sign in new users, and when it's their first sign in, the app automatically creates a stripe customer based on the email from OAuth. After a successful login, the user is presented with a dashboard-like experience provided by the refine framework. Most of the content are built upon the framework so the development went way faster than starting from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Link to Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mateusabelli/prompteer"&gt;https://github.com/mateusabelli/prompteer&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📜 Permissive License
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💭 Background
&lt;/h2&gt;

&lt;p&gt;I watched a tutorial from Javascript Mastery where it showed how to make a similar web app so I wanted to do it on my own, when I started doing the design in Figma I saw the Hackathon and decided to hop try to make this a fully fledged SaaS. Looking back at it, it kind of holds up to my expectations, even though I had to cut a few features due to time constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  📚 How I built it
&lt;/h3&gt;

&lt;p&gt;refine was great to provide the dashboard-like experience, and I learned a lot of things, I documented most of my progress in my previous post. The tech stack that I used can be seen at the top. Most of my choices didn't had planned reasons, some of them were to just "work" when something else didn't.&lt;/p&gt;

</description>
      <category>refinehackathon</category>
      <category>ai</category>
      <category>prompts</category>
      <category>refine</category>
    </item>
    <item>
      <title>Development Updates #RefineHackathon</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Mon, 03 Jul 2023 00:10:38 +0000</pubDate>
      <link>https://dev.to/mateusabelli/development-updates-refinehackathon-5ale</link>
      <guid>https://dev.to/mateusabelli/development-updates-refinehackathon-5ale</guid>
      <description>&lt;h2&gt;
  
  
  👋 Hello there
&lt;/h2&gt;

&lt;p&gt;I'm Mateus and this is my development progress during the &lt;strong&gt;Refine + DEV Hackathon&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post is going to be huge due the reference links and images. For the first time I'm going to try to give you (the reader) a close feeling to my progress and research. Hope you enjoy.&lt;/p&gt;

&lt;p&gt;I'm going to try to keep these updated day by day but during busy weeks it won't be possible, if that happens I'll provide a summary with a date range during the events.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ The project
&lt;/h2&gt;

&lt;p&gt;Here is an overview of what I'm building and know so far.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The app will be called &lt;strong&gt;Prompteer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It will be a platform where you can share you creative AI prompts&lt;/li&gt;
&lt;li&gt;The app will be a fully fledged SaaS, with free and paid subscriptions&lt;/li&gt;
&lt;li&gt;The UI/UX will be the best among other prompt platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🥗  My recipe
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nextjs&lt;/strong&gt;, because a great SaaS needs server side rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;typescript&lt;/strong&gt;, to say safe from the javascript horrors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;next-auth&lt;/strong&gt;, to make authentication with nextjs nice and easy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;prisma&lt;/strong&gt;, to make databases best friends with frontend devs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;supabase&lt;/strong&gt;, to store all the data consumed by the app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;refine&lt;/strong&gt;, to easily handle and manage the app's CRUD operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;material-ui&lt;/strong&gt;, for a streamlined look and feel&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 June 23rd to 25th
&lt;/h3&gt;

&lt;p&gt;Initial design and general app ideas, brainstorming and design study phase. Using multiple references, I came up with a basic black and white and full of &lt;em&gt;Lorem Ipsums&lt;/em&gt; figma file.&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%2Fk8umudjmk9ngpehb3wtv.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%2Fk8umudjmk9ngpehb3wtv.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/23Y01_aVdzM" rel="noopener noreferrer"&gt;https://youtu.be/23Y01_aVdzM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.landingfolio.com/" rel="noopener noreferrer"&gt;https://www.landingfolio.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.figma.com/community/file/1153320445661469840/Sales-Dashboard-Design" rel="noopener noreferrer"&gt;https://www.figma.com/community/file/1153320445661469840/Sales-Dashboard-Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uigarage.net/dashboard-on-macos-by-make-com/" rel="noopener noreferrer"&gt;https://uigarage.net/dashboard-on-macos-by-make-com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/HZuk6Wkx_Eg" rel="noopener noreferrer"&gt;https://youtu.be/HZuk6Wkx_Eg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 June 26th to 30th
&lt;/h3&gt;

&lt;p&gt;Studying the refine framework and how to work with it, had a rollercoaster of emotions in this phase, frustration and excitement went side by side.&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%2Fhs3cbxmjz9q0pzby6slp.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%2Fhs3cbxmjz9q0pzby6slp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/" rel="noopener noreferrer"&gt;https://refine.dev/docs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/tutorial/introduction/index/" rel="noopener noreferrer"&gt;https://refine.dev/docs/tutorial/introduction/index/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/k4lHXIzCEkM" rel="noopener noreferrer"&gt;https://youtu.be/k4lHXIzCEkM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/eDcxcTSQJaA" rel="noopener noreferrer"&gt;https://youtu.be/eDcxcTSQJaA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/0MvxHT5a6aY" rel="noopener noreferrer"&gt;https://youtu.be/0MvxHT5a6aY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refine.dev/?playground=true" rel="noopener noreferrer"&gt;https://refine.dev/?playground=true&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 July 1st
&lt;/h3&gt;

&lt;p&gt;I managed to do a proper auth setup using next-auth and Supabase. People can now sign in using GitHub or Discord and their data will be stored on the database. I chose OAuth because by default I’m going to get a name and profile picture in most cases, this is good to populate my UI.&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%2Fdf2hmxqxy4dh800gf2um.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%2Fdf2hmxqxy4dh800gf2um.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://supabase.com/docs/guides/api" rel="noopener noreferrer"&gt;https://supabase.com/docs/guides/api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://supabase.com/docs/guides/auth/managing-user-data" rel="noopener noreferrer"&gt;https://supabase.com/docs/guides/auth/managing-user-data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase-community/create-t3-turbo/tree/main" rel="noopener noreferrer"&gt;https://github.com/supabase-community/create-t3-turbo/tree/main&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://authjs.dev/reference/adapter/prisma" rel="noopener noreferrer"&gt;https://authjs.dev/reference/adapter/prisma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/packages/documentation/routers/nextjs/#basic-usage" rel="noopener noreferrer"&gt;https://refine.dev/docs/packages/documentation/routers/nextjs/#basic-usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/tutorial/understanding-authprovider/create-authprovider/#getidentity" rel="noopener noreferrer"&gt;https://refine.dev/docs/tutorial/understanding-authprovider/create-authprovider/#getidentity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/examples/next-js/NextAuth-js/" rel="noopener noreferrer"&gt;https://refine.dev/docs/examples/next-js/NextAuth-js/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 July 2nd
&lt;/h3&gt;

&lt;p&gt;I integrated Stripe with my previous auth setup and database. People can now sign in to their accounts and go to the pricing page, pick a plan and go to the checkout page, pay and be redirected back to the app. Everything is in sync! I would not be able to do this whole process if it wasn’t for a wonderful DEV post linked down 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fam20moqj0aqcd3r19xat.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%2Fam20moqj0aqcd3r19xat.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 References: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ajones_codes/how-to-add-user-accounts-and-paid-subscriptions-to-your-nextjs-website-585e"&gt;https://dev.to/ajones_codes/how-to-add-user-accounts-and-paid-subscriptions-to-your-nextjs-website-585e&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stripe.com/docs/payments/checkout" rel="noopener noreferrer"&gt;https://stripe.com/docs/payments/checkout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pipedream.com/apps/stripe/actions/retrieve-price" rel="noopener noreferrer"&gt;https://pipedream.com/apps/stripe/actions/retrieve-price&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stripe.com/docs/products-prices/pricing-models#flat-rate" rel="noopener noreferrer"&gt;https://stripe.com/docs/products-prices/pricing-models#flat-rate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/65384818/error-when-migrating-models-to-database-prisma" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/65384818/error-when-migrating-models-to-database-prisma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel.com/guides/getting-started-with-nextjs-typescript-stripe" rel="noopener noreferrer"&gt;https://vercel.com/guides/getting-started-with-nextjs-typescript-stripe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://egghead.io/lessons/next-js-use-stripe-js-to-query-product-data-and-pre-render-with-next-js" rel="noopener noreferrer"&gt;https://egghead.io/lessons/next-js-use-stripe-js-to-query-product-data-and-pre-render-with-next-js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/prisma/prisma/issues/6219" rel="noopener noreferrer"&gt;https://github.com/prisma/prisma/issues/6219&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/pages/building-your-application/routing/api-routes" rel="noopener noreferrer"&gt;https://nextjs.org/docs/pages/building-your-application/routing/api-routes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 July 3rd to 10th
&lt;/h3&gt;

&lt;p&gt;I created the prompts table on the database and other supporting tables such as languages, because you will be able to write cool prompts in different languages, along side the languages table, a comments table and an ai models table were also created. A lot of relationships were built. Some redesign were made to the UI, now it looks cleaner and more intuitive. I also accepted that I won't be able to finish this project to its fully desired result and that's okay.&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%2Ffd6vko76j55zzg7g3ab6.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%2Ffd6vko76j55zzg7g3ab6.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 References: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Supabase/comments/10y8zvk/setting_the_default_value_for_an_id_column/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/Supabase/comments/10y8zvk/setting_the_default_value_for_an_id_column/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/supabase-community/create-t3-turbo/blob/main/packages/db/prisma/schema.prisma" rel="noopener noreferrer"&gt;https://github.com/supabase-community/create-t3-turbo/blob/main/packages/db/prisma/schema.prisma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/67551593/supabase-client-permission-denied-for-schema-public" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/67551593/supabase-client-permission-denied-for-schema-public&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.prisma.io/docs/concepts/components/prisma-schema/relationshttps://en.wikipedia.org/wiki/List_of_ISO_639-1_codes" rel="noopener noreferrer"&gt;https://www.prisma.io/docs/concepts/components/prisma-schema/relationshttps://en.wikipedia.org/wiki/List_of_ISO_639-1_codes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.prisma.io/docs/concepts/components/prisma-schema/names-in-underlying-database" rel="noopener noreferrer"&gt;https://www.prisma.io/docs/concepts/components/prisma-schema/names-in-underlying-database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mui.com/material-ui/" rel="noopener noreferrer"&gt;https://mui.com/material-ui/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/25972904/truncate-text-to-fit-in-3-lines-and-show-three-dots-in-end-in-html" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/25972904/truncate-text-to-fit-in-3-lines-and-show-three-dots-in-end-in-html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nextjs.org/docs/app/building-your-application/optimizing/fonts#google-fonts" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/building-your-application/optimizing/fonts#google-fonts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 July 11th to 15th
&lt;/h3&gt;

&lt;p&gt;In this phase I’m focusing on the major features such as creation and deletion of prompts, comments, the subscription of paid plans and the overall UX. At this point I’m not worried about optimizing my code, it’s a mess but a functional mess, and hopefully my spaghetti code provides a good experience for anyone who tries to use the app.  I’m still fighting with the entire stack but I do have some fun at random moments. I thought it would never happen to me but I suffered with the horrors of dates in javascript.&lt;/p&gt;

&lt;p&gt;Here is a summary of what is possible to do in the app at this point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View a nice home, pricing and about page&lt;/li&gt;
&lt;li&gt;Sign in with OAuth&lt;/li&gt;
&lt;li&gt;Purchase a paid subscription&lt;/li&gt;
&lt;li&gt;Publish and delete prompts&lt;/li&gt;
&lt;li&gt;Write and delete comments on prompts&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%2Fx29nwxfe0cchbpyivle5.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%2Fx29nwxfe0cchbpyivle5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/api-reference/core/hooks/data/useOne/#basic-usage" rel="noopener noreferrer"&gt;https://refine.dev/docs/api-reference/core/hooks/data/useOne/#basic-usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/61815605/material-ui-grid-system-limit-2-items-per-row" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/61815605/material-ui-grid-system-limit-2-items-per-row&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://day.js.org/docs/en/installation/typescript" rel="noopener noreferrer"&gt;https://day.js.org/docs/en/installation/typescript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://day.js.org/docs/en/display/from-now" rel="noopener noreferrer"&gt;https://day.js.org/docs/en/display/from-now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mui.com/material-ui/react-text-field/" rel="noopener noreferrer"&gt;https://mui.com/material-ui/react-text-field/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/api-reference/core/hooks/data/useMany/#basic-usage" rel="noopener noreferrer"&gt;https://refine.dev/docs/api-reference/core/hooks/data/useMany/#basic-usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.crocoder.dev/blog/react-input-component-clear-value-after-input/" rel="noopener noreferrer"&gt;https://www.crocoder.dev/blog/react-input-component-clear-value-after-input/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/55677600/typescript-how-to-pass-object-is-possibly-null-error" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/55677600/typescript-how-to-pass-object-is-possibly-null-error&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bobbyhadz.com/blog/react-ref-returns-undefined-or-null" rel="noopener noreferrer"&gt;https://bobbyhadz.com/blog/react-ref-returns-undefined-or-null&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/59647940/how-can-i-use-ref-in-textfield" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/59647940/how-can-i-use-ref-in-textfield&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://day.js.org/docs/en/plugin/timezone" rel="noopener noreferrer"&gt;https://day.js.org/docs/en/plugin/timezone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://date-fns.org/v2.30.0/docs/formatDistanceToNow" rel="noopener noreferrer"&gt;https://date-fns.org/v2.30.0/docs/formatDistanceToNow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 July 16th
&lt;/h3&gt;

&lt;p&gt;I’m wrapping up the development for the final release, I had to eliminate a few features due to the time constraint but the whole app is working as expected, except for the search bar and some filters.&lt;/p&gt;

&lt;p&gt;Today I pushed through some final touches on the front pages, stripped a few visual features away from the dashboard and polished some interactions, such as the paid subscription. I also created a seed script for the DB, now it’s easier to populate the app with some data.&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%2Flu3j9c9y0zb0jptji092.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%2Flu3j9c9y0zb0jptji092.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 References:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stripe.com/docs/api/checkout/sessions/object#checkout_session_object-line_items-data-price" rel="noopener noreferrer"&gt;https://stripe.com/docs/api/checkout/sessions/object#checkout_session_object-line_items-data-price&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/65165662/how-can-i-get-price-id-associated-with-a-charge-in-stripe" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/65165662/how-can-i-get-price-id-associated-with-a-charge-in-stripe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/refinedev/refine/blob/next/examples/blog-refine-supabase-auth/src/pages/Login.tsx" rel="noopener noreferrer"&gt;https://github.com/refinedev/refine/blob/next/examples/blog-refine-supabase-auth/src/pages/Login.tsx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://next-auth.js.org/providers/credentials#example---username--password" rel="noopener noreferrer"&gt;https://next-auth.js.org/providers/credentials#example---username--password&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://refine.dev/docs/examples/next-js/NextAuth-js/" rel="noopener noreferrer"&gt;https://refine.dev/docs/examples/next-js/NextAuth-js/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.prisma.io/docs/guides/migrate/seed-database" rel="noopener noreferrer"&gt;https://www.prisma.io/docs/guides/migrate/seed-database&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.prisma.io/docs/concepts/components/prisma-client/crud#create" rel="noopener noreferrer"&gt;https://www.prisma.io/docs/concepts/components/prisma-client/crud#create&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📅 July 17th to 18th
&lt;/h3&gt;

&lt;p&gt;This is my last update, I've frozen the code updates and limited the changes only for small refactoring and some cleanup.&lt;/p&gt;

</description>
      <category>refinehackathon</category>
    </item>
    <item>
      <title>Introducing Pull Request Tracker - A GitHub Action</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Wed, 17 May 2023 21:54:48 +0000</pubDate>
      <link>https://dev.to/mateusabelli/introducing-pull-request-tracker-a-github-action-3ijh</link>
      <guid>https://dev.to/mateusabelli/introducing-pull-request-tracker-a-github-action-3ijh</guid>
      <description>&lt;h2&gt;
  
  
  🧪 What I built
&lt;/h2&gt;

&lt;p&gt;A GitHub Action that will help maintainers keep track of new Pull Requests by giving them detailed information if someone might be trying to push similar or duplicate changes.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🏆 Category Submission:
&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;Maintainers Must-Have&lt;/b&gt;: Make the lives of Open Source maintainers easier.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 App Link
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/marketplace/actions/pull-request-tracker"&gt;https://github.com/marketplace/actions/pull-request-tracker&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🖼 Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frs4s2pxgxwfloei2n1rl.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frs4s2pxgxwfloei2n1rl.PNG" alt="Image description" width="637" height="363"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  💬 Description
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Pull Request Tracker&lt;/code&gt; is a GitHub Action to easily track similar or duplicated PRs. It runs automatically whenever someone opens a new PR and scans all open PRs for different patterns. The output is a detailed comment with useful information including diff links in case of detected conflicts.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Link to Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mateusabelli/pr-tracker"&gt;https://github.com/mateusabelli/pr-tracker&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📜 Permissive License
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Pull Request Tracker&lt;/code&gt; is free and open-source software licensed under the &lt;strong&gt;MIT&lt;/strong&gt; License.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍💻 Background
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;What made you decide to build this particular app? What inspired you?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My initial idea was to create a tool that could identify if someone is opening a PR that makes the same or similar changes of other contributors with open PRs. To achieve this, I planned three major modules, one for checking pulls, checking conflicts and one for checking hunks.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙ How I built it
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;How did you utilize GitHub Actions or GitHub Codespaces? Did you learn something new along the way? Pick up a new skill?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I created this project as a &lt;a href="https://docs.github.com/en/actions/creating-actions/creating-a-composite-action"&gt;composite&lt;/a&gt; action, at the beginning I wanted to try making a JavaScript action but I've always felt like the features were easily executed from the command line or using the GitHub CLI &lt;code&gt;gh&lt;/code&gt;. So that's when decided to go with a composite action running a few shell scripts.&lt;/p&gt;

&lt;p&gt;I didn't know how to use shell before, but it felt like a very simple and flexible scripting language, everything that I attempted to do with it, kind of worked, specially integrating the usage of CLI tools, using grep and even some JS code with node.&lt;/p&gt;

&lt;p&gt;I learned about GitHub Actions, Shell scripting, a basic usage of GraphQL, the awesome GitHub API, the powerful GitHub CLI &lt;code&gt;gh&lt;/code&gt;, and I also wrote my best README so far.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔎 Additional Resources/Info
&lt;/h3&gt;

&lt;p&gt;These videos helped understand GitHub Actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=kKbIEPsLj88"&gt;https://www.youtube.com/watch?v=kKbIEPsLj88&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-hVG9z0fCac"&gt;https://www.youtube.com/watch?v=-hVG9z0fCac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;td&gt;Thanks for reading. Have a nice day!&lt;/td&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>githubhack23</category>
      <category>github</category>
      <category>opensource</category>
      <category>shell</category>
    </item>
    <item>
      <title>Make images responsive to light/dark mode on GitHub</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Wed, 17 May 2023 18:26:06 +0000</pubDate>
      <link>https://dev.to/mateusabelli/make-images-responsive-to-lightdark-mode-on-github-3gbg</link>
      <guid>https://dev.to/mateusabelli/make-images-responsive-to-lightdark-mode-on-github-3gbg</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello there, today I'd like to share with you something that I've been using lately on my READMEs to have my images responsive the light or dark modes. It's a very simple feature on GitHub but not many people know about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstration
&lt;/h2&gt;

&lt;p&gt;Here is the result on my new open source project &lt;a href="https://github.com/mateusabelli/pr-tracker"&gt;pr-tracker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvo2cvgmn26968nyu8igo.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvo2cvgmn26968nyu8igo.PNG" alt="light-preview" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgu76e53oobt8f693vqek.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgu76e53oobt8f693vqek.PNG" alt="dark-preview" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;p&gt;To use this feature, you are going to need to have two images or URL pointing at your light and dark image versions. In my example I had the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.github/
├── demo-dark.png
├── demo-light.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;with Markdown&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you prefer to add your images with &lt;code&gt;Markdown&lt;/code&gt; all you need to do is to append &lt;code&gt;#gh-dark-mode-only&lt;/code&gt; or &lt;code&gt;#gh-light-mode-only&lt;/code&gt; at the end of the URL. Like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Demo-Light&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;.github/demo-dark.png#gh-dark-mode-only&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Demo-Dark&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;.github/demo-light.png#gh-light-mode-only&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;with HTML&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or you can use the &lt;code&gt;&amp;lt;picture /&amp;gt;&lt;/code&gt; tag with the new &lt;code&gt;media&lt;/code&gt; feature, specifying the value &lt;code&gt;(prefers-color-scheme: dark)&lt;/code&gt; or &lt;code&gt;(prefers-color-scheme: light)&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;".github/demo-dark.png"&lt;/span&gt;
    &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(prefers-color-scheme: dark)"&lt;/span&gt;
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt;
    &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;".github/demo-light.png"&lt;/span&gt;
    &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(prefers-color-scheme: light), (prefers-color-scheme: no-preference)"&lt;/span&gt;
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;".github/demo-light.png"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;I didn't figured this on my own, the first time I learned about this feature was through the &lt;a href="https://github.com/anuraghazra/github-readme-stats"&gt;github-readme-stats&lt;/a&gt; project, under the &lt;a href="https://github.com/anuraghazra/github-readme-stats#responsive-card-theme"&gt;responsive-card-theme&lt;/a&gt; section, it showed examples that I've used in my profile README and I've been also using on repositories as well.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The cover image used belongs to the first link below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Useful links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2021-11-24-specify-theme-context-for-images-in-markdown/"&gt;https://github.blog/changelog/2021-11-24-specify-theme-context-for-images-in-markdown/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2022-05-19-specify-theme-context-for-images-in-markdown-beta/"&gt;https://github.blog/changelog/2022-05-19-specify-theme-context-for-images-in-markdown-beta/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Questions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Have you ever seen this feature before?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have you ever used this before?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you have plans to apply this feature somewhere?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;td&gt;Thanks for reading. Have a nice day!&lt;/td&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>github</category>
      <category>markdown</category>
      <category>html</category>
      <category>readme</category>
    </item>
    <item>
      <title>My Progress #GitHubHack23</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Fri, 28 Apr 2023 01:39:16 +0000</pubDate>
      <link>https://dev.to/mateusabelli/my-progress-githubhack23-4p1d</link>
      <guid>https://dev.to/mateusabelli/my-progress-githubhack23-4p1d</guid>
      <description>&lt;h3&gt;
  
  
  26/04 - First idea
&lt;/h3&gt;

&lt;p&gt;I received an email from &lt;strong&gt;DEV&lt;/strong&gt; in the morning and was happy to read about a new Hackathon that had just begun. My initial thoughts went wild, so many possibilities and ideas but only one was left.&lt;/p&gt;

&lt;p&gt;A GitHub Action called &lt;code&gt;diffcool&lt;/code&gt; and the tag line would be something like &lt;em&gt;“Because diff should be cool not difficult”.&lt;/em&gt; I loved this project! but when the time to think of a more practical concept for production came, I hit a wall. My cool project, the way I imagined it suddenly didn’t quite fit on the category that I wanted to participate in.&lt;/p&gt;

&lt;p&gt;It was a though hour to circle around new ideas, even ChatGPT wasn’t being helpful. I needed something unique. After researching previous Hackathons, other GH Actions and refining my thoughts using my previous failure. I came up with a new idea, this is going to fit and it’s going to awesome.&lt;/p&gt;

&lt;h3&gt;
  
  
  27/04 - Initial steps with GraphQL
&lt;/h3&gt;

&lt;p&gt;I thought that going through pages and pages of documentation would be a pain, but GitHub provides such an awesome tool called &lt;a href="https://docs.github.com/en/graphql/overview/explorer"&gt;&lt;strong&gt;Explorer&lt;/strong&gt;&lt;/a&gt;, from this I managed to quickly learn how to query and assemble pieces of information needed for my project.&lt;/p&gt;

&lt;p&gt;I managed to get my first feature from drawings and imagination to a more practical concept through a few GraphQL queries, it doesn’t work yet but those queries being integrated together could really turn my feature into reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  28/04 - My first Action
&lt;/h3&gt;

&lt;p&gt;I completed the practical concept for most of the features, on some of them I resorted to use the good an old &lt;code&gt;git&lt;/code&gt; command, I hope it’s not too tricky to combine API calls with “local” commands during the Action workflow run.&lt;/p&gt;

&lt;p&gt;After planning for a while (not done yet) it was time to get to know how it was to build the actual GitHub Action. I’ve found &lt;strong&gt;&lt;a href="https://youtu.be/kKbIEPsLj88"&gt;this&lt;/a&gt;&lt;/strong&gt; awesome video by &lt;strong&gt;&lt;a href="https://www.youtube.com/@tug-grall"&gt;Tug on Dev!&lt;/a&gt;&lt;/strong&gt; that really simplified the entire process of creating the action and testing it, the development felt surprisingly simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  01/05 - Interesting turn of events
&lt;/h3&gt;

&lt;p&gt;After looking for more learning resources I’ve found another great &lt;strong&gt;&lt;a href="https://youtu.be/-hVG9z0fCac"&gt;video&lt;/a&gt;&lt;/strong&gt; by &lt;strong&gt;&lt;a href="https://www.youtube.com/@glich.stream"&gt;glitch.stream&lt;/a&gt;&lt;/strong&gt; on YouTube, this time it was full course on Actions with CI/CD pipelines but I had to skip some of this stuff to focus more on how the runners worked, and also to avoid falling again into tutorial hell.&lt;/p&gt;

&lt;p&gt;I finally started the actual development of my own Action and since I’ve exposed to so many different ways to build and consume then, I ended up with bash. It’s not what I’ve been planning to use, but it seems very flexible to use, it’s so flexible that I’ve managed to integrate the gh CLI for GraphQL queries and also run a bit of JavaScript with node inside a single Bash script file.&lt;/p&gt;

&lt;h3&gt;
  
  
  04/05 - It works
&lt;/h3&gt;

&lt;p&gt;From a bit more than a week ago to today I can finally say “It works”. There’s nothing polished yet but with lots of trial and error the core functionality is there.&lt;/p&gt;

&lt;p&gt;I’m building a &lt;strong&gt;&lt;a href="https://github.com/mateusabelli/pr-tracker"&gt;Pull Request Tracker&lt;/a&gt;&lt;/strong&gt;, with 3 planned features, the main one is for checking if there are other PR with the same files, the second one is for checking if there are conflicts in between them and the last one is for checking if there are duplicated hunks among those files.&lt;/p&gt;

&lt;p&gt;This is a markdown mock of the contents of the comment that this Action is going to produce&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Checks&lt;/th&gt;
&lt;th&gt;PR Tracker Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;☑️&lt;/td&gt;
&lt;td&gt;3 pull request(s) found with the same file(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;0 conflict(s) detected among them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;0 similar hunk(s) spotted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  07/05 - Features development
&lt;/h3&gt;

&lt;p&gt;From my previous report I was left with the &lt;strong&gt;check pulls&lt;/strong&gt; feature done, yesterday I implemented the &lt;strong&gt;check conflicts&lt;/strong&gt; and today it was the &lt;strong&gt;check hunks&lt;/strong&gt;. I definitely moved way faster than when I was pushing the first feature, because this time there is a base do build on top of.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;check conflicts&lt;/strong&gt; feature basically clones the repo then uses the &lt;code&gt;gh&lt;/code&gt; cli command to checkout into the PRs and does a "dry run" of the git merge command to check if there are conflicts in between those branches.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;check hunks&lt;/strong&gt; is giving a bit more of trouble because it needs to reference the files and from the files their diffs to extract the hunks and compare them. It's giving false positives at the moment so I had to temporarily disable it.&lt;/p&gt;

&lt;p&gt;This is a screenshot the current state of the project: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F330m6lzn77wp1nwosvxm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F330m6lzn77wp1nwosvxm.png" alt="Image description" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  17/05 - v0.0.1-alpha
&lt;/h3&gt;

&lt;p&gt;I did it, yesterday I published the very first version of this project to the GitHub Actions marketplace. It was a long road but this project has finally gone live to the world.&lt;/p&gt;

&lt;p&gt;The development so far has not changed a lot from my previous report, I did make some refactoring specially on the comment module, now it's responsible for actually composing the comments with data exported from the other shell modules, instead of receiving a pre-baked comment.&lt;/p&gt;

&lt;p&gt;I've just posted the official release post for the Hackathon and I'll be doing a few more tests and updating the code. I hope this project attracts people and be helpful for them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mateusabelli/pr-tracker"&gt;https://github.com/mateusabelli/pr-tracker&lt;/a&gt;&lt;/p&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;td&gt;Thanks for reading. Have a nice day!&lt;/td&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>githubhack23</category>
    </item>
    <item>
      <title>OmeDEV - Talk to Developers! MongoDB Atlas Hackathon 2022 on DEV</title>
      <dc:creator>Mateus Abelli</dc:creator>
      <pubDate>Wed, 07 Dec 2022 02:51:07 +0000</pubDate>
      <link>https://dev.to/mateusabelli/omedev-talk-to-developers-mongodb-atlas-hackathon-2022-on-dev-3n9k</link>
      <guid>https://dev.to/mateusabelli/omedev-talk-to-developers-mongodb-atlas-hackathon-2022-on-dev-3n9k</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;OmeDEV is an Omegle clone that lets you connect "randomly" with stranger developers to have a nice chat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission: Choose Your Own Adventure
&lt;/h3&gt;

&lt;h3&gt;
  
  
  App Link
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://omedev.vercel.app/" rel="noopener noreferrer"&gt;https://omedev.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo
&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%2Fjuvrekoqqgxs8jkyd0ch.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%2Fjuvrekoqqgxs8jkyd0ch.gif" alt="Demo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;Dark theme&lt;br&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%2Fj3li7m7zkek03e8lklzg.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%2Fj3li7m7zkek03e8lklzg.png" alt="Dark theme" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Light theme&lt;br&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%2Fflxvy2d88bb6x7hvkc7t.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%2Fflxvy2d88bb6x7hvkc7t.png" alt="Light theme" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;When you connect with someone, the chats attempts to be anonymous by searching for the first room available, if it does not exist one will be created for you. The next user will automagically be joined in a FIFO style (First in, First out). To prevent predictions on who will be joining theres a random delay applied to each user. Your messages are sent and received through websocket and only the rooms ids are stored in database for no longer than one day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/mateusabelli/omedev" rel="noopener noreferrer"&gt;https://github.com/mateusabelli/omedev&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;MIT&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I wanted the build something beyond my current skills, to imagine something and code it into reality, this project has proven me that it is possible and taught me valuable lessons. I choose to do an Omegle clone because it is my first chat application.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I built it
&lt;/h3&gt;

&lt;p&gt;The chat rooms are stored in MongoDB Atlas. It stores the ID for the Pusher presence channel which allows the app to receive events whenever someone joins or leaves the channel.&lt;/p&gt;

&lt;p&gt;I've learned a ton but the biggest lesson was to always try to organize the ideas and plan out before coding. This application was built while I was learning about how everything would work, so there was little to no planning in the project.&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>community</category>
    </item>
  </channel>
</rss>
