<?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: Félix Paradis</title>
    <description>The latest articles on DEV Community by Félix Paradis (@feldev).</description>
    <link>https://dev.to/feldev</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%2F223416%2F2f981ac3-55f2-4fd8-9cd0-f6ffd34db0f9.png</url>
      <title>DEV Community: Félix Paradis</title>
      <link>https://dev.to/feldev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/feldev"/>
    <language>en</language>
    <item>
      <title>Randomizing the Alert Sound on a Mac</title>
      <dc:creator>Félix Paradis</dc:creator>
      <pubDate>Fri, 12 Nov 2021 18:54:32 +0000</pubDate>
      <link>https://dev.to/feldev/randomizing-the-alert-sound-on-a-mac-234i</link>
      <guid>https://dev.to/feldev/randomizing-the-alert-sound-on-a-mac-234i</guid>
      <description>&lt;p&gt;Adding custom alert sounds to your mac is easy peasy (see Step 0). But after a while of having a specific snippet from &lt;a href="https://www.youtube.com/watch?v=aY3PqKkOXzg"&gt;this classic piece of Québécois culture&lt;/a&gt;, I got kinda bored with it. What if I could get a different "tabarnak" everyday? Or add a few of Homer Simpsons' famous "D'ho!" in the mix?&lt;/p&gt;

&lt;p&gt;Well, a tiny Python script and a single cron job is all I needed to get not only one custom alert sound, but many custom alert sounds that change automagically.&lt;/p&gt;

&lt;p&gt;If you want to randomize your alert sound without adding custom ones, you can do that too, just use the default sounds shipped with your mac.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 0: adding custom alert sounds to your mac
&lt;/h2&gt;

&lt;p&gt;After you've selected nice and short audio clips, convert them to .aiff and place them in your &lt;code&gt;Sounds&lt;/code&gt; folder. The full path:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/Users/{yourName}/Library/Sounds/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note that you could also modify the folder where the sounds shipped with your mac are stored (&lt;code&gt;/System/Library/Sounds/&lt;/code&gt;) but I tend to not modify the default filesystem if I don't need to.&lt;/p&gt;

&lt;p&gt;Once those files are where they need to be, you can select them right from System Preferences, under "Sound", "Sound Effects".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--My9sONr_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5z77r7nnx55qs70d0ah8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--My9sONr_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5z77r7nnx55qs70d0ah8.png" alt="Screenshot of system preferences with custom sound options." width="670" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: changing the alert sound via the command line
&lt;/h2&gt;

&lt;p&gt;Copy and paste the  line below into your terminal, press enter, and it should set your alert sound to "Sosumi".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defaults write .GlobalPreferences com.apple.sound.beep.sound /System/Library/Sounds/Sosumi.aiff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change "Sosumi" to some other sound in the Sounds folder and it will set that other sound. Change the path to the path to a sound in your custom sounds folder (&lt;code&gt;/Users/{yourName}/Library/Sounds/{yourSound.aiff}&lt;/code&gt;) and it will work too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: choosing and setting a random sound from Python 
&lt;/h2&gt;

&lt;p&gt;I'm very much not a python expert and yet this was super easy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'HERE WE GO'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sounds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/Users/{yourName}/Library/Sounds/*.aiff'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sound&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sounds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'randomly selected sound: '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'defaults write .GlobalPreferences com.apple.sound.beep.sound /Users/{yourName}/Library/Sounds/{}.aiff'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sound&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# You could also define an array of sounds yourself,  
# if you don't want every .aiff file to be a possibility
# sounds=['tabarnak1', 'tabarnak2', 'tabarnak3']
# sound=random.choice(sounds)
# command = 'defaults write .GlobalPreferences com.apple.sound.beep.sound /Users/{yourName}/Library/Sounds/{}.aiff'.format(sound)
&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this does: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;import modules which are all already available in Python&lt;/li&gt;
&lt;li&gt;Get a list of .aiff files in your &lt;code&gt;Sounds&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;Select a random file from the list&lt;/li&gt;
&lt;li&gt;Call the command from Step 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll only need to adapt the paths; just change &lt;code&gt;{yourName}&lt;/code&gt; to your actual name or change the whole path if you're not using the same folder as me. (Also, remove the print() when you're done testing.)&lt;/p&gt;

&lt;p&gt;Voilà! Running this script will set a random alert sound. I called it &lt;code&gt;randomize.py&lt;/code&gt; and stored it right in the &lt;code&gt;/Users/{yourName}/Library/Sounds/&lt;/code&gt; folder. I can call it from anywhere with this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 /Users/{yourName}/Library/Sounds/randomize.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that this could've been done with another scripting language. I was going to use Bash at first, but I find Python much more intuitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Call the Python script automatically
&lt;/h2&gt;

&lt;p&gt;The change needs to happen without manually triggering the Python script.&lt;/p&gt;

&lt;p&gt;The perfect, no-download-necessary tool for this job is cron. (I wrote &lt;a href="https://betterprogramming.pub/the-fun-cron-tutorial-b1c9d255a94c?source=friends_link&amp;amp;sk=e7de5a92cee1d5c4fa7cb2bafafc89c7"&gt;a tutorial about cron&lt;/a&gt;, but you don't need to go through it to understand what we'll do here.)&lt;/p&gt;

&lt;p&gt;In the terminal, enter this command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;env EDITOR=nano crontab -e&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;nano is a command line text editor which is known to be bad, but also very simple when compared to other command line text editors. Simply copy and paste this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MAILTO=""
* * * * * python3 /Users/{yourName}/Library/Sounds/randomize.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again, adapt the path (&lt;code&gt;{yourName}&lt;/code&gt;) and press ctrl + X to exit nano. &lt;br&gt;
It will prompt you to save or not. &lt;br&gt;
Press Y to save and enter to accept the default file location. &lt;/p&gt;

&lt;p&gt;At this point, you're calling the script every minute, which is perfect for testing. &lt;br&gt;
I changed the &lt;code&gt;* * * * *&lt;/code&gt; to &lt;code&gt;59 * * * *&lt;/code&gt; so that the script only runs once per hour. &lt;/p&gt;

&lt;p&gt;The logic of &lt;em&gt;when&lt;/em&gt; a cron job runs is this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* * * * *  command to execute
│ │ │ │ │
│ │ │ │ └─── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
│ │ │ └──────── month (1 - 12)
│ │ └───────────── day of month (1 - 31)
│ └────────────────── hour (0 - 23)
└─────────────────────── min (0 - 59)

// Taken from Ole Michelsen
// https://ole.michelsen.dk/blog/schedule-jobs-with-crontab-on-mac-osx.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Enjoy!
&lt;/h2&gt;

&lt;p&gt;Alert sounds can be annoying.&lt;br&gt;
But with this simple modification to my OS, I get a little giggle from what used to be ordinary and boring.&lt;/p&gt;

&lt;p&gt;I made &lt;a href="https://github.com/FelDev/alert-sounds"&gt;a public repository&lt;/a&gt; containing &lt;br&gt;
the script and my sound collection, should you find it inspiring.&lt;/p&gt;

</description>
      <category>mac</category>
      <category>fun</category>
    </item>
    <item>
      <title>Web Dev in JS vs. Android Dev in Kotlin - what would you choose?</title>
      <dc:creator>Félix Paradis</dc:creator>
      <pubDate>Fri, 23 Oct 2020 12:21:23 +0000</pubDate>
      <link>https://dev.to/feldev/web-dev-in-js-vs-android-dev-in-kotlin-what-would-you-choose-2dln</link>
      <guid>https://dev.to/feldev/web-dev-in-js-vs-android-dev-in-kotlin-what-would-you-choose-2dln</guid>
      <description>&lt;p&gt;Dearest DEV community,&lt;/p&gt;

&lt;p&gt;I have 2+ years of professional experience working as a web developer with the MEAN stack. In my spare time, I do enjoy tinkering with Svelte and jamstacky technologies such as Hugo, Netlify and other SSGs.&lt;/p&gt;

&lt;p&gt;I'm also unemployed at the moment (long story) and just started job hunting. An opportunity to work as an Android developer with Kotlin is already presenting itself and I wonder what the developer experience is like with Android/Kotlin.&lt;/p&gt;

&lt;p&gt;From ~10 minutes of research it seems like Kotlin is at least as loved as JS, but I'd love to hear testimonials from actual devs who have experience in both JS/web dev and Kotlin/Android dev&lt;/p&gt;

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

</description>
      <category>career</category>
      <category>kotlin</category>
      <category>help</category>
    </item>
    <item>
      <title>Arc.io Review - A Way to Monetize Any Website</title>
      <dc:creator>Félix Paradis</dc:creator>
      <pubDate>Sat, 22 Aug 2020 15:51:11 +0000</pubDate>
      <link>https://dev.to/feldev/arc-io-review-a-way-to-monetize-any-website-4ee8</link>
      <guid>https://dev.to/feldev/arc-io-review-a-way-to-monetize-any-website-4ee8</guid>
      <description>&lt;h1&gt;
  
  
  What's &lt;a href="https://arc.io/" rel="noopener noreferrer"&gt;Arc.io&lt;/a&gt; ?
&lt;/h1&gt;

&lt;p&gt;In their own words, "Arc is a peer-to-peer Content Delivery Network". Basically, a tiny portion of your users' bandwith and CPU will be used to power Arc's CDN. Arc promises that "it never impacts the user experience" and anyone can join the network, whether you have a single or a million monthly visitors.&lt;/p&gt;

&lt;p&gt;Generating money from any kind of website without charging your users or showing them ads is an enticing promise. So I gave it a try!&lt;/p&gt;

&lt;p&gt;Note that I'm not using Arc as a way to serve my assets, so this blog post is not about how fast and cheap Arc is as a CDN. It's about: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How easy it is to setup &lt;/li&gt;
&lt;li&gt;Whether it really "never impacts the user experience" or not &lt;/li&gt;
&lt;li&gt;How much money it actually generates &lt;/li&gt;
&lt;li&gt;The ethical implications of renting out your users' bandwidth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tested Arc on &lt;a href="https://www.felixparadis.com/posts/arc-dot-io-review/" rel="noopener noreferrer"&gt;my own little website&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting started with Arc
&lt;/h1&gt;

&lt;p&gt;Setting up Arc was fairly easy. The whole process, from signing up to testing in production, took me less than an hour. It may take you a little longer if you're not comfortable copy/pasting a few lines of code, but since you're reading this on dev.to, I think you'll get around the challenge!&lt;/p&gt;

&lt;p&gt;My website is built with Hugo as a Static Site Generator and hosted on Netlify. So the whole process was this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add this line of code to my baseof.html file:
&lt;/li&gt;
&lt;/ol&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;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://arc.io/widget.js#jf2aUNG1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add this rule to my netlify.toml file:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[[redirects]]&lt;/span&gt;
  &lt;span class="py"&gt;from&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/arc-sw.js"&lt;/span&gt;
  &lt;span class="py"&gt;to&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://arc.io/arc-sw.js"&lt;/span&gt;  
  &lt;span class="py"&gt;status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I provided an email address to receive PayPal payments and that was pretty much it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Impact on the user experience
&lt;/h1&gt;

&lt;p&gt;I ran Lighthouse tests before and after implementing Arc. Sadly, it doesn't look like injecting Arc's code is impact-less 🙁&lt;/p&gt;

&lt;p&gt;My score before implementing Arc:&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%2Fpgfvdzt31f30c9gi4rs4.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%2Fpgfvdzt31f30c9gi4rs4.png" title="Yeah, I'm that good." alt="Lighthouse test showing a score of 100 for Performance, Accessibility, Best Practices and SEO."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After implementing Arc:&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%2F7e3ct1gdmtvlscn9r5f1.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%2F7e3ct1gdmtvlscn9r5f1.png" title="Yikes!" alt="Lighthouse test showing a score of 81 for Performance, 96 for Accessibility, 93 for Best Practices and 100 for SEO."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then I noticed errors were being logged in the console...&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%2Fxc3wrrtobhhrio1zeeih.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%2Fxc3wrrtobhhrio1zeeih.png" title="Yuck!" alt="Developer console showing \"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wrote to Arc's team about this, pointing out that some of the issues were easy fixes. They kindly replied that they will be fixing them "shortly".  I'm still eagerly waiting for those fixes in particular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;lt;frame&amp;gt; or &amp;lt;iframe&amp;gt; elements do not have a title - &lt;strong&gt;UPDATE: FIXED&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A cookie associated with a cross-site resource at &lt;a href="http://core.arc.io/" rel="noopener noreferrer"&gt;http://core.arc.io/&lt;/a&gt; was set without the &lt;code&gt;SameSite&lt;/code&gt; attribute. - &lt;strong&gt;UPDATE: FIXED&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Arc's widget is not accessible to users who only use a keyboard. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll update this blog post when I notice fixes. But Arc's reply included this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We're currently experiencing unprecedented, explosive growth and our servers are absolutely melting. We're  hands on deck to resolve that and right the ship.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I don't know how short "shortly" is going to be.&lt;/p&gt;

&lt;p&gt;To be fair, I cannot say that I notice slower performances now that Arc is on my website. When I browse it as an average user, the only noticeable difference is the blue circle with two white lines in the bottom left corner. &lt;/p&gt;

&lt;h1&gt;
  
  
  Is this generating income?
&lt;/h1&gt;

&lt;p&gt;My website is, for the moment, pretty low traffic. Here is a screenshot of my Google Analytics homepage for the past 28 days.&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%2F95p8vmqiyygbj6xyf5lo.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%2F95p8vmqiyygbj6xyf5lo.png" alt="Google Analytics screenshot showing 282 users, 293 sessions, 89.42% bounce rate and 17 seconds as the average session duration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yeah, there's room for growth. The traffic is so low that I couldn't possibly be accepted by any decent ad network at the moment. And yet... even with such a humble amount of visitors, felixparadis.com is now a source of passive income!&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%2F4oh9d5o7l7fyfw4xmgt8.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%2F4oh9d5o7l7fyfw4xmgt8.png" title="I implemented Arc on the 4th of August." alt="Graphic of my earnings through Arc.io. Some days are as low as not even a penny, but some are above 0.10$ and one day even got to 0.24$"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ok, it's passive pennies. Just enough to cover the yearly cost of my domain name plus a few cheap beers. But considering how low traffic my website is, I'd say it's not bad at all! Remember, there are no annoying ads there. No asking for money anywhere, just a slightly bad Lighthouse score 😐&lt;/p&gt;

&lt;p&gt;If you run some kind of free web app where many people spend many minutes, you probably could make decent earnings. &lt;a href="https://www.indiehackers.com/post/arcdot-io-reviews-rent-your-users-bandwidth-058c1efe42" rel="noopener noreferrer"&gt;I asked for arc.io reviews on Indie Hackers&lt;/a&gt; and &lt;a href="https://twitter.com/martinratinaud" rel="noopener noreferrer"&gt;Martin Ratinaud&lt;/a&gt; wrote back that he makes about 8$ per day for 400k views per month with &lt;a href="https://www.edityouraudio.com/" rel="noopener noreferrer"&gt;edityouraudio.com&lt;/a&gt;. That's a daily not-so-cheap beer!&lt;/p&gt;

&lt;h1&gt;
  
  
  Is this ethical though?
&lt;/h1&gt;

&lt;p&gt;When I entered "arc.io review" in Google Search, the first result was &lt;a href="https://news.ycombinator.com/item?id=20105509" rel="noopener noreferrer"&gt;a post on Hacker News&lt;/a&gt; where almost everyone said they wouldn't use it, even though some admitted it's a cool technology. &lt;/p&gt;

&lt;p&gt;Most criticism came from people seeing the idea of renting your users' bandwidth as somewhat sly and potentially not compliant with privacy regulations such as the GDPR, &lt;em&gt;potentially&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You definitely should be wary of anyone asking you to inject their code into your users' browsers and Arc could do a better job of making us feel at ease (Maybe by being more transparent about who works there? Having an official Twitter account?). Also, while Arc's widget offers the possibility of opting out, some argue that it should be the other way around. Although, let's be honest, nobody would opt-in.&lt;/p&gt;

&lt;p&gt;So, there is room for personal opinions here. But Arc is very legit when it comes to privacy and they only rent out users' bandwidth if they're on wifi. To me, it sounds like a good deal as a user too; I give money to people creating content I enjoy without actually giving them money. It's a win-win, no?&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I think Arc is bringing an innovative solution to a real problem: creators like to get paid but users don't like to pay. There are still some rough edges around their technology, but this should get better... "shortly".&lt;/p&gt;

&lt;p&gt;You do need a lot of traffic to generate serious income, but it's probably the easiest way to monetize any web project. As for the user experience, try scrolling &lt;a href="https://www.felixparadis.com/posts/arc-dot-io-review/" rel="noopener noreferrer"&gt;the exact same article on felixparadis.com&lt;/a&gt; and see how it feels.&lt;/p&gt;

</description>
      <category>webmonetization</category>
      <category>startup</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My Recipe for a 0$/month e-commerce Website</title>
      <dc:creator>Félix Paradis</dc:creator>
      <pubDate>Tue, 19 May 2020 17:27:12 +0000</pubDate>
      <link>https://dev.to/feldev/my-recipe-for-a-0-month-e-commerce-website-1fgb</link>
      <guid>https://dev.to/feldev/my-recipe-for-a-0-month-e-commerce-website-1fgb</guid>
      <description>&lt;h1&gt;
  
  
  The Ingredients:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Netlify as a hosting solution (I heard Vercel is just as tasty.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stripe as a payment platform&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;FaunaDB as a database (Only needed to keep track of an inventory)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Svelte and Sapper to build the front-end (Could be replaced with any decent front-end tools that exports to static)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SendGrid to send email confirmations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cloudinary to host images (Optional)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Wanna Taste?
&lt;/h1&gt;

&lt;p&gt;Live demo: &lt;a href="https://free-ecommerce.netlify.app/"&gt;https://free-ecommerce.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Use card &lt;code&gt;4242 4242 4242 4242&lt;/code&gt; with an expiration date somewhere in the future to go through the whole checkout process.)&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/FelDev/free-ecom"&gt;https://github.com/FelDev/free-ecom&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Where’s the catch?
&lt;/h1&gt;

&lt;p&gt;Stripe will charge you 2,9 % + 0,30$ on every transaction, but only if you make sales. Fine by me!&lt;/p&gt;

&lt;p&gt;For all the other service providers, you’ll notice that they all have a pricing page. But if you look at those pricing pages, you’ll also notice that they all have a very generous free tier. For instance, SendGrid allows you to send 100 emails/day and FaunaDB lets you store up to 5GB, all without a credit card. &lt;/p&gt;

&lt;p&gt;More than enough to test your market.&lt;/p&gt;

&lt;h1&gt;
  
  
  Is this good though?
&lt;/h1&gt;

&lt;p&gt;This is more a proof of concept than a battle-tested solution like Shopify and the likes. The major downsides are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You’ll definitely need a developer &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No automatically calculated shipping costs (If you have a solution for this, let me know!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Slight possibility of double selling items (matters if every item is unique, or you’re running low on stocks.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apart from that, you’ll get excellent loading times, it’s very secure and highly customizable. &lt;/p&gt;

&lt;h1&gt;
  
  
  Ever tested in production?
&lt;/h1&gt;

&lt;p&gt;I used it to sell my paintings over at &lt;a href="https://boutique.felixparadis.com/"&gt;boutique.felixparadis.com&lt;/a&gt; and it got through the challenge with only two problems: &lt;/p&gt;

&lt;h3&gt;
  
  
  One item was sold twice
&lt;/h3&gt;

&lt;p&gt;I thought the chances of that happening were so low that I could afford the risk. And then someone got to the checkout form before another person got to the end of the process... Luckily it’s easy to issue a refund on Stripe, but this recipe definitely needs modifications if you’re going to use it for unique items.&lt;/p&gt;

&lt;h3&gt;
  
  
  Emails failed twice
&lt;/h3&gt;

&lt;p&gt;One thing I learned with this experiment is that Hotmail users are harder to reach. &lt;a href="https://www.reddit.com/r/webdev/comments/amzfhg/outlookhotmail_blocking_my_sendgrid_emails/"&gt;Apparently&lt;/a&gt;, SendGrid uses a separate IP range for emails sent from the free tier. Sometimes, email providers will block the free plan range as spammers are more likely to use it. You get what you pay for!&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I tried to come up with the cheapest possible e-commerce solution and I’d say it’s half a success. &lt;/p&gt;

&lt;p&gt;While it’s certainly hard to beat in terms of pricing, you kinda get what you paid for. Considering that something like a &lt;a href="https://snipcart.com/"&gt;SnipCart&lt;/a&gt; integration would solve all the problems of this recipe while adding more features for an extra 2% /transaction, you may wonder if this is worth all the trouble.&lt;/p&gt;

&lt;p&gt;For some use-cases though, this recipe might be great. If you’re selling something that doesn’t need to be shipped and that you won’t run out of, for instance. It can also be a good first iteration if you just want to test if anyone would ever click the “checkout” button for your product.&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>ecommerce</category>
    </item>
  </channel>
</rss>
