<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kai Neuwerth</title>
    <description>The latest articles on Forem by Kai Neuwerth (@crease29).</description>
    <link>https://forem.com/crease29</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%2F92631%2F287ca8e9-6bdc-4784-9323-5b9fbba94c9c.jpg</url>
      <title>Forem: Kai Neuwerth</title>
      <link>https://forem.com/crease29</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/crease29"/>
    <language>en</language>
    <item>
      <title>My experiences with building a Google Chrome extension</title>
      <dc:creator>Kai Neuwerth</dc:creator>
      <pubDate>Mon, 17 Sep 2018 20:26:38 +0000</pubDate>
      <link>https://forem.com/crease29/what-ive-learned-from-building-a-google-chrome-extension-4do</link>
      <guid>https://forem.com/crease29/what-ive-learned-from-building-a-google-chrome-extension-4do</guid>
      <description>&lt;p&gt;Over 4 years ago I've released my first Google Chrome extension. I'm talking about &lt;a href="https://chrome.google.com/webstore/detail/pageliner/nepakmljodobhlbbkpobblnifmhclemh" rel="noopener noreferrer"&gt;PageLiner&lt;/a&gt;. Later on more about the bad rating! 😉 Please don't blame me for all the horrible jQuery stuff and hungarian notation in there. 4 years ago jQuery was still the thing for me and it just works. But I'm aware of the fact, that it can be done much cleaner and more elegant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, what is it for?&lt;/strong&gt; PageLiner allows you to place guide lines on a website like you know it from Adobe Photoshop. It's helpful to see if all elements on a website are properly aligned or to measure distances between guide lines. So it's perfect for frontend developers.&lt;/p&gt;

&lt;p&gt;I've started by shouting it out to my collegues and in some software communities and so my userbase started to grow slowly. &lt;/p&gt;

&lt;p&gt;The first issues that reached me were just some visual bugs caused by the CSS that was used on some pages that affected the rendering of the guide lines. Pretty easy to fix.&lt;/p&gt;

&lt;p&gt;As the userbase growed I noticed that some users from other countries are also using PageLiner and because it was only available in German at that point, I decided to implement a really easy internationalization method with Javascript that simply reads the &lt;code&gt;data-i18n&lt;/code&gt; attribute of elements and replaces its node text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;data-i18n=&lt;/span&gt;&lt;span class="s"&gt;"POPUP_TOGGLE_HELPLINES"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-i18n]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sIdent&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;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;data-i18n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nx"&gt;sTranslation&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sIdent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;VERSION&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="nx"&gt;sTranslation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getManifest&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;sTranslation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chrome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;i18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sIdent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;sTranslation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Could not find message string by ident "&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;sIdent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;"!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&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="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sTranslation&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;That made the userbase grow slightly faster. But at some day the userbase just &lt;strong&gt;exploded&lt;/strong&gt;! 💥 Here is the graph that shows the massive increase of users, reviews and bad ratings:&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%2Fgksatf643bunw88g7hyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgksatf643bunw88g7hyo.png" alt="PageLiner statistics" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The extension got reviewed by many Russian persons. Comments like "remove this virus" and "I can't uninstall this extension". I had no idea what was going on and contacted google.&lt;br&gt;
They could do nothing about it. Google just deleted those reviews with swearwords.&lt;br&gt;
I tried to contact the reviewers via Google+ or Hangouts and someone with a technical background replied. We analized it a bit and found out that someone grabbed my extension, modified it, extended it with malware and installed it on other clients as OEM extension, so that it can't be removed in Google Chrome itself. Some months later the userbase went back and everything was okay, except the bad reviews.&lt;/p&gt;

&lt;p&gt;One year later the same thing happened but even heavier:&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%2Fqpb4ex5hk37akpzfxow0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqpb4ex5hk37akpzfxow0.png" alt="PageLiner statistics" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There were many threads in russian anti virus forums asking how to uninstall the extension. Months later the userbase went back again to a consistent level of 6000 users. I guess the anti virus vendors have implemented a check for the malware extension and could remove it.&lt;/p&gt;

&lt;p&gt;Currently there aren't so many changes in the extension but that's okay for me. I'm really proud that I have created an extension that is used by so many &lt;strong&gt;real&lt;/strong&gt; people everyday.&lt;/p&gt;

&lt;p&gt;In case of questions I would love to answer them below in the comments! Have you ever created a browser extension? Share it!&lt;/p&gt;

&lt;p&gt;Hopefully that was interesting in some way and you enjoyed my little cerebration. 🙂&lt;/p&gt;

&lt;p&gt;If you want to have a look at the code behind this extension, you can find it here:&lt;br&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://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Crease29" rel="noopener noreferrer"&gt;
        Crease29
      &lt;/a&gt; / &lt;a href="https://github.com/Crease29/pageliner" rel="noopener noreferrer"&gt;
        pageliner
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      📐 Google Chrome extension to create guide lines on a website.
    &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;
&lt;a rel="noopener noreferrer" href="https://github.com/Crease29/pageliner/blob/master/icons/icon_pl_48x48.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FCrease29%2Fpageliner%2Fraw%2Fmaster%2Ficons%2Ficon_pl_48x48.png" width="24" height="24"&gt;&lt;/a&gt; PageLiner &lt;a href="https://gitter.im/WebChimp-DE/pageliner" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ef3705254e766b5edea93f49291c6d9239f29b942cfdb84f3296d0e37898b067/68747470733a2f2f6261646765732e6769747465722e696d2f4a6f696e253230436861742e737667" alt="Join the chat at https://gitter.im/WebChimp-DE/pageliner"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/Crease29/pageliner/workflows/.github/workflows/main.yml/badge.svg"&gt;&lt;img src="https://github.com/Crease29/pageliner/workflows/.github/workflows/main.yml/badge.svg" alt=""&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e14f1285eeedd7e48199cebf9ed0b61add895052d60cd14d45fb4c541f67d609/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f762f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68"&gt;&lt;img src="https://camo.githubusercontent.com/e14f1285eeedd7e48199cebf9ed0b61add895052d60cd14d45fb4c541f67d609/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f762f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68" alt="Chrome extension version"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5a2860c917a5500417b7e7ecb53aa484d51b0e4b4a407383bb27b0b4486cddf6/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f75736572732f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68"&gt;&lt;img src="https://camo.githubusercontent.com/5a2860c917a5500417b7e7ecb53aa484d51b0e4b4a407383bb27b0b4486cddf6/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f75736572732f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68" alt="Chrome extension user count"&gt;&lt;/a&gt;  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fa5e6d8bad27266bed46dc44cb3471e7244aaaece19fd3aaa9f75410332b38ef/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f70726963652f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68"&gt;&lt;img src="https://camo.githubusercontent.com/fa5e6d8bad27266bed46dc44cb3471e7244aaaece19fd3aaa9f75410332b38ef/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f70726963652f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68" alt="Chrome extension price"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc0d8d7481c69229c38c2e30b8b89740e2d750da823e81ede5ca4987697752b9/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f726174696e672d636f756e742f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68"&gt;&lt;img src="https://camo.githubusercontent.com/bc0d8d7481c69229c38c2e30b8b89740e2d750da823e81ede5ca4987697752b9/68747470733a2f2f62616467656e2e6e65742f6368726f6d652d7765622d73746f72652f726174696e672d636f756e742f6e6570616b6d6c6a6f646f62686c62626b706f62626c6e69666d68636c656d68" alt="Chrome extension rating count"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you like this extension, I'd be really happy to receive an honest review and/or a tiny donation 🤗🥰 That means a lot to me!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.paypal.me/koi" rel="nofollow noopener noreferrer"&gt;PayPal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bitcoin (BTC): &lt;code&gt;1PD2v5chdNR67kjpWAyKYZ5U6oSFqpRiVs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dogecoin (DOGE): &lt;code&gt;D5oEU9VbQ8jY8BGcrVoMLUxXzD26VMJzqM&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ethereum (ETH): &lt;code&gt;0xEE3057Cc44F93DC20423a682AFB35e93C4A134fd&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Litecoin (LTC): &lt;code&gt;LXbNG6VdCyqWmgvKZxyr4QinfiFiq8ebyb&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ripple (XRP): &lt;code&gt;rnVEhBpThdY9Vs8sYJdoXxH9oFRC84LDyw&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Stellar Lumen (XLM): &lt;code&gt;GCLNBSZWFQZLALMMNKTCUMXHI5QMEGN5XE2SH6HG63HKXTGUINFYI7OI&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google Chrome and Edge extension to create guidelines on a website.&lt;/p&gt;

&lt;p&gt;▶ &lt;a href="https://chrome.google.com/webstore/detail/pageliner/nepakmljodobhlbbkpobblnifmhclemh" rel="nofollow noopener noreferrer"&gt;View in Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;▶ &lt;a href="https://addons.mozilla.org/de/firefox/addon/pageliner/" rel="nofollow noopener noreferrer"&gt;View in Mozilla 🦊 Firefox Add-Ons Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;▶ &lt;a href="https://microsoftedge.microsoft.com/addons/detail/pageliner/kcombcinjokdchiiakigflgcangmfafp" rel="nofollow noopener noreferrer"&gt;View in Microsoft Edge-Add-Ons Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any suggestions or bugs, please create an issue or use the support form in Chrome Web Store. Thank you!&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;Add guidelines from the rulers&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;Hover over one of the rulers and start dragging a new guideline from there, like you know it from Photoshop.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Add guidelines with shortcuts&lt;/h3&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;

Alt+H adds a &lt;em&gt;horizontal&lt;/em&gt; guideline at your cursor position and selects it for keyboard movement.&lt;/li&gt;

&lt;li&gt;

Alt+V adds…&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&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/Crease29/pageliner" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>chrome</category>
      <category>extension</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How old have you been when you started programming and what was your first project? </title>
      <dc:creator>Kai Neuwerth</dc:creator>
      <pubDate>Thu, 16 Aug 2018 08:29:10 +0000</pubDate>
      <link>https://forem.com/crease29/how-old-have-you-been-when-you-started-programming-and-what-was-your-first-project--4m9i</link>
      <guid>https://forem.com/crease29/how-old-have-you-been-when-you-started-programming-and-what-was-your-first-project--4m9i</guid>
      <description>&lt;p&gt;When I was about 14 I got in touch with Photoshop and "designed" some themes for &lt;a href="https://www.woltlab.com/"&gt;Woltlab Burning Board 2&lt;/a&gt; (if someone of you even knows this) in my sparetime. After the designing I also wanted to write the templates and CSS for it. I adopted some other CMS and did the same there but my dream was always to become a web designer. So I did an internship and realized that I can't force myself to be creative 8 hours per day.&lt;/p&gt;

&lt;p&gt;I did another internship in the same company as developer. I knew HTML and CSS quite okay but PHP came on top. My first project there was a guestbook with an administration panel. Simple CRUD things with self written BB code parser (str_replace ROCKED 🤘!!!), fancy gif smileys, pagination and SQLi + XSS prevention (I exaggerate a bit 😛).&lt;/p&gt;

&lt;p&gt;I'm curious what your first project was!&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>I'm a fullstack web developer in ecommerce, Ask Me Anything!</title>
      <dc:creator>Kai Neuwerth</dc:creator>
      <pubDate>Wed, 15 Aug 2018 09:57:40 +0000</pubDate>
      <link>https://forem.com/crease29/i-a-fullstack-web-developer-ask-me-anything-3905</link>
      <guid>https://forem.com/crease29/i-a-fullstack-web-developer-ask-me-anything-3905</guid>
      <description>&lt;p&gt;I started my training back in 2009, finished it in 2012 working in a company that had a LAMPP-stack CMS as product with many modules for different industries (such as hotels, hospitals and call centers).&lt;/p&gt;

&lt;p&gt;After that I moved to an agency that made online shops based on &lt;a href="https://github.com/OXID-eSales/oxideshop_ce"&gt;OXID eShop&lt;/a&gt;. Really interesting clients and challenges!&lt;/p&gt;

&lt;p&gt;After that I decided to move to a bigger city (Hamburg, Germany) and I got employeed as lead fullstack developer in an agency that also creates online shops but based on &lt;a href="https://github.com/shopware/shopware"&gt;Shopware&lt;/a&gt;. Writing plugins, APIs and whatever the customer needs. That's where I am now.&lt;/p&gt;

</description>
      <category>ama</category>
    </item>
    <item>
      <title>My little personal website</title>
      <dc:creator>Kai Neuwerth</dc:creator>
      <pubDate>Tue, 14 Aug 2018 11:08:19 +0000</pubDate>
      <link>https://forem.com/crease29/my-little-personal-website-41e9</link>
      <guid>https://forem.com/crease29/my-little-personal-website-41e9</guid>
      <description>&lt;p&gt;Hi devs,&lt;/p&gt;

&lt;p&gt;this is my first post on dev.to and I don't know if it is the right place to share &lt;a href="https://kai.neuwerth.me/"&gt;my personal website&lt;/a&gt; but I want to give you a little insight what I found interesting while building it.&lt;/p&gt;

&lt;p&gt;So on a free sunday I just had the idea to create a tiny personal site to be a bit creative, share my social network accounts and SSH &amp;amp; OpenPGP keys.&lt;/p&gt;

&lt;p&gt;I finalized the "design" and wrote down the HTML, CSS &amp;amp; JS. I tested the PageSpeed score with &lt;a href="https://gtmetrix.com/"&gt;GTmetrix&lt;/a&gt; and had a pretty bad score. Fortunately GTmetrix provides some really good guides on how to improve certain criterias. Activated some caching here, enabled some webserver mods there and optimized some assets over there: &lt;strong&gt;Neat&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;After that I digged a bit deeper in performance on the loading. There was this flash of contents that really annoyed me. &lt;br&gt;
Maybe you see, that there is a video looping in the background (maybe not in Safari because Apple blocks auto-playing videos 🤦). So I had to bridge that time before the background video was loaded. The simple solution was just to take the first frame of the background video as background image. That worked great! 🙂&lt;/p&gt;

&lt;p&gt;I also added some &lt;code&gt;dns-prefetch&lt;/code&gt; tags to improve the loading of external assets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"dns-prefetch"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"//fonts.googleapis.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"dns-prefetch"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"//www.googletagmanager.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Overall it was interesting to see how granular, even the smallest website, can be optimized.&lt;/p&gt;

&lt;p&gt;If you have any questions, critique, improvements or similar experiences, I'd be glad if you just answer here!&lt;/p&gt;

&lt;p&gt;The code of my website is also, for sure:&lt;br&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--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Crease29"&gt;
        Crease29
      &lt;/a&gt; / &lt;a href="https://github.com/Crease29/kai.neuwerth.me"&gt;
        kai.neuwerth.me
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🎨 My personal website
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/Crease29/kai.neuwerth.me/master/assets/img/opengraph.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T6UfVTZV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/Crease29/kai.neuwerth.me/master/assets/img/opengraph.png" alt="Teaser image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
🎨 My personal website: kai.neuwerth.me&lt;/h1&gt;
&lt;p&gt;This repository holds my own static website.
You can see the production state &lt;a href="https://kai.neuwerth.me/" rel="nofollow"&gt;right here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I'm sorry, that I can't ship the background video that is running there because of the license,
but I'm sure you will pick your own background video anyways. 😊 Just place it in the &lt;code&gt;assets/webm/&lt;/code&gt; directory
and link it in the &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
Set up for development&lt;/h2&gt;
&lt;div class="highlight highlight-source-shell js-code-highlight"&gt;
&lt;pre&gt;git clone git@github.com:Crease29/kai.neuwerth.me.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; kai.neuwerth.me
npm install
grunt build&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
Feel free to use this codebase&lt;/h2&gt;
&lt;p&gt;I'd be happy if you just like this setup and "theme" and use it for your own website.
Feel free to leave an issue if you have problems or just want to share what you have done out of it. 😊 ✌️&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Crease29/kai.neuwerth.me"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



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

&lt;p&gt;Kai&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>website</category>
      <category>optimization</category>
      <category>pagespeed</category>
    </item>
  </channel>
</rss>
