<?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: lowlighter 🦑</title>
    <description>The latest articles on DEV Community by lowlighter 🦑 (@lowlighter).</description>
    <link>https://dev.to/lowlighter</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%2F498489%2F82df2800-b4ac-4ac9-bbd8-0e96926c0705.png</url>
      <title>DEV Community: lowlighter 🦑</title>
      <link>https://dev.to/lowlighter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lowlighter"/>
    <language>en</language>
    <item>
      <title>Supercharge your HTML with mizu.js!</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Tue, 03 Dec 2024 18:15:00 +0000</pubDate>
      <link>https://dev.to/lowlighter/supercharge-your-html-with-mizujs-2djf</link>
      <guid>https://dev.to/lowlighter/supercharge-your-html-with-mizujs-2djf</guid>
      <description>&lt;p&gt;Looking to build interactive web apps with ultimate flexibility and adaptability?&lt;/p&gt;

&lt;p&gt;Check out &lt;em&gt;&lt;a href="https://mizu.sh" rel="noopener noreferrer"&gt;🌊 mizu.js 🐕‍🦺&lt;/a&gt;&lt;/em&gt;!  &lt;/p&gt;

&lt;p&gt;It offers around thirty powerful directives to dynamically render HTML, listen to events, create custom elements, bind and model attributes, handle HTTP requests, render markdown and code, and much much more!&lt;/p&gt;

&lt;p&gt;And it works client-side on any modern browser...&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%2Ft3pgscom638xdugj43fe.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%2Ft3pgscom638xdugj43fe.png" alt="mizu.js csr" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;...but also server-side on your favorite runtime, whether it's Node, Deno, or Bun! You can even use it for static site generation!&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%2Fu5xla0p0j27hdy8gzn09.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%2Fu5xla0p0j27hdy8gzn09.png" alt="mizu.js ssr" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  Why yet another JavaScript templating library?
  &lt;br&gt;
I get your concern, but hear me out!

&lt;p&gt;Over the years, I've become increasingly frustrated with the need to set up an entire ecosystem just to create simple interactive web pages. You often need a dedicated toolbox, tons of dependencies, transpiling steps, and to learn a new superset of a language. You may even end up spending more time setting up your environment than actually working on your project!&lt;/p&gt;

&lt;p&gt;That's why I grew fond of libraries such as &lt;a href="https://alpinejs.dev" rel="noopener noreferrer"&gt;Alpine.js&lt;/a&gt; and &lt;a href="https://htmx.org" rel="noopener noreferrer"&gt;htmx&lt;/a&gt;, which require no setup and are easy to use. However, I felt these had some limitations. Since they were mostly designed for client-side usage, it wasn't really possible to use them in server-side rendering contexts (including static generation).&lt;/p&gt;

&lt;p&gt;In the meantime, I started writing more and more isomorphic JavaScript (i.e., working both in client and server) and found &lt;a href="https://deno.com" rel="noopener noreferrer"&gt;Deno&lt;/a&gt; to be the perfect runtime for it. Deno relies on web standards rather than implementing its own like &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node&lt;/a&gt;. Because of this, I encountered some compatibility issues, which shouldn't exist, as developers should be free to use whatever that suits them best, whether it's Node, Deno, Bun or the browser.&lt;/p&gt;

&lt;p&gt;With all these points in mind, I started working on « 水 » (&lt;em&gt;mizu&lt;/em&gt;, the kanji for water in Japanese), a new library that attempt to addresses all the above-mentioned issues.&lt;/p&gt;

&lt;p&gt;And today, I'm excited to introduce it to you!&lt;br&gt;
&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;mizu.js&lt;/em&gt; integrates directly with your HTML and uses vanilla JavaScript expressions for its expressions. This means you don't need to learn a new language or paradigm to start using it.&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="c"&gt;&amp;lt;!-- Conditionally render elements --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;*if=&lt;/span&gt;&lt;span class="s"&gt;"Math.round(Math.random())"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Heads!&lt;span class="nt"&gt;&amp;lt;a&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;b&lt;/span&gt; &lt;span class="na"&gt;*else&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Tails!&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Render list elements dynamically --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;*for=&lt;/span&gt;&lt;span class="s"&gt;"const value of ['foo', 'bar', 'baz']"&lt;/span&gt; &lt;span class="na"&gt;*text=&lt;/span&gt;&lt;span class="s"&gt;"value"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;*for=&lt;/span&gt;&lt;span class="s"&gt;"['qux', 'quux', 'corge']"&lt;/span&gt; &lt;span class="na"&gt;*text=&lt;/span&gt;&lt;span class="s"&gt;"$value"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Bind attributes and handle events --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;submit.prevent&lt;/span&gt; &lt;span class="na"&gt;:class=&lt;/span&gt;&lt;span class="s"&gt;"{ 'user-form': true }"&lt;/span&gt; &lt;span class="na"&gt;*set=&lt;/span&gt;&lt;span class="s"&gt;"{ input: '' }"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&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;"text"&lt;/span&gt; &lt;span class="na"&gt;::value=&lt;/span&gt;&lt;span class="s"&gt;"input"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Template text content --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;*text=&lt;/span&gt;&lt;span class="s"&gt;"`Today is ${new Date()}`"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;*mustache&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Today is {{ new Date() }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In &lt;em&gt;mizu.js&lt;/em&gt;, the first character of a directive indicates its purpose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; for general directives&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@&lt;/code&gt; for event-based directives&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:&lt;/code&gt; for attribute binding directives

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;::&lt;/code&gt; for two-way binding directives (also known as modeling)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might notice some similarities with the syntax from other frameworks and libraries, which is intentional.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;mizu.js&lt;/em&gt; is reactive, automatically updating the DOM whenever your data changes (on the client-side).&lt;/p&gt;
&lt;h3&gt;
  
  
  Rendering rich content
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;mizu.js&lt;/em&gt; also offers some neat directives to easily render rich content such as markdown or code syntax highlighting.&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="c"&gt;&amp;lt;!-- Automatically generate a table of contents from h1-h6 tags within the selected element --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;*toc=&lt;/span&gt;&lt;span class="s"&gt;"'main section'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Render markdown content --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*markdown&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;**hello world!**&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Highlight syntax using TypeScript flavor --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;code&lt;/span&gt; &lt;span class="na"&gt;*code&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;ts&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;const foo = "bar"&lt;span class="nt"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  HTTP based directives
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;mizu.js&lt;/em&gt; offers a set of directives inspired by &lt;a href="https://htmx.org" rel="noopener noreferrer"&gt;htmx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These directives are especially useful in server-rendering contexts for importing content, but they can also be used on the client side to perform HTTP requests.&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="c"&gt;&amp;lt;!-- Fetch and display remote content --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;http=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;response.html&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;http=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;response.html=&lt;/span&gt;&lt;span class="s"&gt;"$content.querySelector('h1')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Make an HTTP POST request on click and show the response --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;http.post=&lt;/span&gt;&lt;span class="s"&gt;"https://example/api"&lt;/span&gt;
  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;header[x-foo]=&lt;/span&gt;&lt;span class="s"&gt;"'my custom header'"&lt;/span&gt;
  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;body.json=&lt;/span&gt;&lt;span class="s"&gt;"{ foo: 'bar' }"&lt;/span&gt;
  &lt;span class="err"&gt;%@&lt;/span&gt;&lt;span class="na"&gt;click=&lt;/span&gt;&lt;span class="s"&gt;"alert(await $response.text())"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Working with HTML custom elements
&lt;/h3&gt;

&lt;p&gt;While HTML natively supports &lt;a href="https://developer.mozilla.org/docs/Web/API/Web_components/Using_custom_elements" rel="noopener noreferrer"&gt;custom elements&lt;/a&gt;, they can be a bit tedious to use.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;mizu.js&lt;/em&gt; simplifies this process with a more concise syntax for defining and using custom elements in your documents.&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="c"&gt;&amp;lt;!-- Create a custom element --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;template&lt;/span&gt; &lt;span class="na"&gt;*custom-element=&lt;/span&gt;&lt;span class="s"&gt;"my-element"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*mustache&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    There is {{ items.length }} items:
    &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&amp;lt;slot&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"items"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/slot&amp;gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Use the custom element --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;my-element&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;#items&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;foo&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;#items&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;bar&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/my-element&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; You can easily reuse your custom elements in other projects by importing them with a HTTP based directive!&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;template&lt;/span&gt; 
  &lt;span class="na"&gt;*custom-element=&lt;/span&gt;&lt;span class="s"&gt;"my-element"&lt;/span&gt; 
  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;http=&lt;/span&gt;&lt;span class="s"&gt;"https://example.com/partial/my-element.html"&lt;/span&gt; 
  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="na"&gt;response.html&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Miscelleanous
&lt;/h3&gt;

&lt;p&gt;I won't cover every available directive here, &lt;a href="https://mizu.sh/#directives" rel="noopener noreferrer"&gt;but there are many more to explore&lt;/a&gt;!&lt;br&gt;
Here's a small selection of some interesting ones:&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="c"&gt;&amp;lt;!-- Automatically update the time every second --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- Perfect for elements where reactivity can't be tracked --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;time&lt;/span&gt; &lt;span class="na"&gt;*refresh=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;*mustache&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ new Date() }}&lt;span class="nt"&gt;&amp;lt;/time&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Execute raw code for special cases --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*eval=&lt;/span&gt;&lt;span class="s"&gt;"this.remove()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Using &lt;em&gt;mizu.js&lt;/em&gt; programmatically
&lt;/h2&gt;

&lt;p&gt;So far, I've shown how to use &lt;em&gt;mizu.js&lt;/em&gt; directly in your HTML documents, but you can also use it programmatically for more advanced use cases.&lt;/p&gt;

&lt;p&gt;Because &lt;em&gt;mizu.js&lt;/em&gt; directives are just plain HTML attributes, the syntax remains the same for both client-side and server-side rendering. This means you can easily switch between rendering environments without ever changing your templates!&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Mizu&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mizu/render/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/html; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Mizu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;div *text="foo"&amp;gt;&amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🌊 Yaa, mizu!&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Generating static sites
&lt;/h3&gt;

&lt;p&gt;You can generate static sites easily&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Mizu&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mizu/render/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Mizu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="c1"&gt;// Copy content from /source/static to /dist/static&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;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="na"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/source/static&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="c1"&gt;// Copy and render content from /source/templates to /dist&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&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="na"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/source/templates&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;render&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="c1"&gt;// Copy content from a URL to /dist/styles.css&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://matcha.mizu.sh/matcha.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="c1"&gt;// Copy content from callback return&lt;/span&gt;
  &lt;span class="p"&gt;[()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timestamp.json&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="na"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Start using &lt;em&gt;mizu.js&lt;/em&gt; today!
&lt;/h2&gt;

&lt;p&gt;Want to experiment with &lt;em&gt;mizu.js&lt;/em&gt; without installing anything?&lt;br&gt;
Checkout &lt;a href="https://mizu.sh/playground" rel="noopener noreferrer"&gt;mizu.sh/playground&lt;/a&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/lowlighter" rel="noopener noreferrer"&gt;
        lowlighter
      &lt;/a&gt; / &lt;a href="https://github.com/lowlighter/mizu" rel="noopener noreferrer"&gt;
        mizu
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🌊 mizu.js is a lightweight html templating engine for any side rendering. No build steps, no config, no headaches. 
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Visit &lt;a href="https://mizu.sh" rel="noopener noreferrer"&gt;mizu.sh&lt;/a&gt; for a comprehensive overview!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; &lt;em&gt;mizu.js&lt;/em&gt; pairs perfectly with &lt;a href="https://dev.to/lowlighter/make-naked-websites-look-great-with-matchacss-4ng7"&gt;matcha.css&lt;/a&gt; to make your websites look fantastic!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tooling</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Make naked websites look great with matcha.css!</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Fri, 24 May 2024 09:11:00 +0000</pubDate>
      <link>https://dev.to/lowlighter/make-naked-websites-look-great-with-matchacss-4ng7</link>
      <guid>https://dev.to/lowlighter/make-naked-websites-look-great-with-matchacss-4ng7</guid>
      <description>&lt;p&gt;Have you ever contemplated the bareness of starting from a "blank page" when beginning a new web project?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsyhnfxnz7i2cs3exqhf4.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%2Fsyhnfxnz7i2cs3exqhf4.png" alt="Blank page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  index.html
  &lt;br&gt;
&lt;em&gt;Notice the lack of any styling or custom attributes&lt;/em&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;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello world!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      This is my new project, and it's still under construction.
      Please be indulgent 😊
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
      Also, check out my work on &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://github.com/octocat"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;GitHub&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;!
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;blockquote&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
        Imagination is more important than knowledge
      &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;cite&amp;gt;&lt;/span&gt;Albert Einstein&lt;span class="nt"&gt;&amp;lt;/cite&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/blockquote&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;menu&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Home&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;
        About me
        &lt;span class="nt"&gt;&amp;lt;menu&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;My works&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;My passions&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/menu&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/menu&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;form&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Contact me&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
        Your email:
        &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;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;label&amp;gt;&lt;/span&gt;
        Your message:
        &lt;span class="nt"&gt;&amp;lt;small&amp;gt;&lt;/span&gt;255 characters max&lt;span class="nt"&gt;&amp;lt;/small&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your message"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;


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

&lt;/div&gt;


&lt;/p&gt;

&lt;p&gt;Ouch! If you showed that to your friends while claiming you're a web developer, they would start questioning what you're really doing...&lt;/p&gt;

&lt;p&gt;Default browser stylesheets are usually pretty bare-bones, and it can be frustrating to not have something "visually nice" when you're prototyping apps, generating static HTML pages, Markdown-generated documents, etc., and don't want to delve into CSS intricacies too early.&lt;/p&gt;

&lt;p&gt;Good news! I have something perfect for you: &lt;a href="https://matcha.mizu.sh" rel="noopener noreferrer"&gt;matcha.css&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Just add the following into your document and see the magic happen:&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;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://matcha.mizu.sh/matcha.css"&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;&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%2Fr2duw5mfvuxcf0s56w7f.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%2Fr2duw5mfvuxcf0s56w7f.png" alt="Matcha page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without really doing anything, we got a page that respects user preferences on light/dark mode, nice fonts and proper spacing, our &lt;code&gt;&amp;lt;menu&amp;gt;&lt;/code&gt; actually looks like a menu, and our &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; is also pretty nice with even "mandatory field" indicators for required inputs.&lt;/p&gt;

&lt;p&gt;All of that without any build steps, JavaScript, configuration, or refactoring.&lt;/p&gt;

&lt;p&gt;It's because &lt;a href="https://matcha.mizu.sh" rel="noopener noreferrer"&gt;matcha.css&lt;/a&gt; uses semantic styling. For example, it assumes that &lt;code&gt;&amp;lt;menu&amp;gt;&lt;/code&gt; nested in another &lt;code&gt;&amp;lt;menu&amp;gt;&lt;/code&gt; should result in a submenu, while a &lt;code&gt;&amp;lt;label&amp;gt;&amp;lt;input required&amp;gt;&amp;lt;/label&amp;gt;&lt;/code&gt; should clarify to the user that the input is mandatory.&lt;/p&gt;

&lt;p&gt;There are a few more "drop-in" CSS libraries out there, but I believe this is the most complete one as it provides additional modern styles out-of-the-box like syntax highlighting, simple layouts, utility classes, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcuq2b9axcybs26lbkple.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%2Fcuq2b9axcybs26lbkple.png" alt="Matcha"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://matcha.mizu.sh" rel="noopener noreferrer"&gt;matcha.css&lt;/a&gt; is also easily customizable (it does not have any &lt;code&gt;!important&lt;/code&gt; rules, and even provide a helper to create custom builds) and while being also reversible (if you ever decide to migrate out, just remove the stylesheet).&lt;/p&gt;

&lt;p&gt;And last but not least, it's totally free and open-source!&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lowlighter" rel="noopener noreferrer"&gt;
        lowlighter
      &lt;/a&gt; / &lt;a href="https://github.com/lowlighter/matcha" rel="noopener noreferrer"&gt;
        matcha
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🍵 Drop-in semantic styling library in pure CSS. Highly customizable and perfect for simple websites and prototyping web apps!
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Checkout &lt;a href="https://matcha.mizu.sh" rel="noopener noreferrer"&gt;matcha.mizu.sh&lt;/a&gt; for a full overview!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>ui</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Using GitHub Codespaces with VNC/flexbox to create Pokémon maps from a web browser</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Thu, 20 Jan 2022 18:55:10 +0000</pubDate>
      <link>https://dev.to/lowlighter/using-github-codespaces-with-vncflexbox-to-create-pokemon-maps-from-a-web-browser-3ch6</link>
      <guid>https://dev.to/lowlighter/using-github-codespaces-with-vncflexbox-to-create-pokemon-maps-from-a-web-browser-3ch6</guid>
      <description>&lt;p&gt;Hi there 👋 !&lt;/p&gt;

&lt;p&gt;I'm currently working on a cool project, &lt;a href="https://github.com/lowlighter/gracidea" rel="noopener noreferrer"&gt;&lt;code&gt;🌺 Gracidea&lt;/code&gt;&lt;/a&gt;, which is an animated Pokémon live web map aiming to recreate the whole Pokémon world while being accessible directly from your browser:&lt;/p&gt;

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

&lt;p&gt;I use a combination of several technologies, like &lt;a href="//deno.land"&gt;deno&lt;/a&gt;, &lt;a href="https://pixijs.com" rel="noopener noreferrer"&gt;pixi.js&lt;/a&gt;, &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;vercel.com&lt;/a&gt; and &lt;a href="https://www.mapeditor.org" rel="noopener noreferrer"&gt;Tiled map editor&lt;/a&gt; along additional other tools. Some of these, like Tiled, are graphical desktop apps so they need to be installed first.&lt;/p&gt;

&lt;p&gt;Which made wonder, what if it was possible to provide a graphic environment to access desktop apps and edit maps directly from a web browser... 🤔 ?&lt;/p&gt;

&lt;p&gt;And it is 🥳 !&lt;/p&gt;

&lt;p&gt;If you don't know, GitHub offers &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;codespaces&lt;/a&gt; which lets you spawn a web-accessible docker instance from a repository with VS Code pre-installed. However, not many people know that it is actually possible to configure the dockerfile through the &lt;code&gt;.devcontainer&lt;/code&gt; folder of said repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84lvivmxh4bg8ozwxcyg.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%2F84lvivmxh4bg8ozwxcyg.png" alt="Codespaces"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Note: Seems that this feature is in closed beta for users accounts&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After playing a bit with &lt;a href="https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/desktop-lite.md" rel="noopener noreferrer"&gt;Microsoft's vscode-dev-containers' lightweight desktop&lt;/a&gt; I achieved to configure vnc and flexbox (the provided desktop env) to spawn a full-screen instance of Tiled!&lt;/p&gt;

&lt;p&gt;Below's a preview of the whole thing, in Firefox (yes, everything is happening in the browser !😮)&lt;/p&gt;

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

&lt;p&gt;So yeah, basically all you need to setup this project now is just a web browser, no headaches caused by "but it works on my machine 😵 !"&lt;/p&gt;

&lt;p&gt;If you're interested in the required code to make this works, it is available &lt;a href="https://github.com/lowlighter/gracidea/tree/main/.devcontainer" rel="noopener noreferrer"&gt;here&lt;/a&gt;!&lt;/p&gt;

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

</description>
      <category>github</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Discover your GitHub ranking with Metrics Insights!</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Mon, 19 Apr 2021 17:11:14 +0000</pubDate>
      <link>https://dev.to/lowlighter/discover-your-github-ranking-with-metrics-insights-dpe</link>
      <guid>https://dev.to/lowlighter/discover-your-github-ranking-with-metrics-insights-dpe</guid>
      <description>&lt;p&gt;Ever wondered how high is ranked your most starred/forked repository across all &lt;a href="https://github.com" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;? Or whether if you're one of most followed user account 🙂 ?&lt;/p&gt;

&lt;p&gt;Well, this is possible thanks to &lt;a href="https://metrics.lecoq.io/about" rel="noopener noreferrer"&gt;Metrics Insights&lt;/a&gt;! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbq3ewr0ymy8erb40h4s.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%2Fhbq3ewr0ymy8erb40h4s.png" alt="Preview image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's also a few additional data, like the number of bytes you've written for each languages you used up until now!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flz6urdyh1v1vsquu8wqa.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%2Flz6urdyh1v1vsquu8wqa.png" alt="Preview image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Best of it is that you can use &lt;a href="https://metrics.lecoq.io/about" rel="noopener noreferrer"&gt;Metrics Insights&lt;/a&gt; in your browser without any account login nor cookies!&lt;/p&gt;

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

&lt;p&gt;I'm currently working on &lt;a href="https://github.com/lowlighter/metrics" rel="noopener noreferrer"&gt;Metrics&lt;/a&gt;, a project designed to gather data that you can then render as SVG to embed on your GitHub user profile, like below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ivu4p47r55v9tvyib5x.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%2F3ivu4p47r55v9tvyib5x.png" alt="Preview image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Currently, there's hundreds of options, including 4 templates and 30 plugins, one of them being the &lt;code&gt;🏆 Achievements&lt;/code&gt; one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgv663em79s3q66ryqgmo.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%2Fgv663em79s3q66ryqgmo.png" alt="Preview image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, some of them include ranking. You may wonder of these are computed? Well it's actually a lot simpler that it may looks, using &lt;a href="https://docs.github.com/en/graphql" rel="noopener noreferrer"&gt;GitHub GraphQL API&lt;/a&gt; and &lt;a href="https://github.com/puppeteer/puppeteer" rel="noopener noreferrer"&gt;Puppeteer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The trick is to fetch the number of &lt;code&gt;followers&lt;/code&gt;, &lt;code&gt;created repositories&lt;/code&gt; of said user, along with their most &lt;code&gt;starred repository&lt;/code&gt; and most &lt;code&gt;forked repository&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then using &lt;code&gt;search&lt;/code&gt; GitHub GraphQL API, we can count how many users and repositories are above using the following query (replacing each &lt;code&gt;$&lt;/code&gt; prefixed values with what we found earlier):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AchievementsRanking&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="n"&gt;repo_rank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stars:&amp;gt;$stars"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;REPOSITORY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;0)&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;repositoryCount&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="n"&gt;user_rank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"followers:&amp;gt;$followers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;0)&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;userCount&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="n"&gt;forks_rank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forks:&amp;gt;$forks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;REPOSITORY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;0)&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;repositoryCount&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="n"&gt;created_rank&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"repos:&amp;gt;$created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;0)&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;userCount&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As you can see, we only retrieve the total count of each categorie, we don't even try to fetch any content. So basically, if an user has &lt;code&gt;100&lt;/code&gt; followers and &lt;code&gt;user_rank.userCount&lt;/code&gt; send back &lt;code&gt;999&lt;/code&gt; users, we can deduce that user is 1000&lt;sup&gt;th&lt;/sup&gt; (&lt;code&gt;999+1&lt;/code&gt;) since 999 users has more followers. We do the same for each categorie.&lt;/p&gt;

&lt;p&gt;One thing to note is that GitHub API may return incomplete count below some thresholds as there's too many results to compute for even GitHub to handle it. But if you have created a respository at least once, or having a repository which has been starred 5+ times or forked 1+ time or if you have 3+ followers, you can compete within each categorie 😃 !&lt;/p&gt;

&lt;p&gt;I guess it also means that there's a lot of inactive users and unused account, so if you're somewhat active on GitHub you'll be able to see your stats pretty easily with this tool. &lt;/p&gt;

&lt;p&gt;Since it's not possible to estimate how many repositories and users exists through GitHub's own API, you may wonder how I got total repositories and users count?&lt;/p&gt;

&lt;p&gt;Well, actually these are displayed on &lt;a href="https://github.com/search" rel="noopener noreferrer"&gt;GitHub search&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7vb5hibwsr83s2k62ej.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%2Ft7vb5hibwsr83s2k62ej.png" alt="GitHub search"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is why we needed puppeteer 🙂 We just crawl a few times (displayed stats is random between users, repositories and issues) and extract these. Once we got each categorie at least once, no more need for puppeteer, we're ready to go!&lt;/p&gt;



&lt;p&gt;If you're interested, don't hesitate to take a look at this project source code and support it. There's even a plugin to update your profile readme with your latest post from &lt;strong&gt;dev.to&lt;/strong&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lowlighter" rel="noopener noreferrer"&gt;
        lowlighter
      &lt;/a&gt; / &lt;a href="https://github.com/lowlighter/metrics" rel="noopener noreferrer"&gt;
        metrics
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      📊 An infographics generator with 30+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;You can provide some feedback like bug reports and suggestion for this feature on &lt;a href="https://github.com/lowlighter/metrics/discussions/229" rel="noopener noreferrer"&gt;GitHub discussions&lt;/a&gt; 🙂&lt;/p&gt;

&lt;p&gt;Thanks a lot for reading, and don't hesitate to share your scores in comments section!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;One last bonus: can you guess &lt;strong&gt;who&lt;/strong&gt; is the most followed GitHub user? &lt;a href="https://metrics.lecoq.io/about/torvalds" rel="noopener noreferrer"&gt;Click here to know!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Metrics v3.0, the ultimate tool to pimp your GitHub profile!
</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Mon, 04 Jan 2021 17:24:35 +0000</pubDate>
      <link>https://dev.to/lowlighter/metrics-v3-0-the-ultimate-tool-to-pimp-your-github-profile-g7p</link>
      <guid>https://dev.to/lowlighter/metrics-v3-0-the-ultimate-tool-to-pimp-your-github-profile-g7p</guid>
      <description>&lt;p&gt;Metrics is an extensive SVG images generator plugged with various APIs (GitHub, Twitter, Spotify, ...) to embed awesome informations about your daily coding routine on your profile!&lt;/p&gt;

&lt;p&gt;It's highly configurable with multiple templates and plugins, and for optimal pragmatism, it uses transparency with a color font which works on both light/dark modes, so you'll never offend the eyes of your visitors anymore!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fww4l2mz5jttwewxq4oyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fww4l2mz5jttwewxq4oyc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Build your dream profile now!
&lt;/h3&gt;

&lt;p&gt;Metrics works with a plugin system to make it highly customizable.&lt;/p&gt;

&lt;p&gt;Want to refresh a bit your profile and flex a bit about your 2-days commit streak? Well, why not add an &lt;em&gt;i s o m e t r i c&lt;/em&gt; calendar to it?&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3x104chlsm3u0cuwpn60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3x104chlsm3u0cuwpn60.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With metrics you can display a lot useless facts about you. You'll be able to know how many datacenters you're filling up with the &lt;code&gt;/node_modules&lt;/code&gt; you inadvertently pushed because you forgot to &lt;code&gt;.gitignore&lt;/code&gt; it, your favorite license (very interesting right?) or even the number of lines of code you've published on GitHib. Of course, there are also more "traditional" stats available in other sections, indicating your internet clout 😎&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqt67y13uutk8nub3v4io.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqt67y13uutk8nub3v4io.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also display your war medals for each framework you've starred in &lt;a href="https://github.com/topics/" rel="noopener noreferrer"&gt;GitHub topics&lt;/a&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7eaekl4xrakvj48ggol8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7eaekl4xrakvj48ggol8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And show that you're a true polyglot who knows how to say &lt;code&gt;"hello world"&lt;/code&gt; in many languages:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvblov8q7o7xehrl27f9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvblov8q7o7xehrl27f9u.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you can use smooth charts to show everyone that you've got an incredibly unhealthy sleep cycle with all your stacked commits at 2 a.m.:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3qis4ae3i3xp68i9aej1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3qis4ae3i3xp68i9aej1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Web devs can prove that they're building optimized websites, despite including more JavaScript libs than the number of observable atoms in the universe:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffipbllgi98om1yax190f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffipbllgi98om1yax190f.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you can show that you're a true scrum expert by adding your projects progress, even if you never finish them anyway because you get bored of them way before:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl25kkq005dhbjnnk7vpa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl25kkq005dhbjnnk7vpa.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you're a twitter addict, you can display your latest tweets:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9u54hmrqp13jixd12zni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9u54hmrqp13jixd12zni.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, you can show the world that you have awesome music tastes:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F319faqx1szl92sf59j60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F319faqx1szl92sf59j60.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And last but not least, some of what has been presented here can also be used for repositories! A nice addition for your readmes!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnlfh0ge91b4vtz8dnm0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnlfh0ge91b4vtz8dnm0n.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're some who is spreading love everywhere by supporting passionate developers by starring their projects, you can display it 💕!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo1tbnzfsbgzqkztpon4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fo1tbnzfsbgzqkztpon4j.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A little bonus for all &lt;strong&gt;dev.to&lt;/strong&gt; writers here, they can also display their recent posts with this!&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkmsoo42gaygcndnxihb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkmsoo42gaygcndnxihb7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's a few more features available, so be sure to check it out!&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://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lowlighter" rel="noopener noreferrer"&gt;
        lowlighter
      &lt;/a&gt; / &lt;a href="https://github.com/lowlighter/metrics" rel="noopener noreferrer"&gt;
        metrics
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      📊 An infographics generator with 30+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;
 

&lt;p&gt;Thanks again for reading until the end!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PS: New ideas and contributions are welcome!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Downtime, a simple uptime/response time monitor using GitHub actions</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Sat, 12 Dec 2020 12:20:00 +0000</pubDate>
      <link>https://dev.to/lowlighter/downtime-a-simple-uptime-response-time-monitor-using-github-actions-2m73</link>
      <guid>https://dev.to/lowlighter/downtime-a-simple-uptime-response-time-monitor-using-github-actions-2m73</guid>
      <description>&lt;p&gt;Hi there 👋, &lt;/p&gt;

&lt;p&gt;This is a small presentation of one of my recent projects : &lt;a href="https://github.com/lowlighter/downtime"&gt;Downtime&lt;/a&gt;, an uptime/response time monitor.&lt;/p&gt;

&lt;p&gt;It generates SVG badges that you can use anywhere to display whether your server is up or not :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--whUb81qu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xjzv1fyw4h5zs8l998kv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--whUb81qu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xjzv1fyw4h5zs8l998kv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The real badges are actually transparents, rendering nice on both light/dark mode&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 How to setup (&amp;lt; 2min) ?
&lt;/h2&gt;

&lt;p&gt;It is based on the Keep It Simple Stupid philosophy, so it's super-straightforward :&lt;/p&gt;

&lt;p&gt;0: Fork the repository&lt;br&gt;
1: Edit the &lt;code&gt;config.yml&lt;/code&gt; to add your hosts&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;config.yml&lt;/code&gt; is just a list of domain/server/ip/port you want to monitor :&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;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Check if google.com is up&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google.com&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Google&lt;/span&gt;

  &lt;span class="c1"&gt;# Check if a given url is up&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.com/lowlighter/downtime&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Downtime repository&lt;/span&gt;

  &lt;span class="c1"&gt;# Test an ip/domain with port using ncat (any protocol)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8.8.8.8"&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Google DNS&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;53&lt;/span&gt;
    &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ncat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2: (optional) You can also enable GitHub pages and get a webpage with all your servers status !&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ How does it works ?
&lt;/h3&gt;

&lt;p&gt;A GitHub action workflow is ran each 5 minutes, testing connections with the hosts you specified in &lt;code&gt;config.yml&lt;/code&gt;. It can either use &lt;code&gt;curl&lt;/code&gt; (for HTTP/HTTPS) or &lt;code&gt;ncat&lt;/code&gt;/&lt;code&gt;telnet&lt;/code&gt; (any protocol). It records if target is reachable and its response time.&lt;/p&gt;

&lt;p&gt;Since it use the default &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; to update connection results, there is no need to create an additional personal token, keeping your account safe. &lt;/p&gt;

&lt;p&gt;You can also set the repository private, keeping only the GitHub pages and the badges to embed elsewhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ Inspiration
&lt;/h3&gt;

&lt;p&gt;This has been inspired a lot by &lt;a href="https://github.com/upptime/upptime"&gt;upptime&lt;/a&gt;, but I didn't liked the fact you needed a token with a lot of permissions (especially since the workflow update itself so you need to put a lot of trust in maintainers) and that you couldn't get a status badge to tell whether your server is up or not.&lt;/p&gt;

&lt;p&gt;Thanks for reading !&lt;br&gt;
If you like generated SVG images, you may also checkout &lt;a href="//github.com/lowlighter/metrics"&gt;GitHub metrics&lt;/a&gt; ! &lt;/p&gt;

</description>
      <category>showdev</category>
      <category>github</category>
      <category>monitoring</category>
      <category>devops</category>
    </item>
    <item>
      <title>Rendering the commit calendar in isometric view</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Tue, 03 Nov 2020 19:07:12 +0000</pubDate>
      <link>https://dev.to/lowlighter/rendering-the-commit-calendar-in-isometric-view-2ccg</link>
      <guid>https://dev.to/lowlighter/rendering-the-commit-calendar-in-isometric-view-2ccg</guid>
      <description>&lt;p&gt;Recently, I found a browser extension called &lt;a href="https://github.com/jasonlong/isometric-contributions" rel="noopener noreferrer"&gt;isometric-contributions&lt;/a&gt; which displays the GitHub commit calendar in an isometric view. It looked quite neat, but it can't be used as a standalone...&lt;/p&gt;

&lt;p&gt;So I decided to make a similar render as part of my &lt;a href="https://github.com/lowlighter/metrics" rel="noopener noreferrer"&gt;metrics plugins&lt;/a&gt; suite, which executes itself either as a GitHub action or as a NodeJS server. &lt;/p&gt;

&lt;p&gt;Below is the final render, generated with about &lt;a href="https://github.com/lowlighter/metrics/blob/master/src/plugins/isocalendar/index.mjs" rel="noopener noreferrer"&gt;80 lines of code&lt;/a&gt; : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl9t4aycqk4zwhyoktfer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fl9t4aycqk4zwhyoktfer.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can test it with your own GitHub account &lt;a href="https://metrics.lecoq.io/" rel="noopener noreferrer"&gt;here&lt;/a&gt; by checking &lt;code&gt;"Isometric commit calendar"&lt;/code&gt; option !&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Under the hood
&lt;/h3&gt;

&lt;p&gt;Using &lt;a href="https://docs.github.com/en/free-pro-team@latest/graphql" rel="noopener noreferrer"&gt;GitHub GraphQL API&lt;/a&gt;, it retrieves the &lt;code&gt;contributionCalendar&lt;/code&gt; from the &lt;code&gt;contributionsCollection&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;To ensure the last row get a full week, the start date queried is always set to a monday.&lt;/p&gt;

&lt;p&gt;Then, it iterates a first time over the contribution calendar to find the highest number of contributions in a single day, the current commits streak and the average commits per day.&lt;/p&gt;

&lt;p&gt;Then, it iterates once again over the calendar, but this time to generate the SVG. &lt;/p&gt;

&lt;p&gt;Each day creates a new isometric rectangle, with its height depending on the &lt;code&gt;contributionCount&lt;/code&gt; of said day scaled to the highest count found previously. &lt;/p&gt;

&lt;p&gt;Color is already given by GitHub API (which allows easier supports for the Haloween theme), though it adds brightness filters to simulate shadows and make render nicer.&lt;/p&gt;

&lt;p&gt;Pretty simple, no 😁 ?&lt;/p&gt;

</description>
      <category>github</category>
      <category>showdev</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Using GitHub Explore to find hidden gems</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Mon, 02 Nov 2020 18:35:00 +0000</pubDate>
      <link>https://dev.to/lowlighter/using-github-explore-to-find-hidden-gems-45gg</link>
      <guid>https://dev.to/lowlighter/using-github-explore-to-find-hidden-gems-45gg</guid>
      <description>&lt;p&gt;I really like to see what fellow developpers out there built. From famous frameworks to small side projects, I always find it interesting and impressive what awesome stuff people are making.&lt;/p&gt;

&lt;p&gt;Recently, I discovered the &lt;a href="https://github.com/explore"&gt;GitHub explore&lt;/a&gt; tab, that you may or not know (personally, I didn't even knew it existed). It's located at the end of the main navbar.&lt;/p&gt;

&lt;p&gt;Here's what it looks like : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3w5kCqgy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w6yz7p90k96j8981gzc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3w5kCqgy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/w6yz7p90k96j8981gzc7.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, it'll provide a "news feed" with projects and issues you may be interested in, along with some apps that you could introduce in you workflow and GitHub news.&lt;/p&gt;

&lt;p&gt;To build your feed, you'll need to select a few subjects from &lt;a href="https://github.com/topics"&gt;&lt;strong&gt;Topics&lt;/strong&gt;&lt;/a&gt; tab, which is also probably the most useful section. There are a lot of categories available, from general computer sciences stuff, to specific programming languages or even frameworks.&lt;/p&gt;

&lt;p&gt;You can also browse directly a topic. By default it's sorted by stars, but you can change the criteria and find some hidden gems if you're lucky... Pretty neat !&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eWT89XYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dvwz5i7pb9x1t4m8evw8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eWT89XYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dvwz5i7pb9x1t4m8evw8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/collections"&gt;&lt;strong&gt;Collections&lt;/strong&gt;&lt;/a&gt; tab is also pretty cool as it contains a curated list of projects related to a more generic subject.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UifM8t-F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2dc72w9xkebvzya2al6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UifM8t-F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2dc72w9xkebvzya2al6j.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should definitely check it out this feature if you got some spare time !&lt;/p&gt;

</description>
      <category>github</category>
      <category>beginners</category>
      <category>devops</category>
      <category>todayisearched</category>
    </item>
    <item>
      <title>Embellish your GitHub readme profile with 20+ metrics, PageSpeed stats, music you've listened to and more !</title>
      <dc:creator>lowlighter 🦑</dc:creator>
      <pubDate>Tue, 27 Oct 2020 00:04:44 +0000</pubDate>
      <link>https://dev.to/lowlighter/embellish-your-github-readme-profile-with-20-metrics-pagespeed-stats-music-you-ve-listened-to-and-more-2kda</link>
      <guid>https://dev.to/lowlighter/embellish-your-github-readme-profile-with-20-metrics-pagespeed-stats-music-you-ve-listened-to-and-more-2kda</guid>
      <description>&lt;p&gt;So it's been a while since GitHub introduced its &lt;a href="https://docs.github.com/en/free-pro-team@latest/github/setting-up-and-managing-your-github-profile/managing-your-profile-readme"&gt;profile readme&lt;/a&gt; feature which lets you customize your user profile. Since then, a lot of people have been creative with it, and have been developping on components like &lt;a href="https://github.com/anuraghazra/github-readme-stats"&gt;github-readme-stats&lt;/a&gt;, &lt;a href="https://github.com/ryo-ma/github-profile-trophy"&gt;github-profile-trophy&lt;/a&gt; or &lt;a href="https://github.com/anmol098/waka-readme-stats"&gt;waka-readme-stats&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Today, I'm introducing &lt;a href="https://github.com/lowlighter/metrics"&gt;metrics&lt;/a&gt;, a set of various plugins that generates SVG images that you can embed in your user profile to make it even more prettier ! It can be setup either as a GitHub action or as a web server.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 20+ metrics about you !
&lt;/h3&gt;

&lt;p&gt;The main plugin lets you display your account metrics, listed in three categories : &lt;em&gt;Activity&lt;/em&gt;, &lt;em&gt;Community&lt;/em&gt; and &lt;em&gt;Repositories&lt;/em&gt;. Some common stats are included like number of commits, stars, contributions, ... But also a few more exotic ones like your prefered license !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KnHn40sN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7ya5vdra42rggh7d2svh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KnHn40sN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7ya5vdra42rggh7d2svh.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can configure it to hide some parts if you find it too cluttered. A lot of numbers can be intimidating for some people (unless it's on a paycheck haha).&lt;/p&gt;

&lt;p&gt;Also, generated SVGs are transparents with a color font that blends well with both light and dark mode, so your visitors will be able to see it whichever side they are !&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Faster than light with the PageSpeed plugin
&lt;/h3&gt;

&lt;p&gt;If you have a website linked to your account, you can also display its &lt;a href="https://web.dev/measure/"&gt;PageSpeed&lt;/a&gt; performance scores and shows that you've mastered the web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZVuwhrM0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j5690dm392bw40cu5zid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZVuwhrM0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/j5690dm392bw40cu5zid.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎼 Show what you listen to with the music plugin
&lt;/h3&gt;

&lt;p&gt;If you're using &lt;em&gt;Apple Music&lt;/em&gt; or &lt;em&gt;Spotify&lt;/em&gt; to listen music, you can use the &lt;em&gt;Music plugin&lt;/em&gt; to display randomly music tracks from one of your favorite playlist. You'll just need to provide its embed url.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lcppqRXe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/btdjlxe75re0qyb248ra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lcppqRXe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/btdjlxe75re0qyb248ra.png" alt="Suggested tracks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're brave enough to create a &lt;em&gt;Spotify&lt;/em&gt; token, it's possible to display the track you recently listened to instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jkAViKWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0abz0amko6i7t4fko8i2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jkAViKWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0abz0amko6i7t4fko8i2.png" alt="Recently listened"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Reveal the artist in you with templates
&lt;/h3&gt;

&lt;p&gt;The generated SVGs are rendered through &lt;a href="https://github.com/mde/ejs"&gt;EJS&lt;/a&gt;, which means you can actually use HTML, CSS and JS to template your metrics from the data gathered through the various GitHub APIs and plugins.&lt;/p&gt;

&lt;p&gt;For instance, I made a more nerdy alternative template based on an unix terminal : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vOjTV7K3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0fisewj0sczq1nyljnup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vOjTV7K3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0fisewj0sczq1nyljnup.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if you're comfortable enough with web, you'll be fine making your own template. Don't hesitate to share it if you made something awesome !&lt;/p&gt;

&lt;h3&gt;
  
  
  🦑 Intrigued ?
&lt;/h3&gt;

&lt;p&gt;There are even more at &lt;a href="https://github.com/lowlighter/metrics"&gt;lowlighter/metrics&lt;/a&gt;, including documentation and source code. Try it now at &lt;a href="https://metrics.lecoq.io"&gt;metrics.lecoq.io&lt;/a&gt; !&lt;/p&gt;

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

</description>
      <category>github</category>
      <category>markdow</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
