<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mohit Yadav's Blog | One stop for all tech know-how ✌️]]></title><description><![CDATA[I love creating awesome apps and spreading the word about things I find interesting. In this blog, I like to share my heart out and dev. tips and tricks, as wel]]></description><link>https://blog.mohitya.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 03:24:53 GMT</lastBuildDate><atom:link href="https://blog.mohitya.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introducing Mockoops - Transform boring screen-recordings into jaw-dropping animations]]></title><description><![CDATA[😣 The problem with current tech
Have you ever wanted to upload a video presentation/teaser of your app online but it looks too plain. Maybe you just wanted to add a gradient or throw in some background music. The only way is to install expensive or ...]]></description><link>https://blog.mohitya.dev/introducing-mockoops-transform-boring-screen-recordings-into-jaw-dropping-animations</link><guid isPermaLink="true">https://blog.mohitya.dev/introducing-mockoops-transform-boring-screen-recordings-into-jaw-dropping-animations</guid><category><![CDATA[Linode]]></category><category><![CDATA[Linode Hackathon]]></category><category><![CDATA[General Programming]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[Mohit Yadav]]></dc:creator><pubDate>Thu, 30 Jun 2022 04:30:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1657030485175/_c1ywCV2t.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-the-problem-with-current-tech">😣 The problem with current tech</h2>
<p>Have you ever wanted to upload a <strong><em>video presentation/teaser</em></strong> of your app online but it looks <strong><em>too plain</em></strong>. Maybe you just wanted to <strong><em>add a gradient or throw in some background music</em></strong>. The only way is to install expensive or resource-<strong><em>heavy overkill video editors</em></strong>, or rely on some sort of online editor that asks you for a premium plan to export without a <strong><em>watermark</em></strong>.</p>
<p><strong>Well, no more!</strong></p>
<h2 id="heading-introducing-mockoops">Introducing Mockoops 📱</h2>
<p>Mockoops is an online mockup-tool which allows you to just drag-drop your screen recordings, choose a template, throw in some background music, all previewing everything right in your browser.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657032617548/k_Nay7tF8.png" alt="Screenshot 2022-07-04 at 6.38.59 PM.png" /></p>
<h2 id="heading-demo">Demo 🥳</h2>
<p>Here's an introductory video</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/SSNmU3FXW4s">https://youtu.be/SSNmU3FXW4s</a></div>
<h2 id="heading-walkthrough">Walkthrough 🚶</h2>
<p>Here's how you'll create a video from scratch.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/RV8zJp8udMQ">https://youtu.be/RV8zJp8udMQ</a></div>
<h2 id="heading-useful-links">Useful Links ⚙️:</h2>
<p>Here's what Mockoops calls home:</p>
<p>🌐 Website: <a target="_blank" href="https://mockoops.mohitya.dev">https://mockoops.mohitya.dev</a></p>
<p>🐱 Code: <a target="_blank" href="https://github.com/Just-Moh-it/Mockoops">https://github.com/Just-Moh-it/Mockoops</a></p>
<h2 id="heading-current-templates">Current Templates 🌈</h2>
<p>Mockoops comes with a bunch of templates right out of the box! They are very responsive, customisable and diversified for each of your motion-graphics video need. Some of them are here:</p>
<h3 id="heading-angled-presentation">📐 Angled Presentation</h3>
<p>This template is idea for long-form content to make it more appealing (and possibly less boring too!). Here's a quick Showdown</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/q08QhVHIz8o">https://youtu.be/q08QhVHIz8o</a></div>
<h3 id="heading-quick-teaser">⚡️ Quick Teaser</h3>
<p>This one is great for quick teasers that start out by build anticipation in the begenning, revealing only certain part of the input video at first, and slowly reveal the entire thing.</p>
<p>Here's me, using it for <a target="_blank" href="https://github.com/PckdHq/Pckd">Pckd</a>'s reveal</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/RzewyyYjjC4">https://youtu.be/RzewyyYjjC4</a></div>
<h3 id="heading-laptop-zoom">💻 Laptop Zoom</h3>
<p>This one is for the more lo-fi people out there. This template lets you present your video on a moving MacBook screen on a beautiful workstation background. This could be used with non-screen recorded stuff as well!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/IS0iEVmFrbE">https://youtu.be/IS0iEVmFrbE</a></div>
<h3 id="heading-text-reveal">📚 Text Reveal</h3>
<p>This one is for short announcements or reveals. Most suitably when you just have one screen for an app and you want to tease the coming soon status!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/FScyaMF14bE">https://youtu.be/FScyaMF14bE</a></div>
<p>Or it could even be used for things like the release of a new version of a product. The possibility with this one are endless</p>
<h3 id="heading-rotate-title">🎭 Rotate Title</h3>
<p>This one is well suited for use-cases where you need to present some text before a video, while not having to setup any fancy stuff</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/3BNXTRIKYBw">https://youtu.be/3BNXTRIKYBw</a></div>
<p>With this, the templates end for now. I have a lot in mind as to what to add next. But considering the tight schedule for this hackathon, I'll have to keep that for later.</p>
<h2 id="heading-features">Features 🏆</h2>
<p>Mockoops comes packed with awesome features you're gonna love</p>
<h3 id="heading-distributed-rendering-using-serverless-remotion-lambda">⚡️ Distributed Rendering Using Serverless (Remotion Lambda)</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657030760456/krHQIfMb6.gif" alt="ezgif.com-gif-maker (4).gif" /></p>
<p>This portion is explained in later sections</p>
<h3 id="heading-blazing-fast-exports">Blazing fast exports</h3>
<p>Preview videos right in the browser, then export with a single click</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/6LmR1UeB4s0">https://youtu.be/6LmR1UeB4s0</a></div>
<h3 id="heading-responsive-video-templates">🧩 Responsive Video Templates</h3>
<p>Unlike any other video ediors like After Effects, or Jitter, Mockoops has responsive video templates so that you could export videos with any dimension you'd want.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657030837629/A0mi7TFz-.gif" alt="ezgif.com-gif-maker (5).gif" /></p>
<h3 id="heading-pwa-support">🫡 PWA Support</h3>
<p>Mockoops even works in offline environments (preview mode).</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657031236056/wzP7nU2aC.png" alt="PWA.png" /></p>
<h3 id="heading-keyboard-shortcuts">🍰 Keyboard Shortcuts</h3>
<p>Since the app was created with user-friendliness in mind, keyboard shortcuts were on the priority when assigning actions to buttons. Here's how power-users could utilize shortcuts to render video without touching their mouse.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657031618518/qHpGO7ggX0.png" alt="Screenshot 2022-07-05 at 8.03.32 PM.png" /></p>
<h2 id="heading-how-it-works">How it works ⚙️</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657031639791/iP39OaClX.png" alt="architecture.png" /></p>
<p>Mockoops uses Remotion for the rendering.</p>
<p>Here's what remotion is <code>in 100 seconds</code></p>
<p>tl;dr It's basically a way to create videos programatically with React. It allows developers to create responsive and absolutely positioned</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://youtu.be/deg8bOoziaE">https://youtu.be/deg8bOoziaE</a></div>
<h2 id="heading-tech-stack">Tech Stack:</h2>
<p>I used my go-to tech stack for this one. Since Linode could run any technology you'd want, you're free to choose. I went with:</p>


<ul>
<li>NextJS - Because it's one of the best frontend JS Frameworks</li>
<li>Remotion - For the video and rendering</li>
<li>Linode S3 Storage - For quickly storing uploaded video files in storage buckets</li>
<li>Sass - For making the app look beautiful</li>
<li>MongoDB (w/ Linode) - For caching renders with the same input params</li>
<li>React Recoil - For app-wide state management</li>
<li>React Hot Toast - For the notifications</li>
<li>React Confetti - For the joyous animations</li>
<li>React Dropzone - For handling advanced drag-drop animations</li>
</ul>
<h2 id="heading-the-birth-of-an-idea">The birth of an idea</h2>
<p>The app idea The app idea actually came out of the need for creating/building presentable screen-recordings, for announcing my new projects on twitter.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657032326478/Tpv6vAwyV.jpeg" alt="necessity.jpeg" /></p>
<p>Apps that do the beautifying and presentation part exist for Images (like <a target="_blank" href="https://pika.style">pika.style</a>), but none for videos. So, it was obvious I had to fill the void.</p>


<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/Just_Moh_it/status/1543799112252166145">https://twitter.com/Just_Moh_it/status/1543799112252166145</a></div>
<h2 id="heading-design">Design:</h2>
<p>As every other developer who tries to design, I'm not too good with designing things on my own. I usually browse websites like <a target="_blank" href="https://dribbble.com">Dribbble</a> to get inspiration for User Interfaces.</p>
<p>I also usually have the plan in mind on how the app flow would be like. This makes the process much more simpler, and I could concentrate on one part at a time.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657033889275/HBxAypDw1.png" alt="Screenshot 2022-07-05 at 8.41.13 PM.png" /></p>
<p>(Detailed description... soon)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657034636670/Y4WoLVSGP.png" alt="pika-2022-07-05T15_23_53.618Z.png" /></p>
<h2 id="heading-code-quality">Code Quality</h2>
<p>Care has been heavily focused on in this project. Unlike most hackathon submissions, I plan to use it very frequently, and so, the code was written with maintainability in mind.</p>
<p>(Detailed Description coming soon)</p>
<p>The GitHub commit messages are a joy to read as well, in case you're wondering</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657032459365/HDd-F-T7l.png" alt="Screenshot 2022-07-05 at 8.17.33 PM.png" /></p>
<h2 id="heading-linodes-role">Linode's Role</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657032913756/EutORAY5q.png" alt="Screenshot 2022-07-05 at 8.25.06 PM.png" /></p>
<p>Linode played a major role in most aspects of the application. Here's how.</p>
<h3 id="heading-how-mockoops-achieved-blazing-fast-renders">How Mockoops achieved blazing-fast Renders ⚡️</h3>
<p>Usually, video processing happens through an API on the same server as the backend. In the traditional way, it would apply to Linode, by having a virtual machine, which runs the NextJS server through an Nginx proxy, with API endpoints to render and get progress.</p>
<p>However, this approach would be highly inefficient and non-scalable in case 50 people render at the same time. Though the server would be able to serve the frontend, the backend would not be able to handle this rendering workload.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657033536683/HJKz0ReXO.png" alt="pika-2022-07-05T03_41_00.840Z.png" /></p>
<p>This is where serverless comes into play. By leveraging the power of serverless, Mockoops could have a thousand concurrent users, all rendering at the same time while not having to compromise on any part of the application performance.</p>
<p>This is especially useful for maintaining the super-fast response times of Mockoops, while not having to deplete the monthly transfer costs. This also makes Mockoops compatible with the micro-services architecture, where the frontend is one service, the backend another, and the rendering engine to complete the architecture.</p>
<h3 id="heading-quick-deployment-of-vm-nodes">🏕 Quick deployment of VM nodes</h3>
<p>With Linode, I was able to get Mockoops from development to production within minutes. I even setup an Nginx Proxy Pass and added an SSL certificate. Though it's not as easy as something like vercel, etc. and there's a learning curve, once you get the hang of linux commands, it's much better since you have all the control you could have over deployments.</p>
<h3 id="heading-domain-management-using-linode">Domain management using Linode 🚦</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657034557261/jkA4c0j8G.png" alt="pika-2022-07-05T15_22_32.396Z.png" /></p>
<p>Linode also allows for easy domain management for free (until you have at least one VM). Unlike the registrar's nameservers, updates propagated through the DNS instantly as soon as they were edited from the console.</p>
<h3 id="heading-ddos-mitigation">DDoS Mitigation</h3>
<p>I probably don't need this very often, but with this project, it was crucial. Since the rendering infrastructure was open to anyone, and engineering a protection system to prevent repetetive renders was not possible, the application was vulnerable to DDoS exploits.</p>
<p>I know this is thinking too far, but one of my friends actually got DDoS'ed very recently on a hackathon submission. His project was down for a very long time and his hosting bills probably touched the clouds.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657031129939/EwJfJsOqG.png" alt="Screenshot 2022-07-05 at 7.54.53 PM.png" class="image--center mx-auto" /></p>
<p>This is where Linode's built-in DDoS protection comes into play. It automatically notifies when repetitive queries are being sent to the same service and if it detects some level of exploitation. Though it's not perfect, I could enjoy peace of mind at no extra cost.</p>
<h2 id="heading-what-i-learnt-during-this-hackathon">💭 What I learnt during this hackathon</h2>
<p>Learning is the main driving factor behind hackathons! Mockoops has been lesser of a web application and more of a teacher to me. To sum it here, here's what I learned:</p>
<h3 id="heading-optimization-long-term-caching">Optimization: Long-term Caching 😎</h3>
<p>Through a limited pre-alpha testing I did with some people for this app, I found out that most just pressed <code>render</code> on the video templates without changing any parameter. This meant that most of the renders were exactly the same.</p>
<p>This was a huge opportunity to save cloud costs. I just needed a way to identify each render uniquely. This was done through non-cryptographic hashing.</p>
<p>If you don't know already, a hashing function is a function which takes in an input of arbitrary length, and produces a fixed-size output based on the input. Even when the input is slightly changed, the resulatant output string is totally different. Hashing is used mainly for securing password storage, along with salting, etc.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://codesandbox.io/s/hashing-with-crypto-js-forked-0lxon6">https://codesandbox.io/s/hashing-with-crypto-js-forked-0lxon6</a></div>
<p>Hashing was particularly useful for my use-case, since the input props to the video could be given as the input to a hashing function (SHA-256 in this case), and it would produce a hash which would act like an ID for the video. If the hash of two video requests is same, it means the same is exact video is being requested. Therefore, it is very efficient to serve the already-rendered video.</p>
<p>Using this method, I was able to decrease the render requests by a large factor, while also making the user interface better. In hindsight, it was well worth the 3 days setting up rendering infrastructure took me.</p>
<h3 id="heading-serverless-computing">Serverless Computing 🥂</h3>
<p>I was always fascinated by serverless and the JAM stack, but this project took it to another level. Using Remotion Lambda, I was able to deploy pre-built functions across different regions around the globe, and scale on demand.</p>
<p>With serverless functions, <strong>serverless sites</strong> was another thing I never though of, which came out to be a crucial requirement to access the serverless functions through an API. It taught me about scaling massively, the cold-start problem, caching, cache-invalidation, and a lot more.</p>
<h3 id="heading-video-rendering">Video Rendering 🎬</h3>
<p>Setting up the rendering process was a nightmare. Since the videos are rendered on a serverless architecture, the initial setup was much more complicated that normal server renders. Also, Mockoops needed to show a progress bar for each render for a better User Experience.</p>
<p>I first though about client side rendering. However, it was not feasible since browser has to process the video in real time and if there are some interruptions, they are recorded as well, and the final video is not as smooth. It also takes twice the length of video to render, which is not ideal for a good user experience.</p>
<p>Therefore, I had to resort to client side rendering, as the remotion community had too. This meant hosting the infrastructure to render and store videos, which in itself was a challenge, but Linode user-friendliness made the process less painful and more of a joy.</p>
<p>It also taught me about FFMpeg and how it works behind the scenes. Remotion Lambda opens up the video in a Chromium browser controlled using puppeteer. It goes through each frame and dleays the renders until a video/image has loaded. It then takes a screenshot of the window.</p>
<p>This happens for all frames in the video. Finally, they are attached together using FFMpeg, which is an awesome tool I didn't know of before.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657032980539/8a2Tk5KUh.png" alt="Mp4 to Gif.png" /></p>
<p>I learned how to convert a video from <code>mp4</code> to <code>gif</code> without having to rely on online solutions</p>
<h2 id="heading-challenges-and-how-i-overcame-them">🦸 Challenges and how I overcame them</h2>
<p>This project was supposed to be an easy build, but oh boy, what an understatement!</p>
<p>Mockoops was no less that a roller-coaster. Though it taught me some valuable lessons.</p>
<h3 id="heading-software-incompatibility">Software Incompatibility ☹️</h3>
<p>It was hard to make remotion compatible with the latest versions of NextJS, since react 18 made significant changes in the browser rendering process and also changed some things from the ground-up. Though remotion had been tested against React 18, I'm afraid not so with NextJS 12.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1657031441617/Iua7v36p4.png" alt="downgrade.png" /></p>
<p>So, every now and then I was getting ambiguous error messages that I had no idea how to fix, and the solutions online seemed to make no difference. After much struggle and avoiding to downgrade my React and NextJS versions, I had to finally downgrade to React 17 and NextJS 11. It took me 2 days of debugging and finally having enough to make the switch.</p>
<p>Since downgrading, I haven't faced any silly error message and everything worked exactly like I wanted to.</p>
<p><strong>Lesson learnt</strong>: Never hesitate to downgrade your tech stack versions if it is hampering too much with progress. The change would probably be very in-significant (unless ofcourse new features aren't a business requirement).</p>
<h2 id="heading-run-your-own-version-of-mockoops">🤗 Run your own version of Mockoops!</h2>
<p>Want to tinker with Mockoops? Want to add a template? To setup your own instance of Mockoops, read the docs over on the <a target="_blank" href="https://github.com/Just-Moh-it/Mockoops">GitHub repo</a></p>
<h2 id="heading-future-roadmap">🛣 Future Roadmap</h2>
<p>Mockoops could be made better by:</p>
<ul>
<li>Adding <strong>more exciting templates</strong> (since I'd probably use this very frequently, I'll add a lot overtime)</li>
<li><strong>Dynamically uploading serverless functions when a template change is detected</strong>: Currently, all templates are uploaded to serverless environments, and different videos are altered based on different input requirements.</li>
<li>Adding Cypress tests to validate if newly added templates survive edge cases (like rendering fallback if the video is removed)</li>
</ul>
<h2 id="heading-summing-it-up">😎 Summing it up</h2>
<p>This is one of the longest blog posts I've written, since I wanted to summarize the entire process. </p>
<p>Mockoops has been a journey of creating a vision to reality. Though there were some bumps and even speed-breakers, I finally managed to get it through the tunne... Well the analogy went too literal. 😅</p>
<p>This was one of my first experiences launching a product (on product hunt as well, soon), and it sure was hell of a fun one!</p>
<h2 id="heading-thank-you">🤗 Thank you!</h2>
<p>If you've reached this far, I'm grateful that you read the article. I'm excited for the results and the prices (since I'm saving up for college). Till then, later!</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://media.giphy.com/media/42D3CxaINsAFemFuId/giphy.gif">https://media.giphy.com/media/42D3CxaINsAFemFuId/giphy.gif</a></div>
]]></content:encoded></item><item><title><![CDATA[Introducing 🏡 HouseBid - The next-gen bidding platform 🪄]]></title><description><![CDATA[🏡 Introduction
HouseBid is an open source bidding platform, where property owners could list their properties, then allow interested customers to bid from the property. 
The auctions are usual, the bidder with the highest bid will be automatically c...]]></description><link>https://blog.mohitya.dev/introducing-housebid-the-next-gen-bidding-platform</link><guid isPermaLink="true">https://blog.mohitya.dev/introducing-housebid-the-next-gen-bidding-platform</guid><category><![CDATA[Hasura Hackathon]]></category><category><![CDATA[Hasura]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[web application]]></category><category><![CDATA[UI]]></category><dc:creator><![CDATA[Mohit Yadav]]></dc:creator><pubDate>Wed, 30 Mar 2022 18:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1649307160411/wdb1xnPp4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction">🏡 Introduction</h1>
<p>HouseBid is an open source bidding platform, where property owners could list their properties, then allow interested customers to bid from the property. </p>
<p>The auctions are usual, the bidder with the highest bid will be automatically chosen as the winner, and will have to pay for the property at the end.</p>
<h1 id="heading-app-walkthrough">🚶‍♀️ App Walkthrough</h1>
<p>What’s better than a demo? Here’s one just for you...</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=jCt1MG7Ek28">https://www.youtube.com/watch?v=jCt1MG7Ek28</a></div>
<p>PS: This was my first ever time trying motion-design, would be flattered to hear any feedback :)</p>
<h2 id="heading-home-page">🏘 Home Page</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799650621/eCrrcJdVb.png" alt="Home-low.png" /></p>
<h2 id="heading-single-product-page">🎧 Single Product Page</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799662470/hohg0a63L.png" alt="Product-Page.png" /></p>
<h2 id="heading-listings-page">🙉 Listings Page</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799689301/JR8Nfp3ia.png" alt="Listings.png" /></p>
<h2 id="heading-activity-page">🎭 Activity Page</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799700779/ymkJOStWi.png" alt="Activity.png" /></p>
<h1 id="heading-some-features">🤩 Some Features</h1>
<p>I’ve put in extra effort to ensure the project is more than just a concept, and could even be used as a real application</p>
<h3 id="heading-verification-using-stripe">🪄  Verification using Stripe</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799867257/jt_NhMsHT.png" alt="user.png" /></p>
<h3 id="heading-bid-anonymously">🧑‍💻 Bid Anonymously</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799881950/8kt3HpxYS.png" alt="Anonymous.png" /></p>
<h3 id="heading-specify-increments">📈 Specify Increments</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799891110/ADGCpsmmJ.png" alt="increment.png" /></p>
<h3 id="heading-seamless-wallet-integration">💳 Seamless Wallet Integration</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799910197/edktsTSES.png" alt="wallet.png" /></p>
<h3 id="heading-dark-mode">🌙 Dark Mode</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799921054/r6rPZ3iS0.png" alt="dark.png" /></p>
<h3 id="heading-list-under-several-tags">🏷 List under several tags</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1648799927166/eMsTxzWU-.png" alt="listing.png" /></p>
<h1 id="heading-tech-stack">📐 Tech Stack</h1>
<p>I’ve created HouseBid using the following open-source technologies:</p>
<ul>
<li>Hausra + GraphQL: For the awesome and easy-to-implement backend</li>
<li>NextJS: As the frontend of the app</li>
<li>Vercel: Deployment solution for the app</li>
<li>Sass: For styling the app</li>
<li>Figma: For designing the app, and it’s user flow</li>
<li>Oracle Cloud: For hosting the database and other crucial parts of the app</li>
</ul>
<h1 id="heading-hasuras-role">😈 Hasura's Role</h1>
<p>After thinking about what to make for a hackathon, I decided to go with an app that demonstrates everything Hasura has to offer:</p>
<ul>
<li>🪄 Reliable CRUD operations</li>
<li>🗝 Seamless 3rd Party Role-based Authorization</li>
<li>👑 Blazing fast live-updates through subscriptions</li>
</ul>
<h1 id="heading-roadmap">🛣 Roadmap</h1>
<p>The application will be going to have a lot of features in the coming months, and the possibilities are virtually endless. That’s why I have a lot on the white board</p>
<h1 id="heading-conclusion">👋 Conclusion</h1>
<p>There’s a lot that got into the project, and I would love to have you review it.</p>
<p>Also, you know the drill. If you found this article helpful or the app awesome, do let me know in the comments, and I would love to hear the feedback.</p>
<h1 id="heading-useful-links">Useful Links</h1>
<ul>
<li>😺 GitHub Repo - https://github.com/Just-Moh-it/HouseBid</li>
<li>🚀 Project Demo Link - https://house-bid.vercel.app</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Introducing Pckd - The most powerful open-source URL shortener]]></title><description><![CDATA[Overview
This month, I saw the Netlify-Hashnode hackathon 🤩 and immediately knew I found the excuse to spend my time bringing my prolonged idea to life.
What exactly is 🔗 Pckd?

Have you ever wanted to share a link with a long link with a friend, b...]]></description><link>https://blog.mohitya.dev/introducing-pckd-the-most-powerful-open-source-url-shortener</link><guid isPermaLink="true">https://blog.mohitya.dev/introducing-pckd-the-most-powerful-open-source-url-shortener</guid><category><![CDATA[NetlifyHackathon]]></category><category><![CDATA[Netlify]]></category><category><![CDATA[React]]></category><category><![CDATA[UI Design]]></category><category><![CDATA[Node.js]]></category><dc:creator><![CDATA[Mohit Yadav]]></dc:creator><pubDate>Tue, 01 Mar 2022 06:18:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1646539290799/tfyjGPJ-8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-overview">Overview</h2>
<p>This month, I saw the Netlify-Hashnode hackathon 🤩 and immediately knew I found the excuse to spend my time bringing my prolonged idea to life.</p>
<h2 id="heading-what-exactly-is-pckdhttpspckdnetlifyapphashnodedemo">What exactly is 🔗 <a target="_blank" href="https://pckd.netlify.app/hashnode_demo">Pckd</a>?</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646134353427/XxF1QtA0N.gif" alt="Intro Video" /></p>
<p>Have you ever wanted to share a link with a long link with a friend, but it seems way too long to send through a message (maybe it's a base-64 image URI), so you might turn towards URL shorteners, nothing special?</p>
<p>But try to imagine, along with the shortening functionality, what if you could have a lot more. I mean, track all the clicks (or hits) on the URL that you shortened and get very-deep insights about the person who clicked it, like:</p>
<ul>
<li>Their 💻 device information, including model, operating system, etc.</li>
<li>Their 👩‍💻 browser name and version</li>
<li>Their 🌎 IP location, along with their ISP name, their city, rough coordinates, etc.</li>
</ul>
<p>And much more! 🤯</p>
<p>And to add the cherry on the top, you could host it yourself on your custom domain! In fact, it was created to be self-hosted, for people on the <a target="_blank" href="https://www.reddit.com/r/selfhosted/">self-hosted community</a></p>
<p>Doesn't that sound like the time to switch from Bitly and stop paying <a target="_blank" href="https://bitly.com/pages/pricing">the premium</a>, and stop being limited by 100 links/month?</p>
<h2 id="heading-tech-stack">Tech Stack</h2>
<p>Pckd uses the following technologies:</p>
<ul>
<li><a target="_blank" href="https://netlify.com">Netlify</a> ✨ for hosting the app</li>
<li><a target="_blank" href="https://reactjs.org/">React JS</a> ⚛️ - For the frontend of the app</li>
<li><a target="_blank" href="https://www.apollographql.com/docs/apollo-server/">Apollo GraphQL Server v3</a> 🕸️ - For querying the backend from the frontend efficiently</li>
<li><a target="_blank" href="https://github.com/Just-Moh-it/grapqhl-backend">GraphQL Template By Mohit</a> 🧩 - Boilerplate Template used for initializing the backend</li>
<li><a target="_blank" href="https://www.prisma.io/">Prisma</a> 💿 - The ORM used for the app</li>
<li><a target="_blank" href="https://www.prisma.io/docs/reference/database-reference/supported-databases">MySQL</a> for the database</li>
<li><a target="_blank" href="https://redux.js.org/">Redux</a> 🗺️ w/ <a target="_blank" href="https://redux-toolkit.js.org/">Redux Toolkit</a> - For handling states across the application</li>
<li><a target="_blank" href="https://react-hook-form.com/">React Hook Form</a> 🎣 - For managing and validating forms and text inputs.</li>
<li><a target="_blank" href="https://www.styled-components.com">Styled Components</a> 💅 - For adding CSS to the application</li>
<li><a target="_blank" href="https://ipregistry.co/">IP registry API</a> 🌐 - For obtaining 🏛 ISP, geolocation, etc. information for the IP address</li>
</ul>
<h2 id="heading-creation-process">Creation process 👩‍🎨</h2>
<p>The creation process was undoubtedly the most fun part of the project. I solved many new challenges, learnt a lot, and finally came up with an application I was proud of! Here is how I pulled it off...</p>
<h3 id="heading-designing">Designing 🎨</h3>
<p>Usually when I create a pet project, I just use the designing from the previous projects I was working on, since they won't get noticed anyway. But with this one, I wanted it to reach to the top of the list of open source URL shorteners. I had self-doubts about whether I would be able to reach the goal with my experience, but you are <a target="_blank" href="https://pckd.mohityadav.codes/devto-demo">free to judge</a>.</p>
<h4 id="heading-inspiration">Inspiration ✨</h4>
<p>So, I started by looking for inspiration. The best place for this was <a target="_blank" href="https://dribbble.com">dribbble</a>. I went to the inspiration tab. Many people would create the best design they could without any inspiration, but as Pablo Picasso (may have) said:</p>
<blockquote>
<p>Good artists create, great artists steal</p>
</blockquote>
<p>That's one way to put it, but the point is: with the amount of design experience and the height of the goals I had, I just wasn't going to be able to create a good-enough design overnight if I started from scratch. Hence, the searching.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646102675914/EhT8sPZ-Q.gif" alt="Dribbble.gif" /></p>
<p>After endless scrolling, similar-sounding keywords and hard-to-make choices, I decided to go with <a target="_blank" href="https://dribbble.com/shots/15223174-Project-Management-Dashboard-UI-Exploration">this design</a>, because it just looked great for the purpose I was looking for. There were many fancy ones too, but they just weren't practical, or too flashy for the typical programmer that was going to host it (if Pckd was even going to be successful).</p>
<h4 id="heading-customizing">Customizing 🍕</h4>
<p>The original design was good, but it wanted something more, like the colour customization, planning out exactly where everything would go, and creating an exact mock-up of how the app would look. I find this approach very useful, because you don't have to scratch your head over minor details that would otherwise go unnoticed while planning, and you have to go to the sketch board all over again.</p>
<h5 id="heading-dashboard">Dashboard 💾</h5>
<p>I went on to Dribbble to find some designs. I got some that caught my attention. After that, I went to Figma and started laying out the design</p>
<p>Here's how the final result looked like:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645203739109/Vz2jIS6iP.png" alt="dashboard.png" /></p>
<p>(I know they look totally different, or at least barely-related, but the inspiration image really helped with the design aspects, and most of the compliments I received are a result of that)</p>
<h5 id="heading-other-pages">Other pages 🗞</h5>
<p>As for the other pages, I created the homepage out of just my imagination. Here's how it looked:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645205140834/ZTdNk6J4bS.png" alt="home.png" /></p>
<p>And the signup pages:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645205192611/ffTQwK1Zn.png" alt="signup.png" /></p>
<p>The designs looked good in my opinion, and I was dead-set to implement the most design-accurate version of this with react and try to not mess up the margins or paddings somewhere. This marked the end of the designing and planning part of the app. Not bad, right?</p>
<h3 id="heading-setting-up-the-backend">Setting up the backend 🧩</h3>
<p>For the backend, I started out by forking a <a target="_blank" href="https://github.com/Just-Moh-it/grapqhl-nextjs-template">backend template repo</a> (made by me ;), because it contains a file-based structure, just like NextJS, but with backend. It also has authentication baked in, so we don't have to do the hassle of setting everything up.</p>
<h4 id="heading-the-database-schema">The database schema 💾</h4>
<p>OK, I want to have a <code>hits</code> table, a <code>user</code> table, and that's it. Oh! Forgot the <code>pckd</code> table, the main one! After all these conversations in my mind, I was ready with the following database schema</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646105302582/ism9BSqmU.png" alt="structure.png" /></p>
<p>I created the database through the <a target="_blank" href="https://prisma.io">Prisma</a> schema, and it ended up working great.</p>
<h4 id="heading-the-file-structure">The file structure 📁</h4>
<p>This is how the finished file structure looked like:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646101860667/oeGiAjkMt.png" alt="Screenshot 2022-03-01 at 8.00.42 AM.png" /></p>
<p>Adding a new route is just as easy as creating a new file in the directory, like for the <code>user</code> type, <code>api/ping/user.graphql</code> file needed to be created. This is how it looked like:</p>
<pre><code class="lang-gql">type User {
  id: ID!
  pckds: [pckd!]
  name: String!
  email: String!
  createdAt: String!
  updatedAt: String!
}
</code></pre>
<p>And For the resolving the users' <code>pckd</code> logic:</p>
<pre><code class="lang-js"><span class="hljs-built_in">module</span>.exports = {
  <span class="hljs-attr">User</span>: {
    <span class="hljs-attr">pckds</span>: <span class="hljs-keyword">async</span> (parent, args, { prisma }) =&gt; {
      <span class="hljs-keyword">const</span> pckds = <span class="hljs-keyword">await</span> prisma.pckd.findMany({
        <span class="hljs-attr">where</span>: {
          <span class="hljs-attr">userId</span>: parent.id,
        },
      });
      <span class="hljs-keyword">return</span> pckds;
    },
  },
};
</code></pre>
<p>As simple as creating an export file. You should definitely try this method of creating backends out. Little boilerplate, powerful APIs. 😃💪</p>
<h4 id="heading-achieving-this-functionality">Achieving this functionality ⛽</h4>
<p>For combining the files to create a single instance of <code>typeDef</code> and <code>resolvers</code>, I used the following code</p>
<pre><code class="lang-js"><span class="hljs-keyword">const</span> path = <span class="hljs-built_in">require</span>(<span class="hljs-string">"path"</span>);
<span class="hljs-keyword">const</span> { loadFilesSync } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"@graphql-tools/load-files"</span>);
<span class="hljs-keyword">const</span> { mergeTypeDefs, mergeResolvers } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"@graphql-tools/merge"</span>);
<span class="hljs-keyword">const</span> { makeExecutableSchema } = <span class="hljs-built_in">require</span>(<span class="hljs-string">"@graphql-tools/schema"</span>);

<span class="hljs-keyword">const</span> typeDefs = loadFilesSync(path.join(__dirname, <span class="hljs-string">"/api/**/*.graphql"</span>));
<span class="hljs-keyword">const</span> resolvers = loadFilesSync(path.join(__dirname, <span class="hljs-string">"/api/**/*.js"</span>));

<span class="hljs-keyword">const</span> schemaWithResolvers = makeExecutableSchema({
  <span class="hljs-attr">typeDefs</span>: mergeTypeDefs(typeDefs),
  <span class="hljs-attr">resolvers</span>: mergeResolvers(resolvers),
});

<span class="hljs-built_in">module</span>.exports = schemaWithResolvers;
</code></pre>
<p>This would combine all the files ending with the <code>.js</code> and <code>.graphql</code> extension from the <code>api</code> and it's sub-folder into a single <code>typedef</code> and <code>resolvers</code> variable.</p>
<h3 id="heading-querying-the-backend">Querying the backend 💬</h3>
<p>For those who are new to GraphQL or haven't used apollo GraphQL before, Apollo provides a great interface for testing and creating queries, just like postman, but for Graphs, and much more powerful.</p>
<p>And creating APIs with GraphQL never gets easier</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646104502429/3Z3YJd5HV.webp" alt="never gets easier.webp" /></p>
<h3 id="heading-setting-up-the-frontend">Setting up the frontend ⚛</h3>
<p>For the frontend, I used React with the Create-react-app template, because it was easiest to work with, and I didn't use NextJS because the app didn't have much about SEO.</p>
<p>Along with react, I used Redux, and Apollo-graphql-client to query the backend, because the global state was shared across multiple components. Also, I wanted to learn Redux, and what other way to learn than to implement it yourself. (But it turned out to be an overkill 😅).</p>
<p>The typical React development pattern continues... At the end, we have a polished URL-shortener application that's fully customizable and ready to be deployed.</p>
<h2 id="heading-hosting-the-app">Hosting the app</h2>
<p>For hosting the web app, I used netlify, as per the instructions. I created a netlify app from the dashbaoard, and the app was deployed in one click!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646539220530/sRHmaYBLW.png" alt="Screenshot 2022-03-06 at 9.30.16 AM.png" /></p>
<p>Deploying on Netlify was undoubtedly the easiest part of the project, period!</p>
<h2 id="heading-try-it-yourself">Try it yourself</h2>
<p>Here are some useful links you would need:</p>
<ul>
<li>🚀 Project Demo - https://pckd.mohityadav.codes/devto-demo</li>
<li>🐱 GitHub Repo - https://github.com/Just-Moh-it/pckd</li>
</ul>
<p>I hope you liked the blog. If you did, please leave your thoughts in the comments. It would make my day.</p>
<p>Till then, happy 💻 coding! 🍿</p>
]]></content:encoded></item><item><title><![CDATA[Top VS Code extensions only 5% people know about]]></title><description><![CDATA[As a developer, you're probably using Visual Studio Code on a daily basis. But did you know that there are tons of extensions out there that can make your life a lot easier?

I have a lot of VS Code extensions. Some are indispensable, some are good t...]]></description><link>https://blog.mohitya.dev/top-vs-code-extensions-only-5-people-know-about</link><guid isPermaLink="true">https://blog.mohitya.dev/top-vs-code-extensions-only-5-people-know-about</guid><category><![CDATA[vscode extensions]]></category><category><![CDATA[Visual Studio Code]]></category><category><![CDATA[Experience ]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[ide]]></category><dc:creator><![CDATA[Mohit Yadav]]></dc:creator><pubDate>Tue, 22 Feb 2022 05:03:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1645506098210/uC4WDcjH1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a developer, you're probably using Visual Studio Code on a daily basis. But did you know that there are tons of extensions out there that can make your life a lot easier?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645502895927/O7oK0JOsL.webp" alt="never gets easier.webp" /></p>
<p>I have a lot of VS Code extensions. Some are indispensable, some are good to have, and some become irrelevant because I'm no longer learning the language I downloaded it for.</p>
<p>In this blog post, I'm going to list my top 5 extensions that I think are underrated and unknown to most developers.😍</p>
<h1 id="heading-top-vs-code-extensions-of-all-time">Top VS Code extensions of all time</h1>
<p><strong>Bonus</strong>: At the end, there is a bonus extension, so be sure to check it out.</p>
<p>Now, starting off with the 5th one,</p>
<h2 id="heading-5-indent-linehttpsmarketplacevisualstudiocomitemsitemnamesandipchitalevscode-indent-line-5k-downloads">5: <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=sandipchitale.vscode-indent-line">Indent line</a> (5k downloads)</h2>
<p>This extension fixes all indentation issues with a single shortcut. What is better than seeing it for yourself? Here's a demo</p>
<p><img src="https://github.com/sandipchitale/vscode-indent-line/raw/master/images/indent-line-demo.gif" alt="Demo" /></p>
<p>But why need it when you have prettier? There's a reason. As far as I know, prettier does not format python code, but this extension supports many languages that prettier does not.</p>
<h2 id="heading-4-polacodehttpsmarketplacevisualstudiocomitemsitemnamepnppolacode">4: <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=pnp.polacode">Polacode</a></h2>
<p>Ever wanted to present your code to someone or some platform, but it looks ugly? A great alternative to <a target="_blank" href="https://carbon.now.sh/">Carbon</a>, it automatically detects the language, highlighting, etc. and presents a picture-perfect version of your code.</p>
<p><img src="https://github.com/octref/polacode/raw/master/demo/usage.gif" alt="Demo" /></p>
<p>Don't use it to share your company's code though :)</p>
<h2 id="heading-3-toggle-quotehttpsmarketplacevisualstudiocomitemsitemnamebritesnowvscode-toggle-quotes">3: <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=BriteSnow.vscode-toggle-quotes">Toggle Quote</a></h2>
<p>Ever typed a string with <code>"</code> and wanted to convert it to a template literal with <code>` </code>  or to <code>'</code>? Why move your cursor back and forth? Just press a simple keyboard shortcut to toggle through these quotes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645501577361/dsEThH6bF.gif" alt="Toggle.gif" /></p>
<p>I hope you get the idea. This is pretty useful for me personally, since I mistakenly write the <code>"</code> and then remember to use <code>` </code></p>
<h2 id="heading-2-bracket-padderhttpsmarketplacevisualstudiocomitemsitemnameviablelabbracket-padder">2: <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=viablelab.bracket-padder">Bracket Padder</a></h2>
<p>A simple package that provides smart whitespace padding and closing of bracket pairs: <code>() [] {}</code>. Even though prettier does it automatically, it also supports languages like python, go, etc. which prettier does not support. </p>
<p><img src="https://cloud.githubusercontent.com/assets/6108538/22630998/56e3f60e-ec05-11e6-8e5b-53c99e36f46c.gif" alt="Preview" /></p>
<p>A must-have to increase readability.</p>
<h2 id="heading-1-toggle-casehttpsmarketplacevisualstudiocomitemsitemnameryanlawstoggle-case">1: <a target="_blank" href="https://marketplace.visualstudio.com/items?itemName=ryanlaws.toggle-case">Toggle Case</a></h2>
<p>This is one of the most useful extensions on the list. The thing it does might sound very basic, but combined with VS Code's awesome features, it could save a lot of time.</p>
<p><img src="https://cloud.githubusercontent.com/assets/2899448/10712456/3c5e29b6-7a9c-11e5-9ce4-7eb944889696.gif" alt="Demo" /></p>
<p>It becomes awesome when dealing with multi-cursor text, where it could convert case for multiple instances to ones, saving a lot of time. It also converts text like <code>foo bar</code> to paths like <code>foo/bar</code>. A must-have for every programmer.</p>
<h2 id="heading-bonus-hot-dog-stand">Bonus! <a target="_blank" href>Hot dog stand</a></h2>
<p><strong>Get the joke?</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645499475560/cxGX1iXSb.png" alt="hot dog.png" /></p>
<p>OK, let's start the pitching.</p>
<p>Have you ever wanted to <strong>burn your eyeballs within seconds</strong>!? Well now, you can! With ho... Oh wait. No one in their healthy minds would want that!</p>
<h1 id="heading-wrapping-it-up">Wrapping it up</h1>
<p>Thanks for reading! If you are looking to take your VS Code experience to the next level, be sure to check out some of these extensions. Also, I'm going to post about a really cool project soon, so stay tuned. </p>
<p>You know the drill. If you found this post helpful, please share it with your friends and followers. And if you have any questions or comments, please feel free to leave them below.</p>
<p>Until then, happy coding!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645503093621/VbybySt7w.gif" alt="Bye.gif" /></p>
]]></content:encoded></item></channel></rss>