<?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: Spike.sh</title>
    <description>The latest articles on DEV Community by Spike.sh (@spike).</description>
    <link>https://dev.to/spike</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%2Forganization%2Fprofile_image%2F2227%2F64264442-9adb-4cd8-aaab-75a6bf1cf570.png</url>
      <title>DEV Community: Spike.sh</title>
      <link>https://dev.to/spike</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spike"/>
    <language>en</language>
    <item>
      <title>Scammers signed up, scammed us of $870 in 15 minutes.</title>
      <dc:creator>Kaushik Thirthappa</dc:creator>
      <pubDate>Tue, 26 May 2020 13:16:59 +0000</pubDate>
      <link>https://dev.to/spike/scammers-signed-up-scammed-us-of-870-in-15-minutes-4gjf</link>
      <guid>https://dev.to/spike/scammers-signed-up-scammed-us-of-870-in-15-minutes-4gjf</guid>
      <description>&lt;p&gt;&lt;strong&gt;No data or access was compromised.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the 20th of May at 6:45 AM&lt;/strong&gt;, I got a phone call alert from &lt;a href="https://spike.sh" rel="noopener noreferrer"&gt;Spike.sh&lt;/a&gt; from our &lt;a href="https://twilio.com" rel="noopener noreferrer"&gt;Twilio&lt;/a&gt; integration about a surge in calls. &lt;/p&gt;

&lt;p&gt;Scammers abused our phone verification by otp generating thousands of phone calls. This qualifies as &lt;a href="https://www.twilio.com/learn/voice-and-video/toll-fraud" rel="noopener noreferrer"&gt;Toll fraud&lt;/a&gt;&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Timeline of how it went down
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;7 AM&lt;/li&gt;
&lt;li&gt;7:15 AM&lt;/li&gt;
&lt;li&gt;7:30 AM&lt;/li&gt;
&lt;li&gt;8 AM&lt;/li&gt;
&lt;li&gt;9 AM&lt;/li&gt;
&lt;li&gt;10 AM&lt;/li&gt;
&lt;li&gt;11 AM&lt;/li&gt;
&lt;li&gt;1 PM&lt;/li&gt;
&lt;li&gt;3 PM&lt;/li&gt;
&lt;li&gt;What did we learn?&lt;/li&gt;
&lt;li&gt;Resources&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;7 AM 👨‍💻&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Within the next 15 minutes, I was awake and glaring into my screen trying to find out what the hell is happening. &lt;/p&gt;

&lt;p&gt;I learn about these keys facts - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;40 new registrations in the last one hour using disposable email addresses, mainly &lt;a href="https://mailinator.com" rel="noopener noreferrer"&gt;Mailinator&lt;/a&gt; (.com and .net)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our Twilio account had been recharged &lt;em&gt;which was unusual&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;So far, I was knee-deep with $107 bill on Twilio because scammers had made about hundreds of phone calls to a number in &lt;a href="https://en.wikipedia.org/wiki/Moldova" rel="noopener noreferrer"&gt;Moldova&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also, Twilio, being awesome, detected suspicious activity and blocked several phone calls by that time. I had emails from their Fraud detection team. &lt;strong&gt;Thank you Twilio&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;7:15 AM 😧&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;After digging into logs, I learn that the scammers were generating phone calls from our Phone verification section. We make phone calls to verify your phone number after signing up on Spike. I knew this was not the best idea going in too... 🙁 We now send SMS to verify instead of making a phone call.&lt;/p&gt;

&lt;p&gt;There were two such sections. Both of them now look like this -&lt;/p&gt;

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




&lt;h2&gt;
  
  
  &lt;a&gt;7:30 AM 💸&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I got a call from our credit card company who inform us we have been charged about &lt;strong&gt;$870 in total so far&lt;/strong&gt; 😭&lt;/p&gt;

&lt;p&gt;We have barred making calls to Moldova and some other regions scammers had been targeting using &lt;a href="https://www.twilio.com/docs/sip-trunking/voice-dialing-geographic-permissions" rel="noopener noreferrer"&gt;Twilio's GeoPermissions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, Twilio blocks voice call to some high-risk areas. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnlbq926lti64y6jvi1xv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnlbq926lti64y6jvi1xv.png" alt="Twilio blocking high risk areas" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is us blocking &lt;strong&gt;Moldova&lt;/strong&gt;. &lt;/p&gt;

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

&lt;p&gt;All in all, about 2400+ phone calls were made so far.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;7:45 AM 🤖&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Integrate Google reCaptcha on the dashboard. Block spam user's accounts. I was personally very sceptical if things would go back to normal.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;When you do this, make sure to authorise the request on the backend too.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;8:00 AM 🚫&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So far, I have made about 20 deployments to production, thanks to GitHub Actions for automating that.&lt;/p&gt;

&lt;p&gt;Replace phone call verification with SMS verification. This took some time along with testing.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;9:00 AM 📖&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Revoke all Twilio tokens and read their guide again on &lt;a href="https://www.twilio.com/learn/voice-and-video/toll-fraud" rel="noopener noreferrer"&gt;toll frauds&lt;/a&gt;. Are we missing anything? &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Facepalm&lt;/em&gt; - Twilio has explicitly written in their docs to not use a phone call for verification via OTP and that's exactly what we did 🤦‍♀️&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We released some of our old phone numbers and bought new ones. This didn't take long.&lt;/em&gt; &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;10:00 AM 🧟‍♂️&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Deploy to production but we still see a number of signups coming in via bots using Mailinator email addresses.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;11:00 AM 🕵️‍♀️&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Our search for a service API to tell disposable email addresses apart has begun. &lt;/p&gt;

&lt;p&gt;Shortlisted:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://block-temporary-email.com/" rel="noopener noreferrer"&gt;https://block-temporary-email.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.kickbox.com/docs" rel="noopener noreferrer"&gt;Kickbox.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nameapi.org/en/live-demos/disposable-email-address-detector" rel="noopener noreferrer"&gt;NameAPI&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AoTUKOcU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/stackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
          &lt;a href="https://stackoverflow.com/questions/10976706/how-to-block-disposable-email-addresses-in-your-websites-registration-form" rel="noopener noreferrer"&gt;
            How to block Disposable Email Addresses in your website's registration form?
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jun 11 '12&lt;/span&gt;
            &lt;span&gt;Comments: 4&lt;/span&gt;
            &lt;span&gt;Answers: 11&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/10976706/how-to-block-disposable-email-addresses-in-your-websites-registration-form" rel="noopener noreferrer"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oeieW07A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/stackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          36
        &lt;/div&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h2-sXgSn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/stackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;I would like to know of the possible ways to block &lt;a href="http://en.wikipedia.org/wiki/Disposable_email_address" rel="noreferrer noopener"&gt;disposable email addresses&lt;/a&gt; from registering in my website. &lt;/p&gt;

&lt;p&gt;For simplicity, let's take the example where the registration form of the website is done with HTML and PHP.&lt;/p&gt;

&lt;p&gt;Any ideas, solutions or suggestions would be greatly appreciated.&lt;/p&gt;

    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://stackoverflow.com/questions/10976706/how-to-block-disposable-email-addresses-in-your-websites-registration-form" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;The problem is creating newer disposable email addresses is easy. It's perhaps too much to expect that one service would cover all of them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Interesting stat - A ton of our users were using Google OAuth, so we made the bold move. &lt;/p&gt;

&lt;h3&gt;
  
  
  Allow only Google OAuth. Remove login and signup using Email/Password combinations.
&lt;/h3&gt;




&lt;h2&gt;
  
  
  &lt;a&gt;1:00 PM 👮‍♂️&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Time to take extra measures - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activate Cloudflare &lt;a href="https://www.cloudflare.com/ddos" rel="noopener noreferrer"&gt;DDoS protection&lt;/a&gt; with &lt;strong&gt;I'm under attack mode&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloudflare is pretty awesome at this. When you visit &lt;a href="https://spike.sh" rel="noopener noreferrer"&gt;Spike.sh&lt;/a&gt;, Cloudflare will try to determine if you are human or a bot. Sometimes, a test also appears for verification using hcaptcha. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We installed &lt;a href="https://needle.sh" rel="noopener noreferrer"&gt;Needle.sh&lt;/a&gt;, which provides a security layer with their NPM module. In their dashboard, we noticed that security scanners have been probing our web properties for vulnerabilities multiple times a day. This made us realise the importance of using security tools for our web products from an early stage, &lt;strong&gt;obviously&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://nordicapis.com/everything-you-need-to-know-about-api-rate-limiting" rel="noopener noreferrer"&gt;Rate limiting&lt;/a&gt; was super helpful and easy to setup. I have seen tons of &lt;strong&gt;429 response status&lt;/strong&gt; after we activated this.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Setup &lt;a href="https://www.twilio.com/docs/usage/api/usage-trigger" rel="noopener noreferrer"&gt;usage triggers&lt;/a&gt; on twilio&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;3:00 PM 🤞&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;All of our measures are now live. Now - it's all about monitoring carefully. &lt;/p&gt;

&lt;p&gt;Scammers were unable to create new accounts. Yipee!&lt;br&gt;
Some literally created accounts using Google OAuth and tried to make more calls but over 99% of them ended up in either 401 or 429 response codes. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;What did we learn?&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Setup critical alerts, had I not gotten the phone call from &lt;a href="https://spike.sh" rel="noopener noreferrer"&gt;Spike.sh&lt;/a&gt;, I easily would have gotten a bill of more than $5000 by the time I woke up.&lt;/li&gt;
&lt;li&gt;Security is super important. Never too early to start.&lt;/li&gt;
&lt;li&gt;Use the right tools for the right job, we are using Cloudflare and Needle.sh&lt;/li&gt;
&lt;li&gt;Better safe than sorry&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a&gt;Resources&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;These are some good reads I came across during the entire ordeal. Hope this helps you -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cloudflare.com/ddos" rel="noopener noreferrer"&gt;Cloudflare DDoS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://needle.sh" rel="noopener noreferrer"&gt;Needle.sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.cloudflare.com/t/err-ssl-version-or-cipher-mismatch-appears-with-cloudflare-letsencrypt-and-wordpress/79097" rel="noopener noreferrer"&gt;SSL error with Letsencrypt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://block-temporary-email.com/" rel="noopener noreferrer"&gt;https://block-temporary-email.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/10976706/how-to-block-disposable-email-addresses-in-your-websites-registration-form" rel="noopener noreferrer"&gt;SO question&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://antoinevastel.com/bot%20detection/2018/01/17/detect-chrome-headless-v2.html" rel="noopener noreferrer"&gt;Detecting headless browsers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=detecting+headless+browser+is+impossible&amp;amp;oq=detecting+headless+browser+is+impossible&amp;amp;aqs=chrome..69i57.6513j0j7&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8" rel="noopener noreferrer"&gt;Impossible to detect headless browsers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This doesn't cover all the steps we have taken to stop abuse or DDoS.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hack</category>
      <category>security</category>
      <category>twilio</category>
      <category>scammers</category>
    </item>
    <item>
      <title>Excerpt of 7 regrets from creator of Deno about Node.js</title>
      <dc:creator>Kaushik Thirthappa</dc:creator>
      <pubDate>Fri, 22 May 2020 06:37:48 +0000</pubDate>
      <link>https://dev.to/spike/excerpt-of-7-regrets-from-creator-of-deno-about-node-js-1k51</link>
      <guid>https://dev.to/spike/excerpt-of-7-regrets-from-creator-of-deno-about-node-js-1k51</guid>
      <description>&lt;p&gt;✨ &lt;em&gt;This post has been copied from the YouTube comment with some edits.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 🤷‍♂️ No Promises
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Promises were added in June 2009 but removed "foolishly" in Feb 2010&lt;/li&gt;
&lt;li&gt;Promises are the necessary abstraction for async/await.&lt;/li&gt;
&lt;li&gt;It's possible unified usage of promises in Node would have sped the delivery of the eventual standardization and async/await.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. 👮‍♀️ Security
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;V8 by itself is a very good security sandbox&lt;/li&gt;
&lt;li&gt;Node apps outside of the browser shouldn't need to have all the permissions like writing to disk and network.&lt;/li&gt;
&lt;li&gt;Example: Your linter shouldn't get complete access to your computer and network.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. 👷‍♀️ The Build System (GYP)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Build systems are very difficult and very important.&lt;/li&gt;
&lt;li&gt;V8 (via Chrome) started using GYP and Node uses the same.&lt;/li&gt;
&lt;li&gt;Later Chrome dropped GYP for GN. Leaving Node the sole GYP user.&lt;/li&gt;
&lt;li&gt;GYP is not an ugly internal interface either - it is exposed to anyone who's trying to bind to V8.&lt;/li&gt;
&lt;li&gt;It's an awful experience for users. It's this non-JSON, Python adaptation of JSON.&lt;/li&gt;
&lt;li&gt;The continued usage of GYP is the probably largest failure of Node core because there are just too many wrappers to make it work.&lt;/li&gt;
&lt;li&gt;Instead of guiding users to write C++ bindings to V8, I should have provided a core foreign function interface (FFI)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. 🗄 Package.json
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Isaac, in NPM, invented package.json (for the most part)&lt;/li&gt;
&lt;li&gt;But I sanctioned it by allowing Node's require() to inspect package.json files for "main"&lt;/li&gt;
&lt;li&gt;NPM in node distribution means it is the de-facto standard now. Also remember, NPM, a centralized repository is now privately controlled.&lt;/li&gt;
&lt;li&gt;package.json now includes all sorts of unnecessary information. License? Repository? Description? It's boilerplate noise.&lt;/li&gt;
&lt;li&gt;If only relative files and URLs were used when importing, the path defines the version. There is no need to list dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Too much boilerplate noise&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. 🗃 node_modules
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Complicated module resolution algorithm.&lt;/li&gt;
&lt;li&gt;vendored-by-default has good intentions, but in practice just using $NODE_PATH wouldn't have precluded that.&lt;/li&gt;
&lt;li&gt;Deviates greatly from browser semantics. &lt;em&gt;can't undo now&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frpkxhxkeu0h0kncx30oc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frpkxhxkeu0h0kncx30oc.png" alt="Node modules is so freaking heavy" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. 🧩 require("module") without ".js" extension
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Needlessly less explicit.&lt;/li&gt;
&lt;li&gt;Not how browser javascript works. You cannot omit the ".js" in a script tag src attribute.&lt;/li&gt;
&lt;li&gt;The module loader has to query the file system at multiple locations trying to guess what the user intended.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. 🧟‍♂️ index.js
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Inspired from index.html and though index.js is cute. A default file to be loaded might reduce complexity but...&lt;/li&gt;
&lt;li&gt;It needlessly complicated the module loading system.&lt;/li&gt;
&lt;li&gt;It became especially unnecessary after require supported package.json&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✨ &lt;strong&gt;If you think something is kinda cute and not completely necessary then don't add it. This comes with experience.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ry" rel="noopener noreferrer"&gt;Ryan Dahl&lt;/a&gt; created Deno with all the above things kept in mind. &lt;a href="https://deno.land/" rel="noopener noreferrer"&gt;Deno&lt;/a&gt; is focused on security without having to give access to everything, kept simple, comes with Typescript enabled. &lt;/p&gt;

&lt;p&gt;This is Ryan's talk 👉&lt;/p&gt;

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

</description>
      <category>node</category>
      <category>deno</category>
      <category>javascript</category>
      <category>talks</category>
    </item>
    <item>
      <title>Monitoring your cron jobs is critical</title>
      <dc:creator>Kaushik Thirthappa</dc:creator>
      <pubDate>Tue, 19 May 2020 08:50:05 +0000</pubDate>
      <link>https://dev.to/spike/monitoring-your-cron-jobs-is-critical-5038</link>
      <guid>https://dev.to/spike/monitoring-your-cron-jobs-is-critical-5038</guid>
      <description>&lt;p&gt;At Spike, we have a few supercritical &lt;code&gt;cron&lt;/code&gt; jobs. &lt;/p&gt;

&lt;p&gt;Some use cases of &lt;code&gt;cron&lt;/code&gt; for us has been - &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send weekly email reports&lt;/li&gt;
&lt;li&gt;Billing reminders&lt;/li&gt;
&lt;li&gt;DB backups&lt;/li&gt;
&lt;li&gt;Bill organisation for the right amount based on active members every month (&lt;em&gt;flexibility to add/remove users and reflect on billing is super important&lt;/em&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Basically &lt;code&gt;cron&lt;/code&gt; is important and we need to be alerted when they fail. &lt;/p&gt;

&lt;p&gt;There are several tools that will help you with cron monitoring. Here is a comparison chart&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxfrsc3fgw64b0j8ci0sw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxfrsc3fgw64b0j8ci0sw.png" alt="Cron monitoring tools compared" width="513" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What should you setup?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Timeouts&lt;/li&gt;
&lt;li&gt;Insert cron expression to check if cron has executed&lt;/li&gt;
&lt;li&gt;Alerting upon failure&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://crontab.guru" rel="noopener noreferrer"&gt;Crontab.guru&lt;/a&gt; is the best cron expression validator out there. It will convert your expression into human-readable format and validate it for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to setup?
&lt;/h3&gt;

&lt;p&gt;Once you have your expression, you can use one of the cron monitoring tools to validate if the cron was executed and run successfully or not. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://healthchecks.io" rel="noopener noreferrer"&gt;Healthchecks.io ⭐️&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cronitor.io/" rel="noopener noreferrer"&gt;Cronitor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cronhub.io" rel="noopener noreferrer"&gt;Cronhub&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We ourselves use Healthchecks the most and have absolutely no complains in the past year of using it. Quite sure the other products are great too.&lt;/p&gt;

&lt;p&gt;Give it a spin and let us know.&lt;/p&gt;

&lt;p&gt;ps: Spike &lt;a href="https://spike.sh/integrations/healthchecks" rel="noopener noreferrer"&gt;integrates with healthchecks.io&lt;/a&gt; very easily. We alert you so you can stay on top of your cron jobs execution.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>cron</category>
      <category>health</category>
      <category>alerts</category>
    </item>
    <item>
      <title>Simple git aliases for daily purpose</title>
      <dc:creator>Kaushik Thirthappa</dc:creator>
      <pubDate>Sat, 16 May 2020 04:54:12 +0000</pubDate>
      <link>https://dev.to/spike/simple-git-aliases-for-daily-purpose-4o8d</link>
      <guid>https://dev.to/spike/simple-git-aliases-for-daily-purpose-4o8d</guid>
      <description>&lt;p&gt;On average, every developer commits their code atleast once a day.&lt;/p&gt;

&lt;p&gt;Having some &lt;code&gt;git aliases&lt;/code&gt; help you quickly make changes and push your code. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;No more typos&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of my daily frustrations in the past 🤬 - &lt;/p&gt;

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

&lt;p&gt;Avoid common pitfalls are super important, it helps increase productivity in the long term.&lt;/p&gt;

&lt;h4&gt;
  
  
  Table of contents
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;git status&lt;/li&gt;
&lt;li&gt;git commit&lt;/li&gt;
&lt;li&gt;git push&lt;/li&gt;
&lt;li&gt;git add and commit&lt;/li&gt;
&lt;li&gt;git add, commit and push&lt;/li&gt;
&lt;li&gt;git stash&lt;/li&gt;
&lt;li&gt;git stash apply&lt;/li&gt;
&lt;li&gt;git push --set-upstream&lt;/li&gt;
&lt;li&gt;git checkout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;ps: These are aliases I have been using personally, feel free to create and share your own&lt;/em&gt; ☺️&lt;/p&gt;

&lt;h2&gt;
  
  
  1. &lt;a&gt; git status 👉 gs&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git status'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. &lt;a&gt;git commit 👉 gc&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'Adding integration test cases'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gc &lt;span class="s1"&gt;'Adding integration test cases'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git commit -m $2'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. &lt;a&gt;git push 👉 gp&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git push'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. &lt;a&gt;git add . &amp;amp;&amp;amp; git commit -m 👉 gac&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'Adding integration test cases'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gac &lt;span class="s1"&gt;'Adding integration test cases'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gac&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git add . &amp;amp;&amp;amp; git commit -m $2'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. &lt;a&gt;git add . &amp;amp;&amp;amp; git commit -m &amp;amp;&amp;amp; git push 👉 gacp&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'Adding integration test cases'&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gacp &lt;span class="s1"&gt;'Adding integration test cases'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gacp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git add . &amp;amp;&amp;amp; git commit -m $2 &amp;amp;&amp;amp; git push'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. &lt;a&gt;git stash 👉 gst&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gst
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gst&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git stash'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. &lt;a&gt;git stash apply 👉 gsta&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gsta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gsta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git stash apply'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. &lt;a&gt;git push --set-upstream origin 👉 gpst&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This syntax is the one I forget the most 🤷‍♀️&lt;/p&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--set-upstream&lt;/span&gt; origin integration-tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpst integration-tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gpst&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git push --set-upstream origin $1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. &lt;a&gt;git checkout 👉 gco&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Before -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gco staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup code -&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gco&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'git checkout $1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are the aliases that I use &lt;strong&gt;everyday&lt;/strong&gt; for the past few years. No typos, no errors and super handy.&lt;/p&gt;

</description>
      <category>git</category>
      <category>alias</category>
      <category>productivity</category>
    </item>
    <item>
      <title>⚡️Tools and products we use at Spike - part 2</title>
      <dc:creator>Kaushik Thirthappa</dc:creator>
      <pubDate>Mon, 11 May 2020 01:45:28 +0000</pubDate>
      <link>https://dev.to/spike/tools-and-products-we-use-at-spike-part-2-31fh</link>
      <guid>https://dev.to/spike/tools-and-products-we-use-at-spike-part-2-31fh</guid>
      <description>&lt;p&gt;We believe in outsourcing complex jobs to specific products. This a small list of other tools and products we use.&lt;/p&gt;

&lt;p&gt;👈 &lt;a href="https://dev.to/spike/tools-and-products-we-use-at-spike-part-1-37mm"&gt;First part&lt;/a&gt; on all the tools and products used by engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://intercom.com" rel="noopener noreferrer"&gt;Intercom&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We got into Intercom's &lt;a href="https://www.intercom.com/early-stage" rel="noopener noreferrer"&gt;early stage program&lt;/a&gt; to access the entire platform. We mainly use this for customer support using Live chat and user onboarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://www.gitbook.com" rel="noopener noreferrer"&gt;GitBook&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;After having tried multiple products to host our documentation, we finalised GitBook. It's intuitive, has a great UI and super flexible. Our customers love &lt;a href="https://docs.spike.sh" rel="noopener noreferrer"&gt;our docs&lt;/a&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://1password.com" rel="noopener noreferrer"&gt;1Password&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We didn't think we would use this as much as we do. This is by far the product we use the most other than Gmail. We recommend orgs and individuals to use 1Password to stay safe and secure. &lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://notion.so" rel="noopener noreferrer"&gt;Notion&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Roadmap, sprints, extensive documentation for features and team collaboration all on Notion. It's literally capable of everything our teams needs in one place.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;a href="https://headwayapp.co" rel="noopener noreferrer"&gt;Headway&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We display our changelog on the website and on the dashboard. There are mixed opinions about public changelog on the internet but for us, it's easy to keep our customers up to date about the latest changes on our platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;a href="https://figma.com" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Frankly, the only reason we started with this was because it was free. (&lt;em&gt;not kidding&lt;/em&gt;). However, Figma has played a HUGE role in how we work. At &lt;a href="https://spike.sh" rel="noopener noreferrer"&gt;Spike&lt;/a&gt;, we take design very seriously and Figma has been an ultimate solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;a href="https://www.sendx.io" rel="noopener noreferrer"&gt;SendX&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We use SendX for our promotional emails. Easy, affordable and perhaps the best support of all the other products we have used. Super SME friendly. &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>customersupport</category>
    </item>
    <item>
      <title>⚡️Tools and products we use at Spike - part 1</title>
      <dc:creator>Kaushik Thirthappa</dc:creator>
      <pubDate>Mon, 11 May 2020 01:45:08 +0000</pubDate>
      <link>https://dev.to/spike/tools-and-products-we-use-at-spike-part-1-37mm</link>
      <guid>https://dev.to/spike/tools-and-products-we-use-at-spike-part-1-37mm</guid>
      <description>&lt;p&gt;Every organisation uses a multitude of a number of tools to support their business. We will try and cover all of the ones we use at &lt;a href="https://spike.sh" rel="noopener noreferrer"&gt;Spike&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post has all the DevTools or say products used by engineering. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/spike/tools-and-products-we-use-at-spike-part-2-31fh"&gt;Second part&lt;/a&gt; on all the marketing, support products we use 👉&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PS: not covering our tech stack here&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Servers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://aws.amazon.com" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is pretty clear. AWS is reliable and has over &lt;strong&gt;160+ products 😳&lt;/strong&gt;. From deployments, hosting, storage and monitoring. All of it on AWS.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1013959156678578176-838" src="https://platform.twitter.com/embed/Tweet.html?id=1013959156678578176"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1013959156678578176-838');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1013959156678578176&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; (formerly Zeit.co)
&lt;/h3&gt;

&lt;p&gt;We use this for all of our serverless needs. Why didn't we directly use AWS lambda instead? Well, only because the setup on Vercel is so damn easy. Highly recommend them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://www.mongodb.com/cloud/atlas" rel="noopener noreferrer"&gt;MongoDB Atlas&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;For all our DB hosting needs. We haven't moved all of it yet but soon we will finish this migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitoring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://aws.amazon.com/cloudwatch" rel="noopener noreferrer"&gt;Cloudwatch&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We monitor a bunch of things from network I/O, CPU, Disk space, Autoscaling, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://healthchecks.io" rel="noopener noreferrer"&gt;Healthchecks.io&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We have a few cron jobs running at different schedules. While setting cron in Linux is easy, we still monitor it via Healthchecks to make sure it is actually running &lt;strong&gt;successfully&lt;/strong&gt;. You can set your cron expression and they will make sure they are getting a ping ensuring it's all good. Super awesome tool. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://uptimerobot.com" rel="noopener noreferrer"&gt;Uptime Robot&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Uptime monitoring to make sure all of our endpoints are up and running. Some endpoints everyone should monitor 👉&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Website&lt;/li&gt;
&lt;li&gt;Dashboard&lt;/li&gt;
&lt;li&gt;DB endpoint &lt;/li&gt;
&lt;li&gt;Cache endpoint&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Good alternative is &lt;a href="https://apex.sh/ping" rel="noopener noreferrer"&gt;Apex Ping&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://www.datadoghq.com" rel="noopener noreferrer"&gt;Datadog&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;For our Application Performance Monitoring. When incidents happen, we want to make sure that alerts reach to you within one second. Datadog helps give us great insights on how our application peaks at certain times.&lt;/p&gt;

&lt;p&gt;Why Datadog and not New Relic?&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1257936993956192259-421" src="https://platform.twitter.com/embed/Tweet.html?id=1257936993956192259"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1257936993956192259-421');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1257936993956192259&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;a href="https://amplify.nginx.com" rel="noopener noreferrer"&gt;Nginx Amplify&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;To monitor our web server. Nginx is clean, easy to setup and has a lot of plugins you can use.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;For all our error monitoring. They provide a ton of features and we have hardly ever been disappointed. Integrates with most languages and frameworks, catches all exceptions on serverless too 👏&lt;/p&gt;

&lt;p&gt;&lt;em&gt;tip: send additional data and use tags to identify your errors better with Sentry&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://buddy.works" rel="noopener noreferrer"&gt;Buddy.works&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We rely the most on Buddy for one simple reason - the UI. &lt;/p&gt;

&lt;p&gt;You don't have to spend a lot of time configuring on Buddy or even writing YAML files to get it running. This is easily the most underrated tool we use.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://travis-ci.org" rel="noopener noreferrer"&gt;Travis CI&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is in our wishlist. We have been writing a lot of test cases in the past couple of months and in the near time we will be integrating Travis. &lt;em&gt;shoutout to Kent 👉 for building &lt;a href="https://testingjavascript.com/" rel="noopener noreferrer"&gt;testingjavascript.com&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__50802"&gt;
    &lt;a href="/kentcdodds" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F50802%2F99f2baf8-aee1-4fc6-8dc0-63f0dda5244b.jpg" alt="kentcdodds image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/kentcdodds"&gt;Kent C. Dodds&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/kentcdodds"&gt;My name is Kent C. Dodds and I'm a Remix Co-Founder, JavaScript engineer, and teacher. I'm also active in the open source community. I like my family, JavaScript, and React.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  DevTools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://ngrok.com" rel="noopener noreferrer"&gt;Ngrok&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Clean, succinct and does the job well to expose our localhost urls so we can build integrations we ease. We have reserved about 4 subdomains on ngrok so we don't have to spend time on reconfiguring the webhook urls for dev environment. &lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;a href="https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare" rel="noopener noreferrer"&gt;VS Code Live Share&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Great for remote teams, we usually have a Google Meet call and pair program many-a-times using VS Code Live Share. &lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;a href="https://twilio.com" rel="noopener noreferrer"&gt;Twilio&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Easy to integrate with extensive documentation that you will &lt;em&gt;actually read&lt;/em&gt;. Easily a very reliable platform for us to alert customers via Phone and SMS.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;a href="https://sendgrid.com" rel="noopener noreferrer"&gt;Sendgrid&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;We send all email notifications using Sendgrid. Reliable, easy to use SDK and so far not that expensive. &lt;/p&gt;

&lt;p&gt;Non-developer tools are next in this short series.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>startup</category>
      <category>tools</category>
    </item>
    <item>
      <title>Why we built Spike? An alternative to PagerDuty and Opsgenie you will love 💙</title>
      <dc:creator>Kaushik Thirthappa</dc:creator>
      <pubDate>Thu, 07 May 2020 03:38:51 +0000</pubDate>
      <link>https://dev.to/spike/why-we-built-spike-an-alternative-to-pagerduty-and-opsgenie-you-will-love-j33</link>
      <guid>https://dev.to/spike/why-we-built-spike-an-alternative-to-pagerduty-and-opsgenie-you-will-love-j33</guid>
      <description>&lt;p&gt;First things first - we are starting to write our thoughts on Dev.to 🎉&lt;/p&gt;

&lt;p&gt;Incident management for dev teams is a slightly confusing term. The core of the term is managing incidents properly. &lt;/p&gt;

&lt;p&gt;We think of incidents as an issue that will or is currently affecting your customers to use your product. We understand that &lt;em&gt;no matter the size of your business, this affects you&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple overview
&lt;/h2&gt;

&lt;p&gt;Before &lt;strong&gt;Spike&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Incident occurs &lt;/li&gt;
&lt;li&gt;😡 frustration mounts &lt;/li&gt;
&lt;li&gt;Contacts support (or you) &lt;/li&gt;
&lt;li&gt;🤷‍♀️ they have no idea why this happened &lt;/li&gt;
&lt;li&gt;You 👩‍💻 identify there is an incident&lt;/li&gt;
&lt;li&gt;Get back to support or to customer&lt;/li&gt;
&lt;li&gt;Customer's wait time for resolution begins ⏳&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After &lt;strong&gt;Spike&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Incidents happen&lt;/li&gt;
&lt;li&gt;We alert instantly via &lt;strong&gt;phone call/sms&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;You resolve them &lt;/li&gt;
&lt;li&gt;customers stay unaffected 😇&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most other players are majorly focused on Enterprises. &lt;/p&gt;

&lt;p&gt;When you build for enterprises your product becomes bloated with tons of features for customisations and loose ends that it becomes difficult to use if you are &lt;strong&gt;not an enterprise&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spike is built on simplicity and reliability at it's core and completely focused on SMBs. &lt;/p&gt;

&lt;h1&gt;
  
  
  Simplicity
&lt;/h1&gt;

&lt;p&gt;No really, how do you focus on simplicity? &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Making it easy to use&lt;/li&gt;
&lt;li&gt;Designed for dev teams&lt;/li&gt;
&lt;li&gt;Building features that our customers will actually use&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Honesty
&lt;/h1&gt;

&lt;p&gt;This is expected from every product you use but it's kinda rare. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No fake promises to seal the deal&lt;/li&gt;
&lt;li&gt;No charging based on number of incidents or alerts&lt;/li&gt;
&lt;li&gt;No constant pings to upgrade your plan. &lt;a href="https://spike.sh/pricing" rel="noopener noreferrer"&gt;We only have plan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cancel your plan with a &lt;a href="https://twitter.com/SpikedHQ/status/1256532677546647552" rel="noopener noreferrer"&gt;click of a button&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Your data is yours, privacy is super important.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Flat pricing
&lt;/h1&gt;

&lt;p&gt;One plan for the entire platform with access to all features makes a lot of sens to us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Benefit from the entire platform&lt;/li&gt;
&lt;li&gt;Unlimited integrations. &lt;em&gt;Monitor for incidents across the entire platform&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Unlimited alerts. &lt;em&gt;Imagine not getting alerts when your customers are affected only because you need to upgrade... Yikes!!&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Stop guessing your bill at the end of the month&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No matter the size of your business, when incidents occur they affect your customers. &lt;/p&gt;

&lt;h1&gt;
  
  
  Bootstrapped
&lt;/h1&gt;

&lt;p&gt;Yup! We are bootstrapped. We have a small handful of paying customers over the past couple of months. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;No VCs, no pressure&lt;/em&gt; translates to 👉 &lt;em&gt;focusing on customers and growing at our own pace&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;More about us 👉 &lt;a href="https://spike.sh" rel="noopener noreferrer"&gt;🌏Spike&lt;/a&gt;, &lt;a href="https://twitter.com/SpikedHQ" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quick note - &lt;br&gt;
We will continue to share our experiences on tech and product as we grow Spike here. Let us know what you would like to hear.&lt;/p&gt;

</description>
      <category>pagerduty</category>
      <category>opsgenie</category>
      <category>monitoring</category>
      <category>phone</category>
    </item>
  </channel>
</rss>
