<?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: Filipe Herculano</title>
    <description>The latest articles on DEV Community by Filipe Herculano (@fifo).</description>
    <link>https://dev.to/fifo</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%2F236608%2Fe3c409d2-b1d3-4244-92e8-99c4e757dc8e.jpg</url>
      <title>DEV Community: Filipe Herculano</title>
      <link>https://dev.to/fifo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fifo"/>
    <language>en</language>
    <item>
      <title>Weird Programming Stuff</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Wed, 29 Apr 2020 00:50:35 +0000</pubDate>
      <link>https://dev.to/fifo/weird-programming-stuff-kgf</link>
      <guid>https://dev.to/fifo/weird-programming-stuff-kgf</guid>
      <description>&lt;p&gt;Ok, I somehow came across this today:&lt;/p&gt;


&lt;div class="ltag__wikipedia--container"&gt;
  &lt;div class="ltag__wikipedia--header"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sew3uq9H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/wikipedia-logo-0a3e76624c7b1c3ccdeb9493ea4add6ef5bd82d7e88d102d5ddfd7c981efa2e7.svg" class="ltag__wikipedia--logo" alt="Wikipedia Logo"&gt;
    &lt;a href="https://en.wikipedia.org/wiki/Whitespace_(programming_language)" rel="noopener noreferrer"&gt;Whitespace (programming language)&lt;/a&gt;
  &lt;/div&gt;
  &lt;div class="ltag__wikipedia--extract"&gt;&lt;p&gt;&lt;b&gt;Whitespace&lt;/b&gt; is an esoteric programming language developed by Edwin Brady and Chris Morris at the University of Durham. It was released on 1 April 2003. Its name is a reference to whitespace characters. Unlike most programming languages, which ignore or assign little meaning to most whitespace characters, the Whitespace interpreter ignores any non-whitespace characters. Only spaces, tabs and linefeeds have meaning. A consequence of this property is that a Whitespace program can easily be contained within the whitespace characters of a program written in another language, except possibly in languages which depend on spaces for syntax validity such as Python, making the text a polyglot.&lt;/p&gt;&lt;/div&gt;
  &lt;div class="ltag__wikipedia--btn--container"&gt;
    
      &lt;a href="https://en.wikipedia.org/wiki/Whitespace_(programming_language)" rel="noopener noreferrer"&gt;View on Wikipedia&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Which led me to this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://nik.works/project/bodyfuck/"&gt;http://nik.works/project/bodyfuck/&lt;/a&gt; &lt;em&gt;(an implementation of brainfuck that uses a camera as input)&lt;/em&gt; &lt;strong&gt;don't worry, it's SFW and actually well done&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That reminded of this good ol' classic:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/lhartikk"&gt;
        lhartikk
      &lt;/a&gt; / &lt;a href="https://github.com/lhartikk/ArnoldC"&gt;
        ArnoldC
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Arnold Schwarzenegger based programming language
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
ArnoldC&lt;/h1&gt;
&lt;p&gt;Programming language based on the one-liners of Arnold Schwarzenegger.&lt;/p&gt;
&lt;h2&gt;
Motivation&lt;/h2&gt;
&lt;p&gt;Although the one-liners of Arnold Schwarzenegger are fairly well known the true semantics of the uttering is yet to be understood. This project tries to discover new meanings from the Arnold movies with the means of computer science.&lt;/p&gt;
&lt;h2&gt;
HelloWorld.arnoldc&lt;/h2&gt;
&lt;div class="snippet-clipboard-content position-relative overflow-auto"&gt;&lt;pre&gt;&lt;code&gt;IT'S SHOWTIME
TALK TO THE HAND "hello world"
YOU HAVE BEEN TERMINATED
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
Quick Start&lt;/h2&gt;
&lt;div class="snippet-clipboard-content position-relative overflow-auto"&gt;&lt;pre&gt;&lt;code&gt;wget http://lhartikk.github.io/ArnoldC.jar
echo -e "IT'S SHOWTIME\nTALK TO THE HAND \"hello world\"\nYOU HAVE BEEN TERMINATED" &amp;gt; hello.arnoldc
java -jar ArnoldC.jar hello.arnoldc
java hello
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To create some "audible" output you can try the -declaim option:&lt;/p&gt;
&lt;div class="snippet-clipboard-content position-relative overflow-auto"&gt;&lt;pre&gt;&lt;code&gt;java -jar ArnoldC.jar -declaim hello.arnoldc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
Brief overview of the keywords&lt;/h2&gt;
&lt;p&gt;Check the &lt;a href="http://github.com/lhartikk/ArnoldC/wiki/ArnoldC"&gt;wiki&lt;/a&gt; for more details&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=_wk-jT9rn-8" rel="nofollow"&gt;False&lt;/a&gt; &lt;code&gt;I LIED&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=CtNb1dnEaSQ" rel="nofollow"&gt;True&lt;/a&gt; &lt;code&gt;NO PROBLEMO&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=MiB7GLyvvJQ" rel="nofollow"&gt;If&lt;/a&gt; &lt;code&gt;BECAUSE I'M GOING TO SAY PLEASE&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=c4psKYpfnYs" rel="nofollow"&gt;Else&lt;/a&gt; &lt;code&gt;BULLSHIT&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://youtu.be/uGstM8QMCjQ?t=1m23s" rel="nofollow"&gt;EndIf&lt;/a&gt; &lt;code&gt;YOU HAVE NO RESPECT FOR LOGIC&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=wDztrw_0N8M" rel="nofollow"&gt;While&lt;/a&gt; &lt;code&gt;STICK AROUND&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=R39e30FL37U" rel="nofollow"&gt;EndWhile&lt;/a&gt; &lt;code&gt;CHILL&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;PlusOperator &lt;code&gt;GET UP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=7Ox0Ehq-FRQ" rel="nofollow"&gt;MinusOperator&lt;/a&gt; &lt;code&gt;GET DOWN&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=lf3Kyv_iaNs" rel="nofollow"&gt;MultiplicationOperator&lt;/a&gt; &lt;code&gt;YOU'RE FIRED&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=9VHtuqXZQeo" rel="nofollow"&gt;DivisionOperator&lt;/a&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lhartikk/ArnoldC"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Really tho, I could go on forever but now I'm curious to what sort of weird programming-related stuff you guys have seen throughout the years, add your findings below in the comments 👇 (oh gosh, here we go 😅)&lt;/p&gt;

&lt;p&gt;And while we're at it, let's end this post with a video because why not&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/lyZQPjUT5B4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;🎠&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
      <category>weird</category>
      <category>ytho</category>
    </item>
    <item>
      <title>React + Jitsi + Serverless + Twilio SendGrid</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Mon, 13 Apr 2020 21:53:33 +0000</pubDate>
      <link>https://dev.to/fifo/react-jitsi-serverless-twilio-sendgrid-po4</link>
      <guid>https://dev.to/fifo/react-jitsi-serverless-twilio-sendgrid-po4</guid>
      <description>&lt;p&gt;I've been using jitsi meet a lot lately to get in touch with people from a distance, so I thought I could automate my workflow and share it with others as a submission to the Twilio + DEV hackathon&lt;/p&gt;

&lt;h3&gt;
  
  
  📜 Summary
&lt;/h3&gt;

&lt;p&gt;It's a webapp that allows visitors to create video conference meetings and invite participants through answering a simple form that emails everyone on their behalf &lt;em&gt;(desktop browser only for now)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The meeting room name is picked for you using a unique id to reduce collisions since meeting links on jitsi servers are public&lt;/p&gt;

&lt;p&gt;Participants can click on the link in their email and join the video conference right on the website&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ Emails are sent using &lt;a href="https://sendgrid.com" rel="noopener noreferrer"&gt;SendGrid&lt;/a&gt; through serverless functions and the video conference runs on an embedded jitsi meet client through &lt;a href="https://github.com/this-fifo/jutsu" rel="noopener noreferrer"&gt;react-jutsu&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A live demo is available and deployed to zeit here: &lt;a href="https://rendezvous.now.sh" rel="noopener noreferrer"&gt;https://rendezvous.now.sh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code for it is available on GitHub 👇&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/this-fifo" rel="noopener noreferrer"&gt;
        this-fifo
      &lt;/a&gt; / &lt;a href="https://github.com/this-fifo/rendezvous" rel="noopener noreferrer"&gt;
        rendezvous
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      React + Jitsi + Serverless + Twilio SendGrid
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
    &lt;a rel="noopener noreferrer" href="https://github.com/this-fifo/rendezvoussrc/assets/cover.png"&gt;&lt;img alt="rendezvous" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fthis-fifo%2Frendezvoussrc%2Fassets%2Fcover.png" width="90%"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;This app was created to have fun, learn some stuff and take part in the &lt;a href="https://www.twilio.com/blog/introducing-code-exchange-community-and-hackathon" rel="nofollow noopener noreferrer"&gt;twilio&lt;/a&gt; + &lt;a href="https://dev.to/devteam/announcing-the-twilio-hackathon-on-dev-2lh8" rel="nofollow"&gt;DEV&lt;/a&gt; hackathon 🥳&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📜 Summary&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Visitors of the site can invite participants to video conference meetings answering a simple form that emails everyone on their behalf&lt;/p&gt;
&lt;p&gt;The meeting room name is picked for you using a unique id to reduce collisions since meetings links are public&lt;/p&gt;
&lt;p&gt;Participants click on the link in their email and join the video conference right on the website&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ℹ Emails are sent using sendgrid through serverless functions and the video conference runs on an embedded jitsi meet client&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏗 Building it&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;rendezvous&lt;/strong&gt;&lt;/em&gt; was bootstrapped with create-react-app&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Requirements&lt;/h4&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node.js and yarn &lt;em&gt;(or npm)&lt;/em&gt; for development&lt;/li&gt;
&lt;li&gt;Zeit CLI &lt;em&gt;(for testing the serverless Node.js runtime through zeit now)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Required Environment Variables&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;Add the following to a &lt;strong&gt;.env&lt;/strong&gt; file at the project root&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;RENDEZVOUS_HCAPTCHA_SECRET=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;your_hcaptcha_secret&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
RENDEZVOUS_APP_SECRET=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;anything_you_want_here&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
SENDGRID_API_KEY=&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/this-fifo/rendezvous" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Video Conference through &lt;a href="https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md" rel="noopener noreferrer"&gt;Jitsi&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Emails through &lt;a href="https://sendgrid.com/" rel="noopener noreferrer"&gt;SendGrid&lt;/a&gt; 📧&lt;/li&gt;
&lt;li&gt;Base css from &lt;a href="https://github.com/andybrewer/mvp/" rel="noopener noreferrer"&gt;MVP.css&lt;/a&gt; ✨ &lt;em&gt;(with a few modifications)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;All potential &lt;a href="https://www.hcaptcha.com/" rel="noopener noreferrer"&gt;hCaptcha&lt;/a&gt; earnings are donated to Wikimedia foundation 🤗&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope someone finds this useful or at least use it as a base for their own project&lt;/p&gt;

</description>
      <category>twiliohackathon</category>
      <category>react</category>
      <category>jitsi</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Natty Theme</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Mon, 30 Mar 2020 14:07:39 +0000</pubDate>
      <link>https://dev.to/fifo/natty-theme-2pa</link>
      <guid>https://dev.to/fifo/natty-theme-2pa</guid>
      <description>&lt;h3&gt;
  
  
  It's like snazzy but natty
&lt;/h3&gt;

&lt;p&gt;I'm a big fan of the &lt;a href="https://github.com/sindresorhus/iterm2-snazzy"&gt;iterm2-snazzy&lt;/a&gt; colours, but I never found a nice port to vscode that I could stick with in the long run so I decided to make my own&lt;/p&gt;

&lt;p&gt;Natty has a darker background for higher contrast and doesn't make much use of red — as I like to think red should be for errors — I am still thinking of what else to customize but it's in good shape for general use already&lt;/p&gt;

&lt;h3&gt;
  
  
  Here's some previews 🎨
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Pcw2KzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z0uxoivouv2t0tmgune8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Pcw2KzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/z0uxoivouv2t0tmgune8.gif" alt="preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Where next
&lt;/h3&gt;

&lt;p&gt;Little details really bother me, so eventually I would like to have a much stronger level of customization and tweaks on things like punctuation, operators, language specific quirks and editor specific controls&lt;/p&gt;

&lt;p&gt;I would also love to have this be a shared theme among many other development tools I use&lt;/p&gt;

&lt;p&gt;I am open to contributions, suggestions, feedback and help. Feel free to check it out on &lt;a href="https://github.com/this-fifo/natty-theme"&gt;GitHub&lt;/a&gt; and the &lt;a href="https://marketplace.visualstudio.com/items?itemName=this-fifo.natty"&gt;vscode marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;☺️&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>design</category>
      <category>theme</category>
      <category>extension</category>
    </item>
    <item>
      <title>Video Conferencing App using React and Jitsi</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Fri, 27 Mar 2020 23:51:28 +0000</pubDate>
      <link>https://dev.to/fifo/video-conferencing-app-using-react-and-jitsi-32oh</link>
      <guid>https://dev.to/fifo/video-conferencing-app-using-react-and-jitsi-32oh</guid>
      <description>&lt;p&gt;I have been reading a bit about WebRTC and how those video conferencing apps work given the situation we're all in due COVID-19&lt;/p&gt;

&lt;p&gt;One project that caught my attention recently was &lt;a href="https://jitsi.org/"&gt;jitsi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They're open source and quite nice to work with, in their api &lt;a href="https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md"&gt;docs&lt;/a&gt; they go over how to embed jitsi in your application&lt;/p&gt;

&lt;p&gt;I decided to use that in a React project I am currently working on and made that into a shared component since I didn't find anything out there&lt;/p&gt;

&lt;p&gt;You can see a live demo using the public jitsi domain &lt;a href="https://this-fifo.github.io/jutsu/"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this is intended to be used on the desktop browser for now, to join a Jitsi room on mobile you will need their app, although checkout &lt;a href="https://github.com/jitsi/jitsi-meet/pull/3518"&gt;this PR&lt;/a&gt; for more information&lt;/em&gt;&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add react-jutsu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Add the Jitsi Meet API js file to the html body
&lt;/h2&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;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;'https://meet.jit.si/external_api.js'&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Sample Usage
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Jutsu&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-jutsu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;room&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setRoom&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCall&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&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;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preventDefault&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;room&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;setCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Jutsu&lt;/span&gt;
      &lt;span class="na"&gt;roomName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;room&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;userName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;loadingComponent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;loading ...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'room'&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'text'&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Room'&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;room&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setRoom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'name'&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'text'&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Name'&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'submit'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Start / Join
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Supported Configuration
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Check the &lt;a href="https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md#api--new-jitsimeetexternalapidomain-options"&gt;Jitsi Meet API docs&lt;/a&gt; for more&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Room Name
&lt;/h3&gt;

&lt;p&gt;The meeting room name&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This prop is required for jitsi to load&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  User Name
&lt;/h3&gt;

&lt;p&gt;The participant's name&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This prop is required for jitsi to load&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Domain
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Jutsu&lt;/span&gt; &lt;span class="na"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'my-custom-domain.com'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Your Jitsi domain to use, the default value is &lt;code&gt;meet.jit.si&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Loading Component
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Jutsu&lt;/span&gt; &lt;span class="na"&gt;loadingComponent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ProgressBar&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;An optional loading component, the default value is &lt;code&gt;&amp;lt;p&amp;gt;Loading ...&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Styles
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;containerStyle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;containerStyles&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;jitsiContainerStyle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;jitsiContainerStyles&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Internally Jutsu is constructed inside 2 containers, you can add custom styles for each by specifying &lt;code&gt;containerStyles&lt;/code&gt; and &lt;code&gt;jitsiContainerstyles&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The default values are&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;const&lt;/span&gt; &lt;span class="nx"&gt;containerStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;800px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400px&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;jitsiContainerStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&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="s1"&gt;block&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;- used for loadingComponent logic&lt;/span&gt;
  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100%&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;p&gt;An example override could be&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Jutsu&lt;/span&gt; &lt;span class="na"&gt;containerStyles&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1200px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;800px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Feel free to grab it out for your next project or help me modify it to suit your needs, the code is open source and you can find it on github&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/this-fifo"&gt;
        this-fifo
      &lt;/a&gt; / &lt;a href="https://github.com/this-fifo/jutsu"&gt;
        jutsu
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A jitsi meet component wrapper and custom hook moulded with react's chakra 💠
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
&amp;lt;Jutsu /&amp;gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;A jitsi meet component wrapper and custom hook moulded with react's chakra 💠&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://this-fifo.github.io/jutsu/" rel="nofollow"&gt;View live demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/react-jutsu" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3d7228621a169a7e6fc752561c56905a6c8ab678c5cc3fcd1a95e4aa3242f4b0/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f72656163742d6a757473752e737667" alt="NPM"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Install&lt;/h2&gt;
&lt;div class="highlight highlight-source-shell position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;yarn add react-jutsu&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
Add the Jitsi Meet API js file to the html body&lt;/h2&gt;
&lt;div class="highlight highlight-text-html-basic position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;body&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt; &lt;span class="pl-c1"&gt;src&lt;/span&gt;='&lt;span class="pl-s"&gt;https://meet.jit.si/external_api.js&lt;/span&gt;'&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;script&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="pl-kos"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="pl-ent"&gt;body&lt;/span&gt;&lt;span class="pl-kos"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;You can choose to load the script another way, the hook will return an error until the jitsi API is available in &lt;code&gt;window&lt;/code&gt; scope.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
Two options&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;You can use the provided component for simple scenarios or the hook for access to the jitsi meet api&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight highlight-source-js position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-v"&gt;Jutsu&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'react-jutsu'&lt;/span&gt; &lt;span class="pl-c"&gt;// Component&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-s1"&gt;useJitsi&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'react-jutsu'&lt;/span&gt; &lt;span class="pl-c"&gt;// Custom hook&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
Sample Usage (Hook)&lt;/h2&gt;
&lt;div class="highlight highlight-source-js position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-v"&gt;React&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-s1"&gt;useEffect&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'react'&lt;/span&gt;
&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-s1"&gt;useJitsi&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'react-jutsu'&lt;/span&gt;
&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-v"&gt;App&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;jitsiConfig&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-c1"&gt;roomName&lt;/span&gt;: &lt;span class="pl-s"&gt;'konoha'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;displayName&lt;/span&gt;: &lt;span class="pl-s"&gt;'Naruto Uzumaki'&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt;
    &lt;span class="pl-c1"&gt;password&lt;/span&gt;: &lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/this-fifo/jutsu"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>react</category>
      <category>webrtc</category>
      <category>video</category>
      <category>call</category>
    </item>
    <item>
      <title>A bit of git.io url fun for your sunday</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Sun, 01 Mar 2020 18:28:49 +0000</pubDate>
      <link>https://dev.to/fifo/a-bit-of-git-io-url-fun-for-your-sunday-4ip3</link>
      <guid>https://dev.to/fifo/a-bit-of-git-io-url-fun-for-your-sunday-4ip3</guid>
      <description>&lt;p&gt;I was bored and browsing around today and happened to find this old &lt;a href="https://gist.github.com/defunkt/1209316"&gt;gist&lt;/a&gt; from GitHub's cofounder for generating a more personalized git.io url&lt;/p&gt;

&lt;p&gt;I thought it was cool — &lt;em&gt;although for some reason the script wasn't working for me&lt;/em&gt; — so I just extracted the important part:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://git.io &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s1"&gt;'url=&amp;lt;YOUR_GITHUB_URL&amp;gt;'&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;YOUR_CODE&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then it occurred to me I could just use a &lt;code&gt;#&lt;/code&gt; identifier used for scrolling to generate a more &lt;del&gt;&lt;em&gt;useless&lt;/em&gt;&lt;/del&gt; personalized fun url for myself&lt;/p&gt;

&lt;p&gt;Try going to &lt;a href="https://git.io/fifo"&gt;https://git.io/fifo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hopefully you see this cool greeting like I do in Firefox&lt;/p&gt;

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

&lt;p&gt;Anyways, all I had to do was get the url encoded value of the 👋 emoji which is &lt;code&gt;%F0%9F%91%8B&lt;/code&gt; and use that in the curl request&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://git.io &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s1"&gt;'url=https://github.com/this-fifo/#%F0%9F%91%8B'&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fifo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hope you enjoy your sunday!&lt;/p&gt;

&lt;p&gt;ʕ •ᴥ•ʔ&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>url</category>
      <category>fun</category>
    </item>
    <item>
      <title>Clipbar — Minimal macOS menu bar app for stashing clipboard content</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Fri, 21 Feb 2020 00:35:51 +0000</pubDate>
      <link>https://dev.to/fifo/clipbar-minimal-macos-menu-bar-app-for-stashing-clipboard-content-22op</link>
      <guid>https://dev.to/fifo/clipbar-minimal-macos-menu-bar-app-for-stashing-clipboard-content-22op</guid>
      <description>&lt;h2&gt;
  
  
  From Larry Tesler to SourceNote to pbpaste to Clipbar
&lt;/h2&gt;

&lt;p&gt;The recent death of &lt;a href="https://en.wikipedia.org/wiki/Larry_Tesler"&gt;Larry Tesler&lt;/a&gt; made me realize how much we take for granted our modern tooling and led me into spending an unusual amount of time reading about the invention of the copy &amp;amp; paste as we know today &lt;em&gt;(even one of my favourite &lt;a href="https://vimeo.com/36579366"&gt;talks&lt;/a&gt; mentions Larry and his principles)&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  Thank you for your amazing contributions Larry!
&lt;/h3&gt;
&lt;/blockquote&gt;

&lt;p&gt;Upon my findings, I came across an incredible app called &lt;a href="https://www.sourcenoteapp.com/"&gt;SourceNote&lt;/a&gt; and I was astonished by how much I could relate to the problem it aims to solve — &lt;em&gt;Feel free to stop reading this and watch their promo video, I thought it was such a simple elegant solution to a common occurrence in my workflow&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Anyways, that made me want to try and approach that same problem with my own tools just because native access to the system clipboard is built in on most operating systems and I was feeling empathetic towards Larry's terrific invention&lt;/p&gt;

&lt;h2&gt;
  
  
  pbpaste
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: pbpaste is a macOS command, if you're on linux &lt;a href="https://superuser.com/questions/288320/whats-like-osxs-pbcopy-for-linux"&gt;try this command&lt;/a&gt; and if you are in Windows I think there is a clip command or you can try Cygwin with /dev/clipboard&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First thing that came to my mind was — "I can write a bash script to dump everything into a txt file and then use that file for searching later"&lt;/p&gt;

&lt;p&gt;So what does that look like?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pbpaste &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; clipboard.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The date and the echo at the end is so you can facilitate some pattern for searching and browsing through the contents of the file as it grows indefinitely&lt;/p&gt;

&lt;p&gt;Say you had &lt;strong&gt;"Hello World"&lt;/strong&gt; in your clipboard, this is what you would get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thu 20 Feb 2020 20:20:20 EST
Hello World

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

&lt;/div&gt;



&lt;p&gt;You can alias that command to something more convenient and run it whenever you want to stash your clipboard data to this file&lt;/p&gt;

&lt;p&gt;And now you can search through that file with something like grep &lt;em&gt;(or &lt;a href="https://github.com/BurntSushi/ripgrep"&gt;ripgrep&lt;/a&gt;, if you're like me)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nice! Except ...&lt;/p&gt;

&lt;h2&gt;
  
  
  I'm not satisfied
&lt;/h2&gt;

&lt;p&gt;Maybe that covers enough for some people, but I wasn't pleased with the solution, after using it for a bit I realized it just moved the problem to a different location&lt;/p&gt;

&lt;p&gt;It solved having multiple "untitled" files open in my editor but it made a bit annoying to use and I noticed I kept going back to old habits&lt;/p&gt;

&lt;p&gt;At this point my mind was thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I like SourceNote but I don't want to reinvent it since it's already pretty solid, maybe I could just simplify my case if I looked for a pattern in my needs and solve for that instead&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Less is more
&lt;/h2&gt;

&lt;p&gt;The pattern I noticed was that I mostly cared about the previous occurrence of my clipboard and not necessarily the entire history&lt;/p&gt;

&lt;p&gt;Countless time I thought I had the previous stuff in my clipboard only to see it was overwritten by some stuff later on&lt;/p&gt;

&lt;p&gt;Another thing I wanted was a quick way of knowing what even is in my clipboard so I don't make the mistake of pasting the wrong thing &lt;em&gt;(like being sloppy and sending my password in a text message to a friend instead of some link)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This would also avoid cluttering by keeping history of things that are no longer relevant indefinitely&lt;/p&gt;

&lt;p&gt;I simply needed a short term stash for accessing the previous value kinda like how we need a temp variable to swap two values — although with &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment"&gt;destructing&lt;/a&gt; in ES6 you could just do&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// swap A and B&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lastly, I wanted this to be minimal and automatic, I don't want to press another shortcut &lt;em&gt;(kudos to SourceNote for the idea to reuse ⌘+C, it is brilliant)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Clipbar
&lt;/h2&gt;

&lt;p&gt;After a few introductory tutorials on Swift and learning how to build OSX apps, I decided a Menu Bar app would be perfect for this&lt;/p&gt;

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

&lt;p&gt;It works by listening to the system's clipboard for changes and whenever there's a new entry it stashes the previous one&lt;/p&gt;

&lt;p&gt;The UI displays a short preview of the current and previous values and gives you the option to swap them as well as clear the contents along with your clipboard value&lt;/p&gt;

&lt;p&gt;There's definitely room for improvement &lt;em&gt;(feel free to contribute)&lt;/em&gt; and it might even be useless for most people but it was fun&lt;/p&gt;

&lt;p&gt;Anyway, you can find the code for it on &lt;a href="https://github.com/this-fifo/clipbar/"&gt;GitHub&lt;/a&gt; and you can &lt;a href="https://github.com/this-fifo/clipbar/releases"&gt;download&lt;/a&gt; the release from there if you don't wish to build it from source. 😁&lt;/p&gt;

</description>
      <category>clipboard</category>
      <category>swift</category>
      <category>macos</category>
      <category>osx</category>
    </item>
    <item>
      <title>Creating a custom react hook for markdown parsing</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Wed, 12 Feb 2020 17:25:22 +0000</pubDate>
      <link>https://dev.to/fifo/creating-a-custom-react-hook-for-markdown-parsing-109</link>
      <guid>https://dev.to/fifo/creating-a-custom-react-hook-for-markdown-parsing-109</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%2Fsource.unsplash.com%2F600x300%2F%3Freact%2Bjavascript" 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%2Fsource.unsplash.com%2F600x300%2F%3Freact%2Bjavascript"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I am making a side project in React that requires markdown parsing so I decided to use that as a good candidate to experiment with custom &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;hooks&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Checkout this fantastic &lt;a href="https://wattenberger.com/blog/react-hooks" rel="noopener noreferrer"&gt;post&lt;/a&gt; from Amelia Wattenberger that goes over a comparison between traditional class components versus using hooks and how they make React feel less bloated and more natural to work with&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's what I needed to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse a markdown string&lt;/li&gt;
&lt;li&gt;Sanitize that string to prevent &lt;a href="https://owasp.org/www-community/attacks/xss/" rel="noopener noreferrer"&gt;XSS&lt;/a&gt; attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apparently &lt;a href="https://github.com/search?q=markdown+parser" rel="noopener noreferrer"&gt;there is a vast number of parsers out there&lt;/a&gt;. I decided to go with &lt;a href="https://github.com/markedjs/marked" rel="noopener noreferrer"&gt;marked&lt;/a&gt; which seems like a good library with an active community and a nice and simple implementation&lt;/p&gt;

&lt;p&gt;Again, the same could be said for sanitizing html &lt;em&gt;(for some reason people just like writing parsers a lot)&lt;/em&gt;, so I picked sanitize-html which offers a nice level of configuration through a simple object&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Alright let's get to work&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="c1"&gt;// parsing markdown with marked&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;marked&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;md&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
  # heading

  [link][1]

  [1]: #heading "heading"`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lexer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;md&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;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Will output this html!&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;h1&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"heading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;heading&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#heading"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"heading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;link&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, to prevent XSS, let's add this before using the html&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="c1"&gt;// sanitizing raw html with sanitize-html&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sanitizeHtml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&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;sanitize-html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// passing the html output from marked&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitizeHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output now is&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;heading
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#heading"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"heading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;link&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait, what? Where's our h1 tag? Well, apparently the default options for sanitize-html consider h1 unsafe (I guess), they go over the specs in their &lt;a href="https://github.com/apostrophecms/sanitize-html/blob/master/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; so I went and added my custom defaults&lt;/p&gt;

&lt;p&gt;Marked also supports a nice set of configurations &lt;em&gt;(syntax highlighting being my favourite)&lt;/em&gt; you can checkout their docs &lt;a href="https://marked.js.org/#/USING_ADVANCED.md#options" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  useMarked('# yay!')
&lt;/h2&gt;

&lt;p&gt;Awesome, we have everything, let's turn that into a React hook called useMarked&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;sanitizeHTML&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sanitize-html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marked&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;defaultOptions&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./defaultOptions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useMarked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defaultOptions&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setHtml&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markedOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markedOptions&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;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lexer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markdown&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;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;marked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;setHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;skipSanitize&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sanitizeHTML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sanitizeOptions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now we can use it in any function component by doing&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useMarked&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use-marked-hook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`**bold content**`&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMarked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;// html -&amp;gt; &amp;lt;p&amp;gt;&amp;lt;/strong&amp;gt;bold content&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;dangerouslySetInnerHTML&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;__html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Custom Hooks
&lt;/h2&gt;

&lt;p&gt;I also found that there's a quick way to test your hooks using the &lt;a href="https://www.npmjs.com/package/@testing-library/react-hooks" rel="noopener noreferrer"&gt;@testing-library/react-hooks&lt;/a&gt; package which provide us with the nice renderHook helper&lt;/p&gt;

&lt;p&gt;Testing our useMarked hook looks like this&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useMarked&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use-marked-hook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;renderHook&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@testing-library/react-hooks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;useMarked&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Receives markdown and returns html&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderHook&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;useMarked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;# test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;h1&amp;gt;test&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&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;&lt;strong&gt;⚠️ Note the newline character added at the end of the output (&lt;em&gt;jest errors were very unhelpful in seeing that and it took me quite a bit to realize tests were failing because of it&lt;/em&gt; 🤦‍♂️)&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;To save you some effort, if you ever find the need for a markdown parser in your react projects, I published this custom hook as an npm package which you can &lt;a href="https://www.npmjs.com/package/use-marked-hook" rel="noopener noreferrer"&gt;download&lt;/a&gt; and use now 😉&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add use-marked-hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I made the code for it available on &lt;a href="https://github.com/this-fifo/use-marked-hook" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also includes a sample react app that uses useMarked hook to render a local markdown file into an html page that is later published live through github pages, checkout the result &lt;a href="https://this-fifo.github.io/use-marked-hook/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>markdown</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Meet Dash O’Pepper</title>
      <dc:creator>Filipe Herculano</dc:creator>
      <pubDate>Thu, 02 Jan 2020 18:12:34 +0000</pubDate>
      <link>https://dev.to/fifo/meet-dash-o-pepper-4fbj</link>
      <guid>https://dev.to/fifo/meet-dash-o-pepper-4fbj</guid>
      <description>&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l62yhuUM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://source.unsplash.com/600x300/%3Fblack%2Bpepper" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l62yhuUM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://source.unsplash.com/600x300/%3Fblack%2Bpepper"&gt;&lt;/a&gt;random image from unsplash
    
&lt;/p&gt;

&lt;p&gt;This other day I was writing an app to play with React and GitHub's API and ended up finding a specially unusual account&lt;/p&gt;

&lt;p&gt;Here's the thing, if you try to sign up for a new account on GitHub your username must meet a certain criteria, to quote their error message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Username may only contain alphanumeric characters or single hyphens, and cannot begin or end with a hyphen.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And if you try to register with an username that already exists you get this:&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gMqPFACb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jhd05moytjbwihyj33vf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gMqPFACb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/jhd05moytjbwihyj33vf.png"&gt;&lt;/a&gt;nice try
    
&lt;/p&gt;

&lt;h2&gt;
  
  
  Okay, so what?
&lt;/h2&gt;

&lt;p&gt;Let's go back to the app I'm making, it leverages GitHub's API to fetch any user's starred repos and displays them in a gallery mode so you can &lt;del&gt;stalk through&lt;/del&gt; &lt;em&gt;browse&lt;/em&gt; their activity&lt;/p&gt;

&lt;p&gt;I was &lt;del&gt;stalking&lt;/del&gt; playing around on it with some seed data and ended up seeing this little guy pop up in the UI&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--497xGTAK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8v9sm9a74kbozky2g138.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--497xGTAK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8v9sm9a74kbozky2g138.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;At that moment I was like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wtf? I thought I had the username displaying, what is this -? Let me check the code again, probably a typo ... yep, I do have the username displaying ... wait a minute 🤔&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Okay, let's try seeing "-" profile page on GitHub's actual UI &lt;a href="https://github.com/-" rel="noopener noreferrer"&gt;&lt;u&gt;&lt;a href="https://github.com/-"&gt;https://github.com/-&lt;/a&gt;&lt;/u&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pH02EuZA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7un90y5d5maeg1evtpjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pH02EuZA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/7un90y5d5maeg1evtpjo.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;At this point I was very confused, how come my app UI shows me that there's this ghost user but GitHub's UI doesn't?&lt;/p&gt;

&lt;p&gt;Let's go back to the sign up page and try registering using a "-" too&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TfdO6bDj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/x0q8u48wjg9nv1um6sbd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TfdO6bDj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/x0q8u48wjg9nv1um6sbd.png"&gt;&lt;/a&gt;???
    
&lt;/p&gt;

&lt;p&gt;Notice we are getting the combination of both error messages this time, the one for allowed characters &lt;strong&gt;and&lt;/strong&gt; the one for username already taken&lt;/p&gt;

&lt;p&gt;I was now determined to explore it a bit further using GitHub's REST API, feel free to continue to follow along&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding the mysterious account through GitHub's REST API
&lt;/h2&gt;

&lt;p&gt;First, let's do a plain GET on the search endpoint &lt;em&gt;- if you're on firefox you can open this link directly in the browser to see a nice json output -&lt;/em&gt;, feel free to use postman, curl, anything&lt;/p&gt;

&lt;p&gt;The endpoint is &lt;code&gt;/search/users&lt;/code&gt; and the querystring is &lt;code&gt;-&lt;/code&gt;, so the end result will look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;a href="https://api.github.com/search/users?q=-"&gt;https://api.github.com/search/users?q=-&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know right? I got 2 results and was surprised yet again, turns out the second result did not have dashes in their username but had dashes in their email which is probably why it got returned&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Thinking about this now, as per the &lt;a href="https://tools.ietf.org/html/rfc5322"&gt;&lt;u&gt;RFC 5322&lt;/u&gt;&lt;/a&gt;, the local-part of an email is allowed to have dashes in it, so maybe that's why the search endpoint allows for that odd query string&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This was fun, let's keep going and grab more info around Mr. Dash, let's use another GET endpoint for discovering user information&lt;/p&gt;

&lt;p&gt;The endpoint this time is &lt;code&gt;/users/:username&lt;/code&gt;, so the end result is now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;a href="https://api.github.com/users/-"&gt;https://api.github.com/users/-&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yay, no 404 this time! Looks like we got some further details about Mr. Dash and it turns out the account name is actually Dash O'Pepper (the account owner obviously knows what's up), here's the full JSON output:&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;"login"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;75544&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MDQ6VXNlcjc1NTQ0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"avatar_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;"https://avatars2.githubusercontent.com/u/75544?v=4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gravatar_id"&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;"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;"https://api.github.com/users/-"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"html_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;"https://github.com/-"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"followers_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;"https://api.github.com/users/-/followers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"following_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;"https://api.github.com/users/-/following{/other_user}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gists_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;"https://api.github.com/users/-/gists{/gist_id}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"starred_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;"https://api.github.com/users/-/starred{/owner}{/repo}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subscriptions_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;"https://api.github.com/users/-/subscriptions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organizations_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;"https://api.github.com/users/-/orgs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"repos_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;"https://api.github.com/users/-/repos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"events_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;"https://api.github.com/users/-/events{/privacy}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"received_events_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;"https://api.github.com/users/-/received_events"&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;"User"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"site_admin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&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;"Dash O'Pepper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"blog"&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;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hireable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"public_repos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"public_gists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"followers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"following"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2009-04-19T23:52:47Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2014-04-11T21:48:45Z"&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;Wait, what? 13 Followers? Since we can't actually see this account through GitHub's web interface, that must mean 13 other people went the trouble of using GitHub's API to authenticate themselves and follow Dash O'Pepper (plot twist, I'm included in that count)&lt;/p&gt;

&lt;p&gt;You can see the list of people that follow Dash O'Pepper here &lt;em&gt;(might have changed after this article was published)&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;a href="https://api.github.com/users/-/followers"&gt;https://api.github.com/users/-/followers&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know, you also want to be part of this &lt;del&gt;cult&lt;/del&gt; select club (at least I wanted), so how do we do that?&lt;/p&gt;

&lt;h2&gt;
  
  
  Back to GitHub's API docs:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Following a user requires the user to be logged in and authenticated with basic auth or OAuth with the &lt;u&gt;user:follow&lt;/u&gt; scope.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's a bit to cover so for the sake of brevity I'll handle that for GitHub's docs this time, just follow what's in here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;&lt;a href="https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line"&gt;https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line&lt;/a&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure you end up with something like the picture below and that your token has the &lt;code&gt;user:follow&lt;/code&gt; scope:&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wn-qTj9U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://help.github.com/assets/images/help/settings/personal_access_tokens.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wn-qTj9U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://help.github.com/assets/images/help/settings/personal_access_tokens.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Grab that and you should now be ready to perform authenticated actions on github from the command line&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FX7ckFD7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wkfnsrd9wx295ujvib5d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FX7ckFD7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wkfnsrd9wx295ujvib5d.gif"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Ok, cool, how do we follow someone on github through their API now?
&lt;/h3&gt;

&lt;p&gt;This time the endpoint will be &lt;code&gt;/user/following/:username&lt;/code&gt; and it needs to be a PUT request, let's follow &lt;code&gt;-&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; username:token https://api.github.com/user/following/-
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can confirm by going to the following tab on your github profile page &lt;em&gt;(although bonus point to you if you use the API to confirm that)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DwaO6ICo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l07aps1626fidspqqq95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DwaO6ICo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l07aps1626fidspqqq95.png"&gt;&lt;/a&gt;Dash O'Pepper in my following list
    
&lt;/p&gt;

&lt;h2&gt;
  
  
  A word of caution
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;! Do not attempt the next steps if you want to keep your GitHub's stars tab functional&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Looks like Dash O'Pepper also has a single repo called &lt;code&gt;test&lt;/code&gt; with the following description:&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TzZWZlCP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5jxjohbzt42krvw9fl7e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TzZWZlCP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5jxjohbzt42krvw9fl7e.png"&gt;&lt;/a&gt;-'s test repo details from my app
    
&lt;/p&gt;

&lt;p&gt;Seeing that made me wonder if that could possibly be some GitHub's staff account or some QA account that they use for internal stuff&lt;/p&gt;

&lt;p&gt;Seems like the repo was modified pretty recently too, that made me curious so I tried cloning that repo, but this is what I get&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cloning into 'test'...
Username for 'https://github.com': this-fifo
Password for 'https://this-fifo@github.com':
remote: Repository not found.
fatal: repository 'https://github.com/-/test.git/' not found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That made me a bit sad but okay, then I tried seeing if I could at least star his repo, which, according to the API you can do by making another PUT request to &lt;code&gt;/user/starred/:owner/:repo&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; username:token https://api.github.com/user/starred/-/test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yay, that worked, that is why I could see details from his repo on my app in the picture from before, let's see now see it on my profile through GitHub's as well and ...&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d2C_kW5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/err3kvadikf4m4mejuoz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d2C_kW5q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/err3kvadikf4m4mejuoz.png"&gt;&lt;/a&gt;(╯°□°)╯︵ ┻━┻
    
&lt;/p&gt;

&lt;p&gt;Looks like I broke my stars tab on github after that, possibly even a bug in their code, but everything else in still works fine and since I plan to use my new app for &lt;del&gt;stalking&lt;/del&gt; browsing through users starred collection anyways I'll leave that as is for now&lt;/p&gt;

&lt;p&gt;Hope you had fun reading this and if you are Dash O'Pepper thank you for entertaining me for a bit &lt;em&gt;(seriously tho, who are you? how did you do this?)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also, my app is a work in progress but it's open source, feel free to play on it if you want, the code is at &lt;u&gt;&lt;a href="https://github.com/this-fifo/stella"&gt;https://github.com/this-fifo/stella&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>starred</category>
      <category>api</category>
    </item>
  </channel>
</rss>
