<?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: André</title>
    <description>The latest articles on DEV Community by André (@lostdesign).</description>
    <link>https://dev.to/lostdesign</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%2F38606%2F198cce4f-1b3b-4aba-8c83-797c537056d3.jpg</url>
      <title>DEV Community: André</title>
      <link>https://dev.to/lostdesign</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lostdesign"/>
    <language>en</language>
    <item>
      <title>How to run laravel in docker</title>
      <dc:creator>André</dc:creator>
      <pubDate>Wed, 15 Jul 2020 12:51:15 +0000</pubDate>
      <link>https://dev.to/lostdesign/how-to-run-laravel-in-docker-4e6o</link>
      <guid>https://dev.to/lostdesign/how-to-run-laravel-in-docker-4e6o</guid>
      <description>&lt;p&gt;This is just a quick post sharing my basic docker setup for new laravel projects.&lt;/p&gt;

&lt;p&gt;Setting up a new laravel project can be quite some hassle, the current options with valet, homestead or vagrant are fine but personally don't give me the flexibility I need.&lt;/p&gt;

&lt;p&gt;That's why I created a basic laravel docker boilerplate I copy across my projects. &lt;/p&gt;

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

&lt;p&gt;First of all you need docker installed on your pc and a laravel projects. Then copy the next two files into the root of your project:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Once you copied the files, you'll need to run &lt;code&gt;docker-compose up&lt;/code&gt; in the root of your project directory to start the dev environment. Head over to &lt;a href="http://localhost"&gt;http://localhost&lt;/a&gt; and you'll have your laravel project up and running.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;The following file is optional and meant for if you want to use your own docker container image. The docker-compose above uses my pre-build docker image which is hosted on docker hub.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;If you want to know more about docker or how to setup your own stack, let me know down below and I'll write something about that.&lt;/p&gt;

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

</description>
      <category>laravel</category>
      <category>docker</category>
      <category>devops</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>GA? Matomo? Or maybe this ...</title>
      <dc:creator>André</dc:creator>
      <pubDate>Thu, 04 Jun 2020 10:55:13 +0000</pubDate>
      <link>https://dev.to/lostdesign/ga-matomo-or-maybe-this-4gp</link>
      <guid>https://dev.to/lostdesign/ga-matomo-or-maybe-this-4gp</guid>
      <description>&lt;p&gt;Which analytics should I choose? What has to be on my privacy policy page? Do I have to choose opt-in or opt-out? &lt;a href="https://www.reuters.com/article/us-alphabet-google-privacy-lawsuit/google-faces-5-billion-lawsuit-in-us-for-tracking-private-internet-use-idUSKBN23933H" rel="noopener noreferrer"&gt;Is Google selling my data?&lt;/a&gt; Where do I put that cookie banner? Any cookie or tracking services? GPDR? BDSG? ... ... ...&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%2Fr4pijwm4muni42m2v7hg.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%2Fr4pijwm4muni42m2v7hg.png" alt="brain overload"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So many things to look after, all that and more just to see how many people have been visiting my site. Is it really worth it? There must be something simpler!&lt;/p&gt;

&lt;h2&gt;
  
  
  Table Of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How it all started&lt;/li&gt;
&lt;li&gt;My first own analytics server&lt;/li&gt;
&lt;li&gt;A new service had to come&lt;/li&gt;
&lt;li&gt;The self-hosted server purge&lt;/li&gt;
&lt;li&gt;Back to the roots&lt;/li&gt;
&lt;li&gt;
TLDR; Miss me with that long ass blogpost
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it all started &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Back then I needed something to check the traffic for my sites, I was rather scared about privacy issues, didn't know how much GA (Google Analytics from now on) costs, how to set it up etc etc. And to be honest, I wasn't too much of a google fan back then.&lt;/p&gt;

&lt;p&gt;I was looking around, comparing prices and if there were on-premise solutions to keep control over the data and what not. I didn't find much out there which fit my needs until I came across Fathom.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first own analytics server &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Some years ago I rented a VPS, setup docker and installed Fathom. I was quite pleased with what I got, given that I didn't have to worry about privacy pages and cookie banners. Fathom doesn't need that.&lt;/p&gt;

&lt;p&gt;Everything went well up until my server crashed. Not too bad right? &lt;br&gt;
So I rebooted my server and then went to check if everything is up and running. I opened my analytics dashboard, just to be welcomed with the setup screen again. &lt;strong&gt;What?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3yaca7kgaxa847nsk5bx.gif" 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%2F3yaca7kgaxa847nsk5bx.gif" alt="me_irl"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Time to debug the issue, back to the server
&lt;/h4&gt;

&lt;p&gt;I was looking around, checking if all services were running but couldn't find any issues. Well, little did I know that I messed up with the docker configuration. I forgot to share the docker volume to my host machine and had all data inside the container. Since my containers were broken, everything was lost.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Data inside docker containers don't persist if they are not shared with the host system&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was pissed, at first I blamed fathom, how dare them to not include basic docker knowledge in their docs.... Insane! &lt;/p&gt;
&lt;h2&gt;
  
  
  A new service had to come &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Of course they are wrong and not me, so I deleted the server and went on the hunt for a new analytics suite. After a while I came across Matomo (formerly Piwik, idk why they still include that). It looked nice, so here I went again and created a new server. I didn't use docker for this setup obviously, because at the time, docker was my enemy (yes I realized it wasn't fathoms fault but my own stupidity).&lt;/p&gt;

&lt;p&gt;The server was running fine, there even is a third party Matomo app for iOS which I used to check my numbers. That server was running for over a year, I went through all my sites added privacy policies, added cookie banners and what not was necessary to be as much compliant as possible. All data was anonymized and deleted after 180 days. Seemed fine to me. Up until I got fed up baby sitting servers.&lt;/p&gt;
&lt;h2&gt;
  
  
  The self-hosted server purge &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Don't get me wrong, I still love self-hosted and open source solutions. But let me tell you, it gets quite tiring after you have to maintain +10 servers. At some point I simply didn't want to look after all my servers anymore, so I began to look for cloud/hosted services to replace anything I had hosted myself. I went from my own hosted instance of Gitlab to Github, replaced Rocket.chat with Discord, mailcow with gmail and many other services at the same time.&lt;/p&gt;

&lt;p&gt;So what happened to Matomo then? Time to use Google Analytics as there is nothing left? Luckily, I came across a fathom tweet &lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1259192400825643008-804" src="https://platform.twitter.com/embed/Tweet.html?id=1259192400825643008"&gt;
&lt;/iframe&gt;

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



&lt;/p&gt;

&lt;p&gt;This made me check their prices again. I guess they changed since back then and compared to my time watching my own servers, this was the best deal I could find personally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back to the roots &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So I went ahead, created a new account, payed for a year sub and started to migrate all my sites back to fathom yet again. But this time, using their hosted solution. It didn't take me long to port my sites over and I already saw traffic coming in. Cool. They added quite some new stuff since the last time I have used them which were a surprise. Oh speaking of which, they are adding simple website monitoring with free notifications to mail, sms and slack this Friday.&lt;/p&gt;

&lt;p&gt;There are many solutions for tracking page traffic, find some below. I will update the post with your comments if I am missing something that should be added here. Maybe in a year or two I will continue this journey by replacing fathom with yet something new (I doubt it though, really happy right now).&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR; Give me the good stuff &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Fathom
&lt;/h4&gt;

&lt;p&gt;Both free and hosted solution, privacy compliant, no need to have a cookie banned or privacy policy for analytics. Perfect if you want an easy and simple solution without much hassle. &lt;strong&gt;Here is my personal referral link for fathom. Would be cool if you help me out! &lt;a href="https://usefathom.com/ref/MQYHPK" rel="noopener noreferrer"&gt;https://usefathom.com/ref/MQYHPK&lt;/a&gt; You get $10 off.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Matomo
&lt;/h4&gt;

&lt;p&gt;Both self-hosted and cloud solution, GPDR Manager, automatic deletion of data, anonymized tracking, offers opt-in and opt-out. The best tracking solution if you want to self host your analytics and still be privacy compliant. &lt;a href="https://matomo.org" rel="noopener noreferrer"&gt;Matomo&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Cloudflare
&lt;/h4&gt;

&lt;p&gt;Free pure traffic tracking, no need to have a cookie banned or privacy policy for analytics. Simply use Cloudflare as your DNS to get pure hits without a page breakdown. Probably the easiest setup but for the price of less detailed stats.&lt;br&gt;
&lt;a href="https://cloudflare.com" rel="noopener noreferrer"&gt;Cloudflare&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Simple Analytics
&lt;/h4&gt;

&lt;p&gt;Just going to link it here, similar to fathom &lt;a href="https://simpleanalytics.com" rel="noopener noreferrer"&gt;Simple Analytics&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Google Analytics
&lt;/h4&gt;

&lt;p&gt;Idk, I am still not there - comment below and I will update this. I'll leave you with this 🤷&lt;br&gt;
&lt;a href="https://policies.google.com/privacy#infocollect" rel="noopener noreferrer"&gt;From Google's policy&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The information we collect includes unique identifiers, browser type and settings, device type and settings, operating system, mobile network information including carrier name and phone number, and application version number [...], your apps, browsers, and devices with our services, including IP address, crash reports, system activity, and the date, time, and referrer URL of your request.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Where did I host you may ask?
&lt;/h4&gt;

&lt;p&gt;Mostly at &lt;a href="https://hetzner.com" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt; and &lt;a href="https://contabo.com" rel="noopener noreferrer"&gt;Contabo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>privacy</category>
      <category>startup</category>
      <category>docker</category>
    </item>
    <item>
      <title>webgems.io 💎 a devs startpage</title>
      <dc:creator>André</dc:creator>
      <pubDate>Thu, 25 Jul 2019 08:06:06 +0000</pubDate>
      <link>https://dev.to/lostdesign/webgems-io-a-developers-startpage-3n7l</link>
      <guid>https://dev.to/lostdesign/webgems-io-a-developers-startpage-3n7l</guid>
      <description>&lt;h3&gt;
  
  
  👋 Introduction
&lt;/h3&gt;

&lt;p&gt;Since I am a community person, I am often helping people within several developer discords as well as running my own server called &lt;a href="https://devcord.com" rel="noopener noreferrer"&gt;devcord&lt;/a&gt;. There is not a single day were I don't find myself linking some resource, as many beginners are asking how to do "that" in flexbox for example. &lt;/p&gt;

&lt;p&gt;On our server we even have a bot command to just send an embed saying "Hey want to learn flexbox? Checkout &lt;a href="https://flexboxfroggy.com" rel="noopener noreferrer"&gt;https://flexboxfroggy.com&lt;/a&gt;". But sometimes I feel like a particular member might not want to use &lt;a href="https://webgems.io/css/?card=flexboxfroggy" rel="noopener noreferrer"&gt;flexboxfroggy&lt;/a&gt; but is looking for a documented approach, so I sent them the link to the &lt;a href="https://webgems.io/css/?card=acompleteguidetoflexbox" rel="noopener noreferrer"&gt;css-tricks flexbox guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 The idea
&lt;/h3&gt;

&lt;p&gt;That brought me to the idea to create a website for beginners, that are looking for resources which will help them get started in the big and chaotic domain of webdevelopment.&lt;/p&gt;

&lt;p&gt;As always I started to look out for a domain first, before even thinking about how I would actually implement this site itself. It was the 10th of may that I started to bug my friends asking what they think about this particular domain name. It's just a small flaw of mine, thinking good domain first and then comes the project (but that actually just changed recently - more on that soon). &lt;/p&gt;

&lt;p&gt;Here is the list of domains I was running through, until I found the perfect match (with the help of my friends, looking at you Jacob): &lt;em&gt;webgems&lt;/em&gt; 💎, "the best gems out there for developers". If you are lucky, you might be still able to register any of these. IMO those are some good domains :)&lt;/p&gt;

&lt;p&gt;webbin.io - webbin.dev - sourcebin.io - webcollect.io - devbucket.io - webrepo.io - devcollect.io - devbin.? - resourcebin.io&lt;/p&gt;

&lt;h3&gt;
  
  
  💻 Starting to dev
&lt;/h3&gt;

&lt;p&gt;Anyhow, once I was settled on the domain, I quickly registered it since you should never wait too long - the domain can be gone anytime. It was now time to decide what stack would be fitting for this site - since &lt;a href="https://vuejs.org" rel="noopener noreferrer"&gt;Vue&lt;/a&gt; is usually my goto framework and just recently I started to rewrite my own website in &lt;a href="https://nuxtjs.org/" rel="noopener noreferrer"&gt;Nuxt&lt;/a&gt;, I decided to use NUXT for webgems as well.&lt;/p&gt;

&lt;p&gt;I am not sure how deep I should go into the dev process, I'd only like to highlight that one particular thing has been costing me some nerves:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Being able to click on a copy button that will highlight the card and put a reference in your clipboard.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's how it looks like now:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kjqkm62mesvbzvivyfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kjqkm62mesvbzvivyfq.png" alt="highlight-card-preview" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It worked completely fine on localhost, but when I pushed it to prod using &lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt;, the reference and routing would just break. I was so hyped about this project but this one issue frustrated me a lot. After some hours researching about this issue I found some references about Nuxt+Netlify and Netlify adding trailing slashes. Quickly I decided to spin up my very own server to verify if it was either me or Netlify's issue. &lt;/p&gt;

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

&lt;p&gt;At that time I was kinda sad since I thought i could not use Netlify, even if I enjoyed their whole workflow that much. &lt;/p&gt;

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

&lt;p&gt;I guess that message makes it quite clear? &lt;/p&gt;

&lt;p&gt;Well after I came down a bit, I wasn't happy with the current situation and wanted to find out if there was another solution to the problem. It took me some days but I found the solution - here is the final code snipped. I actually forgot how I fixed it, but I will make sure to dig through the commits and come back later with the answer for you!&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;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createCopyUrl&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currentPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;reference&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createReferenceTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;$copyText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://webgems.io&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;currentPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?card=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;reference&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;currentPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?card=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;reference&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ✅ IT'S LIVE
&lt;/h3&gt;

&lt;p&gt;As that was out of the way and I was now able again to work with Netlify, I continued to add more resources and fix some small things here and there. Several streams on my &lt;a href="https://twitch.tv/l0stdesign" rel="noopener noreferrer"&gt;twitch&lt;/a&gt; and one month later, it was finally done. I pushed the last commit and decided to tweet about it, even if I am not a twitter person that much.&lt;/p&gt;

&lt;p&gt;Not thinking what would happen, the tweet actually blew up. It was the first time for me that anything I tweeted actually reached that many people.&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;p&gt;About 120.000 people saw this tweet and the site itself got about 10k visits within the first week of the launch. I was completely astonished that I'd actually get that support. &lt;/p&gt;

&lt;p&gt;Shortly after the launch, S3BAS a friend from the devcord server chimed in on the project and helped me out a bit, refactoring the code and what not. We had some late night shifts but it was well worth it.&lt;/p&gt;

&lt;p&gt;This project was also published on producthunt, but I kinda failed the launch there, assuming not posting at the right time.&lt;/p&gt;
&lt;h3&gt;
  
  
  📖 Skill++
&lt;/h3&gt;

&lt;p&gt;While working on this project I had so much fun and learned/fixed my git and git flow skills. Thanks to the people that sent me messages on how much they appreciated what I and the contributors of this project did. Even today, some weeks after the launch people still thank me for this project. And it means so much to me, that it does exactly what I wanted - help other people (&lt;em&gt;and ofc that I don't have to send individual links anymore :D&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;It has been a road of emotions and just recently webgems was mentioned in one of my favorite podcasts "Syntax.fm". I can highly recommend listening to their podcasts and this particular one, where webgems was mentioned -&amp;gt; &lt;a href="https://syntax.fm/show/163/hasty-treat-web-dev-resource-sick-picks" rel="noopener noreferrer"&gt;click here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I didn't even notice at first it was mentioned there, but yet another friend told me about it. I was actually close to crying, hearing that I made it on there. I was shaking at least and had to tell my friends about it, even if they don't know anything about web development at all and couldn't understand what was going on. But they were happy for me at least, so i appreaciate that.&lt;/p&gt;
&lt;h3&gt;
  
  
  💾 The Conclusion
&lt;/h3&gt;

&lt;p&gt;Even if your project is nothing completely new, people that may not believe in your idea, the issues you face or any other reason should never stop you form doing what you are passionate about. &lt;/p&gt;

&lt;p&gt;The web domain is quite toxic sometimes and even more for beginners - that's why I wrote this story about this small project, that still had an impact.&lt;/p&gt;

&lt;p&gt;If you are looking for a friendly community with like minded devs and are in need of help or want to help people, come join us over at &lt;a href="https://devcord.com" rel="noopener noreferrer"&gt;devcord&lt;/a&gt; - we would love to have you there.&lt;/p&gt;

&lt;p&gt;If you want to checkout the source of this project, feel free to do so it's on github. I'd love if you share it when someone is in need of some resources as well as contributing to the project - just shoot a PR or open an issue if you think something is missing.&lt;/p&gt;

&lt;p&gt;.&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/webgems" rel="noopener noreferrer"&gt;
        webgems
      &lt;/a&gt; / &lt;a href="https://github.com/webgems/webgems" rel="noopener noreferrer"&gt;
        webgems
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🚨 REPO MOVED&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;webgems is now back in &lt;a href="https://github.com/lostdesign/webgems" rel="noopener noreferrer"&gt;lostdesign/webgems&lt;/a&gt;&lt;/p&gt;

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


</description>
      <category>showdev</category>
      <category>resource</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Small details make a difference</title>
      <dc:creator>André</dc:creator>
      <pubDate>Tue, 04 Dec 2018 16:45:30 +0000</pubDate>
      <link>https://dev.to/lostdesign/small-details-make-a-difference-1k4a</link>
      <guid>https://dev.to/lostdesign/small-details-make-a-difference-1k4a</guid>
      <description>&lt;p&gt;Recently I had a chat with my fellow web developer &lt;a href="https://dev.to/nevermindtheloading"&gt;friend&lt;/a&gt; about forms and how they should not let users submit the request if required fields are missing. I was trying to fill my request for this years christmas vacation and they didn't have any validation going. I ended up adding the same data again 😔..&lt;/p&gt;

&lt;h1&gt;
  
  
  So why does it matter?
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Form validation is important!
&lt;/h4&gt;

&lt;p&gt;How often have you run into the issue of filling forms which do not have any frontend validation, might not even display where the error relies or simply won't work? I guess you know the feeling well!&lt;/p&gt;

&lt;p&gt;The issue here is that the user usually assumes everything will be fine once they are done filling the form, but then &lt;em&gt;poof&lt;/em&gt; everything is gone. You now have a disappointed or maybe even angry customer. At least that site made this poor cat cry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdntflwlqn9mqi39spr5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdntflwlqn9mqi39spr5.gif" alt="really sad cat" width="1024" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How can you fix that?
&lt;/h1&gt;

&lt;p&gt;Well let's just use &lt;code&gt;required&lt;/code&gt; on the input!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;YAY&lt;/em&gt; - Actually no..&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;can&lt;/em&gt; do it, but you still don't give the user feedback at the right time! We are now at the same point that the user assumes that his filled data is correct.&lt;/p&gt;

&lt;p&gt;So what should you do then? You could install all the fancy js libraries in order to get it to work &lt;em&gt;or&lt;/em&gt; simply work with plain &lt;code&gt;JS&lt;/code&gt; and &lt;code&gt;CSS&lt;/code&gt;. Sometimes you may not need much more than what you can see in the codepen down below!&lt;/p&gt;

&lt;p&gt;I made this codepen as proof of concept, try clicking the button without entering any values into the input. Afterwards click into the input, add something and press submit.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/lost-design/embed/BGeyEr/?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  How the pen works
&lt;/h4&gt;

&lt;p&gt;I have added an &lt;code&gt;addEventListener&lt;/code&gt; to the button on &lt;code&gt;mouseenter&lt;/code&gt; which will trigger a function called &lt;code&gt;validateNote()&lt;/code&gt;.&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;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mouseenter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;validateNote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;mouseenter&lt;/code&gt; in this case is probably the best option to go for, as it's being triggered once the mouse enters the button (read more on event triggers &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Events#Mouse_Events" rel="noopener noreferrer"&gt;here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;validateNote()&lt;/code&gt; checks if the value of the input is an empty string using the ternary operator. Depending on if there is any value or not it will disable or enable the button.&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;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;disableButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;enableButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;disableButton()&lt;/code&gt; will add the &lt;code&gt;.err&lt;/code&gt; css class to the button, input and label to reveal the error message.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;disableButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;err&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;err&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;errMsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;err&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// this kicks the cursor from the input which still has focus&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// the button here will be disabled&lt;/span&gt;
    &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;submitNote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;enableButton()&lt;/code&gt; will do the opposite obviously! It removes the &lt;code&gt;.err&lt;/code&gt; css class off the button, input and label to hide the error message.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;enableButton&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;err&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;err&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;errMsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;err&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;submitNote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Pro tip: Use an inner shadow on the input to prevent it from resizing, since adding a border would make the input actually bigger and your layout would start to shift.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="nc"&gt;.err&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;-webkit-box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;#f00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;-moz-box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;#f00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;inset&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;#f00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="m"&gt;.3s&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another tip: Since we are working with animations here, use any easing method you would like - at least use any. Find some easing properties &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions#Defining_transitions" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Btw, you should add labels which are visible any time for your inputs - i didn't do that in this case. But this is a different topic I will address some other time.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tl;dr
&lt;/h1&gt;

&lt;p&gt;Simply validate all required inputs &lt;strong&gt;before&lt;/strong&gt; the user can submit them in the frontend, but also after the user is done filling the data to prevent any interruptions. &lt;/p&gt;

&lt;p&gt;It helps the experience for the user in order to prevent any false expectations which then cause frustration. &lt;em&gt;Telling the user at the right time what's wrong without disturbing their flow is key!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Error messages&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;should display at right time and place.&lt;/li&gt;
&lt;li&gt;should primarily avoid confusion.&lt;/li&gt;
&lt;li&gt;should communicate what is happening.&lt;/li&gt;
&lt;li&gt;should describe how the user can fix it.&lt;/li&gt;
&lt;li&gt;should be short, but meaningful.&lt;/li&gt;
&lt;li&gt;should have right color for the message.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Taken from &lt;a href="https://ux.stackexchange.com/questions/120939/inline-validation-on-smaller-forms" rel="noopener noreferrer"&gt;UX Stackexchange&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the beginning of me trying to figure out how to make big improvements with small details, stay tuned!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I am always happy to improve myself, so feel free to help out! Thanks for my fellow discord people who helped me to improve this article already :d&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ux</category>
      <category>ui</category>
      <category>forms</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
