<?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: Alexandre Plennevaux</title>
    <description>The latest articles on DEV Community by Alexandre Plennevaux (@pixeline).</description>
    <link>https://dev.to/pixeline</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%2F22406%2Fff5ccf89-7ca5-4197-8af8-06b7fc8349ae.jpeg</url>
      <title>DEV Community: Alexandre Plennevaux</title>
      <link>https://dev.to/pixeline</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pixeline"/>
    <language>en</language>
    <item>
      <title>Cache buster chrome extension</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Wed, 27 Aug 2025 09:39:49 +0000</pubDate>
      <link>https://dev.to/pixeline/cache-buster-chrome-extension-2dei</link>
      <guid>https://dev.to/pixeline/cache-buster-chrome-extension-2dei</guid>
      <description>&lt;p&gt;You know this situation when your colleagues tell you of a bug on the website and the answer is inevitably "&lt;em&gt;clear up your cache&lt;/em&gt;" ?&lt;br&gt;
Which is followed by the equally inevitable "&lt;em&gt;how do I do that?&lt;/em&gt;"&lt;br&gt;
I got tired of explaining it so I looked for a Chrome cache cleaner extension that was simple enough to use, not bloated with engagement baits and that did a thorough job of completely clearing the cache, so I made one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/cachebuster/fnnhibheklokmkpnbdeeiepbhlfapiea" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/cachebuster/fnnhibheklokmkpnbdeeiepbhlfapiea&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chromewebstore.google.com/detail/cachebuster/fnnhibheklokmkpnbdeeiepbhlfapiea" rel="noopener noreferrer"&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%2F6ckdoi835rhqpm7sh80z.png" alt=" " width="638" height="399"&gt;&lt;/a&gt;&lt;br&gt;
Give it a try and let me know how it works out for you!&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>extensions</category>
    </item>
    <item>
      <title>How to Create a Beautiful Public Profile Page for Free Without Facebook or Instagram</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Wed, 28 May 2025 08:57:52 +0000</pubDate>
      <link>https://dev.to/pixeline/how-to-create-a-beautiful-public-profile-page-for-free-without-facebook-or-instagram-32d4</link>
      <guid>https://dev.to/pixeline/how-to-create-a-beautiful-public-profile-page-for-free-without-facebook-or-instagram-32d4</guid>
      <description>&lt;p&gt;I use Google Maps a lot to find local shops and services — cafés, tattoo artists, yoga studios. But too often, their links lead to Instagram or Facebook pages, where I have to accept cookies, dodge login popups, or scroll past ads just to access basic info like opening hours or a portfolio. &lt;strong&gt;It’s frustrating.&lt;/strong&gt; This kind of information should be public by default — not locked behind Meta’s walls.&lt;br&gt;
&lt;strong&gt;This Isn’t What the Web Was Meant For.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Small businesses deserve better than to have their storefronts locked behind walled gardens.&lt;/p&gt;

&lt;p&gt;And people deserve access to that info without handing over their data to Meta.&lt;/p&gt;

&lt;p&gt;They should publish it on a bluesky account instead!&lt;/p&gt;

&lt;h2&gt;
  
  
  So I built a simple alternative: Hopefully Beautiful
&lt;/h2&gt;

&lt;p&gt;I’m working on hopefully.blue — a new tool that gives small businesses a clean, Bluesky-powered profile page. Think Linktree meets Micro.blog, but for Bluesky.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work ?
&lt;/h2&gt;

&lt;p&gt;Your business posts to Bluesky. We generate a public-facing profile that lives outside Meta/ X (any other big corp). No login needed. No cookies. Just your info, presented beautifully.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your bio and pinned post become your “About” section.&lt;/li&gt;
&lt;li&gt;Your latest photos show up on the side as an image wall.&lt;/li&gt;
&lt;li&gt;It's free &lt;/li&gt;
&lt;li&gt;It’s fast, privacy-friendly, and 100% public.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are a few examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://hopefully.blue/unpopularscience.bsky.social" rel="noopener noreferrer"&gt;spencer 🦈, a Marine Biologist&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://hopefully.blue/ahoy.eu" rel="noopener noreferrer"&gt;Ahoy Conference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hopefully.blue/malikafavre.bsky.social" rel="noopener noreferrer"&gt;Malika Favre&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hopefully.blue/404media.co" rel="noopener noreferrer"&gt;404media&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://hopefully.blue/es/apollonia.bsky.social" rel="noopener noreferrer"&gt;Apollonia Saintclair&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works with any Bluesky account (You can find mine &lt;a href="https://hopefully.blue/pixeline.be" rel="noopener noreferrer"&gt;here&lt;/a&gt; ) - all the data is loaded behind the scene (thanks to their amazing API) and hydrates a Sveltekit frontend app.&lt;/p&gt;

&lt;p&gt;It's available in five languages (using paraglideJS).&lt;/p&gt;

&lt;p&gt;Give it a try and let me know how that works for you in the comments below! &lt;/p&gt;

&lt;p&gt;Long live the open web! &lt;/p&gt;

</description>
      <category>bluesky</category>
      <category>instagram</category>
      <category>svelte</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Hide the 1password button on a form field</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Fri, 30 Jun 2023 16:09:48 +0000</pubDate>
      <link>https://dev.to/pixeline/hide-the-1password-button-on-a-form-field-4enb</link>
      <guid>https://dev.to/pixeline/hide-the-1password-button-on-a-form-field-4enb</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ojm5jc9486kny35ifhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ojm5jc9486kny35ifhy.png" alt="1Password icon, uninvited"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a web developer, I sometimes have a field in a form (e.g. inside a CMS) where it makes no sense for 1Password to pop up.&lt;/p&gt;

&lt;p&gt;So, to prevent 1password browser extension from showing the 1Password icon on a form field, simply add this attribute:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

data-1p-ignore


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Example:&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;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;autocapitalize=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;autocorrect=&lt;/span&gt;&lt;span class="s"&gt;"off"&lt;/span&gt; &lt;span class="na"&gt;spellcheck=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;  &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Enter your email address..."&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;source: &lt;a href="https://1password.community/discussion/117501/as-a-web-developer-how-can-i-disable-1password-filling-for-a-specific-field" rel="noopener noreferrer"&gt;1password's (angry) forum&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>BTCONF was 🤩🤪🚀 awesome</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Sat, 29 Apr 2023 19:42:34 +0000</pubDate>
      <link>https://dev.to/pixeline/btconf-was-2bb3</link>
      <guid>https://dev.to/pixeline/btconf-was-2bb3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Last week I attended &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers"&gt;Beyond Tellerrand&lt;/a&gt;, one of the most inspirational and thought-provoking events linking design, art and technology at an affordable price.&lt;/strong&gt; It left me feeling inspired and energized about my work, design and development practice. I harvested many useful takeaways for my professional but also personal life. Here is a summary if you are interested to find out more. &lt;/p&gt;

&lt;h2&gt;
  
  
  1/  🏠 Bring back the personal websites. Make your own, be weird.
&lt;/h2&gt;

&lt;p&gt;Once a very diverse experience built by amateurs and tweakers, browsing the web has become a very uniform and monotonous place. Most online presences are driven by the objective to make money, attract an audience, and success is measured in terms of traffic and quantitative data. Where is the personal website? Sophie Koonin shows us that there are still places where people experiment and find their own interactive tone of voice using their own little knowledge of code to express their personality. A very refreshing and “back to the roots” talk. You can &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers/sophie-koonin"&gt;watch it here&lt;/a&gt; (and check out my &lt;a href="https://pixeline.be/"&gt;own little personal website&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  2/ 🎚️ Achieve a coherent visual hierarchy using typography that scales according to the container.
&lt;/h2&gt;

&lt;p&gt;That talk was mind-blowing but a bit hard to follow for me as it dealt with many typographic concepts that I don’t use very often. Still, it shows that you can now use CSS to scale a headline according to its container’s dimensions and thus have one single css rule that makes all your headlines scale gracefully no matter the device and layout. &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers/scott-kellum"&gt;Watch it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Z3g16Pj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmdb8a6wx2msr3papf8d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Z3g16Pj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmdb8a6wx2msr3papf8d.jpg" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3/ 🤖 ET tu, AI?
&lt;/h2&gt;

&lt;p&gt;Mario Klingemann has been experimenting with AI in his art practice for almost a decade. After some rather humble beginnings, the fast-paced advancements in the field of AI have now become a challenge and opportunity for all of us. In his talk Mario shared his journey, his experiments  and reflected on the evolution of AI in the arts. Super interesting and uncanny use of AI in his work. &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers/mario-klingemann"&gt;More here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ooOigg3M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnz7163ab7libt4obh0e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ooOigg3M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnz7163ab7libt4obh0e.jpg" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4/ 🏯 Meditation with calligraphy.
&lt;/h2&gt;

&lt;p&gt;The work of Japanese calligraphy artist Aoi Yamaguchi. Aoi presented her work and her design process, in which meditation is paramount, with a lot of mental and physical preparation. An ode to being in your doing. &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers/aoi-yamaguchi"&gt;Watch here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vcziIHrK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fu7n0g6jqcc45d0cuekt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vcziIHrK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fu7n0g6jqcc45d0cuekt.jpg" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5/ 👩🏻‍🎤 How to be an ultra artist
&lt;/h2&gt;

&lt;p&gt;A talk about resilience as an artist and designer, by Gemma O’Brien. Main take away - don’t just do client work, keep doing what you love every day or you’ll exhaust yourself. Her graphic design work is really beautiful and impressive - &lt;a href="https://www.youtube.com/watch?v=gUvSyqV7lz0"&gt;watch it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E53L5GpL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g1v78fzzba2hbjshe7px.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E53L5GpL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g1v78fzzba2hbjshe7px.jpg" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6/ 🐐 Goats and cars: beyond failure
&lt;/h2&gt;

&lt;p&gt;You know how we say learning doesn’t happen without failure ? Over the past decade Thomas Thwaites has created an eclectic range of projects, at the edge of the technologically possible. He talked about some of his  work, his narrative design process, his adventures as &lt;a href="https://www.thomasthwaites.com/a-holiday-from-being-human-goatman/"&gt;a goat&lt;/a&gt;, and his current project to create a completely Harmless Car, to explore the landscape of guilt. Fun and waaaay outside the box. Really inspiring!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vLKHsxeg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0knovpjqu9otsq3yrapz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vLKHsxeg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0knovpjqu9otsq3yrapz.jpg" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7/ 🤯 Emotionally fit
&lt;/h2&gt;

&lt;p&gt;Perhaps my favourite talk of the conference. The world is beginning to understand that stress, burnout, anxiety – and, let’s face it, the universal pains of adulting – can drastically affect a company’s bottom line. To be successful today, business leaders and employees need to be emotionally and physically healthy. There are plenty of apps and products that claim to help achieve this, but an effective focus on mental and emotional health must be built from the inside out. Emily Anhalt, a renowned psychologist, shared 7 traits of an emotionally fit leader and had us challenge our defensive impulse when interacting with others. She explored the importance of supporting yourself and your team by developing emotional fitness and gave practical, concrete tips for building a true culture of wellness.  You can &lt;a href="https://youtu.be/VEmWkdBco00"&gt;watch the talk here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wb3o5st8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x4ahni7jopui73n8x63k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wb3o5st8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x4ahni7jopui73n8x63k.jpg" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8/ 蝾 Typography for the non-latin world
&lt;/h2&gt;

&lt;p&gt;One of the co-founders of Google Fonts and its current Design Lead, &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers/tobias-kunisch"&gt;Tobias Kunisch&lt;/a&gt; showed that open source fonts are an important way in which we can provide access to typography for anyone designing and building things on the internet. Especially in regions of the world that don’t use the latin alphabet. New technologies like variable fonts are changing type to be more like software and open up entirely new possibilities in digital spaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  9/ 👩🏼‍💻 Modern CSS layout
&lt;/h2&gt;

&lt;p&gt;In this session by CSS Wizard &lt;a href="https://michellebarker.co.uk/"&gt;Michelle Barker&lt;/a&gt; we saw some real-world use cases for container queries, subgrid, the :has() pseudo class (or parent selector) and much more,  to build robust, flexible and creative layouts that respond to both content and context. &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers/michelle-barker"&gt;Read more here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  10/ 🤯 Animating the Impossible
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.cassie.codes/"&gt;Cassie Evans&lt;/a&gt; (Greensock but check &lt;a href="https://www.cassie.codes/"&gt;her cool website&lt;/a&gt;) looked at some “impossible” animation challenges and how to achieve smooth UI animations when dealing with DOM changes, responsive layouts, dynamic content and user interaction. The one trick I took away is to avoid browser repaint by animating from the end state to start, instead of the (more intuitive) start to end state. &lt;a href="https://youtu.be/v5oxrZWAq78"&gt;Watch the talk here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OT0jqPD_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lsaz33eemwu7zexc94lv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OT0jqPD_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lsaz33eemwu7zexc94lv.jpg" alt="Image description" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11/ 🌈 Side Quests: Satisfy Your Distracted Self
&lt;/h2&gt;

&lt;p&gt;Random doesn’t need to be intimidating. Sometimes you just need to say “yes” to yourself. Technology artist &lt;a href="https://beyondtellerrand.com/events/dusseldorf-2023/speakers/hugh-elliott"&gt;Hugh Elliot&lt;/a&gt;t shared how by quickly going from idea to prototype and iterations, he was able to have impact, notably on supporting the  LGBTQ+ community in a year-long project involving homemade led devices and photography.  One key takeaway is: make things for you, not for likes. A welcome reminder in the age of instagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  12/ 😒 Past, present and future
&lt;/h2&gt;

&lt;p&gt;I was a bit disappointed with this last talk: usually a last talk leaves us on a high note and energized, but this one felt like watching an old man looking back at his life and rambling about work and the challenges of leading a design studio. Some of his work caught my eyes and interest, but I didn’t really get anything else out of this talk. Well, his interpretation of Radioactivity by Kraftwerk was a nice “blast from the bast” introduction (pun intended).&lt;/p&gt;

&lt;h2&gt;
  
  
  To sum it up
&lt;/h2&gt;

&lt;p&gt;Once again, the overall atmosphere of the conference sets it apart from other conferences: it’s relaxed, the sponsor booths around the place are interesting, there are people of all genders and many different countries and fields of work: designers, developers, marketing, artists ...  The merch is yummy and everyone is super friendly. It feels hand crafted with care so that everyone feels welcome. It brings out the open mindedness and curiosity of looking beyond yourself, into the universe.... beyond the tellerrand.&lt;/p&gt;

&lt;p&gt;That's it! Thanks for reading this far, and thank you &lt;a href="https://marcthiele.com/"&gt;Marc Thiele&lt;/a&gt; for organizing such an inspiring event!&lt;/p&gt;

</description>
      <category>conference</category>
      <category>design</category>
      <category>ai</category>
      <category>css</category>
    </item>
    <item>
      <title>How to use Redis with WordPress (docker-compose)</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Fri, 25 Nov 2022 13:14:00 +0000</pubDate>
      <link>https://dev.to/pixeline/how-to-use-redis-with-wordpress-docker-compose-55fk</link>
      <guid>https://dev.to/pixeline/how-to-use-redis-with-wordpress-docker-compose-55fk</guid>
      <description>&lt;p&gt;I'm putting this here because it took me a long while to figure this out.&lt;/p&gt;

&lt;p&gt;I wanted to improve WordPress's performance by using Redis object caching. My environment is defined in a docker compose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.6'&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;redis:alpine'&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;6379:6379'&lt;/span&gt;
      &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
      &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;6379'&lt;/span&gt;

  &lt;span class="na"&gt;wordpress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;wordpress:latest'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is a &lt;a href="https://fr.wordpress.org/plugins/redis-cache/" rel="noopener noreferrer"&gt;handy WordPress plugin&lt;/a&gt; for that, but of course, it needs redis to be installed and configured properly. That's the part I struggled with as it could not connect to my redis container.&lt;/p&gt;

&lt;p&gt;Normally, Redis should work out-of-the-box with WordPress as long as it is accessible via localhost:6379.&lt;/p&gt;

&lt;p&gt;The thing is, in a docker setup the redis instance is accessible via its container name.&lt;/p&gt;

&lt;p&gt;So in the above example, in order for WordPress to find it, you need to modify the constant &lt;code&gt;WP_REDIS_HOST&lt;/code&gt; to "redis" in your wp-config.php file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_REDIS_HOST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'redis'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'WP_REDIS_PORT'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'6379'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Additional constants are available. More information is available &lt;a href="https://github.com/rhubarbgroup/redis-cache/wiki/Connection-Parameters" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;That's it, really. I hope this helps someone.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>How to deploy a Sapper PWA on GitHub Pages</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Sun, 05 Jan 2020 19:30:45 +0000</pubDate>
      <link>https://dev.to/pixeline/how-to-deploy-a-sapper-pwa-on-github-pages-47lc</link>
      <guid>https://dev.to/pixeline/how-to-deploy-a-sapper-pwa-on-github-pages-47lc</guid>
      <description>&lt;p&gt;Here is a quick and easy tutorial on how to deploy a PWA made with &lt;a href="https://sapper.svelte.dev/"&gt;Sapper&lt;/a&gt; &amp;amp; &lt;a href="https://svelte.dev"&gt;Svelte&lt;/a&gt; on GitHub Pages.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure your project's GitHub repository (in the repository &lt;code&gt;/settings&lt;/code&gt;) to use the GitHub Pages functionality and choose to publish the content of the &lt;code&gt;gh-pages&lt;/code&gt; branch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3hmwReIU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7iloh3jir2p42h4itl6p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3hmwReIU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7iloh3jir2p42h4itl6p.png" alt="GitHub Settings interface" width="777" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pay extra attention to your repository slug name: it will become the foldername value to use later. In this example, it is "mathr", a &lt;a href="https://pixeline.tk/mathr"&gt;personal project&lt;/a&gt; of mine (math quizz game for my bored teenage girl 🤓 )&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Build your SPA
&lt;/h2&gt;

&lt;p&gt;... until the point of readiness (obviously ;-) )&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Export the code and check if it is good to go
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx sapper &lt;span class="nb"&gt;export
&lt;/span&gt;npx serve __sapper__/export
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Serving from a subfolder
&lt;/h2&gt;

&lt;p&gt;That's the tricky part. Since as a GitHub Pages, your project will most probably be served in a subfolder (unless you use your own domain name), modify the file &lt;code&gt;src/server.js&lt;/code&gt;, to mention your subfolder. It will be used as the base tag href attribute value:&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;base&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/yourproject"&lt;/span&gt;&lt;span class="nt"&gt;&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="nx"&gt;polka&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yourproject&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;-- replace yourproject with your repo name&lt;/span&gt;
        &lt;span class="nx"&gt;compression&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="nx"&gt;sirv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;static&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;dev&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
        &lt;span class="nx"&gt;sapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;middleware&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="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;err&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Deploy via the Terminal
&lt;/h2&gt;

&lt;p&gt;We want to be able to deploy using a simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To achieve that, install this npm package: &lt;a href="https://www.npmjs.com/package/gh-pages"&gt;gh-pages - npm&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;gh-pages &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in the root of your project folder, create the file &lt;code&gt;/scripts/gh-pages.js&lt;/code&gt; with this content:&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;var&lt;/span&gt; &lt;span class="nx"&gt;ghpages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gh-pages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ghpages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__sapper__/export/yourproject&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="c1"&gt;// &amp;lt;-- replace yourproject with your repo name&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;branch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gh-pages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://github.com/username/yourproject.git&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Your name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Your Email address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Deploy Complete!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, update your &lt;code&gt;package.json&lt;/code&gt; project file with the following (again, replace &lt;code&gt;yourproject&lt;/code&gt; with your repo name):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sapper export --basepath yourproject --legacy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deploy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run export &amp;amp;&amp;amp; node ./scripts/gh-pages.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Finally, test it out !
&lt;/h2&gt;

&lt;p&gt;From inside your project folder, launch this command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;bash&lt;br&gt;
npm run deploy&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Following these steps worked for me 🚀. Do let me know if you run into hiccups ;-)&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>svelte</category>
      <category>sapper</category>
      <category>github</category>
    </item>
    <item>
      <title>Gamifying a coding bootcamp: the BeCode LUX</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Mon, 16 Dec 2019 20:16:25 +0000</pubDate>
      <link>https://dev.to/becodeorg/gamifying-a-coding-bootcamp-the-becode-lux-86l</link>
      <guid>https://dev.to/becodeorg/gamifying-a-coding-bootcamp-the-becode-lux-86l</guid>
      <description>&lt;p&gt;Learning to code is fun (most of the time). Learning to code with the added goal of &lt;strong&gt;landing a first job as a Junior Developer&lt;/strong&gt; after just 7 months of training can be daunting. Gamification is a great way to build self-confidence through this intensive learning period.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://becode.org/" rel="noopener noreferrer"&gt;BeCode&lt;/a&gt; (the largest network of inclusive coding bootcamps in Belgium), we may have found a way to both gamify our trainings and improve the job marketability of our learners at the same time.&lt;/p&gt;

&lt;p&gt;It did not happen overnight. All the pieces fell into place recently, while working on our latest advanced training: DevSecOps. This article explains how we gradually came to design &lt;strong&gt;the BeCode Learning User Experience&lt;/strong&gt; (or LUX, as in &lt;em&gt;Light&lt;/em&gt; in Latin).&lt;/p&gt;

&lt;h2&gt;
  
  
  The bits and pieces of our gamification system
&lt;/h2&gt;

&lt;p&gt;Here is more or less chronologically how the pieces started stacking up, through good old trial and error and iterations over almost 3 years.&lt;/p&gt;

&lt;h3&gt;
  
  
  0. The ground floor
&lt;/h3&gt;

&lt;p&gt;When we launched BeCode in 2017 we did not want to create just another school. We wanted learning to be fun, collective, positive, healing. We wanted to surround our learners with the comfort, structure, autonomy and kindness needed to dare take risks and embrace failure. After all, learning is about searching and experimenting "until it works". Inspired by &lt;a href="https://simplon.co/" rel="noopener noreferrer"&gt;Simplon&lt;/a&gt; (a huge network of inclusive coding bootcamps in France), we replaced the teachers by coaches and chose active learning techniques, where the learner is in charge and controls its learning experience. We unleashed the beast in 2017 and since then, boy have we experimented. &lt;/p&gt;

&lt;h3&gt;
  
  
  1. Project-based learning
&lt;/h3&gt;

&lt;p&gt;We organize project-based learning using two types of challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Learning challenges&lt;/strong&gt; are great to explore, try, experiment. They usually involve a lot of googling, discussing and sharing, trying and failing... When the deadline is reached, what sits on the learner's hard drive is most probably buggy, dirty, dysfunctioning, or completely broken. But they have learned.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Consolidation challenges&lt;/strong&gt; come after a few learning challenges to re-invest what has been learned/ explored previously. This type of challenges focuses on the quality of result. It can be used to assess whether the target skills involved in the challenge have reached a professional level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find more about our project-based approach on this Slide Deck &lt;a href="https://docs.google.com/presentation/d/e/2PACX-1vQ0d_TigUjz27UZ9RUgXpbZa1EJ9IB_hmMSEQuVoX0gN4i_DR7vgX-ZpesaAfawjy5tXy-WIPthEbLe/pub?start=false&amp;amp;loop=false&amp;amp;delayms=3000" rel="noopener noreferrer"&gt;BeCode LUX: the Learning User Experience&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Informal learning is hard to certify
&lt;/h3&gt;

&lt;p&gt;BeCode basically provides the conditions of learning. Trainers do not teach but stimulate learning via group dynamics, individual coaching, instilling into the group a "failing forward" approach to mistakes and of course, real-life challenges. According to &lt;a href="https://www.coe.int/en/web/lang-migrants/formal-non-formal-and-informal-learning" rel="noopener noreferrer"&gt;European education administration&lt;/a&gt;, the type of learning we offer sits somewhere between &lt;strong&gt;experiential and non-formal learning&lt;/strong&gt;, which by definition happens while working on real-life projects. There are no clear, unified certification system for that. And that’s okay… until you need to reassure companies that you are worth being hired, with no diploma to show for it. This has been an ongoing question for us to solve: how to certify skills in a non-formal learning environment ?&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Open Badges FTW!
&lt;/h3&gt;

&lt;p&gt;In the meanwhile, and pretty much since the first day of the first training, we have been playing around with the &lt;a href="https://openbadges.org/" rel="noopener noreferrer"&gt;Open Badges&lt;/a&gt; technology. It's important for the learner's self-confidence to receive gratifications for their achievements, big or small. Positive reinforcement is key to learning and badges felt like a good way to do that.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuhhxv71tpevuxozhnu2g.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fuhhxv71tpevuxozhnu2g.gif" alt="Have a badge, you earned it!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We started creating and granting badges for every technology we use during the training.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. How to assess Tech Skills ?
&lt;/h3&gt;

&lt;p&gt;The point of these challenges is to grow the skills enabling the learner to enter the job market, bringing value to companies.&lt;/p&gt;

&lt;p&gt;Of course, various degrees of craftsmanship are possible. Again, we need something as simple as possible and easy to understand to maximise adoption by everyone - learners and companies. Through various iterations, we came up with this 4-level grid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Level 0: Skill is non-existent&lt;/li&gt;
&lt;li&gt;  Level 1: Skill has been explored - the candidate has interest and motivation to grow the skill.&lt;/li&gt;
&lt;li&gt;  Level 2: The candidate has been able to use that skill on a professional level.&lt;/li&gt;
&lt;li&gt;  Level 3: The candidate has acquired enough knowledge and experience and has the teaching skills required to be able to train people on that technical skill&lt;/li&gt;
&lt;li&gt;  Level 4: The candidate has contributed to the technology source code, aka "Godmode" - it is of course very rare that someone reach that level. We consider this level to be the ceiling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practically it means that learners having finished a learning challenge and shown genuine interest and motivation could claim the Technology’s level 1 badge. When finishing a consolidation challenge, they could get the technology’s level 2 badge. If they give a hands-on workshop on the technology, they could claim to have reached level 3. If Linus Torvald ever comes to BeCode (you never know…) we would grant him Linux’s Level 4 badge. (I'm sure he'd be thrilled!)&lt;/p&gt;

&lt;p&gt;From a business point of view, a level 1 badge certifies that the candidate has "some exploratory" knowledge and is interested to master that skill but is not autonomous yet nor able to use the technology in a real-life professional scenario - some senior mentoring would be required.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. LinkedIn &amp;lt;3 open badges !
&lt;/h3&gt;

&lt;p&gt;An important benefit of Open Badges is the fact that they can be embedded on the Learner's LinkedIn profile (&lt;a href="https://medium.com/becode/sharing-open-badges-on-linkedin-2cddb05e0aa7" rel="noopener noreferrer"&gt;here is how&lt;/a&gt;). The potential employer, reviewing the profile, can click on the badges and check what it means and more importantly, how it was obtained. In that regard, open badges are much more transparent than diplomas and classic certificates. &lt;/p&gt;

&lt;p&gt;They are also very relevant: since every learner is different, the set of badges acquired can more closely represent the strengths of each profile. This is a great way to improve the marketability of our learners and move beyond the "informal" aspect of their training, indeed giving it a recognizable form.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Soft skills badges
&lt;/h3&gt;

&lt;p&gt;In the summer of 2019, we undertook an important work synthesizing what soft skills we can observe (and thus certify) during the seven months of the bootcamps. Through a couple of co-creation workshops involving smart people from various disciplines (management, previous learners, trainers, marketing people and an external HR expert) we came up with a vocabulary of &lt;a href="https://docs.google.com/presentation/d/e/2PACX-1vQiIr7nHbiK-XyPvHUoic6XZyNs2fr1nGhf71EmrbXY1uCUuwIni3bKQIrC2IaWNbzXoHFc0d7v_ljZ/pub?start=false&amp;amp;loop=false&amp;amp;delayms=5000&amp;amp;slide=id.g4dfce81f19_0_45" rel="noopener noreferrer"&gt;10 Soft Skills badges&lt;/a&gt; that enable everyone at BeCode speak the same language about the behaviours expected in a professional environment.&lt;/p&gt;

&lt;p&gt;When we introduced the soft skill badges to the learners and fellow trainers from Simplon (our French partner), it brought a lot of enthusiasm as it gamifies the acquisition of soft skills, whereas soft skill training is usually experienced as "condescending" and is generally a hard to tame beast, since it is so subjective. Unwillingly, we had created the embryo of a gamification system.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fx7kk0vn12mxoj7ac02mt.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fx7kk0vn12mxoj7ac02mt.png" alt="The Four Soft skills required to be certified"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Career paths
&lt;/h3&gt;

&lt;p&gt;Ultimately, badges are a mean to an end: finding a job, starting a career path.&lt;/p&gt;

&lt;p&gt;Well, in essence, &lt;em&gt;a career path is a set of tech skills and soft skills to acquire.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If we can describe a career path through the necessary combination of level 1-4 badges, we have a clear way to describe to the learner what path they need to take to achieve their goals. That's exactly what we did, involving company experts in the process of content creation.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjh4uq887e5r81n1zbp6y.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fjh4uq887e5r81n1zbp6y.png" alt="Careers described in skills"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To certify that a learner has acquired all the required badges, we need another badge, representing the career: we called them "meta badges". Here is an example of the Secure Developer metabadge, and the badges necessary to earn it.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fo5hbsjecevr6a0rvrigs.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fo5hbsjecevr6a0rvrigs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion: the LUX
&lt;/h3&gt;

&lt;p&gt;The gamification of the Learning User Experience at BeCode essentially means acquiring skills through challenges, deciding which career path to pursue and when learning goals are achieved, certifying them using open badges. The goal of the game is by the end of the training to obtain the meta badge corresponding to the learner's desired career path. That badge certifies that the learner has the soft and technical skills required to enter the job market in that career, and with enough self-confidence to grow into the position autonomously.&lt;/p&gt;

&lt;p&gt;What are the next steps ? Our next trainings will implement it from the starting day. It will be a real life pilot from which I expect to discover a lot of opportunities for improvement. We also need to update our Junior Web Developer training to match this structured gamification approach.&lt;/p&gt;

&lt;p&gt;Also, I am eager to see how “open minded” will companies be about these badges as a way to assess a candidate’s skills. They make a lot of sense to us, trainers, but time will tell if it is actually effective in “landing that first job in IT” – the hardest one.  &lt;/p&gt;

</description>
      <category>becode</category>
      <category>openbadges</category>
      <category>bootcamp</category>
      <category>gamification</category>
    </item>
    <item>
      <title>Why I love the word Iteration</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Fri, 08 Nov 2019 19:17:16 +0000</pubDate>
      <link>https://dev.to/pixeline/why-i-love-the-word-iteration-a9b</link>
      <guid>https://dev.to/pixeline/why-i-love-the-word-iteration-a9b</guid>
      <description>&lt;p&gt;I love the word Iteration because... It means I don't need to get it right at the first attempt.&lt;br&gt;
There is nothing more liberating. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automate deployment using GitHub hooks</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Tue, 13 Aug 2019 15:08:29 +0000</pubDate>
      <link>https://dev.to/becodeorg/deploy-an-application-automatically-using-github-hooks-50fd</link>
      <guid>https://dev.to/becodeorg/deploy-an-application-automatically-using-github-hooks-50fd</guid>
      <description>&lt;p&gt;The first time I witnessed the cleverness of the &lt;em&gt;deployment using git&lt;/em&gt; strategy was with GitHub Pages: simply &lt;code&gt;git push&lt;/code&gt; to the master branch of your repository and your static web page is updated. As simple as that.&lt;/p&gt;

&lt;p&gt;I wanted to be able to deploy with the same elegance on my own servers and for more complex applications. I thought I understood how it worked but not how to automate it. So I would manually &lt;code&gt;ssh&lt;/code&gt; into the server, &lt;code&gt;cd&lt;/code&gt; my way into the project folder, then &lt;code&gt;git pull&lt;/code&gt;. Every. time. Not really convenient.&lt;/p&gt;

&lt;p&gt;When I discovered &lt;a href="//htts://roots.io/trellis"&gt;Trellis&lt;/a&gt; I learned to use ansible  to be able to deploy by using a oneliner: &lt;code&gt;./deploy.sh production domain.com&lt;/code&gt;)...&lt;/p&gt;

&lt;p&gt;But then Ansible is a power tool, which does a lot of other things than just deploy. And I learned the hard way that I should not update my local Ansible version otherwise... All hell break loose. &lt;br&gt;
Also, I would still have to &lt;code&gt;git push&lt;/code&gt; to the remote prior to launching the deployment.&lt;/p&gt;
&lt;h2&gt;
  
  
  One line to rule them all
&lt;/h2&gt;

&lt;p&gt;Working at &lt;a href="https://becode.org"&gt;BeCode&lt;/a&gt; is cool because you get to meet dozen of fellow developers, craving to learn and explore. One of our learners pointed me in the direction of using a GitHub Post-Receive hook, thanks to which deployment is a simple : &lt;code&gt;git push production master&lt;/code&gt;. The hook launches a local script that &lt;code&gt;git checkout&lt;/code&gt; the master branch on the production server, then runs any other custom operations you want (such as &lt;code&gt;composer update&lt;/code&gt; for example).&lt;/p&gt;

&lt;p&gt;Let's see how to set it up.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Setup a bare Git repository on production server
&lt;/h3&gt;

&lt;p&gt;First, create a "bare" repository – one that does not contain the working copy files. It basically is the content of the .git repository folder in a normal working copy. Name it whatever you like (you could also omit the .git part from project.git but I find it best to keep it):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/project/folder/
&lt;span class="nb"&gt;mkdir &lt;/span&gt;project-name.git
&lt;span class="nb"&gt;cd &lt;/span&gt;project-name.git
git init &lt;span class="nt"&gt;--bare&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configure the GitHub hook
&lt;/h3&gt;

&lt;p&gt;Create a post-receive hook at &lt;code&gt;/path/to/project/folder/project-name.git/hooks/post-receive&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;hooks/post-receive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Fill it with your version of the following code (use your specific folder paths) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nv"&gt;NOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +&lt;span class="s1"&gt;'%d-%m-%Y_%T'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# check out master branch&lt;/span&gt;
&lt;span class="nv"&gt;GIT_WORK_TREE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/destination/folder/htdocs git checkout &lt;span class="nt"&gt;-f&lt;/span&gt; master

&lt;span class="c"&gt;# custom steps for deployment&lt;/span&gt;
&lt;span class="c"&gt;# For example, let's execute composer to refresh our dependencies : &lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/destination/folder/htdocs
composer update
&lt;span class="c"&gt;# backup current version, in case we need to do a rollback&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; /path/to/destination/folder/htdocs/. /backups/project-name/&lt;span class="nv"&gt;$NOW&lt;/span&gt;/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Make sure it is executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x post-receive
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Add the remote-repository to your local system
&lt;/h3&gt;

&lt;p&gt;Let's now add a reference to this bare repository to our local system, as a remote location. Let's call this remote "production". (It could also be called "staging" or "live" or "test"... should you want to deploy to a different system or to multiple systems.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/path/to/working-copy/
&lt;span class="nv"&gt;$ &lt;/span&gt;git remote add production ssh://username@myserver.com:22/path/to/project/folder/project-name.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Check that your new remote is now available, and all the existing ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  And... that's it!
&lt;/h3&gt;

&lt;p&gt;You can now deploy using this beautiful one liner :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;git push production master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Going beyond ? TDD !!
&lt;/h2&gt;

&lt;p&gt;With this, I have the raw basis of a deployment pipeline. The next step would be to add code testing to make sure code updates do not introduce bugs or break anything (regression testing). I assume I should look at how to use &lt;a href="https://github.com/trinitronx/ansible-tdd"&gt;Ansible&lt;/a&gt; for that. &lt;/p&gt;

&lt;p&gt;Since I don't know how to do that yet, I'll leave you to &lt;del&gt;google&lt;/del&gt; &lt;a href="https://dev.to/search?q=TDD"&gt;dev.to/search&lt;/a&gt; your way around that one ! &lt;/p&gt;

</description>
      <category>git</category>
      <category>githubhooks</category>
      <category>deployment</category>
      <category>becode</category>
    </item>
    <item>
      <title>Helping your team become more focused</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Thu, 05 Apr 2018 17:35:44 +0000</pubDate>
      <link>https://dev.to/pixeline/helping-your-team-become-more-focused-38ff</link>
      <guid>https://dev.to/pixeline/helping-your-team-become-more-focused-38ff</guid>
      <description>&lt;h2&gt;
  
  
  It happens to the best of us.
&lt;/h2&gt;

&lt;p&gt;During the &lt;a href="https://becode.org"&gt;BeCode&lt;/a&gt; boot camp, junior developers enjoy a lot of freedom and autonomy so that they can grow the skillset adapted to their personal interests : frontend, backend, fullstack, devOps ... &lt;/p&gt;

&lt;p&gt;These are exceptional human beings. Each was selected for the sparks in its eyes when facing a new problem. For their ability to work collaboratively. For their &lt;em&gt;grinta&lt;/em&gt;. For being passion-driven and knowledge-hungry.&lt;/p&gt;

&lt;p&gt;As their coach, I want to know them better. So I observe them a lot. We talk, in private sessions or in group discussions. &lt;/p&gt;

&lt;p&gt;Doing so I realized they often lose energy and time on pointless explorations. Venturing on the pretty much infinite fields of learning resources provided by the internet can be tricky. I know this because I have been there. More often than not, I would start a tutorial, and at the first difficulty, switch to another without finishing the first one. Then again, starting stuff, not finishing. As a result, it often becomes difficult for them to meet deadlines and basically, get things done. Which is frustrating and bad for morale. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When information is cheap, attention becomes expensive.&lt;br&gt;
– James Gleick&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What happens is, when we are trapped in the process of exploration, we lose focus on what we were actually trying to get done.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Tick. Tick. Tick.
&lt;/h2&gt;

&lt;p&gt;Part of my job is to remind them that we are on a clock: we have six months to get as far as possible towards their own digital horizon. After that, they have to jump, try to swim the best they can with their new set of skills, or die trying (dramatic pun intended). &lt;strong&gt;Every lost second does not come back.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Too much information becomes a distraction that blurs our sense of focus. It happens to all of us. Every day. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's understandable, but unacceptable&lt;/strong&gt; given the objective of becoming the best developers they can be in six months.&lt;/p&gt;

&lt;p&gt;My answer to that : &lt;strong&gt;the pleasure of GTD (Getting Things Done) through self discipline&lt;/strong&gt;. I want them (and me!) to stay on focus despite the distractions and the fast pace of life at BeCode, where opportunities come by the dozen (Meetups, hackathons, conferences, talks, networking events, customer projects …). &lt;/p&gt;

&lt;p&gt;And so I introduced a ritual that I actually discovered a few years ago whilst working with the fine team at &lt;a href="https://basedesign.com"&gt;Base Design&lt;/a&gt;: the &lt;strong&gt;"Challenges of the week"&lt;/strong&gt; ritual.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to conduct the Challenges of the Week ritual
&lt;/h2&gt;

&lt;p&gt;This is how I roll it with my startup.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give the team five minutes, plenty of post-its and this instruction: &lt;em&gt;"Using post-its, write down something you would like to have finished by the end of this week. One post-it per objective. Formulate it so that it's actually possible to say *done/not done&lt;/em&gt;."*&lt;/li&gt;
&lt;li&gt;Allocate an empty spot on the wall where post-it will be placed. Visible, so that it acts as a silent reminder during the week. Have plenty of empty space in front so that the team can gather up. &lt;/li&gt;
&lt;li&gt;Each team member comes in turn in front of the team and verbalises his objectives one by one and sticks them on the wall. I like it Popcorn style: whomever wants speaks, as long as everyone does. Do not designate, if possible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WzmJiSS8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/23f27a8o2ljce1u6tto6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WzmJiSS8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/23f27a8o2ljce1u6tto6.jpg" alt="The Challenges of the Week, in action."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Challenges of the Week, in action at startup Lovelace.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;The next week at the same time, each person publicly reviews its objectives, removes the "done" post-it, and explains what happened with the remaining ones. He or she then adds her new objectives.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As facilitator, allow comments from teammates : if an objective triggers a remark, there might be an opportunity for collaboration. But let's not loose the… focus of the exercice by turning this into a debate. Rythm is everything. This should set everyone into motion and kick off the week. Speaking of rythm: the whole process lasts about 20 minutes.&lt;/p&gt;

&lt;p&gt;We perform this ritual each Monday morning. This timing gives us a nice bonus of switching ourselves from "week-end" mode to "work week" mode. &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Challenges of the week&lt;/strong&gt; has become a cornerstone ritual that sets the mind into motion after the week-end and align each team member to its individual objectives. It indirectly builds motivation and allows everyone knows where each other stands, thus improving the team cohesion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jr7zslM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7ci74vhhqs35xqb31r2q.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jr7zslM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7ci74vhhqs35xqb31r2q.jpg" alt="Here is the nicely pimped-up board of the Swartz startup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here is the pimped-up board of the Swartz startup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a simple ritual. Simple and effective when done seriously. Simple enough that, perhaps, you should try it. Unless you and your team uses another ritual? Feel free to share in the comments.&lt;/p&gt;

&lt;p&gt;(Photo credits: &lt;a href="https://twitter.com/SlyLnss"&gt;Syl&lt;/a&gt; / &lt;a href="https://twitter.com/miloon"&gt;Miloon&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>agile</category>
      <category>productivity</category>
      <category>workplace</category>
      <category>becode</category>
    </item>
    <item>
      <title>Progressive Enhancement is non-negotiable.</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Fri, 09 Feb 2018 11:38:20 +0000</pubDate>
      <link>https://dev.to/pixeline/progressive-enhancement-is-non-negotiable--1g57</link>
      <guid>https://dev.to/pixeline/progressive-enhancement-is-non-negotiable--1g57</guid>
      <description>&lt;p&gt;I was drawn to the Internet back in 1997, when I got a proper (ISDN!) connection at my first office position in a large European company. These were the days of MS FrontPage. The websites I built were an horrendous bunch of code, mixture of bastardy html and some proprietary version of a prehistorical version of Javascript by Microsoft. &lt;/p&gt;

&lt;p&gt;The browser war was raging and Netscape was the clear leader. There was pretty much one screen standard : 1024x768 resolution replaced the legacy 800x600. It seemed huge! Screens were bulky analog monitors.  Of course, we used &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; and loads of 1px-square transparent gif files as spacers to make interfaces, conceived by print(!) designers. &lt;/p&gt;

&lt;p&gt;There was no other choice than code like a pyromaniac bastard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YrkGGVpL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4vkx991cgq3t1xkqann2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YrkGGVpL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4vkx991cgq3t1xkqann2.jpg" alt="That was the Internet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;21 years later, this is 2018. We still build static websites (it was almost deemed old-fashioned a few years ago to &lt;em&gt;not have&lt;/em&gt; a dynamic website) but also SPA (Single Page Applications), Progressive Web Apps. Virtual Reality is becoming mainstream. Fridges automatically order tomorrows' bottle of milk from an online dairy store. Standards have arisen for html, css and javascript. It's never been easier to build something and put it online. &lt;/p&gt;

&lt;p&gt;Yet, turn off javascript and half of the internet breaks. Because of that "cool javascript framework" that allows pretty much anyone build things fast, without even understanding the underlying architecture, or the purpose of JS Frameworks : SPA, not presentational websites. &lt;/p&gt;

&lt;p&gt;AS often is the case, "Fast" for the developer means "bad" for the end-user. &lt;/p&gt;

&lt;p&gt;As developers, for the sake of keeping the universal access of the information we put online (and the very reason we exist), we need to re-claim the Progressive Enhancement methodology. Here are just a few reasons why:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. It is good for the user
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Disabled people, for whom static rendering and full-page reloads are typically still more (not exclusively, but more, and more easily) accessible.&lt;/li&gt;
&lt;li&gt;Search engine spiders (it is being said the GoogleBot parse javascript, but how well exactly ? Google does not recommend js-only interfaces, so, that's that)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. It is good for the developer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It's not hard : the &lt;code&gt;html.js&lt;/code&gt; trick enables writing CSS only applying to javascript-enabled contexts. Javascript framework ? Use the &lt;code&gt;&amp;lt;noscript&amp;gt;&lt;/code&gt; tag, at the very least, so that everyone (including the GoogleBot) gets access to your content.
&lt;/li&gt;
&lt;li&gt;It's not expensive, on the contrary : you gain time because your code is more maintainable and easier to debug. Thank you miss &lt;a href="https://en.wikipedia.org/wiki/Separation_of_concerns#HTML,_CSS,_JavaScript"&gt;Separation of Concern&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;you have no idea what devices your code will run on in two years. &lt;strong&gt;Build "future-proof" digital products, not sand castles, crushed by the next wave.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. This is why the Internet was built for.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://thatsthespir.it/quote/view/188"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kf6B2NtE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qmq8jumktefp91v4yfu5.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. It takes but a few minutes to grasp.
&lt;/h2&gt;

&lt;p&gt;Here is a presentation I did for my bad-ass junior developers at BeCode. Have a browse.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.ludus.one/8c042d9a-e404-4df5-b14e-48e3eb6e6014"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xbP7TeKf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/esfa2vgq8uebhv2j8f88.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stil not convinced ? Head over this &lt;a href="https://www.reddit.com/r/webdev/comments/48z7jz/do_you_take_into_account_those_who_disable/"&gt;Reddit thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I leave the final word to &lt;strong&gt;Tiffany Tse&lt;/strong&gt; (Shopify) (&lt;a href="https://www.shopify.com/partners/blog/what-is-progressive-enhancement-and-why-should-you-care"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Considering how quickly things change, and how many new devices there are every year, it’s imperative that we continue to build websites and applications that can scale, change, and employ new features as they become available. To do this, and continue to make sure that the web is accessible for all, we need to ensure progressive enhancement is at the heart of everything we do.  &lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>progressive</category>
      <category>enhancement</category>
      <category>standards</category>
    </item>
    <item>
      <title>The easy way to turn a website into a Progressive Web App</title>
      <dc:creator>Alexandre Plennevaux</dc:creator>
      <pubDate>Tue, 21 Nov 2017 09:26:41 +0000</pubDate>
      <link>https://dev.to/becodeorg/the-easy-way-to-turn-a-website-into-a-progressive-web-app-77g</link>
      <guid>https://dev.to/becodeorg/the-easy-way-to-turn-a-website-into-a-progressive-web-app-77g</guid>
      <description>&lt;h2&gt;
  
  
  What is a Progressive Web App?
&lt;/h2&gt;

&lt;p&gt;Basically, a PWA is a website that can be saved on the user's device (desktop, tablet or smartphone) and thus feels and behaves much like a &lt;em&gt;Native application&lt;/em&gt;:  loading screen, removing the browser's interface clutter to enhance user focus, and, should the connection drop, it still displays (cached) content, enabling the user to continue working offline.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why is it important?
&lt;/h2&gt;

&lt;p&gt;It tends to boost user engagement: if Android's Chrome browser (not sure about other mobile browsers) detects that the website is a PWA, it prompts the user to save it on its device's homescreen using the icon of your choice.&lt;/p&gt;

&lt;p&gt;Compared to a mobile application, it simplifies the end-user setup process, breaking free from app stores. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvz18srzbmewqv6slxa5l.jpg" 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%2Fvz18srzbmewqv6slxa5l.jpg" width="700" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PWA are good for your client's business&lt;/strong&gt;. Alibaba, the Chinese Amazon, notices a 48% increase in user engagement thanks to the browser's prompt to "install" the website (&lt;a href="https://developers.google.com/web/showcase/2016/alibaba" rel="noopener noreferrer"&gt;source&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;This makes the effort totally worth fighting for!&lt;/p&gt;

&lt;p&gt;This bounty is possible thanks to a technology called &lt;strong&gt;Service Workers&lt;/strong&gt; that allows you to save static assets in the user system (html, css, javascript, json...), alongside a &lt;code&gt;manifest.json&lt;/code&gt; that specifies how the website should behave as an installed application. Service workers can do much much more, like polling user actions while offline, and syncing them in the background when back online.&lt;/p&gt;
&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;Famous PWAs are Slack, Spotify, Starbucks, the NY Times, and &lt;a href="https://www.dizzain.com/blog/insights/pwa-examples/" rel="noopener noreferrer"&gt;many more&lt;/a&gt;... &lt;/p&gt;

&lt;p&gt;Here are a couple PWAs made by myself using the same technique described here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://plancomptablebelge.be" rel="noopener noreferrer"&gt;plancomptablebelge.be&lt;/a&gt; (a single-page website)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mathr.app/" rel="noopener noreferrer"&gt;mathr.app&lt;/a&gt; (a game to practice calculous, made using Sveltekit)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Turning a website into a PWA may sound complicated (Service workers whaaaat ?), but it's not that difficult. Follow my lead and you'll have one by the end of this article !&lt;/p&gt;
&lt;h3&gt;
  
  
  1. requirement: https instead of http
&lt;/h3&gt;

&lt;p&gt;PWA only work on a website running on a secure domain (behind &lt;strong&gt;https&lt;/strong&gt;:// instead of http://).&lt;br&gt;
These are usually very hard to set up manually, but thanksfully, if you have your own server, you can use &lt;a href="https://letsencrypt.org/" rel="noopener noreferrer"&gt;letsencrypt&lt;/a&gt; to make that super easy and automatic. And... FREE.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Tools
&lt;/h3&gt;
&lt;h4&gt;
  
  
  2.1 lighthouse test
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;a href="https://developers.google.com/web/tools/lighthouse/" rel="noopener noreferrer"&gt;lighthouse test&lt;/a&gt; is an automated test created and maintained by Google that test websites against three criteria : Progressive, Performance, Accessibility. It gives a score in percent for each, and advises on how to solve each issue. It's a great learning tool.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.dropbox.com%2Fs%2Frwfesahj7haglsc%2FCapture%2520d%2527%25C3%25A9cran%25202017-11-21%252010.03.29.png%3Fdl%3D1" alt="Lighthouse test result for didiermotte.be" width="" height=""&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realfavicongenerator.net" rel="noopener noreferrer"&gt;realfavicongenerator.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://www.talater.com/upup/getting-started-with-offline-first.html" rel="noopener noreferrer"&gt;UpUp.js library&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  2.2 realfavicongenerator.net
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://realfavicongenerator.net" rel="noopener noreferrer"&gt;realfavicongenerator.net&lt;/a&gt; takes care of the visual layer of your PWA. It generates the manifest.json file mentioned above, alongside all the versions of your icons necessary when saving the website onto any mobile device, and an html snippet to add to your page's &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag. &lt;/p&gt;
&lt;h4&gt;
  
  
  2.3 service workers, via upup.js
&lt;/h4&gt;

&lt;p&gt;Service Workers is a javascript technology. I found it hard to grasp for my tired and impatient brain, but luckily, &lt;a href="https://vimeo.com/103221949" rel="noopener noreferrer"&gt;a smart girl from Germany&lt;/a&gt; pointed me to a javascript library by &lt;a href="https://twitter.com/TalAter" rel="noopener noreferrer"&gt;Tal Atler&lt;/a&gt;, that makes it &lt;em&gt;über&lt;/em&gt; easy to make your website behave nicely when the connexion drops. &lt;em&gt;danke schön, Ola Gasidlo !&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Just do the quick &lt;a href="https://www.talater.com/upup/getting-started-with-offline-first.html" rel="noopener noreferrer"&gt;UpUp tutorial&lt;/a&gt; and you're good to go.&lt;/p&gt;
&lt;h4&gt;
  
  
  2.4 The Manifest
&lt;/h4&gt;

&lt;p&gt;Edit the manifest.json file that RFG generated for you. It should contain at minimum these entries: "scope", "start_url", "short_name", "display". Here is a working sample:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My PWA Sample App"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"short_name"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PWA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.html?utm_source=homescreen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"icons"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./android-chrome-192x192.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sizes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192x192"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./android-chrome-512x512.png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"sizes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"512x512"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"theme_color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#ffee00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"background_color"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#ffee00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"display"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"standalone"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More information is available at &lt;a href="https://developers.google.com/web/updates/2017/02/improved-add-to-home-screen#navigating_outside_of_your_progressive_web_app" rel="noopener noreferrer"&gt;developers.google.com&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Methodology
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Use Realfavicongenerator and generate the html and image code. Add them to your website code.&lt;/li&gt;
&lt;li&gt;Publish on your https domain.&lt;/li&gt;
&lt;li&gt;Do the lighthouse test.&lt;/li&gt;
&lt;li&gt;Analyse results.&lt;/li&gt;
&lt;li&gt;Fix each issue one by one.&lt;/li&gt;
&lt;li&gt;Go back to 3, rince and repeat.&lt;/li&gt;
&lt;li&gt;Iterate until you get as close to 100 everywhere, and 100 in "Progressive".&lt;/li&gt;
&lt;li&gt;Test on your mobile phone and see what happens. With chance, on Android you'll see a popup at the bottom, inviting you to save the website onto your phone homescreen!
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fbecodeorg%2FLovelace-promo-2%2Fraw%2Fmaster%2FParcours%2FPWA%2520-%2520progressive%2520web%2520apps%2Fassets%2Fadd-to-homescreen.jpg" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Deeper into the rabbit hole...
&lt;/h2&gt;

&lt;p&gt;Here is a sample PWA project I made using a Github Page, live coded for my juniors at &lt;a href="http://www.becode.org" rel="noopener noreferrer"&gt;BeCode&lt;/a&gt; :  &lt;a href="https://pixeline.github.io/pwa-example/index.html" rel="noopener noreferrer"&gt;visit its Github Page&lt;/a&gt; with your mobile phone to test it. &lt;a href="https://github.com/pixeline/pwa-example" rel="noopener noreferrer"&gt;Visit its repository&lt;/a&gt; to inspect the code.&lt;/p&gt;

&lt;p&gt;You can find all the information you need on PWA in this book:   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.fr/_/dp/1491961651?tag=oreilly20-20" rel="noopener noreferrer"&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%2Fuiap4swbstsctb0o8bay.jpg" width="381" height="499"&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's it! Happy PWA-ing!&lt;/p&gt;




&lt;p&gt;Your PWA is ready: how about you learn &lt;a href="https://dev.to/pixeline/deploy-an-application-automatically-using-github-hooks-50fd"&gt;how to automate its deployment using Git&lt;/a&gt; ?&lt;/p&gt;

</description>
      <category>pwa</category>
      <category>lighthouse</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
