<?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: Thew</title>
    <description>The latest articles on DEV Community by Thew (@thewdhanat).</description>
    <link>https://dev.to/thewdhanat</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%2F361059%2F80b9e311-c069-46df-aab9-5d72a6303139.png</url>
      <title>DEV Community: Thew</title>
      <link>https://dev.to/thewdhanat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thewdhanat"/>
    <language>en</language>
    <item>
      <title>Thew Hacktoberfest 2023 Pledge</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Thu, 05 Oct 2023 13:19:23 +0000</pubDate>
      <link>https://dev.to/thewdhanat/thew-hacktoberfest-2023-pledge-4f2j</link>
      <guid>https://dev.to/thewdhanat/thew-hacktoberfest-2023-pledge-4f2j</guid>
      <description>&lt;h3&gt;
  
  
  Intro
&lt;/h3&gt;

&lt;p&gt;I'm Thew. You can learn more about me on &lt;a href="https://www.thewdhanat.com/"&gt;my website&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;Medical student · Software · Aviation · Machine learning&lt;/p&gt;

&lt;h3&gt;
  
  
  Pledge
&lt;/h3&gt;

&lt;p&gt;My goal is to update my open source personal website along with contribute to other interesting projects.&lt;/p&gt;

</description>
      <category>hacktoberfest23</category>
    </item>
    <item>
      <title>Deploy your own short URL to Vercel Edge Middleware</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Thu, 13 Apr 2023 17:35:26 +0000</pubDate>
      <link>https://dev.to/thewdhanat/deploy-your-own-short-url-to-vercel-edge-middleware-2a1e</link>
      <guid>https://dev.to/thewdhanat/deploy-your-own-short-url-to-vercel-edge-middleware-2a1e</guid>
      <description>&lt;p&gt;A year ago, I created a vercel shorturl project that used Vercel serverless.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/thewdhanat" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F361059%2F80b9e311-c069-46df-aab9-5d72a6303139.png" alt="thewdhanat"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/thewdhanat/deploy-your-own-short-url-to-vercel-40j4" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Deploy your own short URL to Vercel&lt;/h2&gt;
      &lt;h3&gt;Thew ・ Dec 1 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#news&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#vercel&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;This year, I updated it to use &lt;a href="https://vercel.com/docs/concepts/functions/edge-middleware" rel="noopener noreferrer"&gt;Vercel Edge Middleware&lt;/a&gt;! Deploying the redirect function globally to the edge will result in a reduction of latency.&lt;/p&gt;

&lt;p&gt;To get started, just clone the &lt;a href="https://github.com/ThewApp/vercel-shorturl-starter" rel="noopener noreferrer"&gt;template repository&lt;/a&gt;, edit &lt;code&gt;redirects.yml&lt;/code&gt; and deploy to Vercel. You &lt;strong&gt;don't&lt;/strong&gt; need to edit middleware.js, install dependencies, or run &lt;code&gt;build&lt;/code&gt; command.🎉&lt;/p&gt;

&lt;p&gt;Or click the below button to deploy to Vercel immediately!😊&lt;br&gt;
&lt;a href="https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2FThewApp%2Fvercel-shorturl-starter&amp;amp;demo-title=vercel-shorturl&amp;amp;demo-description=Create%20your%20own%20shorturl%20on%20Vercel&amp;amp;demo-url=https%3A%2F%2Fvercel-shorturl-starter.vercel.app%2F" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fvercel.com%2Fbutton" alt="Deploy with Vercel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the record, the version of the underlying &lt;a href="https://github.com/ThewApp/vercel-shorturl" rel="noopener noreferrer"&gt;vercel-shorturl&lt;/a&gt; library is &lt;code&gt;v0.3.x&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;The main features remain the same. Here is an example &lt;code&gt;redirects.yml&lt;/code&gt; showing all of the features.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/me&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/ThewBear&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;308&lt;/span&gt; &lt;span class="c1"&gt;# Change status code ex. 301, 302, 307 (Default), 308&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/google/:q&lt;/span&gt; &lt;span class="c1"&gt;# Match exactly one ex. /google/recursion&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://google.com/search?q=:q&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/vercel/:slug*&lt;/span&gt; &lt;span class="c1"&gt;# Match zero or more ex. /vercel /vercel/docs /vercel/solutions/nextjs&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://vercel.com/:slug&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/twitter/:slug?&lt;/span&gt; &lt;span class="c1"&gt;# Match Zero or one ex. /twitter /twitter/thewdhanat&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://twitter.com/:slug&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/github/:slug+&lt;/span&gt; &lt;span class="c1"&gt;# One or more ex. /github/ThewApp github/ThewApp/vercel-shorturl&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/:slug&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/dev/:slug1/:slug2&lt;/span&gt; &lt;span class="c1"&gt;# Multiple match ex. /dev/p/information&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://dev.to/:slug1/:slug2&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/google&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://google.com/search?q=:q&lt;/span&gt;
  &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;search&lt;/span&gt; &lt;span class="c1"&gt;# Must have this exact query&lt;/span&gt;
    &lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;:q&lt;/span&gt; &lt;span class="c1"&gt;# And this match in query ex. /google?action=search&amp;amp;q=recursion&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/dev&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://dev.to/:user&lt;/span&gt;
  &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;u&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;:user?&lt;/span&gt; &lt;span class="c1"&gt;# Optional match ex. /dev /dev?u=thewbear&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom page
&lt;/h3&gt;

&lt;p&gt;You can override home page and 404 page by placing &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;404.html&lt;/code&gt; in project root.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;vercel-shorturl can automatically send an event to &lt;a href="https://amplitude.com/" rel="noopener noreferrer"&gt;Amplitude&lt;/a&gt;, just set &lt;code&gt;Amplitude&lt;/code&gt; &lt;a href="https://vercel.com/docs/environment-variables" rel="noopener noreferrer"&gt;environment variable&lt;/a&gt; to your HTTP API key.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; is deployed with the example &lt;a href="https://github.com/ThewApp/vercel-shorturl/blob/Main/assets/redirects.example.yml" rel="noopener noreferrer"&gt;redirects.yml&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is some route you can try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/me" rel="noopener noreferrer"&gt;/me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/google/path-parameters" rel="noopener noreferrer"&gt;/google/path-parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/google?action=search&amp;amp;q=some-query" rel="noopener noreferrer"&gt;/google?action=search&amp;amp;q=some-query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/dev?u=thewdhanat" rel="noopener noreferrer"&gt;/dev?u=thewdhanat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See more supported routing features in the example &lt;a href="https://github.com/ThewApp/vercel-shorturl/blob/Main/assets/redirects.example.yml" rel="noopener noreferrer"&gt;redirects.yml&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration guides
&lt;/h2&gt;

&lt;p&gt;For &lt;code&gt;v0.1.x&lt;/code&gt; user, just clone the latest &lt;a href="https://github.com/ThewApp/vercel-shorturl-starter" rel="noopener noreferrer"&gt;template repository&lt;/a&gt;, and paste your old &lt;code&gt;redirects.yml&lt;/code&gt;. It should just work.🎊&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/thew" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-blue.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>serverless</category>
      <category>vercel</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Cloud Storage for Backup</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Mon, 02 Aug 2021 16:12:13 +0000</pubDate>
      <link>https://dev.to/thewdhanat/cloud-storage-for-backup-24ed</link>
      <guid>https://dev.to/thewdhanat/cloud-storage-for-backup-24ed</guid>
      <description>&lt;p&gt;In recent years, many people have stored their valuable data in the cloud. One reason that people adopt cloud solution is their generous free plan on personal accounts. The big player in this space is Google Drive. They offer 15 GB of storage for free. Moreover, students get unlimited storage from their school accounts. Google education and business solutions used to have unlimited storage plans. For business, Google Workspace (previously G Suite) &lt;a href="https://9to5google.com/2020/10/08/google-workspace-drive-storage-limits/"&gt;discontinued its unlimited storage in October 2020&lt;/a&gt;. For education, there will be a &lt;a href="https://www.blog.google/outreach-initiatives/education/google-workspace-for-education"&gt;100 TB per organization limit in July 2022&lt;/a&gt;. This change results in a few GBs per user in large universities. People who store their entire data on education account must find a new solution. Although Microsoft OneDrive still provides 1 TB+ storage per user, there is no guarantee that they will not withdraw in the future. The truth is free unlimited data storage is &lt;a href="https://twitter.com/dflieb/status/1326586070264279041"&gt;not a viable business&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Despite the data we own are growing every day, &lt;a href="https://www.theverge.com/2018/8/31/17796884/cloud-storage-service-google-drive-apple-icloud-microsoft-onedrive-dropbox-box-amazon"&gt;cloud storage providers&lt;/a&gt; still offer the same amount of free storage as a decade ago. Previously free unlimited high-quality photo storage by Google has been &lt;a href="https://blog.google/products/photos/storage-changes/"&gt;terminated on 1 June 2021&lt;/a&gt;. Moreover, Google Docs, Sheets, Slides, Drawings, Forms, and Jamboard files will be &lt;a href="https://www.androidpolice.com/2021/04/05/google-is-delaying-when-docs-and-sheets-files-will-start-counting-against-account-storage/"&gt;counted toward your storage usage&lt;/a&gt; starting on 1 February 2022. Hence, the trick to convert your file to Google Docs to get free storage will break soon. Therefore, in the future, more users must pay for their data warehouse.&lt;/p&gt;

&lt;p&gt;Recently, I searched for a system to store my backup data for good. Although consumer clouds like Google Drive, Microsoft OneDrive, Dropbox offer a paid plan, they are suitable for storing short-term and frequently accessed data. They also have a download quota limit which the file may be locked if there are multiple downloads in 24 hours. But for permanent backup, I prefer a more geeky solution like object storage because I can use &lt;a href="https://aws.amazon.com/s3/storage-launches-infographic/"&gt;the brilliant S3 API&lt;/a&gt; to manage, access, and share my data through custom scripting and tools like &lt;a href="https://rclone.org/"&gt;Rclone&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here I compare the following S3-compatible object storage providers. Only the links in the referrals section are affiliated. 🤗&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS S3, Google Cloud, Azure&lt;/li&gt;
&lt;li&gt;DigitalOcean and Linode&lt;/li&gt;
&lt;li&gt;Backblaze B2 and Wasabi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When considering their pricing, you must look at data storage and inbound/outbound data transfer pricing. Almost every provider has free inbound data transfer to encourage data moving in but not out 😉.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS S3, Google Cloud, Azure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g86KJLjz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8rq8mva552s15vjnl8b3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g86KJLjz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8rq8mva552s15vjnl8b3.png" alt="AWS S3, Google Cloud, Azure website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They are the top 3 largest public cloud providers that offer similar object storage plans and have many storage tiers which suit different purposes. Their archival class for long-term data backup have different naming. You can read more information by clicking the link in the table.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Minimum storage duration&lt;/th&gt;
&lt;th&gt;Retrieval period&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS S3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier"&gt;Glacier&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;90 days&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects-retrieval-options.html"&gt;5 minutes&lt;br&gt;5/12 hours&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS S3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html#sc-glacier"&gt;Glacier Deep Archive&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;180 days&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects-retrieval-options.html"&gt;12/48 hours&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;&lt;a href="https://cloud.google.com/storage/docs/storage-classes#coldline"&gt;Coldline&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;90 days&lt;/td&gt;
&lt;td&gt;milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;&lt;a href="https://cloud.google.com/storage/docs/storage-classes#archive"&gt;Archive&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;365 days&lt;/td&gt;
&lt;td&gt;milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers#cool-access-tier"&gt;Cool&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;td&gt;milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers#archive-access-tier"&gt;Archive&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;180 days&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-rehydration"&gt;1/15 hours&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table below compares pricing for each provider and class. Besides data storage and outbound transfer, they also charge for API operations and data retrieval. Check details on their official website: &lt;a href="https://aws.amazon.com/s3/pricing/"&gt;AWS S3&lt;/a&gt;, &lt;a href="https://cloud.google.com/storage/pricing"&gt;Google Cloud&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/pricing/details/storage/blobs/"&gt;Azure&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Outbound transfer&lt;/th&gt;
&lt;th&gt;Data retrieval&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S3 Glacier&lt;/td&gt;
&lt;td&gt;$4.00/TB&lt;/td&gt;
&lt;td&gt;$90.00/TB&lt;/td&gt;
&lt;td&gt;$2.50/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S3 Glacier Deep Archive&lt;/td&gt;
&lt;td&gt;$0.99/TB&lt;/td&gt;
&lt;td&gt;$90.00/TB&lt;/td&gt;
&lt;td&gt;$2.50/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud Coldline&lt;/td&gt;
&lt;td&gt;$4.00/TB&lt;/td&gt;
&lt;td&gt;$120.00/TB&lt;/td&gt;
&lt;td&gt;$20.00/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud Archive&lt;/td&gt;
&lt;td&gt;$1.20/TB&lt;/td&gt;
&lt;td&gt;$120.00/TB&lt;/td&gt;
&lt;td&gt;$50.00/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Cool&lt;/td&gt;
&lt;td&gt;$15.00/TB&lt;/td&gt;
&lt;td&gt;$87.50/TB&lt;/td&gt;
&lt;td&gt;$10.00/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Archive&lt;/td&gt;
&lt;td&gt;$0.99/TB&lt;/td&gt;
&lt;td&gt;$87.50/TB&lt;/td&gt;
&lt;td&gt;$20.00/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For convenience, you can use their pricing calculator: &lt;a href="https://calculator.aws/"&gt;AWS S3&lt;/a&gt;, &lt;a href="https://cloud.google.com/products/calculator"&gt;Google Cloud&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/pricing/calculator/"&gt;Azure&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;AWS S3 Glacier Deep Archive is the lowest cost storage at the moment considering data storage cost alone. The main concern about these providers is 💢 expensive 💢 outbound transfer (egress) when you want to get back your data. Below are more resources about this topic. Although most of them criticize AWS, these apply to all three providers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.cloudflare.com/aws-egregious-egress/"&gt;AWS’s Egregious Egress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=22626097"&gt;NASA to launch 247 petabytes of data into AWS, but forgot about egress costs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=21314412"&gt;AWS Customers Rack Up Hefty Bills for Moving Data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://simon-80033.medium.com/how-cheap-can-cloud-storage-be-8262c67b48c1"&gt;How cheap can cloud object storage be?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=20791563"&gt;How does CloudFlare themselves afford to give bandwidth for free?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.backblaze.com/blog/transparency-in-cloud-storage-costs/"&gt;Transparency in Cloud Storage Costs: Still Elusive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.backblaze.com/blog/backblaze-b2-drops-download-price-in-half/"&gt;Backblaze Cuts B2 Download Price in Half&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another attractive public cloud provider is &lt;a href="https://www.oracle.com/cloud/storage/pricing.html"&gt;Oracle&lt;/a&gt;. Unlike other providers, Oracle gives free 10 TB outbound transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  DigitalOcean and Linode
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QNOvM3bY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n5c9zk7zsec3rfoy96j4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QNOvM3bY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n5c9zk7zsec3rfoy96j4.png" alt="DigitalOcean and Linode website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Smaller cloud providers like &lt;a href="https://www.digitalocean.com/products/spaces/"&gt;DigitalOcean&lt;/a&gt;, &lt;a href="https://www.linode.com/products/object-storage/"&gt;Linode&lt;/a&gt;, &lt;a href="https://www.vultr.com/products/object-storage/"&gt;Vultr&lt;/a&gt;, and &lt;a href="https://upcloud.com/products/object-storage/"&gt;UpCloud&lt;/a&gt; provide single class S3-compatible object storage. Their billing is more simple and does not charge for API operations. Their prices are very similar.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Minimum price&lt;/th&gt;
&lt;th&gt;Data Storage&lt;/th&gt;
&lt;th&gt;Outbound transfer&lt;/th&gt;
&lt;th&gt;Additional storage&lt;/th&gt;
&lt;th&gt;Additional outbound transfer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;250 GB&lt;/td&gt;
&lt;td&gt;1 TB&lt;/td&gt;
&lt;td&gt;$20/TB&lt;/td&gt;
&lt;td&gt;$10/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linode&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;250 GB&lt;/td&gt;
&lt;td&gt;1 TB&lt;/td&gt;
&lt;td&gt;$20/TB&lt;/td&gt;
&lt;td&gt;$10/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;250 GB&lt;/td&gt;
&lt;td&gt;1 TB&lt;/td&gt;
&lt;td&gt;$20/TB&lt;/td&gt;
&lt;td&gt;$10/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UpCloud&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;td&gt;250 GB&lt;/td&gt;
&lt;td&gt;0.5 GB&lt;/td&gt;
&lt;td&gt;$20/TB&lt;/td&gt;
&lt;td&gt;$10/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Unlike the pay-as-you-go scheme from the top three providers, they have a minimum charge bundled with initial data storage and outbound transfer quota. Although their single storage class is cheaper than the standard class from top providers, it is more expensive than the above archival classes. Hence, these smaller cloud providers are not suitable for long-term storage.&lt;/p&gt;

&lt;p&gt;Another notable provider is Scaleway. Scaleway has &lt;a href="https://www.scaleway.com/en/c14-cold-storage/"&gt;C14 Cold Storage&lt;/a&gt; advertised as "World’s first alternative S3 Glacier". C14 Cold Storage stores data in an underground bunker in Paris only. However, the storage is accessible from both Paris and Amsterdam regions. It comes with 75 GB free storage and 75 GB free outbound transfer with an additional of €0.002/GB for storage and €0.01/GB for outbound transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backblaze B2 and Wasabi
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sUl5MYFX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gf9hp4re452ti5pqb8ey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sUl5MYFX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gf9hp4re452ti5pqb8ey.png" alt="Backblaze B2 and Wasabi website"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unlike the above providers, which mainly sell computing, &lt;a href="https://www.backblaze.com/b2/cloud-storage.html"&gt;Backblaze B2&lt;/a&gt; and &lt;a href="https://wasabi.com/"&gt;Wasabi&lt;/a&gt; offer only a cloud storage solution. Their overall pricing is reasonable for ageless backup storage and impressively cheaper than those top providers. They do not have a retrieval fee and a delayed retrieval period. Although Wasabi is relatively new, it is recommended by &lt;a href="https://uit.stanford.edu/storage/wasabi-cloud-storage"&gt;Stanford University IT&lt;/a&gt;. You can read more information by clicking the link in the table.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Backblaze B2&lt;/th&gt;
&lt;th&gt;Wasabi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minimum price&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;a href="https://wasabi.com/paygo-pricing-faq/#minimum-storage-charge"&gt;$5.99&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data storage&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.backblaze.com/b2/cloud-storage-pricing.html"&gt;$0.005/GB&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://wasabi.com/cloud-storage-pricing/"&gt;$0.0059/GB&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound transfer&lt;/td&gt;
&lt;td&gt;$0.01/GB&lt;/td&gt;
&lt;td&gt;&lt;a href="https://wasabi.com/paygo-pricing-faq/#free-egress-policy"&gt;Free with conditions&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimum storage duration&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;a href="https://wasabi.com/paygo-pricing-faq/#minimum-storage-duration"&gt;90 days&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API operations&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.backblaze.com/b2/b2-transactions-price.html"&gt;Limited free&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Backblaze B2 has only US and EU zone, while Wasabi has many regions in the US and Asia. Backblaze B2 users have to select storage location when creating an account and cannot change, whereas Wasabi users can create a bucket in any region.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Big cloud&lt;/th&gt;
&lt;th&gt;Smaller cloud&lt;/th&gt;
&lt;th&gt;Backblaze B2&lt;/th&gt;
&lt;th&gt;Wasabi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage class&lt;/td&gt;
&lt;td&gt;Many archival classes&lt;/td&gt;
&lt;td&gt;Single class&lt;/td&gt;
&lt;td&gt;Single class&lt;/td&gt;
&lt;td&gt;Single class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data storage&lt;/td&gt;
&lt;td&gt;Less than $5/TB&lt;/td&gt;
&lt;td&gt;$20/TB&lt;/td&gt;
&lt;td&gt;$5/TB&lt;/td&gt;
&lt;td&gt;$5.99/TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound transfer&lt;/td&gt;
&lt;td&gt;More than $80/TB 💢&lt;/td&gt;
&lt;td&gt;$10/TB&lt;/td&gt;
&lt;td&gt;$10/TB&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimum storage duration&lt;/td&gt;
&lt;td&gt;Yes ✔&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;90 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data retrieval cost&lt;/td&gt;
&lt;td&gt;Yes ✔&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API operations cost&lt;/td&gt;
&lt;td&gt;Yes ✔&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;td&gt;Yes ✔&lt;/td&gt;
&lt;td&gt;No ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Backblaze B2 and Wasabi offer a fantastic solution for data hoarders like me. I recommend you to evaluate their pricing strategy and performance yourself. From my experience, Wasabi gives better performance when connecting from the Asia Pacific to the US region.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.qualeed.com/en/qbackup/cloud-storage-comparison/"&gt;Object Storage Price Comparison by qBackup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coralnodes.com/amazon-s3-alternatives/"&gt;10 Best Amazon S3 Alternatives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.coralnodes.com/wasabi-storage-review/"&gt;Wasabi review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/DataHoarder/"&gt;DataHoarder reddit community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Referrals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://m.do.co/c/61b92fc0f519"&gt;DigitalOcean&lt;/a&gt; $100, 60-day credit&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linode.com/?r=4c3a05eecf7237278fe445912471f8e51019bee5"&gt;Linode&lt;/a&gt; $100, 60-day credit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/thew"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y61HrVIM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>cloud</category>
      <category>s3</category>
      <category>backup</category>
    </item>
    <item>
      <title>Actions Runner on DigitalOcean App Platform</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Thu, 07 Jan 2021 00:01:45 +0000</pubDate>
      <link>https://dev.to/thewdhanat/actions-runner-on-digitalocean-app-platform-30l4</link>
      <guid>https://dev.to/thewdhanat/actions-runner-on-digitalocean-app-platform-30l4</guid>
      <description>&lt;p&gt;This is the third and final article of the series &lt;a href="https://dev.to/thewdhanat/series/10547"&gt;Trying DigitalOcean App Platform&lt;/a&gt; which is part of &lt;a href="https://dev.to/devteam/announcing-the-digitalocean-app-platform-hackathon-on-dev-2i1k"&gt;DigitalOcean App Platform Hackathon&lt;/a&gt;. This is also my official submission for the hackathon.&lt;/p&gt;

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

&lt;p&gt;GitHub Actions self-hosted runner docker on DigitalOcean App Platform worker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.digitalocean.com/apps/new?repo=https://github.com/ThewBear/do-actions-runner/tree/main&amp;amp;refcode=61b92fc0f519"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CNMgVEM---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://mp-assets1.sfo2.digitaloceanspaces.com/deploy-to-do/do-btn-blue.svg" alt="Deploy to DO" width="252" height="40"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Currently, we &lt;strong&gt;cannot&lt;/strong&gt; deploy a new app that only has the worker. So you need to create a new app with a service then delete that service and create a worker.&lt;/p&gt;

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

&lt;p&gt;Random Roulette&lt;/p&gt;

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

&lt;p&gt;GitHub settings&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tuTfUtSu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v24f3j6d311cj5gw5nru.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tuTfUtSu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/v24f3j6d311cj5gw5nru.png" alt="Actions self-hosted settings" width="880" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DigitalOcean dashboard&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gv7yZjni--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/unzewo6pk3td9yd9zqnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gv7yZjni--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/unzewo6pk3td9yd9zqnh.png" alt="DigitalOcean App Platform dashboard" width="880" height="667"&gt;&lt;/a&gt; &lt;/p&gt;

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

&lt;p&gt;This is a &lt;a href="https://docs.github.com/en/free-pro-team@latest/actions/hosting-your-own-runners/about-self-hosted-runners"&gt;self hosted&lt;/a&gt; GitHub Actions runner for deploying to &lt;a href="https://www.digitalocean.com/products/app-platform/"&gt;DigitalOcean App Platform&lt;/a&gt;. You will get the simplicity of automated cluster deployment and &lt;a href="https://www.digitalocean.com/docs/app-platform/concepts/scaling/"&gt;scaling&lt;/a&gt; by DigitalOcean App Platform.&lt;/p&gt;

&lt;p&gt;It will register and remove itself automatically when DigitalOcean App Platform start and stop &lt;a href="https://www.digitalocean.com/docs/app-platform/concepts/container/"&gt;the container&lt;/a&gt;. You can &lt;a href="https://www.digitalocean.com/docs/app-platform/how-to/scale-app/"&gt;vertical scale or horizontal scale&lt;/a&gt; your runner. If you do a horizontal scale (Pro plan only), all runners will be automatically registered to GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1u9tAGUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3egdqnfi67zztcjmnhzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1u9tAGUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3egdqnfi67zztcjmnhzd.png" alt="Horizontally scaled runners are registered automatically" width="880" height="298"&gt;&lt;/a&gt; &lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ThewBear"&gt;
        ThewBear
      &lt;/a&gt; / &lt;a href="https://github.com/ThewBear/do-actions-runner"&gt;
        do-actions-runner
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Self-hosted actions runner on DigitalOcean App Platform
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


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

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

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

&lt;p&gt;I built this app to trying out DigitalOcean App Platform worker and GitHub Actions self-hosted at the same time.&lt;/p&gt;

&lt;p&gt;The DigitalOcean App Platform worker is a running server-side code that is not internet-accessible. Because workers can not accept HTTP requests, they are only suitable for doing background tasks, such as queue processing.&lt;/p&gt;

&lt;p&gt;The GitHub Actions self-hosted runners offer more control of software tools than GitHub-hosted runners provide. With self-hosted runners, you can choose to increase processing power or memory, install custom software, and choose an operating system not offered by GitHub-hosted runners. In our case, this is done by modifying &lt;code&gt;Dockerfile&lt;/code&gt; and scaling the component.&lt;/p&gt;

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

&lt;p&gt;I built it by looking through existing resources about self-hosted actions runner docker. Here are some of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/2020-08-04-github-actions-self-hosted-runners-on-google-cloud/"&gt;GitHub Actions self-hosted runners on Google Cloud
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sanderknape.com/2020/03/self-hosted-github-actions-runner-kubernetes/"&gt;Running self-hosted GitHub Actions runners in your Kubernetes cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testdriven.io/blog/github-actions-docker/"&gt;Deploying Self-Hosted Github Actions Runners with Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/myoung34/docker-github-actions-runner"&gt;myoung34/docker-github-actions-runner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/samber/github-actions-runner"&gt;samber/github-actions-runner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/actions/virtual-environments"&gt;actions/virtual-environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I create a &lt;code&gt;Dockerfile&lt;/code&gt; and &lt;code&gt;entrypoint.sh&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/thew"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y61HrVIM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy Me A Coffee" width="545" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dohackathon</category>
      <category>actionshackathon</category>
      <category>devops</category>
      <category>github</category>
    </item>
    <item>
      <title>n8n on DigitalOcean App Platform</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Tue, 05 Jan 2021 10:20:29 +0000</pubDate>
      <link>https://dev.to/thewdhanat/n8n-on-digitalocean-app-platform-3lb6</link>
      <guid>https://dev.to/thewdhanat/n8n-on-digitalocean-app-platform-3lb6</guid>
      <description>&lt;p&gt;This is the second article of the series Trying DigitalOcean App Platform which is part of &lt;a href="https://dev.to/devteam/announcing-the-digitalocean-app-platform-hackathon-on-dev-2i1k"&gt;DigitalOcean App Platform Hackathon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, I'm trying to deploy &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;n8n.io&lt;/a&gt; to DigitalOcean App Platform. &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/ThewBear" rel="noopener noreferrer"&gt;
        ThewBear
      &lt;/a&gt; / &lt;a href="https://github.com/ThewBear/do-n8n" rel="noopener noreferrer"&gt;
        do-n8n
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;However after it is successfully deployed, the web ui could not connect to backend. It is showing "Connection lost" on the upper right corner.&lt;br&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%2Fi%2F0v093mi6ziu19evjd9c7.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%2Fi%2F0v093mi6ziu19evjd9c7.png" alt="Connection lost"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I open Devtool and don't see any console error. Then I look at network tab and see that the request to &lt;code&gt;/rest/push&lt;/code&gt; is &lt;strong&gt;pending&lt;/strong&gt;. This is the only one request that n8n is trying to reach the backend. The request is not a plain http request instead it is using an &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/EventSource" rel="noopener noreferrer"&gt;EventSource API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It seems that DigitalOcean App Platform does not support the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/EventSource" rel="noopener noreferrer"&gt;EventSource API&lt;/a&gt;. I found an issue about how to configure &lt;a href="https://github.com/n8n-io/n8n/issues/36" rel="noopener noreferrer"&gt;a reverse proxy like Nginx&lt;/a&gt;. However, the Platform-as-a-Service like DigitalOcean App Platform and &lt;a href="https://community.n8n.io/t/cloud-run-deployment/155/4" rel="noopener noreferrer"&gt;Cloud Run&lt;/a&gt; seems to not support it.&lt;/p&gt;

&lt;p&gt;Unfortunately, we cannot deploy n8n workflow automation tool on DigitalOcean App Platform. DigitalOcean App Platform works great to provide simplicity for developer using a framework supported.&lt;/p&gt;

</description>
      <category>dohackathon</category>
      <category>n8n</category>
      <category>automation</category>
    </item>
    <item>
      <title>Strapi QuickStart on DigitalOcean App Platform</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Mon, 04 Jan 2021 15:32:38 +0000</pubDate>
      <link>https://dev.to/thewdhanat/strapi-quickstart-on-digitalocean-app-platform-502j</link>
      <guid>https://dev.to/thewdhanat/strapi-quickstart-on-digitalocean-app-platform-502j</guid>
      <description>&lt;p&gt;This is the first article of the series &lt;strong&gt;Trying DigitalOcean App Platform&lt;/strong&gt; which is part of &lt;a href="https://dev.to/devteam/announcing-the-digitalocean-app-platform-hackathon-on-dev-2i1k"&gt;DigitalOcean App Platform Hackathon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this post, I will deploy a Strapi quickstart to DigitalOcean App Platform.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Update 2022&lt;/em&gt;: This post was created with Strapi version 3, the latest Strapi version is 4. There is an official video on &lt;strong&gt;Deploying Strapi V4 to DigitalOcean&lt;/strong&gt; on &lt;a href="https://youtu.be/tnGqqUzzh6U" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setup strapi
&lt;/h2&gt;

&lt;p&gt;Create a strapi project in to &lt;code&gt;my-project&lt;/code&gt; directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-strapi-app my-project &lt;span class="nt"&gt;--quickstart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The quickstart project will use a local sqlite as a database. The default sqlite database file is at &lt;code&gt;./.tmp/data.db&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After the project has been created, the browser will be opened with admin setup page automatically. The admin user and content you create at this step will be available only on your computer since it is stored in local sqlite.&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%2Fi%2F9ty22jkifb4cccs576tf.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%2Fi%2F9ty22jkifb4cccs576tf.png" alt="Admin setup page"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Production database config
&lt;/h2&gt;

&lt;p&gt;To tell Strapi to use DigitalOcean database when we deploy it, create the following &lt;code&gt;./config/env/production/database.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;defaultConnection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;connections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;connector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bookshelf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_HOST&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="s2"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_PORT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_NAME&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="s2"&gt;strapi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_USERNAME&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="s2"&gt;strapi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_PASSWORD&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="s2"&gt;strapi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;ca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DATABASE_CA&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="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Develop Strapi
&lt;/h2&gt;

&lt;p&gt;Develop Strapi as usual. If you are new to Strapi, you can try &lt;a href="https://strapi.io/documentation/developer-docs/latest/getting-started/quick-start.html" rel="noopener noreferrer"&gt;Quick Start Guide&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Push code to GitHub repository
&lt;/h2&gt;

&lt;p&gt;For example, here is &lt;a href="https://github.com/ThewBear/do-strapi" rel="noopener noreferrer"&gt;my repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch DigitalOcean App
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://cloud.digitalocean.com/apps/new" rel="noopener noreferrer"&gt;DigitalOcean App Platform Console&lt;/a&gt; and choose the repository. &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%2Fi%2Fvbs4xv36cy24lwe3cmkn.png" alt="Choose the repository"&gt;
&lt;/li&gt;
&lt;li&gt;Choose the region that is close to your user &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%2Fi%2Fu8bhqu5fz4n17r9x5ykh.png" alt="Choose region"&gt;
&lt;/li&gt;
&lt;li&gt;Set the following environment variables and change HTTP port to &lt;code&gt;1337&lt;/code&gt;. Notice the &lt;code&gt;db&lt;/code&gt; prefix in environment variables.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NODE_ENV&lt;/code&gt; = &lt;code&gt;production&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATABASE_HOST&lt;/code&gt; = &lt;code&gt;${db.HOSTNAME}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATABASE_PORT&lt;/code&gt; = &lt;code&gt;${db.PORT}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATABASE_NAME&lt;/code&gt; = &lt;code&gt;${db.DATABASE}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATABASE_USERNAME&lt;/code&gt; = &lt;code&gt;${db.USERNAME}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATABASE_PASSWORD&lt;/code&gt; = &lt;code&gt;${db.PASSWORD}&lt;/code&gt; (Encrypt)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DATABASE_CA&lt;/code&gt; = &lt;code&gt;${db.CA_CERT}&lt;/code&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%2Fi%2F70klm0rwqezmbtx5esdr.png" alt="Set enivronment variables and HTTP port"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add database, set its name to &lt;code&gt;db&lt;/code&gt;. The name must be the same as the prefix you used in environment variables.&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%2Fi%2Ft9ofq7u5qkwp75r9hjja.png" alt="Add database"&gt;
&lt;/li&gt;
&lt;li&gt;Choose your plan and container size. The lowest cost plan is $12 (Basic $5/mo). Then launch your Strapi App! 🎉 &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%2Fi%2Fhefnrdtfjsq7gppo0tqr.png" alt="Choose pricing plan"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Congratulations! 🎊
&lt;/h2&gt;

&lt;p&gt;The Strapi application is being deployed and will be ready in around 10 minutes. You can visit &lt;code&gt;https://&amp;lt;your-url&amp;gt;/admin&lt;/code&gt; to setup &lt;strong&gt;production&lt;/strong&gt; admin account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/thew" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-blue.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dohackathon</category>
      <category>strapi</category>
    </item>
    <item>
      <title>State Of CSS 2020 is out! DEV is the first runner-up blog.</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Sat, 05 Dec 2020 03:55:26 +0000</pubDate>
      <link>https://dev.to/thewdhanat/state-of-css-2020-is-out-dev-is-the-first-runner-up-blog-14fe</link>
      <guid>https://dev.to/thewdhanat/state-of-css-2020-is-out-dev-is-the-first-runner-up-blog-14fe</guid>
      <description>&lt;p&gt;State Of CSS 2020 results have come out.&lt;/p&gt;

&lt;h3&gt;
  
  
  DEV is the first runner-up &lt;a href="https://2020.stateofcss.com/en-US/resources/#blogs_news_magazines"&gt;blog and magazine&lt;/a&gt; behind CSS-Tricks.
&lt;/h3&gt;

&lt;p&gt;Congratulations to the DEV team and everyone here! 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dn-amooj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fxi71zpdvu09tuy4lvnr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dn-amooj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fxi71zpdvu09tuy4lvnr.png" alt="Blogs &amp;amp; Magazines Chart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Awards
&lt;/h3&gt;

&lt;p&gt;Things that stood out this year.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most Adopted Feature: &lt;strong&gt;CSS Grid&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Most Adopted Technology: &lt;strong&gt;Tailwind CSS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Highest Satisfaction: &lt;strong&gt;PostCSS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Highest Interest: &lt;strong&gt;CSS Modules&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Most Write-Ins: &lt;strong&gt;PhpStorm&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LPGMpM4o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9fr3j6zc7kfphrg7ogw7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LPGMpM4o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9fr3j6zc7kfphrg7ogw7.jpg" alt="2020.stateofcss.com_en-US_resources_(aa)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Full results
&lt;/h3&gt;

&lt;p&gt;You can see the full results on &lt;a href="https://2020.stateofcss.com/"&gt;https://2020.stateofcss.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  State Of JS
&lt;/h3&gt;

&lt;p&gt;Now, it's Javascript turn. Take the survey on &lt;a href="https://stateofjs.com/"&gt;https://stateofjs.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>meta</category>
      <category>css</category>
      <category>news</category>
    </item>
    <item>
      <title>Deploy your own short URL to Vercel</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Tue, 01 Dec 2020 16:50:08 +0000</pubDate>
      <link>https://dev.to/thewdhanat/deploy-your-own-short-url-to-vercel-40j4</link>
      <guid>https://dev.to/thewdhanat/deploy-your-own-short-url-to-vercel-40j4</guid>
      <description>&lt;p&gt;A few months ago, I posted how I setup GitHub Actions to deploy a short URL application to Vercel.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/thewdhanat" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F361059%2F80b9e311-c069-46df-aab9-5d72a6303139.png" alt="thewdhanat"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/thewdhanat/create-your-personal-shorturl-with-vercel-github-actions-4idm" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Create your personal shorturl with Vercel + GitHub Actions&lt;/h2&gt;
      &lt;h3&gt;Thew ・ Sep 17 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#actionshackathon&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#vercel&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devops&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;However it requires some complex setup such as token and project secrets management.&lt;/p&gt;

&lt;p&gt;Now, I would like to introduce a new version of &lt;strong&gt;vercel-shorturl&lt;/strong&gt;. In this version, you just clone the &lt;a href="https://github.com/ThewApp/vercel-shorturl-starter" rel="noopener noreferrer"&gt;template repository&lt;/a&gt;, edit &lt;code&gt;redirects.yml&lt;/code&gt; and deploy to Vercel.🎉&lt;/p&gt;

&lt;p&gt;Or click the below button to deploy to Vercel immediately!😊&lt;br&gt;
&lt;a href="https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2FThewApp%2Fvercel-shorturl-starter&amp;amp;demo-title=vercel-shorturl&amp;amp;demo-description=Create%20your%20own%20shorturl%20on%20Vercel&amp;amp;demo-url=https%3A%2F%2Fvercel-shorturl-starter.vercel.app%2F" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fvercel.com%2Fbutton" alt="Deploy with Vercel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this new version, you can edit your configuration through GitHub web interface and let Vercel GitHub Integration deploy it immediately.❤&lt;/p&gt;

&lt;p&gt;Currently, it is still a beta version and I would like to hear your feedback!🤗 You can reach me on &lt;a href="https://twitter.com/ThewDhanat" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; is deployed with the example &lt;a href="https://github.com/ThewApp/vercel-shorturl/blob/Main/assets/redirects.example.yml" rel="noopener noreferrer"&gt;redirects.yml&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is some route you can try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/me" rel="noopener noreferrer"&gt;/me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/google/path-parameters" rel="noopener noreferrer"&gt;/google/path-parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/google?action=search&amp;amp;q=some-query" rel="noopener noreferrer"&gt;/google?action=search&amp;amp;q=some-query&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app/dev?u=thewdhanat" rel="noopener noreferrer"&gt;/dev?u=thewdhanat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See more supported routing features in the example &lt;a href="https://github.com/ThewApp/vercel-shorturl/blob/Main/assets/redirects.example.yml" rel="noopener noreferrer"&gt;redirects.yml&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Custom page
&lt;/h3&gt;

&lt;p&gt;You can override home page and 404 page by placing &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;404.html&lt;/code&gt; in project root.&lt;/p&gt;
&lt;h3&gt;
  
  
  Analytics
&lt;/h3&gt;

&lt;p&gt;vercel-shorturl can automatically send an event to &lt;a href="https://amplitude.com/" rel="noopener noreferrer"&gt;Amplitude&lt;/a&gt;, just set &lt;code&gt;Amplitude&lt;/code&gt; &lt;a href="https://vercel.com/docs/environment-variables" rel="noopener noreferrer"&gt;environment variable&lt;/a&gt; to your HTTP API key.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Vercel?
&lt;/h2&gt;

&lt;p&gt;Because it's easy and free!✨&lt;/p&gt;
&lt;h2&gt;
  
  
  Why short URL?
&lt;/h2&gt;

&lt;p&gt;Because it's easy to share and remember. You can set it to your own domain to improve your brand.&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/ThewApp" rel="noopener noreferrer"&gt;
        ThewApp
      &lt;/a&gt; / &lt;a href="https://github.com/ThewApp/vercel-shorturl" rel="noopener noreferrer"&gt;
        vercel-shorturl
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Create your own shorturl on Vercel
    &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;vercel-shorturl&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Create your own shorturl on Vercel Edge Middleware.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://vercel-shorturl-starter.vercel.app" rel="nofollow noopener noreferrer"&gt;Demo&lt;/a&gt; is deployed with the example &lt;a href="https://github.com/ThewApp/vercel-shorturlassets/redirects.example.yml" rel="noopener noreferrer"&gt;redirects.yml&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Use &lt;a href="https://github.com/ThewApp/vercel-shorturl-starter" rel="noopener noreferrer"&gt;the template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;See the example &lt;a href="https://github.com/ThewApp/vercel-shorturlassets/redirects.example.yml" rel="noopener noreferrer"&gt;redirects.yml&lt;/a&gt; for available features.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Custom page&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;You can override home page and 404 page by placing &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;404.html&lt;/code&gt; in project root.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Analytics&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;vercel-shorturl can automatically send an event to &lt;a href="https://amplitude.com/" rel="nofollow noopener noreferrer"&gt;Amplitude&lt;/a&gt;, just set &lt;code&gt;Amplitude&lt;/code&gt; &lt;a href="https://vercel.com/docs/environment-variables" rel="nofollow noopener noreferrer"&gt;environment variable&lt;/a&gt; to your &lt;a href="https://github.com/ThewApp/vercel-shorturl" rel="noopener noreferrer"&gt;HTTP API&lt;/a&gt; key.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ThewApp/vercel-shorturl" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/thew" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-blue.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>news</category>
      <category>vercel</category>
    </item>
    <item>
      <title>Completed Hacktoberfest</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Sun, 18 Oct 2020 16:24:58 +0000</pubDate>
      <link>https://dev.to/thewdhanat/completed-hacktoberfest-2d8g</link>
      <guid>https://dev.to/thewdhanat/completed-hacktoberfest-2d8g</guid>
      <description>&lt;p&gt;I have officially completed Hacktoberfest 🎉 since my 4 PRs have passed the 14-day review period. While this year Hacktoberfest has not ended yet but it has a lot of stories.&lt;/p&gt;

&lt;p&gt;On the first day, we have&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/thewdhanat" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CvQVbRVq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--6q-NVdFZ--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/361059/80b9e311-c069-46df-aab9-5d72a6303139.png" alt="thewdhanat"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/thewdhanat/digitalocean-s-hacktoberfest-is-hurting-open-source-2g99" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;DigitalOcean's Hacktoberfest is Hurting Open Source&lt;/h2&gt;
      &lt;h3&gt;Thew ・ Oct 1 '20 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#hacktoberfest&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Then DigitalOcean and Dev team come with &lt;a href="https://hacktoberfest.digitalocean.com/hacktoberfest-update"&gt;the updated rules&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/devteam" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CTihtlIw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--nJ87SGF6--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/organization/profile_image/1/0213bbaa-d5a1-4d25-9e7a-10c30b455af0.png" alt="The DEV Team" width="150" height="150"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e5-xFsTb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--F06-1fU6--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/264/40d89fb9-4de0-414d-8a06-f52ddda0bc75.jpg" alt="" width="150" height="150"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/devteam/an-update-on-hacktoberfest-37a" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;An Update on Hacktoberfest ️&lt;/h2&gt;
      &lt;h3&gt;Jess Lee for The DEV Team ・ Oct 1 '20 ・ 2 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#hacktoberfest&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#meta&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I learned that being an open source contributor is hard but being a project maintainers requires much more efforts.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://dev.to/digitalocean"&gt;DigitalOcean&lt;/a&gt; and &lt;a href="https://dev.to/devteam"&gt;DevTeam&lt;/a&gt; for sponsoring and creating &lt;a href="https://dev.to/devteam/hacktoberfest-etiquette-for-contributors-ec6"&gt;resources&lt;/a&gt; for this amazing event.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>Have you migrated to Yarn 2?</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Mon, 12 Oct 2020 11:52:28 +0000</pubDate>
      <link>https://dev.to/thewdhanat/have-you-migrated-to-yarn-2-4ma7</link>
      <guid>https://dev.to/thewdhanat/have-you-migrated-to-yarn-2-4ma7</guid>
      <description>&lt;p&gt;Yarn 2 has been released for 10 months now.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/arcanis" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OM5BZl8f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--6X5KDEbk--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/111910/336c999d-e4e1-4590-bf13-8c9a82bbe6bb.jpeg" alt="arcanis"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/arcanis/introducing-yarn-2-4eh1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Introducing Yarn 2 ! 🧶🌟&lt;/h2&gt;
      &lt;h3&gt;Maël Nison ・ Jan 24 '20 ・ 15 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#npm&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Have you migrated or do you still use yarn 1?&lt;/p&gt;

&lt;p&gt;I am still using yarn 1 for some projects or staying with npm. I found that many open-source projects don't have a plan to migrate yet. Also, many libraries don't support Yarn 2 at this moment for example.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>npm</category>
      <category>yarn</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to make Hacktoberfest contributions counted in not opted-in project</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Sun, 04 Oct 2020 09:35:02 +0000</pubDate>
      <link>https://dev.to/thewdhanat/how-to-make-hacktoberfest-contributions-counted-in-not-opted-in-repository-ige</link>
      <guid>https://dev.to/thewdhanat/how-to-make-hacktoberfest-contributions-counted-in-not-opted-in-repository-ige</guid>
      <description>&lt;p&gt;This year, there is a major change in how contributions are counted.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Unlike in previous years, 2020 Hacktoberfest contributions must be made in projects that have specifically chosen to join the celebration.&lt;/p&gt;

&lt;p&gt;Each PR must be made on &lt;a href="https://github.com/topics/hacktoberfest"&gt;Hacktoberfest-classified repos&lt;/a&gt;. Your PRs will either need to be merged, approved, or labeled as &lt;code&gt;hacktoberfest-accepted&lt;/code&gt; in order to add to the total count.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read more about this change on &lt;a href="https://hacktoberfest.digitalocean.com/hacktoberfest-update"&gt;note&lt;/a&gt; from DigitalOcean and &lt;a href="https://dev.to/devteam/happy-hacktoberfest-here-s-how-to-show-up-for-open-source-this-month-4cee"&gt;post&lt;/a&gt; from The DEV Team. ❤️&lt;/p&gt;

&lt;p&gt;This is bad for people who would like to contribute to their favorite projects which haven't opted-in. You may open random PRs to your own repos but this is still spammy.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--UvNza-r2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1285924496675950592/rNx8Pn1o_normal.jpg" alt="Andy Blum profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Andy Blum
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @andy__blum
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Just spent 3 hours working on a high-quality PR for a repo that hasn't opted into &lt;a href="https://twitter.com/hacktoberfest"&gt;@hacktoberfest&lt;/a&gt; &lt;br&gt;&lt;br&gt;Now I'm going to have to submit 4 garbage PRs to my own repos for my t-shirt. Thanks to the spammy MFers that ruined a great annual event.&lt;br&gt;&lt;br&gt;CC &lt;a href="https://twitter.com/shitoberfest"&gt;@shitoberfest&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      04:20 AM - 04 Oct 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1312608446492168193" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1312608446492168193" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1312608446492168193" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;There is a solution better than that.&lt;/p&gt;

&lt;h1&gt;
  
  
  Solution
&lt;/h1&gt;

&lt;p&gt;Note: This is an example pull request. You &lt;strong&gt;must&lt;/strong&gt; make a contribution that is &lt;strong&gt;meaningful and follows &lt;a href="https://dev.to/devteam/hacktoberfest-etiquette-for-contributors-ec6"&gt;PR etiquette&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Update (2020/10/05 15:00 UTC): No longer need the first step.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;del&gt;Tag your &lt;strong&gt;fork&lt;/strong&gt; repository with &lt;code&gt;hacktoberfest&lt;/code&gt;.&lt;/del&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zVOo2XI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tbpxlthlwyiiqu20cg0p.gif" alt="hacktoberfest eligible fork"&gt;
&lt;/li&gt;
&lt;li&gt;Beside create a pull request back to the origin repository, create a pull request to the default branch inside the fork repository.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mL1qqqN1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ysovvo4wojz61kqmg559.gif" alt="create a pull request in fork"&gt;
&lt;/li&gt;
&lt;li&gt;Label that pull request with &lt;code&gt;hacktoberfest-accepted&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that pull request in fork will be counted toward completing the Hacktoberfest challenge! 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gs3SDtjh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3nqnunfe44y4kfvms806.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gs3SDtjh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3nqnunfe44y4kfvms806.PNG" alt="counted pull request"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;For more tips like this one, you can follow me on &lt;a href="https://twitter.com/ThewDhanat"&gt;Twitter&lt;/a&gt; or &lt;a href="https://www.buymeacoffee.com/thew"&gt;buy me a coffee&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>github</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>DigitalOcean's Hacktoberfest is Hurting Open Source</title>
      <dc:creator>Thew</dc:creator>
      <pubDate>Thu, 01 Oct 2020 05:08:23 +0000</pubDate>
      <link>https://dev.to/thewdhanat/digitalocean-s-hacktoberfest-is-hurting-open-source-2g99</link>
      <guid>https://dev.to/thewdhanat/digitalocean-s-hacktoberfest-is-hurting-open-source-2g99</guid>
      <description>&lt;p&gt;There is a rising spam issue with hacktoberfest this year.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1311355857465225218-543" src="https://platform.twitter.com/embed/Tweet.html?id=1311355857465225218"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1311355857465225218-543');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1311355857465225218&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Which later results in the blog post &lt;a href="https://blog.domenic.me/hacktoberfest/" rel="noopener noreferrer"&gt;"DigitalOcean's Hacktoberfest is Hurting Open Source"&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is also a discussion on &lt;a href="https://news.ycombinator.com/item?id=24643894" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Honestly, I enjoyed Hacktoberfest for many years but this problem is really hurting open source community. I hope DigitalOcean will take this seriously. Fortunately, DigitalOcean Community Platform Manager is looking into this.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1311421301291200512-122" src="https://platform.twitter.com/embed/Tweet.html?id=1311421301291200512"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1311421301291200512-122');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1311421301291200512&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  UPDATE:
&lt;/h3&gt;

&lt;p&gt;Here are official responses&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hacktoberfest.digitalocean.com/hacktoberfest-update" rel="noopener noreferrer"&gt;from DigitalOcean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/devteam/an-update-on-hacktoberfest-37a"&gt;from The Dev Team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>github</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
