<?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: Varun A P ⚡️</title>
    <description>The latest articles on DEV Community by Varun A P ⚡️ (@apvarun).</description>
    <link>https://dev.to/apvarun</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%2F60036%2F763adbc6-f1aa-4a2a-98dc-61f4de424eb3.jpg</url>
      <title>DEV Community: Varun A P ⚡️</title>
      <link>https://dev.to/apvarun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apvarun"/>
    <language>en</language>
    <item>
      <title>Fast Search for Static Sites (JAMStack)</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Sun, 07 Jun 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/apvarun/fast-search-for-static-sites-jamstack-47g4</link>
      <guid>https://dev.to/apvarun/fast-search-for-static-sites-jamstack-47g4</guid>
      <description>&lt;h2&gt;
  
  
  The JAMStack revolution is already here!
&lt;/h2&gt;

&lt;p&gt;If you are into frontend, you might have already heard about this, The JAMStack. From the time &lt;a href="https://netlify.com"&gt;Netlify&lt;/a&gt; popularized the concept and with the push from the &lt;a href="https://www.gatsbyjs.org/"&gt;Gatsby&lt;/a&gt; community, people have started using this extensively. This is nice considering the benefits that come along.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✔️ Faster Page loading&lt;/li&gt;
&lt;li&gt;✔️ No more server-side rendering (no need to maintain FE setup)&lt;/li&gt;
&lt;li&gt;✔️ Developer Experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, it is an advancement to the entire web, reaching far more countries and devices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ok. So?
&lt;/h3&gt;

&lt;p&gt;I've built a bunch of JAMStack sites (mostly for fun, some for work) using various tools and frameworks like Gatsby, Sapper, Hugo, VuePress and more. Among those sites, only a few actually conceptualize JAMStack's potential. I mean, anyone can build a 5 page website with just HTML, CSS and maybe a bit of JS. We did that for years without any of the tools that we have at our disposal.&lt;/p&gt;

&lt;p&gt;In this article, let's uncover more about a crucial part of any large website ▶️ &lt;code&gt;SEARCH&lt;/code&gt; ◀&lt;/p&gt;

&lt;p&gt;I explored most of the things stated below while I was building &lt;a href="https://confs.space"&gt;Confs.space&lt;/a&gt; over a few weekends.&lt;/p&gt;

&lt;p&gt;How is this site different? Let's take a look at the stats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📺 Hosts 120+ Conferences&lt;/li&gt;
&lt;li&gt;🎤 3000+ talks&lt;/li&gt;
&lt;li&gt;🖨 Generates 4000+ Pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above metric is something to keep in mind while we go over the topic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Search
&lt;/h2&gt;

&lt;p&gt;When you have a site that has so much content, it is important to provide the ability to find what the user is interested in. And search is a quick and accustomed way of doing so.&lt;/p&gt;

&lt;p&gt;With this thought, I started looking at how I can do it effectively as there is so much data.&lt;/p&gt;

&lt;p&gt;Tech stack and the considerations before implementing search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;→ Hugo static site generator (template based)&lt;/li&gt;
&lt;li&gt;→ JavaScript, for few operations like persisting darkmode, toggling menu, etc.&lt;/li&gt;
&lt;li&gt;→ Hosted on Vercel's &lt;code&gt;now&lt;/code&gt; (Brings in the possibility of having a serverless function)&lt;/li&gt;
&lt;li&gt;→ Content is stored as markdown files&lt;/li&gt;
&lt;li&gt;→ Performance should not degrade (this is personal 😛)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Available Options
&lt;/h2&gt;

&lt;p&gt;With all this in mind, the most obvious thought was that it might need some form of backend setup to have an effective search. I've also heard about &lt;a href="https://www.algolia.com"&gt;Algolia&lt;/a&gt;, which offers site-wide discoverability services.&lt;/p&gt;

&lt;p&gt;At the same time, I explored options for some form of client side search as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Breaking it down
&lt;/h3&gt;

&lt;p&gt;Let's breakdown the things that would be required for each of the options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt; Custom Backend&lt;/p&gt;

&lt;p&gt;a) Require to setup the entire flow, reading data from repository to searching it effectively&lt;/p&gt;

&lt;p&gt;b) Need separate hosting (Serverless might not make the cut when there is a cold start)&lt;/p&gt;

&lt;p&gt;c) Full customizability - total control over the implementation&lt;/p&gt;

&lt;p&gt;d) Maintenance effort&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt; Third-party services&lt;/p&gt;

&lt;p&gt;a) Setup some CI like Github Actions to update committed data to third-party's index for the site&lt;/p&gt;

&lt;p&gt;b) Searching would involve API calls to the third-party service&lt;/p&gt;

&lt;p&gt;c) Add custom javascript code to the site (usually adds between 25kb and 75kb of additional JS on load)&lt;/p&gt;

&lt;p&gt;d) No need to worry about scaling (this is probably the reason third-party search providers exists)&lt;/p&gt;

&lt;p&gt;e) Cost&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3:&lt;/strong&gt; Client-side search&lt;/p&gt;

&lt;p&gt;I came across two contenders for client-side search: &lt;a href="https://lunrjs.com"&gt;Lunr&lt;/a&gt; and &lt;a href="https://fusejs.io"&gt;Fuse.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;a) Requires a search index to be generated - either during runtime or build time (pre-computed index)&lt;/p&gt;

&lt;p&gt;b) Effectiveness depends on the library - mostly does fuzzy search&lt;/p&gt;

&lt;p&gt;c) No additional API calls (for any number of searches), can make the search feel quick (UX)&lt;/p&gt;

&lt;p&gt;d) Adds ~10kb additional load to the page&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;Finally, I decided to go with a client side implementation as it's of least effort. Also, with hugo, generating additional file(s) for the index is a breeze (just adds a few milliseconds to the build).&lt;/p&gt;

&lt;p&gt;In the first version of search for &lt;code&gt;confs.space&lt;/code&gt;, I decided to go with &lt;a href="https://lunrjs.com/guides/index_prebuilding.html"&gt;Lunrjs&lt;/a&gt;. It was quite straight forward to implement as the index only includes a bunch of JSON objects with fields required for the search.&lt;/p&gt;

&lt;p&gt;Added the following lines for generating the index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{- $.Scratch.Add "index" slice -}}
{{- range where .Site.Pages ".Params.template" "==" "talk" -}}
{{- $.Scratch.Add "index" (dict "title" .Title "ref" .Params.url "tags" .Params.tags) -}}
{{- end -}}
{{- $.Scratch.Get "index" | jsonify -}}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For confs.space, in order to allow for searching videos, I needed to include all talks to the search index. The above code adds the title and tags of the videos for providing appropriate suggestions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Scratch in Hugo is much like a state. The content is added to the state as &lt;code&gt;dict&lt;/code&gt;, then JSON stringified and added to the page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  But..
&lt;/h3&gt;

&lt;p&gt;Although I set it up quickly, there were issues with fuzzy search. Even after exhausting combinations, I was not able to get accurate results. It seemed to have an issue with field weights.&lt;/p&gt;

&lt;p&gt;So, I decided to try &lt;a href="https://fusejs.io"&gt;Fuse.js&lt;/a&gt;. It didn't require any change for the index generation. Only the JS code had to be changed. As I hoped, the search was perfect.&lt;/p&gt;

&lt;p&gt;PS: Fusejs is lighter than lunr, just ~4Kb.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimization
&lt;/h2&gt;

&lt;p&gt;Now that the functionality is as expected, I wanted to improve the user experience.&lt;/p&gt;

&lt;p&gt;You might wonder what more can be improved. Surprisingly, there are some crucial things to consider.&lt;/p&gt;

&lt;h3&gt;
  
  
  1 - Size of the index
&lt;/h3&gt;

&lt;p&gt;Since there are a huge number of videos, the size of the generated index is quite large. Loading this index for all the users would result in an overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Since the index is required only for the users who perform the search, the index is only loaded when the search field is in focus. The index is then used to initialize Fuse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Improvement:&lt;/strong&gt; It is possible to split the index into multiple smaller indices based on categories. Doing so will enable users to search with a specific category while loading smaller data.&lt;/p&gt;

&lt;h3&gt;
  
  
  2 - Search page
&lt;/h3&gt;

&lt;p&gt;By moving the search to client side, there is no way of indexing search pages (since the results are dynamic). Because of this, the search results need to be loaded without any delay in UI. [Easy if the page was pre-rendered]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partial Fix:&lt;/strong&gt; For now, I haven't added any pagination for searches and limited the search results to be a maximum of 30 videos in length. And this result is then dynamically added/modified in the DOM (not quite ideal in the virtual DOM world but gets the job done).&lt;/p&gt;

&lt;p&gt;Since the index is already loaded, the search experience feels quite snappy (try at &lt;a href="https://confs.space"&gt;Confs.space&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  To Conclude
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Client-side search is actually considerable for JAMStack sites based on the scale&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For &lt;a href="https://confs.space"&gt;Confs.space&lt;/a&gt;, I might have to look at a different solution as site's content increases, next step being splitting of index into smaller chunks.&lt;/p&gt;

&lt;p&gt;I'll soon be making the source of confs.space open and so I'd be able to use Algolia under its open source initiative.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have any questions or suggestions, I'd love to hear them.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; The article in no way is opposing the use of Lunr. It's just that I had troubles with getting it to work.&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>javascript</category>
      <category>search</category>
      <category>hugo</category>
    </item>
    <item>
      <title>Let's talk about CSS Subgrids</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Sun, 09 Jun 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/apvarun/let-s-talk-about-css-subgrids-29d2</link>
      <guid>https://dev.to/apvarun/let-s-talk-about-css-subgrids-29d2</guid>
      <description>&lt;p&gt;CSS Subgrid is a part of &lt;a href="https://www.w3.org/TR/css-grid-2/"&gt;CSS Grid Level 2 Spec&lt;/a&gt; by CSS working group. It solves a common use case which wasn’t so obvious when grids were launched. Let’s dig deep into what it is!&lt;/p&gt;

&lt;p&gt;CSS grids are primary used for building complex layouts for the web. And when you start building such layouts, there would be use-cases where you would want to use grids for child components as well. This is great! But there is one non-obvious thing that happens when you do so.&lt;/p&gt;

&lt;p&gt;Each time you write &lt;code&gt;display: grid&lt;/code&gt;, a new grid context is created which is totally unaware of the parent grid.&lt;/p&gt;

&lt;p&gt;Now, due to this obscure spec, you would end up with layouts that are not aligned to your main grid(parent’s grid) of the webpage. And it’s because of this problem, Subgrid are here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Subgrid allows a grid-item with its own grid to align in one or both dimensions of the parent’s grid&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is an example of a two-column grid container with two child elements.&lt;/p&gt;

&lt;p&gt;&lt;a href="///static/d15b3e50b78113797b2978bd749baaf3/d3ebb/grid%20with%20child.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jnwlg4EP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://apvarun.com/static/d15b3e50b78113797b2978bd749baaf3/b9e4f/grid%2520with%2520child.png" alt="Grid without subgrid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, the two cards are a part of grid and are aligned properly. But in you see the content of the grid, they are aligned differently for each other although the card itself is a grid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* Styles for grid without subgrid */
.container {
  display: grid;
  grid-template-columns: repeat(2, minmax(50px, 1fr));
  grid-gap: 10px;
  .card {
    display: grid;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  With Subgrid
&lt;/h3&gt;

&lt;p&gt;When you specify the child card as a subgrid, then we can specify the child to use parent’s grid (with auto rows in this case).&lt;/p&gt;

&lt;p&gt;&lt;a href="///static/a8dfdd3ee7c64032230dc9cb989ea6e9/8b54b/grid%20with%20subgrid.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s0vHBr9h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://apvarun.com/static/a8dfdd3ee7c64032230dc9cb989ea6e9/b9e4f/grid%2520with%2520subgrid.png" alt="Grid with subgrid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, the grid line No. 2 is the same for both the cards, thus making the alignment same.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* Styles for grid with subgrid */
.container {
  display: grid;
  grid-template-columns: repeat(2, minmax(50px, 1fr));
  grid-gap: 10px;
  .card {
    display: grid;
    grid-row: span 2;
    grid-template-rows: subgrid;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;PS: Properties like &lt;code&gt;grid-gap&lt;/code&gt; and &lt;code&gt;names grid lines&lt;/code&gt; are also inherited by the subgrid from parent grid.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Checkout the above example for yourself in &lt;a href="https://codepen.io/apvarun/pen/RmXOzX"&gt;Codepen&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Currently the &lt;strong&gt;Subgrid&lt;/strong&gt; spec is only available in Mozilla Firefox Nightly release, but support for other browsers are also currently being worked upon. &lt;a href="https://caniuse.com/#feat=css-subgrid"&gt;caniuse.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; Here is a Scrimba Screencast that explains Subgrid with code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://scrimba.com/c/cgq2knS6"&gt;https://scrimba.com/c/cgq2knS6&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>subgrid</category>
      <category>csssubgrid</category>
      <category>cssgrid</category>
    </item>
    <item>
      <title>Chrome DevTools: Content Overrides</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Fri, 31 May 2019 17:23:18 +0000</pubDate>
      <link>https://dev.to/apvarun/chrome-devtools-content-overrides-3e79</link>
      <guid>https://dev.to/apvarun/chrome-devtools-content-overrides-3e79</guid>
      <description>&lt;p&gt;Have you debugged a bug in production? Or made multiple deployments to verify one specific issue?&lt;/p&gt;

&lt;p&gt;Web Devs are likely to encounter or have encountered such situations numerous times. So, let's look at a way how we can ease such situations with Chrome DevTools.&lt;/p&gt;

&lt;p&gt;In order to figure out issues, one might log values just before the code breaks or go a bit further to add a breakpoint before a few lines, update the breaking code &amp;amp; continue execution. (especially for code that runs on page load)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yes, this is a pain!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But, there is another simpler way of doing this. &lt;/p&gt;

&lt;p&gt;Chrome supports a feature called Overrides in its sources panel. The feature allows to override any files that is received from network with your own copy.&lt;/p&gt;

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

&lt;p&gt;In order to use this,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you'll have to select a folder on local machine for chrome to save the modified version of files&lt;/li&gt;
&lt;li&gt;Once chosen, edit any file and hit &lt;em&gt;CMD + S&lt;/em&gt; or &lt;em&gt;Ctrl = S&lt;/em&gt; to save the file to overrides folder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the file is saved, reload the page so that chrome can use the overridden file on page load. this helps you to modify and test code right in production before pushing out a fix. 🥳&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Preview (overriding file content):&lt;/em&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/yI-id_VukJk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it yourself at&lt;/strong&gt; &lt;a href="https://learndevtools.now.sh/docs/guides/sources/3.-content-overrides/"&gt;Lessons: Content Overrides&lt;/a&gt; (Demo Page)&lt;/p&gt;

&lt;p&gt;You can also clone the repo below and run the same in your local machine.&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--vWogaON8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-28d89282e0daa1e2496205e2f218a44c755b0dd6536bbadf5ed5a44a7ca54716.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/apvarun"&gt;
        apvarun
      &lt;/a&gt; / &lt;a href="https://github.com/apvarun/learndevtools"&gt;
        learndevtools
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Debug Better With DevTools
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Learn Dev Tools&lt;/h1&gt;
&lt;p&gt;Collection of walk-throughs for learning to use developer tools in the browser. Read more &lt;a href="https://learndevtools.now.sh/#why" rel="nofollow"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Getting Started&lt;/h2&gt;
&lt;p&gt;Visit &lt;a href="https://learndevtools.now.sh/" rel="nofollow"&gt;https://learndevtools.now.sh/&lt;/a&gt; to learn and try out various features of devtools to help you be more productive at work.&lt;/p&gt;
&lt;h2&gt;
Contributing&lt;/h2&gt;
&lt;p&gt;Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.&lt;/p&gt;
&lt;h2&gt;
License&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/apvarun/learndevtools/master/LICENSE.md"&gt;MIT&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/apvarun/learndevtools"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Previous Post: &lt;a href="https://dev.to/apvarun/chrome-devtools-logging-without-console-log-2b7i"&gt;Logging Without console.log&lt;/a&gt;

</description>
      <category>googlechrome</category>
      <category>devtools</category>
      <category>chromedevtools</category>
      <category>overrides</category>
    </item>
    <item>
      <title>Chrome DevTools: Logging Without console.log</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Thu, 30 May 2019 17:51:37 +0000</pubDate>
      <link>https://dev.to/apvarun/chrome-devtools-logging-without-console-log-2b7i</link>
      <guid>https://dev.to/apvarun/chrome-devtools-logging-without-console-log-2b7i</guid>
      <description>&lt;p&gt;If you have ever written JavaScript code, you are highly likely to have come across &lt;code&gt;console.log&lt;/code&gt; statements. They are life savers to identify logic-based issues in code.&lt;/p&gt;

&lt;p&gt;But there is a limitation here. You'll need to modify code to add console statements in order to verify values (another option being adding breakpoints).&lt;/p&gt;

&lt;p&gt;But, that's no more true.&lt;/p&gt;

&lt;p&gt;Chrome now allows you to add logging statements without actually adding it in your code. And they call it &lt;strong&gt;logpoints&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;In order for you to add a logpoint, open up the code where you need to log and right-click on line number. Select "Add logpoint" option and enter the list of variables/values to be logged (separated by comma).&lt;/p&gt;

&lt;p&gt;Once set, Chrome will log the values to console each time the line is executed. 🥳&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Preview (logging without console logs):&lt;/em&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/6X_SKJS_s-w"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it yourself at&lt;/strong&gt; &lt;a href="https://learndevtools.now.sh/docs/guides/sources/1.-logging/"&gt;Lessons: Conditional Breakpoints&lt;/a&gt; (Demo Page)&lt;/p&gt;

&lt;p&gt;You can also clone the repo below and run the same in your local machine.&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--vWogaON8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-28d89282e0daa1e2496205e2f218a44c755b0dd6536bbadf5ed5a44a7ca54716.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/apvarun"&gt;
        apvarun
      &lt;/a&gt; / &lt;a href="https://github.com/apvarun/learndevtools"&gt;
        learndevtools
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Debug Better With DevTools
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Learn Dev Tools&lt;/h1&gt;
&lt;p&gt;Collection of walk-throughs for learning to use developer tools in the browser. Read more &lt;a href="https://learndevtools.now.sh/#why" rel="nofollow"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Getting Started&lt;/h2&gt;
&lt;p&gt;Visit &lt;a href="https://learndevtools.now.sh/" rel="nofollow"&gt;https://learndevtools.now.sh/&lt;/a&gt; to learn and try out various features of devtools to help you be more productive at work.&lt;/p&gt;
&lt;h2&gt;
Contributing&lt;/h2&gt;
&lt;p&gt;Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.&lt;/p&gt;
&lt;h2&gt;
License&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/apvarun/learndevtools/master/LICENSE.md"&gt;MIT&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/apvarun/learndevtools"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Previous Post: &lt;a href="https://dev.to/apvarun/chrome-devtools-conditional-breakpoints-444j"&gt;Conditional Breakpoints&lt;/a&gt;

</description>
      <category>googlechrome</category>
      <category>devtools</category>
      <category>chromedevtools</category>
      <category>logging</category>
    </item>
    <item>
      <title>Chrome DevTools: Conditional Breakpoints</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Wed, 29 May 2019 17:24:49 +0000</pubDate>
      <link>https://dev.to/apvarun/chrome-devtools-conditional-breakpoints-444j</link>
      <guid>https://dev.to/apvarun/chrome-devtools-conditional-breakpoints-444j</guid>
      <description>&lt;p&gt;Have you ever tried to debug a loop or code that executes at intervals? I know it's hard to navigate through the loop to understand the bug.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Conditional breakpoints might be just the one for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conditional breakpoints
&lt;/h2&gt;

&lt;p&gt;You would be familiar with adding breakpoints in your source code in order to debug code execution. This is a pretty common practice of finding bugs or understand the execution of code.&lt;/p&gt;

&lt;p&gt;But Chrome also has a feature called conditional breakpoints, which allows you to break at a particular line only if a specific condition is evaluated to be true.&lt;/p&gt;

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

&lt;p&gt;The condition can include any variable in code that is available at that particular line. Even the variables inside the closures can be accessed in the condition evaluation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Preview (debugging with conditional breakpoints):&lt;/em&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/l6PKY-l6wys"&gt;
&lt;/iframe&gt;
&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vWogaON8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-28d89282e0daa1e2496205e2f218a44c755b0dd6536bbadf5ed5a44a7ca54716.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/apvarun"&gt;
        apvarun
      &lt;/a&gt; / &lt;a href="https://github.com/apvarun/learndevtools"&gt;
        learndevtools
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Debug Better With DevTools
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Learn Dev Tools&lt;/h1&gt;
&lt;p&gt;Collection of walk-throughs for learning to use developer tools in the browser. Read more &lt;a href="https://learndevtools.now.sh/#why" rel="nofollow"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Getting Started&lt;/h2&gt;
&lt;p&gt;Visit &lt;a href="https://learndevtools.now.sh/" rel="nofollow"&gt;https://learndevtools.now.sh/&lt;/a&gt; to learn and try out various features of devtools to help you be more productive at work.&lt;/p&gt;
&lt;h2&gt;
Contributing&lt;/h2&gt;
&lt;p&gt;Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.&lt;/p&gt;
&lt;h2&gt;
License&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/apvarun/learndevtools/master/LICENSE.md"&gt;MIT&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



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


&lt;p&gt;&lt;strong&gt;Direct Link:&lt;/strong&gt; &lt;a href="https://learndevtools.now.sh/docs/guides/sources/2.-conditional-breakpoints/"&gt;Lessons: Conditional Breakpoints&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BONUS:&lt;/strong&gt; The new version of Chrome's Canary release (at the time of writing this post) has landed with inline breakpoints which allow you to break at specific points in a line itself. This is helpful in cases where you do multiple function calls or computations in a single line.&lt;/p&gt;

&lt;p&gt;Previous Post: &lt;a href="https://dev.to/apvarun/chrome-devtools-detecting-element-changes-gh6"&gt;Detecting Element Changes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlechrome</category>
      <category>devtools</category>
      <category>chromedevtools</category>
      <category>debuggingjavascript</category>
    </item>
    <item>
      <title>Chrome DevTools: Detecting Element Changes</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Tue, 28 May 2019 18:31:26 +0000</pubDate>
      <link>https://dev.to/apvarun/chrome-devtools-detecting-element-changes-gh6</link>
      <guid>https://dev.to/apvarun/chrome-devtools-detecting-element-changes-gh6</guid>
      <description>&lt;p&gt;Google chrome comes with a lot of handy tools to assist web developers in building a better experience for users/customers. And it has added numerous features over the last few years, forcing other browsers to follow the same path.&lt;/p&gt;

&lt;p&gt;This article will talk about how one can detect changes on elements in the DOM during runtime, primarily for debugging. This is the first in a series of posts covering useful tools of Chrome Dev tools.&lt;/p&gt;

&lt;h1&gt;
  
  
  Elements Panel
&lt;/h1&gt;

&lt;p&gt;Elements panel, as you know, is the place where you can see the elements that are currently available in the DOM (Document Object Modal).&lt;/p&gt;

&lt;p&gt;Chrome allows to listen to three specific events that occur to an element in the DOM tree.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add/Update of an attribute value&lt;/li&gt;
&lt;li&gt;Change in the element's children (subtree)&lt;/li&gt;
&lt;li&gt;Removal of node (child elements)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to add listeners?
&lt;/h2&gt;

&lt;p&gt;Open the Dev Tools and select the Elements tab. In the list of DOM nodes, select the node on which you need to add listener.&lt;/p&gt;

&lt;p&gt;Once the node is selected, a three-dot menu will appear on the left of the node. Clicking on the dots will open a context menu with a bunch of options.&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%2Fkijkfpfzsfeb96m2irdj.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%2Fkijkfpfzsfeb96m2irdj.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, for adding the listener, Select the "Break on" option and then the type of event. Once selected, chrome will listen to changes to that particular element and stop JS execution at the line of code which modifies the selected node.&lt;/p&gt;

&lt;p&gt;Once the breakpoint is hit, you will get to see all the contextual information and memory snapshot, which can be used in identifying the issue source.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Preview (breaking on subtree modification):&lt;/em&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/WfWj3qzwJ1Y"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you want to try it out yourself, head over to the repo below. It has the file that is shown in the Video. Clone the repo and play around :)&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/apvarun" rel="noopener noreferrer"&gt;
        apvarun
      &lt;/a&gt; / &lt;a href="https://github.com/apvarun/learndevtools" rel="noopener noreferrer"&gt;
        learndevtools
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Debug Better With DevTools
    &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;Learn Dev Tools&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;Collection of walk-throughs for learning to use developer tools in the browser. Read more &lt;a href="https://learndevtools.now.sh/#why" rel="nofollow noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Visit &lt;a href="https://learndevtools.now.sh/" rel="nofollow noopener noreferrer"&gt;https://learndevtools.now.sh/&lt;/a&gt; to learn and try out various features of devtools to help you be more productive at work.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/apvarun/learndevtoolsLICENSE.md" rel="noopener noreferrer"&gt;MIT&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



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


&lt;p&gt;&lt;strong&gt;Direct Link:&lt;/strong&gt; &lt;a href="https://learndevtools.now.sh/docs/guides/elements/2.-detecting-element-updates/" rel="noopener noreferrer"&gt;Lessons: Detecting Element Updates&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlechrome</category>
      <category>devtools</category>
      <category>chromedevtools</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Auth for Hasura GraphQL engine with Firebase - My thoughts</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Thu, 25 Apr 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/apvarun/auth-for-hasura-graphql-engine-with-firebase-my-thoughts-1bmk</link>
      <guid>https://dev.to/apvarun/auth-for-hasura-graphql-engine-with-firebase-my-thoughts-1bmk</guid>
      <description>&lt;p&gt;Hasura’s GraphQL engine is itself a drop-in backend for most of the use cases. It provides you the flexibility to setup a fully functional backend with GraphQL as interface for the front-end. It acts as a layer between the Postgres database and your frontend applications(web or mobile).&lt;/p&gt;

&lt;p&gt;Authentication is entirely a different class of problem which is also common for any kind of application. Hasura already has documentation as to how their platform can be made to work with Auth0 or Firebase authentication service. 🔥&lt;/p&gt;

&lt;p&gt;Everything seemed perfect when I started. And I chose firebase as their auth service doesn’t have a user count based pricing (at least at the time of writing this). This would definitely save a couple of $$ as the application scales.&lt;/p&gt;

&lt;p&gt;And so I went ahead with the implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problems
&lt;/h2&gt;

&lt;p&gt;But I encountered a problem. As per the documentation, I had to create accounts using the firebase client-side SDK. This was a bummer for me as I had to create bulk accounts for my use case.&lt;/p&gt;

&lt;p&gt;Another problem was that if I went ahead and created accounts using client-side API, I would also have to relay the same details(except password) to my datastore(GraphQL engine) as well. This is really unintuitive and doesn’t ensure that the information is present in both locations.&lt;/p&gt;




&lt;h2&gt;
  
  
  How did I address it?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;T.L.D.R&lt;/strong&gt; : Event Triggers + Cloud functions&lt;/p&gt;

&lt;p&gt;GraphQL engine also has support for event triggers which can be setup to call web hooks based on DB operations. Any insert, update or delete operation on tables via the GraphQL endpoint will trigger the events associated with it.&lt;/p&gt;

&lt;p&gt;I was able to set up cloud functions that can be called on insert events, cloud function being hosted on firebase functions. The end point of the cloud function is given to event triggers, which then makes a POST call when the event is fired.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sample cloud function to create user
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const functions = require("firebase-functions"),
  admin = require("firebase-admin"),
  express = require("express"),
  cors = require("cors"),
  bodyParser = require("body-parser"),
  generator = require("generate-password"),
  env = require("./envfile");

const app = express();
app.use(cors({ origin: true }));
app.use(bodyParser.urlencoded({ extended: false }));
admin.initializeApp(functions.config().firebase);

app.post("/", (req, res) =&amp;gt; {

  // Check for POST request
  if (req.method !== "POST") {
    res.status(400).send("Request not supported");
    return;
  }

  // Destructure POST params
  let { email, accountrole, id } = req.body.event.data.new,
    headers = req.headers;

  // Custom header for API call authorization
  if (headers.authorization !== env.authKey) {
    res.status(404).send("Unkonwn error");
    return;
  }

  // Generate account password
  const password = generator.generate({
    length: 12,
    numbers: true
  });

  admin
    .auth()
    .createUser({
      email: email,
      emailVerified: false,
      password,
      uid: String(id)
    })
    .then(userRecord =&amp;gt; {
      // See the UserRecord reference doc for the contents of userRecord
      console.log("Successfully created new user foe email ", email);

      // Send them an email with initial password or a password reset link
      // SendEmail(...)

      // Custom claims for validation by the GraphQL engine
      const customClaims = {
        "https://hasura.io/jwt/claims": {
          "x-hasura-default-role": accountrole,
          "x-hasura-allowed-roles": ["admin", "user"],
          "x-hasura-user-id": id
        },
        authorized: false // custom parameter that can be updated later
      };

      // Assign custom claims
      return admin
        .auth()
        .setCustomUserClaims(userRecord.uid, customClaims)
        .then(() =&amp;gt; {
          console.log("Custom claims set for " + email);
        })
        .catch(console.log);
    })
    .catch(error =&amp;gt; {
      console.log("Error creating new user:", error);
    });
});

exports.user = functions.https.onRequest(app);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the signup form is filled by the user, a mutation is fired to insert the data into the user table. This will then post the same information to the cloud function using the event trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/d6625d32ba0791a2d1433636c37230ce/e986a/event_trigger.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapvarun.com%2Fstatic%2Fd6625d32ba0791a2d1433636c37230ce%2Fb9e4f%2Fevent_trigger.png" alt="Event Trigger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trigger runs only on new insertions to the user table.&lt;/p&gt;

&lt;p&gt;Note that since we have a check for headers in the cloud function, you will also need to pass the secret token in header as below.&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/ea32ed7c10eb9478ea436cbd764c1dd1/ba6f7/event_authorization.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapvarun.com%2Fstatic%2Fea32ed7c10eb9478ea436cbd764c1dd1%2Fb9e4f%2Fevent_authorization.png" alt="POST authorization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, once the signup is done, an user will be created in the firebase auth (with email and generated password).&lt;/p&gt;

&lt;p&gt;And in order to login, we can use the firebase auth script and directly authenticate from the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s achieved
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Signup process can inlcude multiple meta information along with username/email. (password being autogenerated by this process).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If we were to signup user directly to firebase using their SDK, we would have to send two parallel API calls at the least to have user information in our DB as well. This is simplified and made one way so that there is no inconsistency in storage of userdata.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You will now be able to create accounts in bulk as the event triggers are fired for each insert to the table. The process becomes to fully event driven.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Hope this was helpful for someone out there trying to tackle the same problems. I’d love to hear from you on &lt;a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fapvarun.com%2Ffirebase-graphql-engine-auth/&amp;amp;&amp;amp;text=@apvarun%20&amp;amp;original_referer=" rel="noopener noreferrer"&gt;twitter&lt;/a&gt; in case of any queries or suggestions.&lt;/p&gt;

</description>
      <category>graphql</category>
    </item>
    <item>
      <title>Beyond this year: 2019 goals</title>
      <dc:creator>Varun A P ⚡️</dc:creator>
      <pubDate>Sun, 30 Dec 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/apvarun/beyond-this-year-2019-goals-3de3</link>
      <guid>https://dev.to/apvarun/beyond-this-year-2019-goals-3de3</guid>
      <description>&lt;p&gt;As the year comes to an end, it’s time to look back at the events and improve upon it. 2018 has been a roller-coaster with a lot of new experiences. I have learnt so many things, development to design and more.&lt;/p&gt;

&lt;p&gt;The biggest one was moving from React ecosystem to Angular for my fulltime job. And yes, I switched my job this year and I couldn’t be any happier. ( &lt;strong&gt;Off-the-record&lt;/strong&gt; : I work at &lt;a href="https://www.springboard.com"&gt;Springboard&lt;/a&gt; - an Edtech startup.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Starting Angular?&lt;/strong&gt; Create a basic Angular CLI project and build something. You will learn more from it than from the docs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also had a lot of learning going with designing of UI elements. As it’s a continuous process, it will be continued in the next year too. Another great experience that I had was working from China for a month. It was a completely different world, and I also did manage to make some good friends there.&lt;/p&gt;

&lt;p&gt;Apart from these, I switched to Mac from Windows, tried my hands on starting a podcast and a video series, launched a couple of personal projects, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setbacks?&lt;/strong&gt; Yes, there were, and some learning from them too. I got selected as a speaker at React Rally, but was not able to make it due to visa issues.&lt;/p&gt;

&lt;p&gt;So as we end 2018, I would like to thank everyone who supported and inspired me to achieve all the above things.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does this mean for 2019?
&lt;/h3&gt;

&lt;p&gt;The bars are definitely high! But that shouldn’t stop anyone from dreaming big 😉. I have so much stuff in my todos that needs my attention and so I am looking at planning it accordingly.&lt;/p&gt;

&lt;h5&gt;
  
  
  Major Goals
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Increase &lt;strong&gt;open source&lt;/strong&gt; contribution&lt;/li&gt;
&lt;li&gt;👨🏻‍💻 Learn and use &lt;strong&gt;GraphQL&lt;/strong&gt; on the server&lt;/li&gt;
&lt;li&gt;✍🏻 Write at least one &lt;strong&gt;blog&lt;/strong&gt; post a month&lt;/li&gt;
&lt;li&gt;📹 Create more &lt;strong&gt;videos&lt;/strong&gt; with live coding screen shares&lt;/li&gt;
&lt;li&gt;📚 Learn &lt;strong&gt;Python&lt;/strong&gt; (Django)&lt;/li&gt;
&lt;li&gt;🛫 Plan at least one &lt;strong&gt;trip&lt;/strong&gt; with family and one with friends&lt;/li&gt;
&lt;li&gt;🗣 &lt;strong&gt;Speak&lt;/strong&gt; at a conference&lt;/li&gt;
&lt;li&gt;💪🏻 &lt;strong&gt;Workout&lt;/strong&gt; regularly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not a new year resolution but goals that I’m committing publicly. I’m also looking at being active on &lt;a href="https://twitter.com/apvarun"&gt;Twitter&lt;/a&gt; to learn and support the awesome web dev community there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;Kudos to you for reaching the end. Let’s make 2019 more fruitful to oneself and to the web community 🥳. Keep learning, respect &amp;amp; help others and stay motivated!&lt;/p&gt;

&lt;p&gt;Happy 🎊 2019 🎊!&lt;/p&gt;

</description>
      <category>yearinreview</category>
      <category>developer</category>
    </item>
  </channel>
</rss>
