<?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" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Remote work newsletter]]></title><description><![CDATA[Remote Jobs from India]]></description><link>https://indiaremotejobs.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!RYCu!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Faa341aad-e1f9-4683-a30e-c1c2fc78bfd5_1280x1280.png</url><title>Remote work newsletter</title><link>https://indiaremotejobs.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 26 Apr 2026 23:46:42 GMT</lastBuildDate><atom:link href="https://indiaremotejobs.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[harkirat]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[indiaremotejobs@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[indiaremotejobs@substack.com]]></itunes:email><itunes:name><![CDATA[harkirat]]></itunes:name></itunes:owner><itunes:author><![CDATA[harkirat]]></itunes:author><googleplay:owner><![CDATA[indiaremotejobs@substack.com]]></googleplay:owner><googleplay:email><![CDATA[indiaremotejobs@substack.com]]></googleplay:email><googleplay:author><![CDATA[harkirat]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Building a Music SaaS]]></title><description><![CDATA[Let's explore the process of building a music Software as a Service (SaaS) platform that enables creators to engage their audience by allowing them to vote on the music played during live streams.]]></description><link>https://indiaremotejobs.substack.com/p/building-a-music-saas</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/building-a-music-saas</guid><pubDate>Sat, 04 Jan 2025 14:50:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/GhH1QWY6BDc" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Building a Music SaaS</h1><p>In this article, we will explore the process of building a music Software as a Service (SaaS) platform that enables creators to engage their audience by allowing them to vote on the music played during live streams. This comprehensive examination will cover both the conceptual framework and technical implementation involved in developing such a platform.</p><p>We will begin with an <strong>overview of the </strong><code>Music SaaS architecture</code>, breaking it down into essential components such as <code>user authentication</code>, <code>stream management</code>, and <code>audience interaction</code><strong> features</strong>. Following this, we will delve into the technical aspects of implementing these components using modern technologies, including <code>database management</code>, <code>API integrations</code>, and <code>real-time streaming</code><strong> capabilities</strong>.</p><blockquote><p>For those who prefer visual learning, a video presentation of this article's content is available on YouTube at </p><div id="youtube2-GhH1QWY6BDc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;GhH1QWY6BDc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/GhH1QWY6BDc?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></blockquote><p>The article will cover everything from user experience design and security considerations to video playback and voting mechanisms, offering valuable insights into the infrastructure and workflows that underpin successful music streaming platforms. By understanding these elements, developers will be better equipped to create engaging and interactive experiences that meet the needs of users in the evolving landscape of digital music consumption.</p><blockquote><p>To follow along with the code examples in this lecture, please refer to the GitHub repository <a href="https://github.com/code100x/muzer/commit/76be1650935af46e4d92fee69ef892b4bd98a3e0">https://github.com/code100x/muzer/commit/76be1650935af46e4d92fee69ef892b4bd98a3e0</a></p></blockquote><h3>Introduction to the Music SaaS Platform Project</h3><h3>Context and Motivation</h3><p>The following blog post aims to provide a comprehensive overview of the process involved in developing a music SaaS (Software as a Service) platform. This project was initiated with the goal of rebuilding a system that was originally developed in college. The primary motivations behind this endeavor were twofold:</p><ol><li><p><strong>Live Streaming</strong>: The creator plans to engage in live streaming activities, and this platform will become essential for selecting music during these events.</p></li><li><p><strong>Super 30 Cohort</strong>: The project is also aligned with the upcoming Super 30 cohort, an on-site program where this product will likely be highly useful.</p></li></ol><h3>Project Structure and Objectives</h3><p>The video is divided into nine parts, each focusing on a specific aspect of the development process. Here is a detailed breakdown of the project structure:</p><ol><li><p><strong>Part 0: High-Level Context</strong></p><ul><li><p>This part provides an overview of the entire project, including its objectives and the steps involved in the development process.</p></li></ul></li><li><p><strong>Part 1: Initializing the Application</strong></p><ul><li><p>The first part involves initializing the application, which is a relatively straightforward step.</p></li></ul></li><li><p><strong>Part 2: Adding Authentication</strong></p><ul><li><p>In this part, the focus is on adding authentication to the application using Next.js.</p></li></ul></li><li><p><strong>Part 3: Designing the Schema</strong></p><ul><li><p>The third part is dedicated to designing the schema, which involves understanding the structure of the database.</p></li></ul></li><li><p><strong>Part 4: Back End Development</strong></p><ul><li><p>This section covers the back-end development of the application, including setting up the server and handling requests.</p></li></ul></li><li><p><strong>Part 5: Front End Development</strong></p><ul><li><p>The front-end development is a critical component, and it took the most time to complete. This part involves creating the user interface and user experience.</p></li></ul></li><li><p><strong>Part 6: Polishing and Testing</strong></p><ul><li><p>In this phase, the focus is on adding last-minute polishes to ensure there are no vulnerabilities and to cover as many edge cases as possible.</p></li></ul></li><li><p><strong>Part 7: Deployment</strong></p><ul><li><p>The final part involves deploying the application on the internet, making it accessible to users.</p></li></ul></li></ol><h3>Technical Details</h3><ul><li><p><strong>Database Schema</strong>: The database schema is a crucial aspect of the project. It defines the structure of the database, including tables, columns, and relationships between them.</p></li><li><p><strong>Authentication</strong>: The use of Next.js for authentication ensures that only authorized users can access the application.</p></li><li><p><strong>Front End Development</strong>: The front-end development involves creating a user-friendly interface that interacts with the back-end to provide a seamless user experience.</p></li><li><p><strong>Polishing and Testing</strong>: This phase includes various testing methodologies to ensure the application is stable and secure. It also involves fixing any bugs or issues that arise during testing.</p></li></ul><h3>Future Development</h3><ul><li><p><strong>Open Issues</strong>: The creator has identified a few issues that were not addressed during the initial development phase. These issues are documented in the repository, and contributors are encouraged to pick them up and resolve them.</p></li><li><p><strong>Community Involvement</strong>: The project aims to become a useful platform for creators, and the community is invited to contribute to its development.</p></li></ul><h3>Conclusion</h3><p>The music SaaS platform project is a comprehensive endeavor that involves multiple stages of development, from high-level context to deployment. By understanding the technical details and objectives of each part, developers can better appreciate the complexity and scope of such projects. The project's open nature and community involvement make it an excellent example of collaborative development in the tech industry.</p><div><hr></div><p>This blog post provides a detailed overview of the music SaaS platform project, covering every aspect mentioned in the transcript segment. It sets the context, explains the motivations, and outlines the technical details involved in each part of the project. The post also highlights the importance of community involvement and future development opportunities.</p><h3>Part 2: Initializing the Application</h3><h3>Introduction</h3><p>In the previous section, we discussed the context and motivation behind our music SaaS platform. This section delves into the initial setup of the application, highlighting the key components and technologies involved.</p><h3>Problem Statement and Inspiration</h3><p>The idea for our music SaaS platform was inspired by a project from our college days. During this time, we worked on an application called "M" within the SDS Labs campus group. The application was a gated website where a few lab members could choose from various audio or video tracks. These tracks were scripted in-house and stored on a server, not using YouTube as we do today. The website displayed recently played tracks and allowed users to search for specific music tracks using a search bar. Once a track was selected, it would enter a pending queue where members could decide which track to play next. Tracks with more upvotes would be pushed to the top of the queue, ensuring that the most popular tracks were played next.</p><p>This collaborative music player was useful for lab sessions where music was played continuously through speakers. However, it had its limitations, such as not everyone enjoying the same type of music. For instance, Punjabi songs might not be everyone's cup of tea, leading to potential conflicts.</p><h3>Modernizing the Idea</h3><p>Fast forward to today, we aim to modernize this concept by integrating it into a more sophisticated SaaS platform. The primary goal is to create a platform where users can choose the next song to play during live streaming sessions, such as on YouTube. This would involve users upvoting their preferred tracks, ensuring that the most popular ones get played. Additionally, we plan to introduce a payment system where users can pay to have their chosen song played immediately, even if it's not currently at the top of the queue.</p><h3>Use Cases</h3><ol><li><p><strong>Colleges and University Groups</strong>: The platform can be highly useful for college groups and university settings where music is often played in common areas. It provides a democratic way to choose the next song, ensuring that everyone has a say in what gets played.</p></li><li><p><strong>Live Streaming</strong>: During live streaming sessions on platforms like YouTube, users can interact with the stream by choosing the next song to play. This enhances viewer engagement and provides a more interactive experience.</p></li><li><p><strong>On-Site Development Programs</strong>: We are planning to implement this platform in our upcoming on-site development program, Super 30. This program involves a batch of 30 people who will learn and develop for 3-4 hours each day. The music room will be a central part of this program, allowing participants to code while enjoying music chosen democratically by the group.</p></li></ol><h3>Technical Requirements</h3><ol><li><p><strong>Frontend Framework</strong>: We will use Next.js for the frontend development, which is well-suited for building server-side rendered applications with React.</p></li><li><p><strong>Database Schema</strong>: The database schema will need to handle real-time calculations and updates efficiently. This might involve using PostgreSQL with Prisma for database management.</p></li><li><p><strong>Real-Time Updates</strong>: To handle real-time updates, we will need to implement a mechanism for updating the leaderboard in real-time. This could involve using WebSockets or long polling, although we have decided to keep it simple with long polling for now.</p></li><li><p><strong>Payment Integration</strong>: If we decide to implement payment verification, we will need to use Web3.js and Solana wallet adapter for handling cryptocurrency transactions. However, this part is still under consideration and might not be implemented initially.</p></li><li><p><strong>UI Design</strong>: For the UI design, we will use Tailwind CSS and possibly Shad CN to make the components look visually appealing.</p></li><li><p><strong>API Integration</strong>: We will need to integrate with APIs like YouTube and Spotify to handle track selection and ID extraction. Ensuring there are no collisions where the same song is pushed twice is crucial.</p></li><li><p><strong>Real-Time Leaderboards</strong>: Implementing real-time leaderboards is a challenging task, especially if we have a large number of tracks. This might require building something similar to a real-time leaderboard, which is a hard problem to solve.</p></li></ol><h3>Conclusion</h3><p>In this section, we have outlined the initial setup of our music SaaS platform, including its inspiration, use cases, and technical requirements. By understanding these components, we can appreciate the complexity and scope of such projects. The platform's open nature and community involvement make it an excellent example of collaborative development in the tech industry. In the next sections, we will delve deeper into the authentication process, database schema design, backend development, frontend development, and deployment of the application.</p><h3>Part 3: Initializing the Application</h3><p>Initializing a Next.js application is a crucial step in the development process. This section will guide you through the process of setting up a new Next.js project, including the necessary commands and configurations.</p><h3>Step 1: Initializing the Next.js Project</h3><p>To begin, you need to create a new Next.js project. You can do this using the <code>create-next-app</code> command line tool. Here are the steps to initialize a new project:</p><ol><li><p><strong>Open Terminal</strong>:</p><ul><li><p>Ensure you have Node.js and npm installed on your system. If you're using Windows, consider using Git Bash or the Windows Subsystem for Linux (WSL) for better compatibility with UNIX-specific commands.</p></li></ul></li><li><p><strong>Create a New Project Directory</strong>:</p><ul><li><p>Navigate to the directory where you want to create your project.</p></li><li><p>Run the following command to create a new Next.js project:</p></li></ul></li></ol><pre><code><code>npx create-next-app@latest my-next-project --use-pnpm --example "&lt;https://github.com/vercel/next-learn/tree/main/basics/learn-starter&gt;"
</code></code></pre><ol><li><ul><li><p>This command uses the <code>create-next-app</code> tool to set up a new Next.js project with the specified template. The <code>-use-pnpm</code> flag ensures that pnpm is used as the package manager, which can be beneficial for those experiencing issues with npm locally.</p></li></ul></li><li><p><strong>Navigate to the Project Directory</strong>:</p><ul><li><p>Once the installation is complete, navigate to the newly created project directory:</p></li></ul></li></ol><pre><code><code>cd my-next-project
</code></code></pre><ol><li><p><strong>Start the Development Server</strong>:</p><ul><li><p>To start the development server, run:</p></li></ul></li></ol><pre><code><code>pnpm dev
</code></code></pre><ol><li><ul><li><p>This command will start the Next.js development server on port 3000. You can verify this by opening </p></li></ul></li></ol><p>http://localhost:3000</p><ol><li><ul><li><p> in your browser.</p></li></ul></li></ol><h3>Customizing the Project Setup</h3><p>When initializing the project, you may be prompted with several options. Here&#8217;s a breakdown of the common configurations:</p><ul><li><p><strong>Project Name</strong>: You can specify a name for your project.</p></li><li><p><strong>Use TypeScript</strong>: You can choose to use TypeScript for your project.</p></li><li><p><strong>Use ESLint</strong>: You can enable ESLint for code linting.</p></li><li><p><strong>Use Tailwind CSS</strong>: You can enable Tailwind CSS for styling.</p></li><li><p><strong>Source Directory</strong>: You can choose to keep your application code in a <code>src</code> directory.</p></li><li><p><strong>App Router</strong>: You can use the App Router instead of the Pages Router.</p></li><li><p><strong>Customize Imports</strong>: You can configure the import alias (<code>@/*</code> by default).</p></li></ul><h3>Cleaning Up the Initial Project</h3><p>After initializing the project, you may want to clean up the initial files to better understand the structure and start from scratch. Here&#8217;s how you can do it:</p><ol><li><p><strong>Remove Default Text</strong>:</p><ul><li><p>Open the <code>pages/index.tsx</code> file and remove any default text.</p></li><li><p>This will help you start with a clean slate and ensure that you understand how to add content to your pages.</p></li></ul></li><li><p><strong>Remove Global Styles</strong>:</p><ul><li><p>Open the <code>styles/global.css</code> file and remove all styles except for the Tailwind CSS imports.</p></li><li><p>This will help you understand how to use Tailwind CSS for styling your components.</p></li></ul></li><li><p><strong>Add a Basic Greeting</strong>:</p><ul><li><p>Add a simple <code>h1</code> element to the <code>pages/index.tsx</code> file to verify that the project is set up correctly.</p></li></ul></li><li><p><strong>Run the Development Server</strong>:</p><ul><li><p>Navigate to the <code>app</code> directory and run:</p></li></ul></li></ol><pre><code><code>pnpm dev
</code></code></pre><ol><li><ul><li><p>This will start the development server, and you should see a basic Next.js page with your greeting.</p></li></ul></li></ol><p>By following these steps, you can ensure that your Next.js project is set up correctly and you are ready to proceed with adding authentication, designing the schema, and other subsequent steps in the development process.</p><h3>Part 4: Adding Authentication Using Next.js</h3><h3>Introduction to Authentication</h3><p>Authentication is a crucial aspect of any web application, ensuring that only authorized users can access and interact with the platform. In this section, we will delve into the process of adding authentication to our music platform using Next.js, focusing on integrating Google login.</p><h3>Setting Up Next.js for Authentication</h3><p>To begin, we need to add Next.js as a dependency to our project. Since we are using <code>pnpm</code>, we can run the following command:</p><pre><code><code>pnpm add next
</code></code></pre><p>If you are using <code>npm</code>, you would use:</p><pre><code><code>npm install next
</code></code></pre><p>If you are using <code>yarn</code>, you would use:</p><pre><code><code>yarn add next
</code></code></pre><h3>Initializing Routes</h3><p>After adding Next.js, we need to initialize the routes. However, we are not using the Pages router; instead, we are using the new app router. This is evident from the file structure of our project, which includes an <code>app</code> folder instead of a <code>Pages</code> folder. The app router is used in Next.js 13 and above, and it requires us to define route handlers.</p><h1>Hands on Coding Implementation</h1><h2>1] Authentication and AppBar Components</h2><h3>Defining Route Handlers</h3><p>To handle requests to the <code>/api</code> endpoint, we need to create a specific route handler. This involves creating a folder structure like <code>app/api/[...slug].ts</code> and defining a handler function inside it. The handler function will catch all requests to the <code>/api</code> endpoint and handle them accordingly.</p><h3>Using Google Authentication Provider</h3><p>Next.js provides various providers for authentication, including Google. To use the Google authentication provider, we need to import it from <code>next-auth/providers/google</code>.</p><p><strong>Set Environment Variables:</strong></p><ul><li><p>Create an <code>.env</code> file in the root of your project to store the Google client ID and client secret.</p></li></ul><pre><code><code>GOOGLE_CLIENT_ID=your-client-id
GOOGLE_CLIENT_SECRET=your-client-secret
</code></code></pre><h3>1. Authentication Route: <code>app/api/auth/[...nextauth]/route.ts</code></h3><p>This file sets up the authentication logic using NextAuth with Google as the provider.</p><pre><code><code>import GoogleProvider from "next-auth/providers/google";
import NextAuth from "next-auth";
import { prismaClient } from "@/app/lib/db";

const handler = NextAuth({
    providers: [
        GoogleProvider({
            clientId: process.env.GOOGLE_CLIENT_ID ?? "",
            clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? ""
        })
    ],
    secret: process.env.NEXTAUTH_SECRET ?? "secret",
    callbacks: {
        async signIn(params) {
            if (!params.user.email) {
                return false; // Prevent sign-in if email is not available
            }

            try {
                await prismaClient.user.create({
                    data: {
                        email: params.user.email,
                        provider: "Google" // Store the provider information
                    }
                });
            } catch (e) {
                // Handle any errors that occur during the user creation
            }
            return true; // Allow sign-in if everything is successful
        }
    }
});

export { handler as GET, handler as POST };

</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Providers</strong>: The <code>GoogleProvider</code> is configured with <code>clientId</code> and <code>clientSecret</code>, which are retrieved from environment variables. This allows users to authenticate using their Google accounts.</p></li><li><p><strong>Secret</strong>: The <code>NEXTAUTH_SECRET</code> is used to encrypt session tokens, ensuring secure communication between the client and server.</p></li><li><p><strong>Callbacks</strong>:</p><ul><li><p><strong>signIn</strong>: This callback is invoked when a user attempts to sign in. It checks if the user's email is present. If not, it returns <code>false</code>, preventing the sign-in. If the email is present, it tries to create a new user in the database using Prisma. If successful, it returns <code>true</code>, allowing the sign-in process to continue.</p></li></ul></li><li><p><strong>Exporting Handler</strong>: The handler is exported for handling both GET and POST requests, making it versatile for various authentication actions like signing in and signing out.</p></li></ul><h3>2. AppBar Component: <code>app/components/Appbar.tsx</code></h3><p>The AppBar component provides a user interface for signing in and out of the application.</p><pre><code><code>"use client";
import { signIn, signOut, useSession } from "next-auth/react";
import Link from "next/link";
import { Button } from "@/components/ui/button";

export function Appbar() {
    const session = useSession(); // Get session data

    return (
        &lt;div className="flex justify-between px-20 pt-4"&gt;
            &lt;div className="text-lg font-bold flex flex-col justify-center text-white"&gt;
                Muzer
            &lt;/div&gt;
            &lt;div&gt;
                {session.data?.user ? (
                    &lt;Button className="bg-purple-600 text-white hover:bg-purple-700" onClick={() =&gt; signOut()}&gt;
                        Logout
                    &lt;/Button&gt;
                ) : (
                    &lt;Button className="bg-purple-600 text-white hover:bg-purple-700" onClick={() =&gt; signIn()}&gt;
                        Signin
                    &lt;/Button&gt;
                )}
            &lt;/div&gt;
        &lt;/div&gt;
    );
}

</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>useSession Hook</strong>: This hook retrieves the current session state, which contains user information if logged in.</p></li><li><p><strong>Conditional Rendering</strong>:</p><ul><li><p>If a user is logged in (<code>session.data?.user</code> is truthy), a "Logout" button is displayed. Clicking this button will invoke the <code>signOut</code> function to log the user out.</p></li><li><p>If no user is logged in, a "Signin" button is shown. Clicking this button invokes the <code>signIn</code> function, which triggers the authentication flow.</p></li></ul></li><li><p><strong>Styling</strong>: The component uses Tailwind CSS classes for styling, ensuring a responsive and visually appealing interface.</p></li></ul><h3>3. Providers Component: <code>app/providers.tsx</code></h3><p>This component wraps the application in a session provider context.</p><pre><code><code>"use client";

import { SessionProvider } from "next-auth/react";

export function Providers({ children }: { children: React.ReactNode }) {
    return &lt;SessionProvider&gt;{children}&lt;/SessionProvider&gt;;
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>SessionProvider</strong>: This component provides session context to its children, allowing any component within the tree to access session data via hooks like <code>useSession</code>.</p></li></ul><h3>4. Layout Component: <code>app/layout.tsx</code></h3><p>The layout component integrates all parts of the application together.</p><pre><code><code>import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import { Providers } from "./provider";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
    title: "Create Next App",
    description: "Generated by create next app",
};

export default function RootLayout({ children }: Readonly&lt;{ children: React.ReactNode; }&gt;) {
    return (
        &lt;html lang="en"&gt;
            &lt;body className={inter.className}&gt;
                &lt;Providers&gt;
                    {children}
                &lt;/Providers&gt;
            &lt;/body&gt;
        &lt;/html&gt;
    );
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Metadata</strong>: Defines metadata for SEO purposes.</p></li><li><p><strong>Root Layout</strong>:</p><ul><li><p>Wraps all child components with <code>&lt;Providers&gt;</code>, ensuring that session management is available throughout the application.</p></li><li><p>Uses Google Fonts for styling and applies global CSS for consistent design.</p></li></ul></li></ul><blockquote><p>These components collectively establish a robust authentication system using NextAuth with Google as a provider while providing an intuitive user interface for managing sessions. The use of Prisma for database interactions ensures that user data is stored securely and efficiently.</p></blockquote><h2>2] Database Schemas &amp; Management</h2><p>This section provides a detailed explanation of the Prisma schema file (<code>prisma/schema.prisma</code>), the API routes for managing streams (<code>app/api/streams/route.ts</code>), and the database client setup (<code>app/lib/db.ts</code>). These components work together to define the data structure and interactions for the music SaaS platform.</p><h3>1. Prisma Schema: <code>prisma/schema.prisma</code></h3><p>The Prisma schema is a crucial part of the application, defining the data models, their relationships, and how they interact with the database.</p><pre><code><code>// This is your Prisma schema file,
// learn more about it in the docs: &lt;https://pris.ly/d/prisma-schema&gt;

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        String      @id @default(uuid())
  email     String      @unique
  provider  Provider
  streams   Stream[]    @relation("user")
  upvotes   Upvote[]
}

model Stream {
  id            String      @id @default(uuid())
  type          StreamType
  url           String
  extractedId   String
  title         String      @default("")
  smallImg      String      @default("")
  bigImg        String      @default("")
  active        Boolean     @default(true)
  played        Boolean     @default(false)
  playedTs      DateTime?
  createAt      DateTime    @default(now())
  upvotes       Upvote[]
  userId        String
  user          User        @relation(fields: [userId], references: [id], name: "user")
  currentStream CurrentStream?
}

model CurrentStream {
  userId       String    @id
  streamId     String?   @unique
  stream       Stream?   @relation(fields: [streamId], references: [id])
}

model Upvote {
  id        String      @id @default(uuid())
  userId    String
  streamId  String
  user      User        @relation(fields: [userId], references: [id])
  stream    Stream      @relation(fields: [streamId], references: [id], onDelete: Cascade)
  @@unique([userId, streamId])
}

enum StreamType {
  Spotify
  Youtube
}

enum Provider {
  Google
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Generator</strong>:</p><ul><li><p>The <code>generator client</code> block specifies that Prisma Client will be generated using JavaScript. This client allows interaction with the database through defined models.</p></li></ul></li><li><p><strong>Datasource</strong>:</p><ul><li><p>The <code>datasource db</code> block defines the database connection. It specifies PostgreSQL as the database provider and retrieves the connection URL from an environment variable (<code>DATABASE_URL</code>).</p></li></ul></li><li><p><strong>Models</strong>:</p><ul><li><p><strong>User</strong>: Represents users of the application.</p><ul><li><p><code>id</code>: Unique identifier for each user.</p></li><li><p><code>email</code>: Unique email for authentication.</p></li><li><p><code>provider</code>: Indicates which authentication provider (e.g., Google) was used.</p></li><li><p><code>streams</code>: A one-to-many relationship with streams created by this user.</p></li><li><p><code>upvotes</code>: A one-to-many relationship with upvotes associated with this user.</p></li></ul></li><li><p><strong>Stream</strong>: Represents a music stream.</p><ul><li><p><code>id</code>: Unique identifier for each stream.</p></li><li><p><code>type</code>: Specifies whether the stream is from Spotify or YouTube (using the <code>StreamType</code> enum).</p></li><li><p><code>url</code>, <code>extractedId</code>, <code>title</code>, etc.: Various attributes related to the stream.</p></li><li><p><code>userId</code>: Foreign key linking to the creator of the stream (User).</p></li><li><p><code>currentStream</code>: Optional relation to track if this stream is currently active.</p></li></ul></li><li><p><strong>CurrentStream</strong>: Tracks which stream is currently being played for a specific user.</p><ul><li><p>Contains foreign keys linking to both User and Stream.</p></li></ul></li><li><p><strong>Upvote</strong>: Represents a user's upvote on a stream.</p><ul><li><p>Contains foreign keys linking to both User and Stream, ensuring that each user can only upvote a specific stream once (enforced by the unique constraint on <code>[userId, streamId]</code>).</p></li></ul></li></ul></li><li><p><strong>Enums</strong>:</p><ul><li><p><strong>StreamType</strong>: Enum defining possible types of streams (Spotify or YouTube).</p></li><li><p><strong>Provider</strong>: Enum defining possible authentication providers (Google).</p></li></ul></li></ul><h3>2. API Route for Streams: <code>app/api/streams/route.ts</code></h3><p>To add a stream, we need to create an endpoint that accepts a POST request containing the necessary data. The data should include the creator ID and the URL of the stream. We will use Zod to validate the incoming data and ensure it conforms to our schema.</p><h3>Imports and Constants</h3><pre><code><code>import { prismaClient } from "@/app/lib/db";
import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
//@ts-ignore
import youtubesearchapi from "youtube-search-api";
import { YT_REGEX } from "@/app/lib/utils";
import { getServerSession } from "next-auth";

const CreateStreamSchema = z.object({
    creatorId: z.string(),
    url: z.string()
});

const MAX_QUEUE_LEN = 20;
</code></code></pre><ul><li><p><strong>Imports</strong>:</p><ul><li><p><code>prismaClient</code>: Used to interact with the database via Prisma ORM.</p></li><li><p><code>NextRequest</code> and <code>NextResponse</code>: Used to handle HTTP requests and responses in Next.js.</p></li><li><p><code>z</code>: A validation library (Zod) used for schema validation.</p></li><li><p><code>youtubesearchapi</code>: A library for fetching YouTube video details.</p></li><li><p><code>YT_REGEX</code>: A regular expression for validating YouTube URLs.</p></li><li><p><code>getServerSession</code>: A function to retrieve the current session using NextAuth.</p></li></ul></li><li><p><strong>Constants</strong>:</p><ul><li><p><code>CreateStreamSchema</code>: Defines the expected structure of the request body for creating a stream, requiring a <code>creatorId</code> and a <code>url</code>.</p></li><li><p><code>MAX_QUEUE_LEN</code>: Sets a limit on the number of active streams a user can have.</p></li></ul></li></ul><h3>POST Request Handler</h3><pre><code><code>export async function POST(req: NextRequest) {
    try {
        const data = CreateStreamSchema.parse(await req.json());
        const isYt = data.url.match(YT_REGEX);
        if (!isYt) {
            return NextResponse.json({
                message: "Wrong URL format"
            }, {
                status: 411
            });
        }

        const extractedId = data.url.split("?v=")[1];

        const res = await youtubesearchapi.GetVideoDetails(extractedId);

        const thumbnails = res.thumbnail.thumbnails;
        thumbnails.sort((a: {width: number}, b: {width: number}) =&gt; a.width &lt; b.width ? -1 : 1);

        const existingActiveStream = await prismaClient.stream.count({
            where: {
                userId: data.creatorId
            }
        });

        if (existingActiveStream &gt; MAX_QUEUE_LEN) {
            return NextResponse.json({
                message: "Already at limit"
            }, {
                status: 411
            });
        }

        const stream = await prismaClient.stream.create({
            data: {
                userId: data.creatorId,
                url: data.url,
                extractedId,
                type: "Youtube",
                title: res.title ?? "Cant find video",
                smallImg: (thumbnails.length &gt; 1 ? thumbnails[thumbnails.length - 2].url : thumbnails[thumbnails.length - 1].url) ?? "&lt;https://cdn.pixabay.com/photo/2024/02/28/07/42/european-shorthair-8601492_640.jpg&gt;",
                bigImg: thumbnails[thumbnails.length - 1].url ?? "&lt;https://cdn.pixabay.com/photo/2024/02/28/07/42/european-shorthair-8601492_640.jpg&gt;"
            }
        });

        return NextResponse.json({
            ...stream,
            hasUpvoted: false,
            upvotes: 0
        });
    } catch(e) {
        console.log(e);
        return NextResponse.json({
            message: "Error while adding a stream"
        }, {
            status: 411
        });
    }
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Request Parsing and Validation</strong>:</p><ul><li><p>The request body is parsed as JSON, and the schema is validated using Zod. If validation fails, an error response is returned.</p></li></ul></li><li><p><strong>YouTube URL Validation</strong>:</p><ul><li><p>The URL is checked against the <code>YT_REGEX</code> to ensure it is a valid YouTube link. If it does not match, an error response is returned.</p></li></ul></li><li><p><strong>Extracting Video ID</strong>:</p><ul><li><p>The video ID is extracted from the URL by splitting it at "?v=".</p></li></ul></li><li><p><strong>Fetching Video Details</strong>:</p><ul><li><p>The YouTube API is called to get details about the video using the extracted ID. This includes information like title and thumbnails.</p></li></ul></li><li><p><strong>Thumbnail Handling</strong>:</p><ul><li><p>Thumbnails are sorted by width to select appropriate images for display.</p></li></ul></li><li><p><strong>Active Stream Count Check</strong>:</p><ul><li><p>The current number of active streams for the creator is counted. If this exceeds the maximum allowed (<code>MAX_QUEUE_LEN</code>), an error response is returned.</p></li></ul></li><li><p><strong>Creating a New Stream</strong>:</p><ul><li><p>A new stream entry is created in the database using Prisma Client with relevant details such as user ID, URL, video title, and thumbnail images.</p></li></ul></li><li><p><strong>Successful Response</strong>:</p><ul><li><p>If successful, a JSON response containing the newly created stream data is returned, along with default values for upvotes and whether the user has upvoted.</p></li></ul></li></ul><h3>GET Request Handler</h3><pre><code><code>export async function GET(req: NextRequest) {
    const creatorId = req.nextUrl.searchParams.get("creatorId");
    const session = await getServerSession();
    // TODO: You can get rid of the db call here
    const user = await prismaClient.user.findFirst({
        where: {
            email: session?.user?.email ?? ""
        }
    });

    if (!user) {
        return NextResponse.json({
            message: "Unauthenticated"
        }, {
            status: 403
        });
    }

    if (!creatorId) {
        return NextResponse.json({
            message: "Error"
        }, {
            status: 411
        });
    }

    const [streams, activeStream] = await Promise.all([
        await prismaClient.stream.findMany({
            where: {
                userId: creatorId,
                played: false
            },
            include: {
                _count: {
                    select: {
                        upvotes: true
                    }
                },
                upvotes: {
                    where: {
                        userId: user.id
                    }
                }
            }
        }),

        prismaClient.currentStream.findFirst({
            where: {
                userId: creatorId
            },
            include: {
                stream: true
            }
        })
    ]);

    return NextResponse.json({
        streams: streams.map(({_count, ...rest}) =&gt; ({
            ...rest,
            upvotes: _count.upvotes,
            haveUpvoted: rest.upvotes.length ? true : false
        })),
        activeStream
    });
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Query Parameters</strong>:</p><ul><li><p>The <code>creatorId</code> is retrieved from the query parameters of the request URL.</p></li></ul></li><li><p><strong>Session Handling</strong>:</p><ul><li><p>The session is retrieved using <code>getServerSession()</code>. If there is no authenticated user, a 403 Forbidden response is returned.</p></li></ul></li><li><p><strong>Error Handling</strong>:</p><ul><li><p>If no <code>creatorId</code> is provided in the request, an error response with status code 411 is returned.</p></li></ul></li><li><p><strong>Fetching Streams</strong>:</p><ul><li><p>Two asynchronous calls are made using <code>Promise.all()</code> to fetch both unplayed streams associated with the creator and the current active stream.</p></li></ul></li><li><p><strong>Data Inclusion</strong>:</p><ul><li><p>For each stream fetched, it includes counts of upvotes and checks if the current user has upvoted each stream.</p></li></ul></li><li><p><strong>Response Formatting</strong>:</p><ul><li><p>The response JSON includes all relevant stream details along with additional computed properties like total upvotes and whether the user has upvoted each stream.</p></li></ul></li></ul><blockquote><p>The API route defined in <code>app/api/streams/route.ts</code> provides essential functionality for managing music streams in the application. It allows users to create new streams by validating YouTube URLs and storing relevant metadata in a database. Additionally, it retrieves existing unplayed streams and their associated data based on user authentication. This structure facilitates robust interaction between users and their music streams, enhancing overall engagement within the platform.</p></blockquote><h3>3. Database Client Setup: <code>app/lib/db.ts</code></h3><p>This file initializes Prisma Client for database interactions.</p><pre><code><code>import { PrismaClient } from "@prisma/client";

export const prismaClient = new PrismaClient();
// this isn't the best; we should introduce a singleton here
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Prisma Client Instance</strong>:</p><ul><li><p>An instance of <code>PrismaClient</code> is created to interact with the database. This instance can be used throughout the application to perform CRUD operations on defined models.</p></li></ul></li><li><p><strong>Singleton Note</strong>:</p><ul><li><p>The comment suggests that implementing a singleton pattern would be beneficial to prevent multiple instances of Prisma Client from being created, which can lead to performance issues in serverless environments.</p></li></ul></li></ul><blockquote><p>The combination of these files establishes a robust backend architecture for managing users, streams, and upvotes within the music SaaS platform. The schema defines clear relationships between entities, while API routes provide endpoints for creating and retrieving data efficiently. The use of validation libraries like Zod enhances input safety, ensuring that only valid data interacts with the database.</p></blockquote><h2>3] Downvote Upvote Stream Routes</h2><p>This section provides a detailed explanation of the API routes for handling upvotes and downvotes on streams in the music SaaS platform. These routes interact with the database to manage user interactions with streams, specifically allowing users to upvote or downvote a stream.</p><h3>1. Downvote Route: <code>app/api/streams/downvote/route.ts</code></h3><p>This file handles the logic for removing an upvote from a stream.</p><pre><code><code>import { prismaClient } from "@/app/lib/db";
import { getServerSession } from "next-auth";
import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";

const UpvoteSchema = z.object({
    streamId: z.string(),
})

export async function POST(req: NextRequest) {
    const session = await getServerSession();

    // TODO: You can get rid of the db call here
    const user = await prismaClient.user.findFirst({
        where: {
            email: session?.user?.email ?? ""
        }
    });

    if (!user) {
        return NextResponse.json({
            message: "Unauthenticated"
        }, {
            status: 403
        });
    }

    try {
        const data = UpvoteSchema.parse(await req.json());
        await prismaClient.upvote.delete({
            where: {
                userId_streamId: {
                    userId: user.id,
                    streamId: data.streamId
                }
            }
        });

        return NextResponse.json({
            message: "Done!"
        });
    } catch(e) {
        return NextResponse.json({
            message: "Error while upvoting"
        }, {
            status: 403
        });
    }
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Zod Schema</strong>:</p><ul><li><p>The <code>UpvoteSchema</code> defines the expected structure of incoming requests, requiring a <code>streamId</code> to identify which stream is being downvoted.</p></li></ul></li><li><p><strong>Session Handling</strong>:</p><ul><li><p>The session is retrieved using <code>getServerSession()</code>, which checks if the user is authenticated. If not, it returns a 403 status with an "Unauthenticated" message.</p></li></ul></li><li><p><strong>Database Interaction</strong>:</p><ul><li><p>The code attempts to find the user in the database based on their email. This is a point of improvement, as it could be optimized by using session information directly instead of making a database call.</p></li></ul></li><li><p><strong>Deleting an Upvote</strong>:</p><ul><li><p>If the user is authenticated, the code parses the request body and deletes the corresponding upvote from the database using Prisma Client. The deletion is based on a composite key (<code>userId_streamId</code>), ensuring that only the specific upvote by that user for that stream is removed.</p></li></ul></li><li><p><strong>Response Handling</strong>:</p><ul><li><p>If successful, it returns a success message. If there&#8217;s an error (e.g., invalid input), it catches the exception and returns an error message with a 403 status.</p></li></ul></li></ul><h3>2. Upvote Route: <code>app/api/streams/upvote/route.ts</code></h3><p>To upvote a stream, we need to create an endpoint that accepts a POST request containing the stream ID. We will use the Prisma client to update the upvotes count for the specified stream.</p><p>This file handles adding an upvote to a stream.</p><pre><code><code>import { prismaClient } from "@/app/lib/db";
import { getServerSession } from "next-auth";
import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";

const UpvoteSchema = z.object({
    streamId: z.string(),
})

export async function POST(req: NextRequest) {
    const session = await getServerSession();

    // TODO: You can get rid of the db call here
    const user = await prismaClient.user.findFirst({
        where: {
            email: session?.user?.email ?? ""
        }
    });

    if (!user) {
        return NextResponse.json({
            message: "Unauthenticated"
        }, {
            status: 403
        });
    }

    try {
        const data = UpvoteSchema.parse(await req.json());
        await prismaClient.upvote.create({
            data: {
                userId: user.id,
                streamId: data.streamId
            }
        });

        return NextResponse.json({
            message: "Done!"
        });
    } catch(e) {
        return NextResponse.json({
            message: "Error while upvoting"
        }, {
            status: 403
        });
    }
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Zod Schema</strong>:</p><ul><li><p>Similar to the downvote route, this schema validates that incoming requests contain a valid <code>streamId</code>.</p></li></ul></li><li><p><strong>Session Handling</strong>:</p><ul><li><p>The session is again retrieved to check if the user is authenticated. If not, it returns a 403 status.</p></li></ul></li><li><p><strong>Database Interaction</strong>:</p><ul><li><p>After confirming authentication, it attempts to find the user in the database based on their email (again, this could be optimized).</p></li></ul></li><li><p><strong>Creating an Upvote</strong>:</p><ul><li><p>If validation passes and the user exists, it creates a new entry in the <code>upvotes</code> table using Prisma Client. This associates the current user with the specified stream via their IDs.</p></li></ul></li><li><p><strong>Response Handling</strong>:</p><ul><li><p>Returns a success message upon successful creation or an error message if any issues arise during processing.</p></li></ul></li></ul><h3>Comparison with Stream Management Route (<code>app/api/streams/route.ts</code>)</h3><p>The <code>app/api/streams/route.ts</code> file manages streams by allowing users to create new streams and retrieve existing ones. Here&#8217;s how it relates to upvotes and downvotes:</p><ol><li><p><strong>User Interaction</strong>:</p><ul><li><p>All three routes (creating streams, upvoting, and downvoting) require authentication to ensure that only logged-in users can perform actions.</p></li><li><p>The streams route allows users to create new streams, while upvotes and downvotes manage interactions with those streams.</p></li></ul></li><li><p><strong>Data Integrity</strong>:</p><ul><li><p>Each route interacts with the same underlying data models defined in Prisma (<code>User</code>, <code>Stream</code>, <code>Upvote</code>). This ensures that changes made by one route are reflected across others.</p></li><li><p>The upvote and downvote routes specifically ensure that users can only interact with streams they have access to, maintaining data integrity through foreign key relationships.</p></li></ul></li><li><p><strong>Error Handling</strong>:</p><ul><li><p>All routes implement error handling for both authentication failures and operational issues (like invalid input or database errors). This consistency improves robustness and user experience.</p></li></ul></li><li><p><strong>Optimizations</strong>:</p><ul><li><p>Both upvote routes have a commented note suggesting that unnecessary database calls can be eliminated by leveraging session information directly instead of querying for user details each time.</p></li></ul></li></ol><blockquote><p>The upvote and downvote API routes provide essential functionality for managing user interactions with streams in the music SaaS platform. They ensure that users can express their preferences while maintaining robust authentication and error handling practices. Together with the stream management route, they form a cohesive system that enhances user engagement within the platform.</p></blockquote><h2>4] Building Landing Page &amp; Components</h2><p>This section provides a detailed explanation of the landing page (<code>app/page.tsx</code>) and its related components (<code>app/components/Appbar.tsx</code>, <code>app/components/Redirect.tsx</code>, and <code>app/components/StreamView.tsx</code>). These components work together to create the main user interface and functionality of the music SaaS platform.</p><p>In the development of the music platform, the front end plays a crucial role in creating a user-friendly interface. This section will delve into the technical details of designing and implementing the front end using Next.js and Tailwind CSS.</p><h3>Landing Page: <code>app/page.tsx</code></h3><p>The landing page serves as the main entry point for users visiting the application. It showcases the platform's features and encourages users to sign up or learn more about the service.</p><pre><code><code>import Link from "next/link";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Users, Radio, Headphones } from "lucide-react";
import { Appbar } from "./components/Appbar";
import { Redirect } from "./components/Redirect";

export default function LandingPage() {
  return (
    &lt;div className="flex flex-col min-h-screen bg-gradient-to-br from-gray-900 via-purple-900 to-gray-900"&gt;
      &lt;Appbar /&gt;
      &lt;Redirect /&gt;
      {/* ... */}
    &lt;/div&gt;
  );
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Background</strong>: The page uses a gradient background to create a visually appealing layout.</p></li><li><p><strong>Appbar</strong>: The <code>Appbar</code> component is included, providing a consistent navigation bar across the application.</p></li><li><p><strong>Redirect</strong>: The <code>Redirect</code> component is used to redirect authenticated users to the dashboard page, ensuring they don't see the landing page if they are already logged in.</p></li></ul><p>The landing page is divided into several sections:</p><ol><li><p><strong>Hero Section</strong>:</p><ul><li><p>Displays a catchy headline and a brief description of the platform's main feature: letting fans choose the music.</p></li><li><p>Includes two buttons: "Get Started" and "Learn More" to guide users towards sign-up or learning more about the service.</p></li></ul></li><li><p><strong>Key Features Section</strong>:</p><ul><li><p>Highlights three key features of the platform: fan interaction, live streaming, and high-quality audio.</p></li><li><p>Each feature is represented by an icon and a short description.</p></li></ul></li><li><p><strong>Sign-Up Section</strong>:</p><ul><li><p>Encourages users to sign up for the service by providing an email input field and a "Sign Up" button.</p></li><li><p>Includes a call-to-action message emphasizing the platform's ability to transform streams.</p></li></ul></li><li><p><strong>Footer</strong>:</p><ul><li><p>Displays copyright information and links to the terms of service and privacy policy.</p></li></ul></li></ol><h3>Appbar Component: <code>app/components/Appbar.tsx</code></h3><p>The <code>Appbar</code> component provides a consistent navigation bar across the application. It includes the platform's name and handles user authentication.</p><pre><code><code>"use client";
import { signIn, signOut, useSession } from "next-auth/react";
import Link from "next/link";
import { Button } from "@/components/ui/button";

export function Appbar() {
    const session = useSession();

    return (
        &lt;div className="flex justify-between px-20 pt-4"&gt;
            &lt;div className="text-lg font-bold flex flex-col justify-center text-white"&gt;
                Muzer
            &lt;/div&gt;
            &lt;div&gt;
                {session.data?.user ? (
                    &lt;Button className="bg-purple-600 text-white hover:bg-purple-700" onClick={() =&gt; signOut()}&gt;
                        Logout
                    &lt;/Button&gt;
                ) : (
                    &lt;Button className="bg-purple-600 text-white hover:bg-purple-700" onClick={() =&gt; signIn()}&gt;
                        Signin
                    &lt;/Button&gt;
                )}
            &lt;/div&gt;
        &lt;/div&gt;
    );
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Conditional Rendering</strong>: The Appbar conditionally renders a "Logout" button if the user is logged in or a "Signin" button if the user is not logged in.</p></li><li><p><strong>Sign-In and Sign-Out</strong>: The "Signin" and "Logout" buttons trigger the sign-in and sign-out actions using the <code>signIn</code> and <code>signOut</code> functions provided by NextAuth.</p></li></ul><h3>Redirect Component: <code>app/components/Redirect.tsx</code></h3><p>The <code>Redirect</code> component checks if a user is logged in and redirects them to the dashboard page if they are.</p><pre><code><code>"use client";

import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";
import { useEffect } from "react";

export function Redirect() {
    const session = useSession();
    const router = useRouter();

    useEffect(() =&gt; {
        if (session?.data?.user) {
            router.push("/dashboard");
        }
    }, [session]);

    return null;
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Session Data</strong>: The component retrieves the session data using the <code>useSession</code> hook provided by NextAuth.</p></li><li><p><strong>Redirect Logic</strong>: If the user is logged in (<code>session?.data?.user</code>), the component uses the <code>useRouter</code> hook to redirect them to the "/dashboard" route.</p></li><li><p><strong>Conditional Rendering</strong>: The component doesn't render anything visually; it only performs the redirect logic.</p></li></ul><h3>StreamView Component: <code>app/components/StreamView.tsx</code></h3><p>The <code>StreamView</code> component is responsible for displaying the current stream and the upcoming songs in the queue. It allows users to vote on songs and adds new songs to the queue.</p><pre><code><code>"use client";

import { useEffect, useRef, useState } from 'react';
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Card, CardContent } from "@/components/ui/card";
import { ChevronUp, ChevronDown, ThumbsDown, Play, Share2, Axis3DIcon } from "lucide-react";
import { toast, ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { Appbar } from '../components/Appbar';
import LiteYouTubeEmbed from 'react-lite-youtube-embed';
import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css';
import { YT_REGEX } from '../lib/utils';
import YouTubePlayer from 'youtube-player';

interface Video {
  "id": string,
  "type": string,
  "url": string,
  "extractedId": string,
  "title": string,
  "smallImg": string,
  "bigImg": string,
  "active": boolean,
  "userId": string,
  "upvotes": number,
  "haveUpvoted": boolean
}

// ...
</code></code></pre><p>The <code>StreamView</code> component includes various features such as:</p><ol><li><p><strong>Displaying the current video</strong>:</p><ul><li><p>Shows the title and thumbnail of the currently playing video.</p></li><li><p>Embeds the video using the <code>LiteYouTubeEmbed</code> component.</p></li></ul></li><li><p><strong>Upcoming songs queue</strong>:</p><ul><li><p>Displays a list of upcoming songs in the queue.</p></li><li><p>Allows users to upvote or downvote songs in the queue.</p></li></ul></li><li><p><strong>Adding new songs to the queue</strong>:</p><ul><li><p>Provides an input field for users to enter a YouTube video URL.</p></li><li><p>Validates the URL format using a regular expression (<code>YT_REGEX</code>).</p></li><li><p>Sends a POST request to the <code>/api/streams</code> endpoint to add the new song to the queue.</p></li></ul></li><li><p><strong>Automatic playback</strong>:</p><ul><li><p>Uses the <code>YouTubePlayer</code> library to control the video playback.</p></li><li><p>Automatically plays the next song in the queue when the current one ends.</p></li></ul></li><li><p><strong>Refreshing the stream data</strong>:</p><ul><li><p>Periodically fetches the latest stream data from the <code>/api/streams</code> endpoint using the <code>refreshStreams</code> function.</p></li><li><p>Updates the queue and the currently playing video based on the fetched data.</p></li></ul></li><li><p><strong>Sharing the stream link</strong>:</p><ul><li><p>Provides a "Share" button that copies the shareable link to the clipboard.</p></li><li><p>Uses the <code>toast</code> library to display a success or error message based on the copy operation's result.</p></li></ul></li></ol><blockquote><p>The landing page, Appbar, Redirect, and StreamView components work together to create an engaging user experience for the music SaaS platform. The landing page introduces the platform's features and encourages sign-ups, while the Appbar and Redirect components handle authentication and navigation. The StreamView component is the heart of the application, allowing users to interact with the live stream by adding songs, voting on them, and sharing the stream with others.</p></blockquote><h2>5] Building Dashboard Page, Utils, Finishing API Routes</h2><p>This section provides a detailed explanation of the dashboard page (<code>app/dashboard/page.tsx</code>) and its related files (<code>app/api/streams/my/route.ts</code>, <code>app/lib/utils.ts</code>, <code>app/creator/[creatorId]/page.tsx</code>, and <code>app/api/streams/next/route.ts</code>). These components work together to create the main user interface and functionality of the music SaaS platform's dashboard.</p><h3>Dashboard Page: <code>app/dashboard/page.tsx</code></h3><p>The dashboard page serves as the main interface for users to manage their streams and interact with the live stream.</p><pre><code><code>"use client";
import { useEffect, useState } from 'react';
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Card, CardContent } from "@/components/ui/card";
import { ChevronUp, ChevronDown, ThumbsDown, Play, Share2 } from "lucide-react";
import { toast, ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { Appbar } from '../components/Appbar';
import LiteYouTubeEmbed from 'react-lite-youtube-embed';
import 'react-lite-youtube-embed/dist/LiteYouTubeEmbed.css';
import { YT_REGEX } from '../lib/utils';
import StreamView from '../components/StreamView';

interface Video {
    "id": string,
    "type": string,
    "url": string,
    "extractedId": string,
    "title": string,
    "smallImg": string,
    "bigImg": string,
    "active": boolean,
    "userId": string,
    "upvotes": number,
    "haveUpvoted": boolean
}

const REFRESH_INTERVAL_MS = 10 * 1000;

const creatorId = "3ce10574-0396-43ac-8274-02882cde607b"

export default async function Component() {
    try {
        const data = await fetch("/api/user").then(res =&gt; res.json());

        return &lt;StreamView creatorId={data.user.id} playVideo={true} /&gt;
    } catch(e) {
        return null
    }
}

export const dynamic = 'auto'
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Fetching User Data</strong>: The dashboard page fetches the user's data from the <code>/api/user</code> endpoint using the <code>fetch</code> function. This data is used to retrieve the user's streams and display them in the <code>StreamView</code> component.</p></li><li><p><strong>Rendering StreamView</strong>: The <code>StreamView</code> component is rendered with the user's ID and the <code>playVideo</code> prop set to <code>true</code>. This allows the dashboard to display the current stream and the upcoming songs in the queue.</p></li><li><p><strong>Dynamic Rendering</strong>: The <code>export const dynamic = 'auto'</code> statement ensures that the page can be rendered dynamically, allowing for efficient rendering of the <code>StreamView</code> component.</p></li></ul><h3>API Route for User's Streams: <code>app/api/streams/my/route.ts</code></h3><p>This file handles API requests related to retrieving a user's streams.</p><pre><code><code>import { prismaClient } from "@/app/lib/db";
import { getServerSession } from "next-auth";
import { NextRequest, NextResponse } from "next/server";

export async function GET(req: NextRequest) {
    const session = await getServerSession();
    // TODO: You can get rid of the db call here
    const user = await prismaClient.user.findFirst({
        where: {
            email: session?.user?.email ?? ""
        }
    });

    if (!user) {
        return NextResponse.json({
            message: "Unauthenticated"
        }, {
            status: 403
        });
    }

    const streams = await prismaClient.stream.findMany({
        where: {
            userId: user.id
        },
        include: {
            _count: {
                select: {
                    upvotes: true
                }
            },
            upvotes: {
                where: {
                    userId: user.id
                }
            }
        }
    });

    return NextResponse.json({
        streams: streams.map(({_count, ...rest}) =&gt; ({
            ...rest,
            upvotes: _count.upvotes,
            haveUpvoted: rest.upvotes.length ? true : false
        }))
    });
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Authentication</strong>: The route checks if the user is authenticated by retrieving the session data using <code>getServerSession()</code>. If the user is not authenticated, it returns a 403 Forbidden response.</p></li><li><p><strong>Fetching Streams</strong>: If the user is authenticated, the route fetches all the streams associated with the user's ID using Prisma Client's <code>findMany()</code> method. It includes the count of upvotes for each stream and checks if the current user has upvoted each stream.</p></li><li><p><strong>Response</strong>: The route returns a JSON response containing the user's streams with additional information like the number of upvotes and whether the current user has upvoted each stream.</p></li></ul><h3>Utility Functions: <code>app/lib/utils.ts</code></h3><p>This file contains utility functions and constants used throughout the application.</p><h3>Using Regular Expressions for URL Validation</h3><p>Regular expressions can be used to validate URLs and extract specific parts of them. For example, to check if a URL is a valid YouTube URL, we can use the following regular expression:</p><pre><code><code>const youtubeRegex = /^.*(?:youtu.be\\\\/|v\\\\/|u\\\\/\\\\w\\\\/|embed\\\\/|watch\\\\?v=)([^#&amp;?]*)(?:\\\\&amp;.*+)?$/.test(data.url);

</code></code></pre><p>This regular expression checks if the URL contains 'youtube' and extracts the video ID.</p><pre><code><code>import { type ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";

export const YT_REGEX = /^(?:(?:https?:)?\\\\/\\\\/)?(?:www\\\\.)?(?:m\\\\.)?(?:youtu(?:be)?\\\\.com\\\\/(?:v\\\\/|embed\\\\/|watch(?:\\\\/|\\\\?v=))|youtu\\\\.be\\\\/)((?:\\\\w|-){11})(?:\\\\S+)?$/;

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs));
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>YT_REGEX</strong>: A regular expression pattern used to validate YouTube video URLs.</p></li><li><p><strong>cn Function</strong>: A utility function that combines multiple class names using the <code>clsx</code> and <code>tailwind-merge</code> libraries. This function helps with conditional styling and merging class names.</p></li></ul><h3>Creator Page: <code>app/creator/[creatorId]/page.tsx</code></h3><p>This file defines the page for displaying a specific creator's stream.</p><pre><code><code>import StreamView from "@/app/components/StreamView";

export default function Creator({
    params: {
        creatorId
    }
}: {
    params: {
        creatorId: string;
    }
}) {
    return &lt;div&gt;
        &lt;StreamView creatorId={creatorId} playVideo={false} /&gt;
    &lt;/div&gt;
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Rendering StreamView</strong>: The <code>StreamView</code> component is rendered with the <code>creatorId</code> parameter passed from the URL. The <code>playVideo</code> prop is set to <code>false</code> to prevent automatic playback of the stream.</p></li><li><p><strong>Accessing URL Parameters</strong>: The <code>params</code> object is used to access the <code>creatorId</code> parameter from the URL.</p></li></ul><h3>API Route for Next Stream: <code>app/api/streams/next/route.ts</code></h3><p>This file handles API requests related to retrieving the next stream to be played.</p><pre><code><code>import { prismaClient } from "@/app/lib/db";
import { getServerSession } from "next-auth";
import { NextResponse } from "next/server";

export async function GET() {
    const session = await getServerSession();
    // TODO: You can get rid of the db call here
    const user = await prismaClient.user.findFirst({
       where: {
           email: session?.user?.email ?? ""
       }
   });

   if (!user) {
       return NextResponse.json({
           message: "Unauthenticated"
       }, {
           status: 403
       });
   }

   const mostUpvotedStream = await prismaClient.stream.findFirst({
        where: {
            userId: user.id,
            played: false
        },
        orderBy: {
            upvotes: {
                _count: 'desc'
            }
        }
   });

   await Promise.all([prismaClient.currentStream.upsert({
        where: {
            userId: user.id
        },
        update: {
            userId: user.id,
            streamId: mostUpvotedStream?.id
        },
        create: {
            userId: user.id,
            streamId: mostUpvotedStream?.id
        }
    }), prismaClient.stream.update({
        where: {
            id: mostUpvotedStream?.id ?? ""
        },
        data: {
            played: true,
            playedTs: new Date()
        }
   })])

   return NextResponse.json({
    stream: mostUpvotedStream
   });
}
</code></code></pre><h3>Key Components Explained:</h3><ul><li><p><strong>Authentication</strong>: The route checks if the user is authenticated by retrieving the session data using <code>getServerSession()</code>. If the user is not authenticated, it returns a 403 Forbidden response.</p></li><li><p><strong>Fetching Next Stream</strong>: If the user is authenticated, the route fetches the most upvoted unplayed stream associated with the user's ID using Prisma Client's <code>findFirst()</code> method. It orders the streams by the count of upvotes in descending order.</p></li><li><p><strong>Updating Current Stream</strong>: The route uses Prisma Client's <code>upsert()</code> method to update or create the current stream for the user. It sets the <code>streamId</code> to the ID of the most upvoted unplayed stream.</p></li><li><p><strong>Updating Stream Status</strong>: The route updates the played status of the most upvoted unplayed stream using Prisma Client's <code>update()</code> method. It sets the <code>played</code> flag to <code>true</code> and the <code>playedTs</code> to the current timestamp.</p></li><li><p><strong>Response</strong>: The route returns a JSON response containing the most upvoted unplayed stream.</p></li></ul><blockquote><p>The dashboard page, API routes, utility functions, and creator page work together to provide a comprehensive user interface for managing streams and interacting with live streams. The dashboard fetches the user's streams and displays them using the <code>StreamView</code> component. The API routes handle authentication and CRUD operations for streams, while utility functions provide helper functions and constants. The creator page allows users to view a specific creator's stream without automatic playback.</p></blockquote><h3>Technical Details</h3><ul><li><p><strong>Database Schema</strong>: Uses PostgreSQL with Prisma for efficient real-time calculations and updates.</p></li><li><p><strong>Authentication</strong>: Uses Next.js for secure user access.</p></li><li><p><strong>Front End Development</strong>: Focuses on creating a user-friendly interface with Tailwind CSS.</p></li><li><p><strong>Real-Time Updates</strong>: Implements long polling for real-time updates to the leaderboard.</p></li><li><p><strong>Payment Integration</strong>: Plans to use Web3.js and Solana wallet adapter for handling cryptocurrency transactions, though this is still under consideration.</p></li><li><p><strong>API Integration</strong>: Integrates with APIs like YouTube and Spotify to handle track selection and ID extraction, ensuring no song collisions.</p></li></ul><h1>Future Development</h1><ul><li><p><strong>Open Issues</strong>: Identified issues are documented in the repository for community contribution.</p></li><li><p><strong>Community Involvement</strong>: Encourages community contribution to enhance the platform.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Building WazirX End to End]]></title><description><![CDATA[In this article, we will explore the process of building a centralized cryptocurrency exchange (CEX) similar to WazirX from the ground up, providing a thorough examination of both the conceptual framework and technical implementation involved in such a platform.]]></description><link>https://indiaremotejobs.substack.com/p/building-wazirx-end-to-end</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/building-wazirx-end-to-end</guid><pubDate>Fri, 03 Jan 2025 14:50:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/1-oFiYqEsKg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this article, we will explore the process of building a centralized cryptocurrency exchange (CEX) similar to <code>WazirX</code> from the ground up, providing a thorough examination of both the conceptual framework and technical implementation involved in such a platform.</p><p>We will begin with an <code>overview of the CEX architecture</code>, breaking it down into essential components such as user onboarding, <code>wallet management</code>, and <code>trading functionalities</code>. Following this, we will delve into the technical aspects of implementing these components using modern technologies, including <code>database management</code>, API integrations, and <code>security protocols</code>.</p><blockquote><p>For those who prefer visual learning, a video presentation of this article's content is available on YouTube at </p><div id="youtube2-1-oFiYqEsKg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1-oFiYqEsKg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/1-oFiYqEsKg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></blockquote><p>The article will cover everything from regulatory compliance and security considerations to liquidity management and user experience design, offering valuable insights into the infrastructure and workflows that underpin successful cryptocurrency exchanges. By understanding these elements, developers will be better equipped to create secure and efficient trading platforms that meet the needs of users in the evolving crypto landscape.</p><blockquote><p>To follow along with the code examples in this lecture, please refer to the GitHub repository <a href="https://github.com/code100x/cdex">https://github.com/code100x/cdex</a>.</p></blockquote><h1>Building a Centralized Exchange: Key Considerations and Architectural Differences</h1><p>Building a centralized exchange (CEX) is a complex task that requires careful consideration of several critical factors. In this section, we will delve into the architecture of a CEX, discuss the challenges faced by previous exchanges like Binance (BZX) and FTX, and outline the steps necessary to build a secure and compliant CEX in India. We will also explore the use of multi-signature wallets (multis), market makers, and the importance of INR-USDT markets in the Indian context.</p><h3>Architecture of a Centralized Exchange</h3><p>A centralized exchange is a platform where users can buy, sell, and trade cryptocurrencies. The architecture of such an exchange involves several key components:</p><ol><li><p><strong>Front-end Development</strong>:</p><ul><li><p>The first step in building a CEX is to create the front-end interface. This includes designing and developing user-friendly pages for signing up, logging in, viewing balances, and swapping cryptocurrencies.</p></li><li><p>For instance, you would need to create a sign-up page, a balances page, and a swap page. The sign-up and sign-in logic should be implemented with basic backend functionality to handle user authentication.</p></li></ul></li><li><p><strong>Backend Development</strong>:</p><ul><li><p>The backend of the exchange handles the core functionality such as transaction processing, user account management, and security measures.</p></li><li><p>Initially, you will need to implement basic backend logic without integrating banking APIs. This involves mocking out payment processes using services like Razorpay or Stripe but ensuring that these services do not flag your business as a crypto exchange due to regulatory restrictions.</p></li></ul></li><li><p><strong>Multi-Signature Wallets (Multis)</strong>:</p><ul><li><p>Multi-signature wallets are used to enhance security by requiring multiple signatures for transactions. This is particularly useful in preventing single-point failures and ensuring that no single entity can control all funds.</p></li><li><p>In this tutorial, we will explore how to create and integrate multisig wallets on various blockchains such as Solana and Ethereum.</p></li></ul></li><li><p><strong>Market Makers and Spot Trading</strong>:</p><ul><li><p>Market makers are crucial for providing liquidity to an exchange. They buy and sell assets at the best available prices to maintain market stability.</p></li><li><p>Spot trading refers to the immediate exchange of one cryptocurrency for another without involving any derivatives. In the context of a CEX, spot trading allows users to swap INR for Ethereum or Ethereum for INR directly.</p></li></ul></li><li><p><strong>India-Specific Challenges</strong>:</p><ul><li><p>Building an exchange in India comes with unique challenges due to regulatory requirements.</p></li><li><p>One major challenge is handling crypto taxes every time a user swaps cryptocurrencies. Additionally, withdrawals are restricted; users can only withdraw funds using Indian Rupees (INR). This means that users can only buy cryptocurrencies using INR and sell them back into INR but cannot withdraw them directly from the exchange.</p></li><li><p>This regulatory environment necessitates careful planning and compliance with Indian laws regarding cryptocurrency transactions.</p></li></ul></li><li><p><strong>INR-USDT Market</strong>:</p><ul><li><p>The INR-USDT market is critical for exchanges operating in India. USDT (Tether), a stablecoin pegged to the US dollar, is often used as a bridge between fiat currencies like INR and other cryptocurrencies.</p></li><li><p>Ensuring a stable and liquid INR-USDT market is essential for user trust and exchange stability.</p></li></ul></li><li><p><strong>Licensing and Banking APIs</strong>:</p><ul><li><p>To integrate banking APIs directly with your exchange, you need an FIU (Financial Intelligence Unit) license. This license allows you to handle financial transactions securely and comply with anti-money laundering (AML) and know-your-customer (KYC) regulations.</p></li><li><p>Without an FIU license, you cannot integrate directly with payment providers like Razorpay or Stripe, which are essential for onboarding users and facilitating transactions.</p></li></ul></li><li><p><strong>Security Considerations</strong>:</p><ul><li><p>Despite best efforts, centralized exchanges are not immune to security threats. Attack vectors such as phishing attacks, smart contract vulnerabilities, and insider threats must be identified and mitigated.</p></li><li><p>We will discuss common attack vectors associated with centralized exchanges and provide strategies for addressing them effectively.</p></li></ul></li></ol><h3>Conclusion</h3><p>Building a centralized exchange requires meticulous planning and adherence to regulatory requirements specific to the region you operate in. By understanding the architecture of a CEX, addressing India-specific challenges, and implementing robust security measures, you can create a reliable platform for cryptocurrency trading. This tutorial will guide you through each step of building your own CEX while highlighting potential pitfalls and solutions along the way.</p><div><hr></div><h1>Understanding Users and Market Makers</h1><p>Centralized exchanges (CEXs) are pivotal in the digital currency ecosystem, serving as primary hubs for trading cryptocurrencies. These platforms are managed by a central authority and are designed to facilitate the buying, selling, and trading of various digital assets. To build a CEX, particularly in a country like India, one must understand the architecture involving two key components: end users and market makers.</p><h3>End Users</h3><p>End users are individuals who want to buy or sell cryptocurrencies. In the context of an Indian CEX, such as Vazir X, the process is relatively straightforward:</p><ol><li><p><strong>User Onboarding</strong>: The user signs up for the platform, which involves a simple registration process. Many companies offer KYC (Know Your Customer) services as a service, making this step easier for the platform to manage.</p></li><li><p><strong>Funding</strong>: Users deposit INR (Indian Rupees) from their bank accounts into the platform. This is facilitated by integrating directly with banks like HDFC or SBI, allowing users to send funds easily.</p></li><li><p><strong>Trading</strong>: Once funded, users can convert their INR into cryptocurrencies like USDT or Ethereum. For example, a user might swap 10,000 rupees for $10 USDT or Ethereum.</p></li><li><p><strong>Order Execution</strong>: Users place orders to buy or sell cryptocurrencies. The platform's order book matches these orders based on the best available prices.</p></li></ol><h3>Market Makers</h3><p>Market makers are crucial for providing liquidity to the exchange. They are entities that always have a position in the market and are willing to take the other side of trades. In India, attracting market makers poses significant challenges:</p><ol><li><p><strong>Liquidity Requirements</strong>: Liquidity refers to the ability of the market to absorb buy and sell orders without significantly affecting the market price. In India, market makers face high transaction costs due to regulatory requirements, which can be as high as 1% of each transaction.</p></li><li><p><strong>Market Maker Incentives</strong>: Market makers need to have substantial capital to maintain their positions on the order book. They must be incentivized to join the platform, which can be challenging due to high transaction costs.</p></li><li><p><strong>Order Book Management</strong>: The order book is a list of buy and sell orders that are publicly available, showing market depth. Market makers fill this order book by providing liquidity, ensuring that there are always buyers and sellers available for trades.</p></li></ol><h3>Architectural Components</h3><p>To build a robust CEX, several architectural components must be considered:</p><ol><li><p><strong>Trading Engine</strong>: The trading engine processes transactions, matches buy and sell orders, and calculates balances. It must ensure high performance and low latency for efficient trading.</p></li><li><p><strong>User Interface (UI)</strong>: The UI is critical for user experience, providing easy navigation and access to essential information like market charts, order books, and trading history.</p></li><li><p><strong>Wallet Infrastructure</strong>: Users store their cryptocurrencies in custodial wallets controlled by the exchange. This setup allows for efficient trading but also poses risks if the exchange's security is compromised.</p></li><li><p><strong>Security Measures</strong>: Robust security measures such as two-factor authentication, encryption, and regular security audits are essential to protect user assets from hacking and other threats.</p></li></ol><h3>Example Scenario</h3><p>Let's consider an example scenario on a centralized exchange like Vazir X:</p><ul><li><p><strong>User Action</strong>: A user deposits 20,000 INR into their INR wallet on the platform.</p></li><li><p><strong>Order Placement</strong>: The user places an order to buy 0.001 Ethereum (ETH) at the best available price.</p></li><li><p><strong>Order Matching</strong>: The order is matched with an existing sell order in the order book, resulting in the user buying 0.0017 ETH for 5.56 USDT.</p></li><li><p><strong>Portfolio Update</strong>: The user's portfolio is updated to reflect the new balance of ETH and USDT.</p></li></ul><h3>Challenges in India</h3><p>In India, there are specific regulations that affect how CEXs operate:</p><ul><li><p><strong>Regulatory Compliance</strong>: Users can only deposit INR and must withdraw it back to their bank accounts. This regulation restricts the ability to hold cryptocurrencies outside the exchange ecosystem.</p></li><li><p><strong>Liquidity Challenges</strong>: High transaction costs due to regulatory requirements make it challenging for market makers to provide liquidity, leading to higher spreads in the order book.</p></li></ul><h3>Conclusion</h3><p>Building a centralized exchange in India requires careful consideration of both end users and market makers. Ensuring sufficient liquidity through market makers is crucial for providing a smooth trading experience. The architectural components of a CEX must be designed with security and user experience in mind, addressing the unique challenges posed by Indian regulations.</p><p>For a deeper dive into the technical aspects of building such systems, it is recommended to explore detailed guides and videos that cover topics like deposit addresses, sweeping wallets, and primary wallets that are critical for maintaining security in centralized exchanges.</p><div><hr></div><h1>Understanding the Hacking of FTX and Centralized Exchanges</h1><p>Centralized cryptocurrency exchanges (CEXs) have been a cornerstone of the digital asset market, providing users with a platform to buy, sell, and trade various cryptocurrencies. However, these exchanges are not immune to security breaches, as exemplified by the high-profile hack of FTX. In this section, we will delve into the specifics of how FTX was hacked and explore the broader implications for centralized exchanges.</p><h3>How Exchanges Get Hacked</h3><p>Centralized exchanges hold users' assets in their primary wallets. If these wallets are compromised, the exchange is vulnerable to hacking. The scenario can be likened to a real estate platform where users do not directly own the land but rather see a representation of ownership on their dashboard. If the company managing the land's assets is hacked, the users' assets are at risk (Section 4 of the transcript).</p><h3>The FTX Hack</h3><p>FTX's primary wallet was compromised, leading to a significant loss of assets. The hack involved a multisig wallet, which is designed to require multiple signatures for transactions. However, in FTX's case, all four signers were using a central website to sign messages, which was hacked by an attacker (Section 4 of the transcript). This central attack vector allowed the hacker to manipulate the system and steal funds.</p><h3>Preventing Hacks in Centralized Exchanges</h3><p>To prevent such attacks, exchanges can implement more secure practices. One approach is to run code locally rather than relying on internet-facing websites. This method ensures that the code is under constant review and cannot be manipulated by external actors (Section 4 of the transcript). Additionally, using decentralized architectures with multiple data centers and automated signers can significantly reduce the risk of hacking. Each signer should have access to different cloud providers, making it difficult for a single entity to compromise all systems (Section 4 of the transcript).</p><h3>Multisig Wallets</h3><p>Multisig wallets are designed to provide an additional layer of security by requiring multiple signatures for transactions. This approach is useful for resiliency, as it ensures that even if one signer's private key is compromised, the funds cannot be accessed without the cooperation of other signers (Section 4 of the transcript). However, as seen in FTX's case, if all signers are compromised through a central attack vector, the security benefits of multisig wallets are negated.</p><h3>Decentralized Exchanges (DEXs)</h3><p>Decentralized exchanges offer an alternative to centralized exchanges by providing liquidity through automated market makers or other decentralized mechanisms. This approach avoids the need for market makers to physically interact with the exchange, reducing the risk of central points of attack (Section 4 of the transcript). DEXs are particularly useful in regions like India where market makers may be deterred by high transaction taxes (TDS).</p><h3>Market Makers</h3><p>Market makers play a crucial role in maintaining liquidity on centralized exchanges. They provide incentives such as trading rewards or exclusive benefits to traders who actively participate in the market. However, in India, high TDS rates discourage market makers from participating, leading to liquidity issues (Section 4 of the transcript).</p><h3>India-Specific Challenges</h3><p>Building a centralized cryptocurrency exchange in India comes with unique challenges:</p><ol><li><p><strong>Taxes</strong>: India imposes a 1% TDS on every trade, which significantly discourages active trading and attracts market makers (Section 4 of the transcript).</p></li><li><p><strong>Withdrawals</strong>: Retail users cannot withdraw cryptocurrencies from exchanges like CoinDCX, which restricts their ability to own and manage their digital assets (Section 4 of the transcript).</p></li><li><p><strong>Licensing</strong>: Exchanges must obtain an FIU license to connect with banks and facilitate user transactions (Section 4 of the transcript).</p></li><li><p><strong>Banking APIs</strong>: Access to banking APIs is restricted unless an exchange has a valid license, further limiting user transactions (Section 4 of the transcript).</p></li></ol><h3>Architecture of Our Exchange</h3><p>Our exchange will adopt a mildly decentralized architecture to address these challenges:</p><ol><li><p><strong>Liquidity</strong>: By using decentralized mechanisms, we aim to avoid the chicken-and-egg problem of attracting market makers.</p></li><li><p><strong>Security</strong>: This architecture ensures that users' assets are not solely held in a central wallet, reducing the risk of hacking.</p></li><li><p><strong>Proof of Reserves</strong>: Users can easily verify that their assets are owned by the exchange through on-chain proof of reserves.</p></li></ol><p>This approach balances the need for security with the practical challenges of operating in a highly regulated environment like India.</p><h3>Conclusion</h3><p>The hacking of FTX highlights the vulnerabilities of centralized exchanges and underscores the importance of robust security measures. By understanding these vulnerabilities and implementing decentralized architectures, we can build more secure and resilient platforms for cryptocurrency trading. The unique challenges faced by exchanges in India, such as high TDS rates and restrictive withdrawal policies, necessitate innovative solutions that balance security with regulatory compliance.</p><h3>Additional Resources</h3><p>For a deeper understanding of these concepts, refer to our previous sections on multisig wallets, decentralized exchanges, and market makers. Additionally, our video series on building a cryptocurrency exchange provides detailed explanations of these topics.</p><div><hr></div><p>This section provides a comprehensive overview of how centralized exchanges can be hacked, the specific case of FTX's hack, and the broader implications for security measures in cryptocurrency trading. It also addresses India-specific challenges and outlines our approach to building a mildly decentralized exchange that balances security with regulatory compliance.</p><h1>Architecture of a Decentralized Exchange vs. Centralized Exchange</h1><p>In the realm of cryptocurrency trading, the architecture of an exchange is crucial for ensuring a smooth user experience, maintaining the integrity of the trading process, and safeguarding the assets of both traders and the exchange itself. This section delves into the differences between a centralized exchange and a decentralized exchange, focusing on the approach of a normal exchange versus a "wallet as a service" model.</p><h3>Normal Centralized Exchange</h3><p>A traditional centralized exchange (CEX) operates by aggregating all user funds into a single wallet. For instance, if an exchange like CoinDCX has 1,000 users, all their funds are held in a single wallet. This approach raises significant security concerns because it centralizes the storage of vast amounts of cryptocurrency, making it a prime target for hackers. Moreover, proving reserves becomes challenging as users cannot verify on-chain that their funds are securely held. Instead, exchanges often provide proof of reserves, which may not be entirely transparent or reliable.</p><h3>Wallet as a Service (WaaS)</h3><p>In contrast, a "wallet as a service" model, as described in the transcript, diverges from the traditional centralized exchange architecture. Instead of holding all user funds in a single wallet, this approach creates individual wallets for each user. This means that every user's funds are securely stored in their own wallet, which can be verified on-chain. For example, if a user has $10,000 in their wallet, they can prove this by checking their public address on the blockchain. This approach eliminates the trust problem associated with centralized exchanges, where users are uncertain about where their funds are being held.</p><h3>Key Differences</h3><ol><li><p><strong>Security and Trust:</strong></p><ul><li><p><strong>Centralized Exchange:</strong> Centralized exchanges hold all user funds in a single wallet, making them vulnerable to hacks and compromising user trust.</p></li><li><p><strong>Wallet as a Service:</strong> Each user has their own wallet, ensuring that funds are distributed across millions of wallets rather than being aggregated in one central location. This significantly enhances security and transparency.</p></li></ul></li><li><p><strong>Proof of Reserves:</strong></p><ul><li><p><strong>Centralized Exchange:</strong> Proving reserves is complex because it involves verifying the existence of funds in a single wallet.</p></li><li><p><strong>Wallet as a Service:</strong> Since each user has their own wallet, proof of reserves becomes straightforward as users can verify their funds directly on-chain.</p></li></ul></li><li><p><strong>Liquidity Sourcing:</strong></p><ul><li><p><strong>Centralized Exchange:</strong> Finding market makers to provide liquidity is challenging, especially in regions with stringent regulations like India.</p></li><li><p><strong>Wallet as a Service:</strong> By sourcing liquidity from decentralized exchanges (DEXs), the need for market makers is mitigated. DEXs like Jupiter on Solana allow users to swap assets seamlessly without relying on centralized market makers.</p></li></ul></li><li><p><strong>User Experience and Functionality:</strong></p><ul><li><p><strong>Centralized Exchange:</strong> Exchanges offer fast trading due to their centralized systems but may charge higher trading fees.</p></li><li><p><strong>Wallet as a Service:</strong> While transactions are slower due to on-chain verification and associated gas fees, this approach provides a more transparent and secure user experience.</p></li></ul></li><li><p><strong>Regulatory Compliance:</strong></p><ul><li><p><strong>Centralized Exchange:</strong> Centralized exchanges typically require KYC (Know Your Customer) and AML (Anti-Money Laundering) compliance for both users and market makers.</p></li><li><p><strong>Wallet as a Service:</strong> Since market makers on DEXs do not need to undergo KYC, regulatory compliance becomes more complex. However, this approach aligns with the decentralized nature of blockchain technology.</p></li></ul></li></ol><h3>Conclusion</h3><p>The choice between a centralized exchange and a "wallet as a service" model hinges on security, trust, and regulatory considerations. While centralized exchanges offer fast trading with robust security measures, they centralize user funds, making them vulnerable to hacks. In contrast, a "wallet as a service" model distributes user funds across individual wallets, enhancing security and transparency. However, this approach comes with its own set of challenges, including slower transaction times and regulatory complexities. Understanding these differences is crucial for building a secure and reliable cryptocurrency trading platform.</p><h3>Additional Considerations</h3><ol><li><p><strong>Government Regulations:</strong></p><ul><li><p>The government's stance on decentralized exchanges can be challenging due to the lack of KYC for market makers. This could lead to regulatory issues if the source of liquidity is not transparent.</p></li></ul></li><li><p><strong>User Education:</strong></p><ul><li><p>Users need to understand the differences between centralized and decentralized exchanges to make informed decisions about their cryptocurrency holdings.</p></li></ul></li><li><p><strong>Technical Implementation:</strong></p><ul><li><p>Implementing a "wallet as a service" model requires robust technical infrastructure, including secure wallet creation and management systems.</p></li></ul></li><li><p><strong>User Experience Optimization:</strong></p><ul><li><p>Balancing security with user experience is essential. Providing intuitive interfaces for users to manage their wallets and trade cryptocurrencies seamlessly is crucial for adoption.</p></li></ul></li></ol><p>By understanding these architectural differences, developers can design cryptocurrency trading platforms that prioritize both security and user experience, ultimately enhancing the overall integrity of the digital asset ecosystem.</p><h1>Building a Decentralized Exchange</h1><p>Creating a decentralized exchange (DEX) involves several complex steps, from setting up the front-end and back-end infrastructure to integrating wallet services and handling user authentication. In this section, we will delve into the detailed process of building a DEX, focusing on the key aspects such as wallet as a service, user authentication, and database management.</p><h3>Wallet as a Service</h3><p>One of the critical components of our DEX is the wallet as a service approach. This method involves creating a wallet for users without them having to manage their private keys directly. Instead, the service manages the private keys on behalf of the users, providing a secure and user-friendly experience.</p><p><strong>Wallet Address</strong>: The wallet address is the public key of the user's wallet, which is held by the service provider (e.g., Tiplink). This address can be used to verify the user's balance on any blockchain explorer.</p><p><strong>Example</strong>: If a user signs up on our platform, they will receive a wallet address that they can use to view their balance on a blockchain explorer like Solscan. For instance, if the user has $1.46 in their wallet, this information will be visible on Solscan.</p><p><strong>Benefits</strong>:</p><ol><li><p><strong>Safety</strong>: By not allowing users to own their private keys, we ensure that their funds are safer from unauthorized access.</p></li><li><p><strong>Regulatory Compliance</strong>: In India, exchanges are required to hold user funds rather than allowing users to own their private keys. Our wallet as a service approach complies with these regulations.</p></li><li><p><strong>Ease of Withdrawal</strong>: If the Indian government allows withdrawals from centralized exchanges in the future, users can easily withdraw their funds by receiving their private keys from the service provider.</p></li></ol><h3>Architecture Overview</h3><p>To build our DEX, we will follow a two-part approach: easy implementation and hard implementation.</p><p><strong>Easy Implementation</strong>:</p><ol><li><p><strong>Front-end Setup</strong>: Create a simple sign-up and sign-in page using Next.js.</p></li><li><p><strong>Database Schema</strong>: Define a user model with email, name, and wallet details (public key, private key).</p></li><li><p><strong>Wallet Generation</strong>: Generate a Solana wallet for each user and store its details in the database.</p></li></ol><p><strong>Hard Implementation</strong>:</p><ol><li><p><strong>Market Makers</strong>: Integrate market makers to provide liquidity for INR-USDT conversions.</p></li><li><p><strong>Spot Trading</strong>: Allow users to swap Solana for Ethereum or USDT for Solana.</p></li><li><p><strong>Security Measures</strong>: Implement robust security measures to prevent attacks and ensure the integrity of user funds.</p></li></ol><h1>Hands On Coding</h1><h2>1] Creating a basic NextJS app with NextAuth</h2><p>To set up the front-end, we will use Next.js as our framework. Here&#8217;s how we can create a basic sign-up and sign-in logic:</p><h3>1. <code>app/api/auth/[...nextauth]/route.ts</code></h3><p>This file is responsible for setting up authentication using NextAuth, a library that simplifies the process of adding authentication to Next.js applications.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import { authConfig } from "@/app/lib/auth";
import NextAuth from "next-auth";

const handler = NextAuth(authConfig);

export { handler as GET, handler as POST };

console.log({
    clientId: process.env.GOOGLE_CLIENT_ID ?? "",
    clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? ""
});
</code></code></pre><ul><li><p><strong>Imports</strong>: The file imports <code>authConfig</code> from a local module and the <code>NextAuth</code> function from the <code>next-auth</code> package.</p></li><li><p><strong>Handler Setup</strong>: The <code>handler</code> variable is created by calling <code>NextAuth(authConfig)</code>, which initializes the authentication process with the provided configuration.</p></li><li><p><strong>Exporting Handlers</strong>: The handler is exported as both <code>GET</code> and <code>POST</code>, allowing it to respond to both types of HTTP requests. This is essential for handling sign-in and sign-out actions.</p></li><li><p><strong>Logging Credentials</strong>: The <code>console.log</code> statement outputs the Google client ID and secret to the console. This is useful for debugging but should be removed or secured in a production environment to avoid exposing sensitive information.</p></li></ul><div><hr></div><h3>2. <code>app/components/Appbar.tsx</code></h3><p>This component represents the application's navigation bar, providing users with options to sign in or sign out based on their authentication status.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>"use client";
import { signIn, signOut, useSession } from "next-auth/react";
import { PrimaryButton } from "./Button";

export const Appbar = () =&gt; {
    const session = useSession();
    return (
        &lt;div className="border-b px-2 py-2 flex justify-between"&gt;
            &lt;div className="text-xl font-bold flex flex-col justify-center"&gt;
                DCEX
            &lt;/div&gt;
            &lt;div&gt;
                {session.data?.user ? (
                    &lt;PrimaryButton onClick={() =&gt; {
                        signOut();
                    }}&gt;Logout&lt;/PrimaryButton&gt;
                ) : (
                    &lt;PrimaryButton onClick={() =&gt; {
                        signIn();
                    }}&gt;Signin&lt;/PrimaryButton&gt;
                )}
            &lt;/div&gt;
        &lt;/div&gt;
    );
};
</code></code></pre><ul><li><p><strong>Client Component</strong>: The <code>"use client"</code> directive indicates that this component should be rendered on the client side.</p></li><li><p><strong>Session Management</strong>: The <code>useSession</code> hook retrieves the current user's session data, which includes information about whether the user is logged in.</p></li><li><p><strong>Conditional Rendering</strong>: The component conditionally renders either a "Logout" button or a "Signin" button based on whether a user is authenticated (<code>session.data?.user</code>).</p></li><li><p><strong>Styling</strong>: The component uses Tailwind CSS classes for styling, ensuring a responsive and visually appealing layout.</p></li></ul><div><hr></div><h3>3. <code>app/layout.tsx</code></h3><p>This file defines the root layout of the application, which wraps all pages and components within a consistent structure.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import { Appbar } from "./components/Appbar";
import { Providers } from "./providers";

const inter = Inter({ subsets: ["latin"] });

export const metadata: Metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({
  children,
}: Readonly&lt;{
  children: React.ReactNode;
}&gt;) {
  return (
    &lt;html lang="en"&gt;
      &lt;body className={inter.className}&gt;
        &lt;Providers&gt;
          &lt;Appbar /&gt;
          {children}
        &lt;/Providers&gt;
      &lt;/body&gt;
    &lt;/html&gt;
  );
}
</code></code></pre><ul><li><p><strong>Metadata Definition</strong>: The <code>metadata</code> object contains information about the page's title and description, which can be used for SEO purposes.</p></li><li><p><strong>Font Import</strong>: The Inter font is imported for use throughout the application, ensuring consistent typography.</p></li><li><p><strong>Root Layout Structure</strong>: The <code>RootLayout</code> function defines the main HTML structure. It wraps children components with <code>&lt;html&gt;</code> and <code>&lt;body&gt;</code> tags.</p></li><li><p><strong>Providers Component</strong>: The <code>Providers</code> component wraps around child components to provide context (like authentication state) across the application.</p></li></ul><div><hr></div><h3>4. <code>app/page.tsx</code></h3><p>This file represents the main page of the application, rendering the hero section prominently.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import Image from "next/image";
import { Hero } from "./components/Hero";

export default function Home() {
  return (
    &lt;main className="flex min-h-screen flex-col items-center justify-between p-24"&gt;
      &lt;Hero /&gt;
    &lt;/main&gt;
  );
}
</code></code></pre><ul><li><p><strong>Image Import</strong>: The <code>Image</code> component from Next.js is imported for optimized image handling (though it's not used directly in this snippet).</p></li><li><p><strong>Hero Component</strong>: The main content of this page consists of rendering a <code>&lt;Hero /&gt;</code> component, which likely contains introductory content or promotional material.</p></li><li><p><strong>Styling</strong>: The <code>&lt;main&gt;</code> element uses Tailwind CSS classes to ensure it takes up at least the full height of the screen and centers its content both vertically and horizontally.</p></li></ul><div><hr></div><h3>5. <code>app/providers.tsx</code></h3><p>This file sets up context providers necessary for managing session state across the application.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>'use client';

import { SessionProvider } from "next-auth/react";

export const Providers = ({ children }: { children: React.ReactNode; }) =&gt; {
    return (
        &lt;SessionProvider&gt;
            {children}
        &lt;/SessionProvider&gt;
    );
};
</code></code></pre><ul><li><p><strong>Client Component Directive</strong>: Similar to other files, <code>"use client"</code> indicates that this component should run on the client side.</p></li><li><p><strong>Session Provider Setup</strong>: The <code>SessionProvider</code> wraps its children with context that provides session data throughout the app. This allows any component within this provider to access user session information easily.</p></li></ul><div><hr></div><h3>Conclusion</h3><p>These files collectively establish a foundational structure for a Next.js application that integrates authentication using NextAuth. Each component plays a critical role in managing user sessions, rendering UI elements, and maintaining an organized layout, all while adhering to best practices in modern web development.</p><h2>2] Building the Landing Page</h2><h3>1. <code>app/components/Button.tsx</code></h3><p>This file defines three button components: <code>PrimaryButton</code>, <code>SecondaryButton</code>, and <code>TabButton</code>. Each component is designed to handle user interactions while providing a consistent styling approach.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>"use client";

export const PrimaryButton = ({children, onClick}: {
    children: React.ReactNode,
    onClick: () =&gt; void
}) =&gt; {
    return (
        &lt;button onClick={onClick} type="button" className="text-white bg-gray-800 hover:bg-gray-900 focus:outline-none focus:ring-4 focus:ring-gray-300 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2"&gt;
            {children}
        &lt;/button&gt;
    );
};
</code></code></pre><ul><li><p><strong>PrimaryButton</strong>: This component renders a button styled with Tailwind CSS classes. It accepts <code>children</code> (the button label) and an <code>onClick</code> function as props. The button's appearance changes on hover and focus, enhancing user experience.</p></li></ul><pre><code><code>export const SecondaryButton = ({children, onClick, prefix}: {
    children: React.ReactNode,
    onClick: () =&gt; void,
    prefix?: React.ReactNode
}) =&gt; {
    return (
        &lt;button onClick={onClick} type="button" className="text-white bg-blue-500 hover:bg-gray-900 focus:outline-none focus:ring-4 focus:ring-gray-300 font-medium rounded-lg text-sm px-6 py-3 me-2 mb-2 flex"&gt;
            &lt;div&gt;
                {prefix}
            &lt;/div&gt;
            &lt;div&gt;
                {children}
            &lt;/div&gt;
        &lt;/button&gt;
    );
};
</code></code></pre><ul><li><p><strong>SecondaryButton</strong>: Similar to the <code>PrimaryButton</code>, this component includes an optional <code>prefix</code> prop that allows for additional content (like an icon) to be displayed alongside the button label. It also uses Tailwind CSS for styling and has hover effects.</p></li></ul><pre><code><code>export const TabButton = ({active, children, onClick}: {
    active: boolean;
    children: React.ReactNode,
    onClick: () =&gt; void
}) =&gt; {
    return (
        &lt;button type="button" className={`w-full text-white hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 ${active ? "bg-blue-500" : "bg-blue-300"}`} onClick={onClick}&gt;
            {children}
        &lt;/button&gt;
    );
};
</code></code></pre><ul><li><p><strong>TabButton</strong>: This component is designed for tab navigation. It accepts an <code>active</code> prop to determine its styling based on whether it is currently selected. The button's background color changes according to its active state, providing visual feedback to users.</p></li></ul><div><hr></div><h3>2. <code>app/components/Hero.tsx</code></h3><p>The <code>Hero</code> component serves as a prominent introductory section of the application, displaying key messages and actions for users.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>"use client";

import { signIn, useSession } from "next-auth/react";
import { SecondaryButton } from "./Button";
import { useRouter } from "next/navigation";

export const Hero = () =&gt; {
    const session = useSession();
    const router = useRouter();

    return (
        &lt;div&gt;
            &lt;div className="text-6xl font-medium"&gt;
                &lt;span&gt;The Indian Cryptocurrency&lt;/span&gt;
                &lt;span className="text-blue-500 pl-4"&gt;Revolution&lt;/span&gt;
            &lt;/div&gt;
            &lt;div className="flex justify-center pt-4 text-2xl text-slate-500"&gt;
                Create a frictionless wallet from India with just a Google Account.
            &lt;/div&gt;
            &lt;div className="flex justify-center pt-2 text-2xl text-slate-500"&gt;
                Convert your INR into Cryptocurrency
            &lt;/div&gt;
            &lt;div className="pt-8 flex justify-center"&gt;
                {session.data?.user ? (
                    &lt;SecondaryButton onClick={() =&gt; {
                        router.push("/dashboard");
                    }}&gt;Go to Dashboard&lt;/SecondaryButton&gt;
                ) : (
                    &lt;SecondaryButton onClick={() =&gt; {
                        signIn("google");
                    }}&gt;Login with Google&lt;/SecondaryButton&gt;
                )}
            &lt;/div&gt;
        &lt;/div&gt;
    );
};
</code></code></pre><ul><li><p><strong>Client Component Directive</strong>: The <code>"use client"</code> directive indicates that this component should be rendered client-side.</p></li><li><p><strong>Session Management</strong>: The <code>useSession</code> hook retrieves the current user's session data. If a user is logged in, they will see a "Go to Dashboard" button; otherwise, they will see a "Login with Google" button.</p></li><li><p><strong>Styling and Layout</strong>: The component uses Tailwind CSS classes for layout and typography. It features large headings and centered text to create an impactful visual presentation.</p></li></ul><div><hr></div><h3>Summary</h3><p>These two components (<code>Button.tsx</code> and <code>Hero.tsx</code>) play crucial roles in enhancing user interaction within the application:</p><ol><li><p><strong>Button Components</strong>:</p><ul><li><p>Provide reusable UI elements (<code>PrimaryButton</code>, <code>SecondaryButton</code>, and <code>TabButton</code>) with consistent styling and behavior.</p></li><li><p>Allow for different types of user actions (e.g., logging in, navigating tabs).</p></li></ul></li><li><p><strong>Hero Component</strong>:</p><ul><li><p>Acts as an engaging introduction to the application.</p></li><li><p>Guides users towards authentication or navigation based on their session state.</p></li></ul></li></ol><p>Together, they contribute to a cohesive user experience in the WazirX clone application by ensuring that buttons are easily accessible and visually appealing while providing clear calls to action.</p><h2>3] Schemas &amp; Database Management</h2><p>To manage user data and wallets, we will use Prisma as our ORM tool. Here&#8217;s how we can define our schema:</p><h3>1. <code>prisma/schema.prisma</code></h3><p>This file defines the database schema for the application using Prisma, an ORM (Object-Relational Mapping) tool that simplifies database interactions.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>// This is your Prisma schema file,
// learn more about it in the docs: &lt;https://pris.ly/d/prisma-schema&gt;

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: &lt;https://pris.ly/cli/accelerate-init&gt;

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}
</code></code></pre><ul><li><p><strong>Comments</strong>: The initial comments provide context and links to documentation, guiding developers on how to use the schema file effectively.</p></li><li><p><strong>Generator</strong>: The <code>generator client</code> block specifies that Prisma should generate a client library using the JavaScript client (<code>prisma-client-js</code>). This client is used in the application to interact with the database.</p></li><li><p><strong>Datasource</strong>: The <code>datasource db</code> block defines the database connection. It specifies that PostgreSQL is the database provider and retrieves the connection URL from an environment variable (<code>DATABASE_URL</code>).</p></li></ul><p><strong>Model Definitions:</strong></p><pre><code><code>model User {
  id              String    @id  @default(uuid())
  username        String
  sub             String    @default("")
  name            String?
  profilePicture  String?
  password        String?
  solWalletId     String?
  solWallet       SolWallet?
  inrWalletId     String?
  inrWallet       InrWalet?
  provider        Provider
}
</code></code></pre><ul><li><p><strong>User Model</strong>: This model represents a user in the application. It includes fields for user identification (<code>id</code>, <code>username</code>, <code>sub</code>), optional fields for user details (<code>name</code>, <code>profilePicture</code>, <code>password</code>), and relationships to wallet models (<code>solWallet</code>, <code>inrWallet</code>). The <code>@id</code> directive marks <code>id</code> as the primary key, and <code>@default(uuid())</code> automatically generates a unique identifier.</p></li></ul><pre><code><code>model InrWalet {
  id          String    @id  @default(uuid())
  balance     Int
  userId      String   @unique
  user        User     @relation(fields: [userId], references: [id])
}
</code></code></pre><ul><li><p><strong>InrWalet Model</strong>: Represents an INR wallet associated with a user. It includes a balance field and establishes a one-to-one relationship with the <code>User</code> model, ensuring that each wallet is linked to a unique user.</p></li></ul><pre><code><code>model SolWallet {
  id          String   @id  @default(uuid())
  publicKey   String
  privateKey  String
  userId      String   @unique
  user        User     @relation(fields: [userId], references: [id])
}
</code></code></pre><ul><li><p><strong>SolWallet Model</strong>: Represents a Solana wallet linked to a user. It includes fields for public and private keys, along with a relationship to the <code>User</code> model.</p></li></ul><pre><code><code>enum Provider {
  Google
}
</code></code></pre><ul><li><p><strong>Provider Enum</strong>: Defines an enumeration for authentication providers. In this case, it includes only Google, which indicates that users can log in using their Google accounts.</p></li></ul><div><hr></div><h3>2. <code>app/db/index.ts</code></h3><p>This file initializes and exports a singleton instance of the Prisma Client, ensuring that only one instance is used throughout the application.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import { PrismaClient } from '@prisma/client';

const prismaClientSingleton = () =&gt; {
  return new PrismaClient();
};

type PrismaClientSingleton = ReturnType&lt;typeof prismaClientSingleton&gt;;

// eslint-disable-next-line
const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClientSingleton | undefined;
};

const prisma = globalForPrisma.prisma ?? prismaClientSingleton();

export default prisma;

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
</code></code></pre><ul><li><p><strong>Imports</strong>: The file imports <code>PrismaClient</code> from the Prisma package, which is essential for database operations.</p></li><li><p><strong>Singleton Function</strong>: The <code>prismaClientSingleton</code> function creates a new instance of <code>PrismaClient</code>. This pattern helps manage database connections efficiently.</p></li><li><p><strong>Type Definition</strong>: The type alias <code>PrismaClientSingleton</code> defines the return type of the singleton function, ensuring type safety.</p></li><li><p><strong>Global Variable Setup</strong>: The code creates a global variable (<code>globalForPrisma</code>) to hold the singleton instance of Prisma Client. This approach helps avoid multiple instances in environments like serverless functions where multiple invocations can occur.</p></li><li><p><strong>Instance Creation</strong>: The line <code>const prisma = globalForPrisma.prisma ?? prismaClientSingleton();</code> checks if an instance already exists; if not, it creates one. This ensures that only one instance of Prisma Client is used throughout the application lifecycle.</p></li><li><p><strong>Exporting Prisma Instance</strong>: The final line exports the singleton instance of Prisma Client for use in other parts of the application.</p></li><li><p><strong>Environment Check</strong>: The conditional statement at the end ensures that in non-production environments (like development), the global variable is set to hold the created instance. This prevents issues related to hot reloading during development.</p></li></ul><div><hr></div><h3>Summary</h3><p>The files collectively establish a robust data management layer for the WazirX clone application:</p><ol><li><p><strong>Schema Definition (</strong><code>schema.prisma</code><strong>)</strong>:</p><ul><li><p>Defines models for users and wallets, establishing relationships and constraints.</p></li><li><p>Utilizes enums for managing authentication providers.</p></li><li><p>Facilitates easy interaction with PostgreSQL through generated client code.</p></li></ul></li><li><p><strong>Database Client Initialization (</strong><code>index.ts</code><strong>)</strong>:</p><ul><li><p>Implements a singleton pattern for managing database connections efficiently.</p></li><li><p>Ensures only one instance of Prisma Client is used across different parts of the application.</p></li><li><p>Provides type safety and handles environment-specific configurations seamlessly.</p></li></ul></li></ol><p>Together, these components lay down a solid foundation for managing user data and interactions within the application while adhering to best practices in software development.</p><h2>4] Building the Dashboard Page</h2><p>The dashboard component will display the user's name, profile picture, and asset balances.</p><h3>1. <code>app/dashboard/page.tsx</code></h3><p>This file represents the dashboard page of the application, where users can view their wallet information and interact with various features related to their cryptocurrency holdings.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import { getServerSession } from "next-auth";
import { ProfileCard } from "../components/ProfileCard";
import db from "@/app/db";
import { authConfig } from "../lib/auth";

async function getUserWallet() {
    const session = await getServerSession(authConfig);

    const userWallet = await db.solWallet.findFirst({
        where: {
            userId: session?.user?.uid
        },
        select: {
            publicKey: true
        }
    });

    if (!userWallet) {
        return {
            error: "No Solana wallet found associated to the user"
        };
    }

    return { error: null, userWallet };
}

export default async function Dashboard() {
    const userWallet = await getUserWallet();

    if (userWallet.error || !userWallet.userWallet?.publicKey) {
        return &lt;&gt;No Solana wallet found&lt;/&gt;;
    }

    return (
        &lt;div&gt;
            &lt;ProfileCard publicKey={userWallet.userWallet?.publicKey} /&gt;
        &lt;/div&gt;
    );
}
</code></code></pre><ul><li><p><strong>Imports</strong>: The file imports necessary functions and components, including <code>getServerSession</code> for session management, <code>ProfileCard</code> for displaying user wallet information, and the database instance (<code>db</code>) for querying.</p></li><li><p><strong>getUserWallet Function</strong>: This asynchronous function retrieves the user's Solana wallet based on their session. It checks if a session exists and queries the database for the user's wallet using their unique identifier (<code>uid</code>). If no wallet is found, it returns an error message.</p></li><li><p><strong>Dashboard Component</strong>: The main component that renders the dashboard. It calls <code>getUserWallet</code> to fetch the user's wallet information. If an error occurs or if no public key is found, it displays a message indicating that no wallet exists. Otherwise, it renders the <code>ProfileCard</code> component, passing the public key as a prop.</p></li></ul><div><hr></div><h3>2. <code>app/components/ProfileCard.tsx</code></h3><p>This component displays the user's profile information and allows interaction with various features related to their cryptocurrency holdings.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>"use client";

import { useSession } from "next-auth/react";
import { useRouter } from "next/navigation";
import { PrimaryButton, TabButton } from "./Button";
import { useEffect, useState } from "react";
import { TokenWithbalance, useTokens } from "../api/hooks/useTokens";
import { TokenList } from "./TokenList";
import { Swap } from "./Swap";

type Tab = "tokens" | "send" | "add_funds" | "swap" | "withdraw";
const tabs: { id: Tab; name: string }[] = [
    { id: "tokens", name: "Tokens" },
    { id: "send", name: "Send" },
    { id: "add_funds", name: "Add funds" },
    { id: "withdraw", name: "Withdraw" },
    { id: "swap", name: "Swap" },
];

export const ProfileCard = ({ publicKey }: { publicKey: string }) =&gt; {
    const session = useSession();
    const router = useRouter();
    const [selectedTab, setSelectedTab] = useState&lt;Tab&gt;("tokens");
    const { tokenBalances, loading } = useTokens(publicKey);

    if (session.status === "loading") {
        return &lt;div&gt;Loading...&lt;/div&gt;;
    }

    if (!session.data?.user) {
        router.push("/");
        return null;
    }

    return (
        &lt;div className="pt-8 flex justify-center"&gt;
            &lt;div className="max-w-4xl bg-white rounded shadow w-full"&gt;
                &lt;Greeting
                    image={session.data?.user?.image ?? ""}
                    name={session.data?.user?.name ?? ""}
                /&gt;
                &lt;div className="w-full flex px-10"&gt;
                    {tabs.map(tab =&gt; (
                        &lt;TabButton key={tab.id} active={tab.id === selectedTab} onClick={() =&gt; setSelectedTab(tab.id)}&gt;
                            {tab.name}
                        &lt;/TabButton&gt;
                    ))}
                &lt;/div&gt;

                &lt;div className={`${selectedTab === "tokens" ? "visible" : "hidden"}`}&gt;
                    &lt;Assets tokenBalances={tokenBalances} loading={loading} publicKey={publicKey} /&gt;
                &lt;/div&gt;
                &lt;div className={`${selectedTab === "swap" ? "visible" : "hidden"}`}&gt;
                    &lt;Swap tokenBalances={tokenBalances} publicKey={publicKey} /&gt;
                &lt;/div&gt;
                &lt;div className={`${(selectedTab !== "swap" &amp;&amp; selectedTab !== "tokens") ? "visible" : "hidden"}`}&gt;
                    &lt;Warning /&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    );
};

function Warning() {
    return (
        &lt;div className="bg-slate-50 py-32 px-10 flex justify-center"&gt;
            We don't yet support this feature
        &lt;/div&gt;
    );
}

function Assets({ publicKey, tokenBalances, loading }: {
    publicKey: string;
    tokenBalances: {
        totalBalance: number,
        tokens: TokenWithbalance[]
    } | null;
    loading: boolean;
}) {
    const [copied, setCopied] = useState(false);

    useEffect(() =&gt; {
        if (copied) {
            let timeout = setTimeout(() =&gt; setCopied(false), 3000);
            return () =&gt; clearTimeout(timeout);
        }
    }, [copied]);

    if (loading) {
        return "Loading...";
    }

    return (
        &lt;div className="text-slate-500"&gt;
            &lt;div className="mx-12 py-2"&gt;Account assets&lt;/div&gt;
            &lt;div className="flex justify-between mx-12"&gt;
                &lt;div className="flex"&gt;
                    &lt;div className="text-5xl font-bold text-black"&gt;${tokenBalances?.totalBalance}&lt;/div&gt;
                    &lt;div className="font-slate-500 font-bold text-3xl flex flex-col justify-end pb-0 pl-2"&gt;USD&lt;/div&gt;
                &lt;/div&gt;

                &lt;div&gt;
                    &lt;PrimaryButton onClick={() =&gt; {
                        navigator.clipboard.writeText(publicKey);
                        setCopied(true);
                    }}&gt;
                        {copied ? "Copied" : "Your wallet address"}
                    &lt;/PrimaryButton&gt;
                &lt;/div&gt;
            &lt;/div&gt;

            &lt;div className="pt-4 bg-slate-50 p-12 mt-4"&gt;
                &lt;TokenList tokens={tokenBalances?.tokens || []} /&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    );
}

function Greeting({ image, name }: { image: string; name: string }) {
    return (
        &lt;div className="flex p-12"&gt;
            &lt;img src={image} className="rounded-full w-16 h-16 mr-4" /&gt;
            &lt;div className="text-2xl font-semibold flex flex-col justify-center"&gt;
               Welcome back, {name}
            &lt;/div&gt;
        &lt;/div&gt;
    );
}
</code></code></pre><ul><li><p><strong>Client Component Directive</strong>: The <code>"use client"</code> directive indicates that this component is rendered on the client side.</p></li><li><p><strong>Imports</strong>: The component imports necessary hooks and components for managing user sessions and displaying information.</p></li><li><p><strong>Tabs Definition</strong>: It defines tab options for navigation within the profile card (e.g., Tokens, Send, Add Funds).</p></li><li><p><strong>ProfileCard Component</strong>:</p><ul><li><p>Uses <code>useSession</code> to manage authentication state.</p></li><li><p>Uses <code>useTokens</code> to fetch token balances based on the provided <code>publicKey</code>.</p></li><li><p>Displays a loading state while fetching session data.</p></li><li><p>If no user is logged in, it redirects to the home page.</p></li><li><p>Renders greeting information and dynamically displays content based on which tab is selected (Assets or Swap).</p></li></ul></li></ul><div><hr></div><h3>3. <code>app/components/TokenList.tsx</code></h3><p>This component displays a list of tokens held by the user along with their balances.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import { TokenWithbalance } from "../api/hooks/useTokens";

export function TokenList({ tokens }: { tokens: TokenWithbalance[] }) {
    return (
        &lt;div&gt;
            {tokens.map(t =&gt; (
                &lt;TokenRow key={t.name} token={t} /&gt;
            ))}
        &lt;/div&gt;
    );
}

function TokenRow({ token }: { token: TokenWithbalance }) {
    return (
        &lt;div className="flex justify-between"&gt;
            &lt;div className="flex"&gt;
                &lt;img src={token.image} className="h-10 w-10 rounded-full mr-2" /&gt;
                &lt;div&gt;
                    &lt;div className="font-bold"&gt;{token.name}&lt;/div&gt;
                    &lt;div className="font-slim"&gt;1 {token.name} = ~${token.price}&lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
            &lt;div&gt;
                &lt;div className="font-bold flex justify-end"&gt;{token.usdBalance}&lt;/div&gt;
                &lt;div className="font-slim flex justify-end"&gt;{token.balance}&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    );
}
</code></code></pre><ul><li><p><strong>TokenList Component</strong>:</p><ul><li><p>Accepts an array of tokens as props.</p></li><li><p>Maps over each token and renders a <code>TokenRow</code> for each one.</p></li></ul></li><li><p><strong>TokenRow Component</strong>:</p><ul><li><p>Displays individual token details including an image, name, price, USD balance, and actual balance.</p></li><li><p>Uses Tailwind CSS for styling to ensure a clean layout.</p></li></ul></li></ul><div><hr></div><h3>4. <code>app/lib/auth.ts</code></h3><p>This file configures authentication using NextAuth with Google as a provider.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import GoogleProvider from "next-auth/providers/google";
import db from "@/app/db";
import { Keypair } from "@solana/web3.js";

import { Session } from 'next-auth';

export interface session extends Session {
    user: {
      email: string;
      name: string;
      image: string;
      uid: string;
    };
}

export const authConfig = {
    secret: process.env.NEXTAUTH_SECRET || 'secr3t',
    providers: [
        GoogleProvider({
            clientId: process.env.GOOGLE_CLIENT_ID ?? "",
            clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? ""
        })
    ],
</code></code></pre><p>The configuration sets up Google as an authentication provider using credentials stored in environment variables. The custom session interface extends NextAuth's default session type to include additional properties like <code>uid</code>.</p><pre><code><code>callbacks: {
        session: ({ session, token }: any): session =&gt; {
            const newSession: session = session as session;
            if (newSession.user &amp;&amp; token.uid) {
              newSession.user.uid = token.uid ?? "";
            }
            return newSession!;
        },
</code></code></pre><p>The <code>session</code> callback modifies the session object to include the user's unique ID (<code>uid</code>) after successful authentication.</p><pre><code><code>async jwt({ token, account, profile }: any) {
            const user = await db.user.findFirst({
                where: {
                    sub: account?.providerAccountId ?? ""
                }
            });

            if (user) {
              token.uid = user.id;
            }

            return token;
},
</code></code></pre><p>The JWT callback retrieves a user record based on their provider account ID and attaches their UID to the JWT token.</p><pre><code><code>async signIn({ user, account, profile, email, credentials }: any) {
   // Sign-in logic...
}
</code></code></pre><p>The <code>signIn</code> callback handles new users by creating their records in the database if they do not already exist. It generates a new Solana wallet for them upon registration.</p><div><hr></div><h3>Summary</h3><p>These files work together to create a functional dashboard for users in the WazirX clone application:</p><ol><li><p><strong>Dashboard Page (</strong><code>page.tsx</code><strong>)</strong>:</p><ul><li><p>Retrieves user wallet information and displays it through the <code>ProfileCard</code>.</p></li><li><p>Handles server-side authentication to ensure users have valid sessions.</p></li></ul></li><li><p><strong>Profile Card Component (</strong><code>ProfileCard.tsx</code><strong>)</strong>:</p><ul><li><p>Displays user-specific information and allows navigation between different functionalities such as viewing tokens or swapping.</p></li><li><p>Manages state for selected tabs and fetches relevant data using hooks.</p></li></ul></li><li><p><strong>Token List Component (</strong><code>TokenList.tsx</code><strong>)</strong>:</p><ul><li><p>Renders a list of tokens along with their balances and prices.</p></li><li><p>Provides a structured view of assets held by the user.</p></li></ul></li><li><p><strong>Authentication Configuration (</strong><code>auth.ts</code><strong>)</strong>:</p><ul><li><p>Sets up Google authentication with NextAuth.</p></li><li><p>Manages sessions and JWTs to maintain secure access across the application.</p></li></ul></li></ol><p>Together, these components provide a seamless experience for users managing their cryptocurrency wallets while ensuring robust security through proper authentication mechanisms.</p><h2>5] Implementing the Swap Functionality</h2><h3>1. <code>app/components/Swap.tsx</code></h3><p>This file implements the token swapping functionality, allowing users to exchange one cryptocurrency for another. It utilizes various hooks and components to manage user input and display relevant information.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>"use client"
import { ReactNode, useEffect, useState } from "react"
import { SUPPORTED_TOKENS, TokenDetails } from "../lib/tokens"
import { TokenWithbalance } from "../api/hooks/useTokens";
import { PrimaryButton } from "./Button";
import axios from "axios";
</code></code></pre><ul><li><p><strong>Imports</strong>: The file imports necessary libraries and components, including React hooks, token details, and the <code>PrimaryButton</code> component for triggering swaps.</p></li></ul><pre><code><code>export function Swap({ publicKey, tokenBalances }: {
    publicKey: string;
    tokenBalances: {
        totalBalance: number,
        tokens: TokenWithbalance[]
    } | null;
}) {
    const [baseAsset, setBaseAsset] = useState(SUPPORTED_TOKENS[0])
    const [quoteAsset, setQuoteAsset] = useState(SUPPORTED_TOKENS[1])
    const [baseAmount, setBaseAmount] = useState&lt;string&gt;();
    const [quoteAmount, setQuoteAmount] = useState&lt;string&gt;();
    const [fetchingQuote, setFetchingQuote] = useState(false);
    const [quoteResponse, setQuoteResponse] = useState(null);
</code></code></pre><ul><li><p><strong>Component Definition</strong>: The <code>Swap</code> component accepts <code>publicKey</code> and <code>tokenBalances</code> as props. It initializes state variables for the base asset (the asset being sold), quote asset (the asset being bought), amounts for both assets, and flags for fetching quotes.</p></li></ul><pre><code><code>useEffect(() =&gt; {
    if (!baseAmount) {
        return;
    }
    setFetchingQuote(true);
    axios.get(`https://quote-api.jup.ag/v6/quote?inputMint=${baseAsset.mint}&amp;outputMint=${quoteAsset.mint}&amp;amount=${Number(baseAmount) * (10 ** baseAsset.decimals)}&amp;slippageBps=50`)
        .then(res =&gt; {
            setQuoteAmount((Number(res.data.outAmount) / Number(10 ** quoteAsset.decimals)).toString())
            setFetchingQuote(false);
            setQuoteResponse(res.data);
        })
}, [baseAsset, quoteAsset, baseAmount]);
</code></code></pre><ul><li><p><strong>Fetching Quotes</strong>: The <code>useEffect</code> hook triggers whenever the base asset or amount changes. It makes an API call to fetch a quote for the swap using the selected assets and amount. The response is processed to update the quote amount and store the quote response.</p></li></ul><pre><code><code>return &lt;div className="p-12 bg-slate-50"&gt;
    &lt;div className="text-2xl font-bold pb-4"&gt;
        Swap Tokens
    &lt;/div&gt;
</code></code></pre><ul><li><p><strong>Rendering</strong>: The component renders a title and a series of input rows for swapping tokens.</p></li></ul><pre><code><code>&lt;SwapInputRow
    amount={baseAmount}
    onAmountChange={(value: string) =&gt; {
        setBaseAmount(value);
    }}
    onSelect={(asset) =&gt; {
        setBaseAsset(asset)
    }}
    selectedToken={baseAsset}
    title={"You pay:"}
    topBorderEnabled={true}
    bottomBorderEnabled={false}
    subtitle={&lt;div className="text-slate-500 pt-1 text-sm pl-1 flex"&gt;
        &lt;div className="font-normal pr-1"&gt;
            Current Balance:
        &lt;/div&gt;
        &lt;div className="font-semibold"&gt;
            {tokenBalances?.tokens.find(x =&gt; x.name === baseAsset.name)?.balance} {baseAsset.name}
        &lt;/div&gt;
    &lt;/div&gt;}
/&gt;
</code></code></pre><ul><li><p><strong>Swap Input Row</strong>: The first <code>SwapInputRow</code> allows users to input the amount of the base asset they wish to swap. It displays the current balance of that asset as a subtitle.</p></li></ul><pre><code><code>&lt;div className="flex justify-center"&gt;
    &lt;div onClick={() =&gt; {
        let baseAssetTemp = baseAsset;
        setBaseAsset(quoteAsset);
        setQuoteAsset(baseAssetTemp);
    }} className="cursor-pointer rounded-full w-10 h-10 border absolute mt-[-20px] bg-white flex justify-center pt-2"&gt;
        &lt;SwapIcon /&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></code></pre><ul><li><p><strong>Swap Icon</strong>: A clickable icon allows users to switch between the base and quote assets.</p></li></ul><pre><code><code>&lt;SwapInputRow inputLoading={fetchingQuote} inputDisabled={true} amount={quoteAmount} onSelect={(asset) =&gt; {
    setQuoteAsset(asset)
 }} selectedToken={quoteAsset} title={"You receive"}  topBorderEnabled={false} bottomBorderEnabled={true} /&gt;
</code></code></pre><ul><li><p><strong>Receiving Input Row</strong>: The second <code>SwapInputRow</code> displays the amount of the quote asset that will be received after the swap. It is disabled while fetching quotes.</p></li></ul><pre><code><code>&lt;div className="flex justify-end pt-4"&gt;
    &lt;PrimaryButton onClick={async () =&gt; {
        // trigger swap
        try {
            const res = await axios.post("/api/swap", {
                quoteResponse
            })
            if (res.data.txnId) {
                alert("Swap done!");
            }
        } catch(e) {
            alert("Error while sending a txn")
        }
    }}&gt;Swap&lt;/PrimaryButton&gt;
&lt;/div&gt;
</code></code></pre><ul><li><p><strong>Swap Button</strong>: When clicked, this button triggers an API call to execute the swap using the previously fetched quote response. If successful, it alerts the user that the swap is complete.</p></li></ul><div><hr></div><h3>2. <code>app/api/swap/route.ts</code></h3><p>This file handles the backend logic for executing token swaps when a user initiates a swap request.</p><p><strong>Code Breakdown:</strong></p><pre><code><code>import { authConfig } from "@/app/lib/auth";
import { getServerSession } from "next-auth";
import { NextRequest, NextResponse } from "next/server";
import db from "@/app/db";
import { Connection, Keypair, VersionedTransaction } from "@solana/web3.js";

export async function POST(req: NextRequest) {
</code></code></pre><ul><li><p><strong>Imports</strong>: The file imports necessary modules for session management, database access, and Solana transaction handling.</p></li></ul><pre><code><code>const connection = new Connection("&lt;https://mainnet.helius-rpc.com/?api-key=5935eb6e-9c4e-4031-b4b6-f1290106d2d6&gt;");
const data: { quoteResponse: any } = await req.json();
const session = await getServerSession(authConfig);
</code></code></pre><ul><li><p><strong>Connection Setup</strong>: Establishes a connection to Solana's mainnet using Helius RPC. It also retrieves the request body containing the quote response and checks if the user session is valid.</p></li></ul><pre><code><code>if (!session?.user) {
    return NextResponse.json({
        message: "You are not logged in"
    }, {
        status: 401
    });
}
</code></code></pre><ul><li><p><strong>Session Validation</strong>: If no user session exists, it returns a 401 Unauthorized response.</p></li></ul><pre><code><code>const solWallet = await db.solWallet.findFirst({
    where: {
        userId: session.user.uid
    }
});
</code></code></pre><ul><li><p><strong>Wallet Retrieval</strong>: Queries the database for the user's associated Solana wallet based on their UID.</p></li></ul><pre><code><code>if (!solWallet) {
    return NextResponse.json({
        message: "Couldn't find associated Solana wallet"
    }, {
        status: 401
    });
}
</code></code></pre><ul><li><p><strong>Wallet Existence Check</strong>: If no wallet is found, it returns a 401 Unauthorized response.</p></li></ul><pre><code><code>const { swapTransaction } = await (
    await fetch('&lt;https://quote-api.jup.ag/v6/swap&gt;', {
      method: 'POST',
      headers: {
          'Content-Type': 'application/json'
      },
      body: JSON.stringify({
          quoteResponse: data.quoteResponse,
          userPublicKey: solWallet.publicKey,
          wrapAndUnwrapSol: true,
      })
  }).json();
</code></code></pre><ul><li><p><strong>Executing Swap Transaction</strong>: Sends a request to <a href="http://jup.ag/">Jup.ag</a>'s swap endpoint with necessary parameters including user public key and quote response. This initiates a swap transaction on behalf of the user.</p></li></ul><pre><code><code>const swapTransactionBuf = Buffer.from(swapTransaction, 'base64');
var transaction = VersionedTransaction.deserialize(swapTransactionBuf);
const privateKey = getPrivateKeyFromDb(solWallet.privateKey);
transaction.sign([privateKey]);
const latestBlockHash = await connection.getLatestBlockhash();
</code></code></pre><ul><li><p><strong>Transaction Preparation</strong>:</p><ul><li><p>Converts the base64 encoded transaction string into a buffer.</p></li><li><p>Deserializes it into a <code>VersionedTransaction</code>.</p></li><li><p>Retrieves the user's private key from the database and signs the transaction.</p></li><li><p>Gets the latest blockhash for transaction submission.</p></li></ul></li></ul><pre><code><code>const rawTransaction = transaction.serialize();
const txid = await connection.sendRawTransaction(rawTransaction, {
      skipPreflight: true,
      maxRetries: 2
});
await connection.confirmTransaction({
  blockhash: latestBlockHash.blockhash,
  lastValidBlockHeight: latestBlockHash.lastValidBlockHeight,
  signature: txid
});
</code></code></pre><ul><li><p><strong>Sending Transaction</strong>:</p><ul><li><p>Serializes the signed transaction.</p></li><li><p>Sends it to Solana's network while skipping preflight checks.</p></li><li><p>Confirms that it was successfully processed by checking its status.</p></li></ul></li></ul><pre><code><code>return NextResponse.json({
   txid
});
</code></code></pre><ul><li><p><strong>Response</strong>:</p><ul><li><p>Returns a JSON response containing the transaction ID upon successful completion of the swap.</p></li></ul></li></ul><div><hr></div><h3>Summary</h3><p>The files work together to implement a seamless token swapping feature in the WazirX clone application:</p><ol><li><p><strong>Swap Component (</strong><code>Swap.tsx</code><strong>)</strong>:</p><ul><li><p>Manages user inputs for selecting tokens and amounts.</p></li><li><p>Fetches quotes dynamically based on user input.</p></li><li><p>Executes swaps through an API call when users confirm their transactions.</p></li></ul></li><li><p><strong>API Route (</strong><code>route.ts</code><strong>)</strong>:</p><ul><li><p>Handles backend logic for executing swaps.</p></li><li><p>Validates user sessions and retrieves wallet information.</p></li><li><p>Interacts with external APIs to facilitate swaps on behalf of users.</p></li><li><p>Processes transactions securely on Solana's blockchain.</p></li></ul></li></ol><p>Together, these components provide a robust framework for enabling users to exchange cryptocurrencies efficiently while ensuring secure interactions with blockchain technology.</p><h2>Token Swaps on Solana</h2><p>Token swaps on Solana involve the exchange of one token for another using automated market makers (AMMs) like those provided by Jupiter or Raydium. This process is crucial for decentralized exchanges (DEXs) and other blockchain applications. In this section, we will delve into the technical details of implementing token swaps on Solana, covering key concepts, APIs, and best practices.</p><h3>Fetching Quotes and Preparing Swaps</h3><p>To initiate a token swap, the first step is to fetch the quote for the desired tokens. This involves sending a request to the DEX's API to determine the best possible swap rate. For example, using Jupiter's API, you can fetch a quote response that includes the amount of tokens you can receive for a given amount of another token.</p><pre><code><code>// Example request to fetch quote response
const quoteResponse = await axios.get('&lt;https://api.jup.ag/v6/swap&gt;', {
  params: {
    inToken: 'SOL',
    outToken: 'USDC',
    amount: 0.01,
    slippage: 50 // 50 basis points
  }
});
</code></code></pre><p>The response from the API will contain the necessary details for the swap, including the output amount and any relevant metadata. It is essential to handle decimals correctly as different tokens have varying decimal places (e.g., USDC has six decimals).</p><pre><code><code>// Handling decimals in the quote response
const outputAmount = quoteResponse.data.outAmount / Math.pow(10, quoteResponse.data.outToken.decimals);
</code></code></pre><h3>Implementing the Swap Function</h3><p>Once you have the quote response, you need to prepare and send the swap transaction. This involves creating a transaction using Solana's web3.js library and signing it with the user's private key.</p><ol><li><p><strong>Deserialize and Serialize Transactions:</strong></p><ul><li><p>The DEX API will return a raw transaction that needs to be deserialized into a versioned transaction.</p></li><li><p>You then serialize this versioned transaction to prepare it for signing.</p></li></ul></li></ol><pre><code><code>// Deserializing and serializing transactions
const swapTransactionBuffer = Buffer.from(swapTransactionBase64);
const versionedTransaction = deserializeVersionedTransaction(swapTransactionBuffer);
const serializedTransaction = serializeTransaction(versionedTransaction);
</code></code></pre><ol><li><p><strong>Signing Transactions:</strong></p><ul><li><p>To sign the transaction, you need to convert the private key from its stored format (e.g., comma-separated string) into a u8 array format required by Solana's web3.js.</p></li><li><p>Use the <code>fromSecretKey</code> function from Solana's web3.js to generate a key pair from the private key.</p></li></ul></li></ol><pre><code><code>// Converting private key to u8 array format
const privateKeyArray = privateKey.split(',').map(Number);
const keyPair = Keypair.fromSecretKey(privateKeyArray);

// Signing the transaction
const signedTransaction = await signTransaction(serializedTransaction, keyPair);
</code></code></pre><ol><li><p><strong>Sending Transactions:</strong></p><ul><li><p>After signing, send the transaction to the Solana blockchain using a connection object.</p></li><li><p>Wait for the transaction to confirm and return its ID to the user.</p></li></ul></li></ol><pre><code><code>// Sending transactions
const connection = new Connection('&lt;https://api.mainnet-beta.solana.com&gt;');
await connection.sendRawTransaction(signedTransaction.serialize());
const transactionId = await connection.confirmTransaction(signedTransaction.id);
return transactionId;
</code></code></pre><h3>Handling Errors and Improving UX</h3><p>Token swaps on decentralized exchanges can be slow and prone to errors due to factors like high gas fees or network congestion. To improve user experience:</p><ol><li><p><strong>Debounce Requests:</strong> Implement debouncing mechanisms to prevent sending multiple requests in quick succession, which can lead to incorrect quotes or failed transactions.</p></li><li><p><strong>Error Handling:</strong> Use try-catch blocks to handle errors during transaction processing and provide clear error messages to users.</p></li><li><p><strong>Alerts:</strong> Add alerts for successful transactions to notify users when their swaps are complete.</p></li></ol><pre><code><code>// Example of debouncing requests using useEffect with cancel effect
useEffect(() =&gt; {
  if (!mounted.current) return;
  setFetchingQuote(true);
  const fetchQuote = async () =&gt; {
    try {
      const quoteResponse = await axios.get('&lt;https://api.jup.ag/v6/swap&gt;', {
        params: {
          inToken: 'SOL',
          outToken: 'USDC',
          amount: 0.01,
          slippage: 50 // 50 basis points
        }
      });
      // Handle quote response...
    } catch (error) {
      console.error('Error fetching quote:', error);
    } finally {
      setFetchingQuote(false);
    }
  };
  fetchQuote();
}, [mounted]);

// Example of error handling during transaction processing
try {
  const signedTransaction = await signTransaction(serializedTransaction, keyPair);
  const connection = new Connection('&lt;https://api.mainnet-beta.solana.com&gt;');
  await connection.sendRawTransaction(signedTransaction.serialize());
  const transactionId = await connection.confirmTransaction(signedTransaction.id);
  return transactionId;
} catch (error) {
  console.error('Error sending transaction:', error);
  throw new Error('Failed to send transaction');
}
</code></code></pre><h3>Conclusion</h3><p>Implementing token swaps on Solana involves fetching quotes from DEX APIs, preparing and signing transactions using Solana's web3.js library, and sending these transactions to the blockchain. By handling errors properly and improving user experience through debouncing and alerts, you can create a more reliable and user-friendly token swap service. However, it is crucial to address issues related to high gas fees and network congestion by exploring alternative solutions such as multi-sig wallets or better RPC providers.</p><p>By following these steps and best practices outlined above, you can build a robust decentralized exchange that leverages the power of Solana's blockchain technology while providing a seamless experience for users.</p><h2>Secure Storage of Private Keys in Centralized Exchanges</h2><p>The secure storage of private keys is a critical aspect of centralized exchanges, particularly when dealing with cryptocurrencies. In this section, we will delve into the challenges and best practices for managing private keys, highlighting the risks associated with centralized storage and exploring more secure alternatives.</p><h3>Centralized Storage Risks</h3><p>Centralized storage of private keys poses significant risks, including the potential for unauthorized access and theft. For instance, if a centralized database contains all private keys, a malicious actor could potentially extract all the private keys and drain the associated funds. This approach, although easier to implement, is highly insecure and has been used by some platforms with limited security measures, such as encrypting the private keys stored in the database. However, this method still leaves the keys vulnerable to unauthorized access.</p><pre><code><code>**Example SQL Query Risk:**
```sql
SELECT private_key FROM users WHERE user_id = 'example_user';
</code></code></pre><p>This query can be used to extract a private key from a centralized database, exposing the user's funds to potential theft.</p><h3>Multi-Signature Approach</h3><p>A more secure approach involves using multi-signature wallets. This method ensures that no single entity has control over the funds, requiring multiple signatures to authorize transactions. Here&#8217;s how it works:</p><ol><li><p><strong>Multi-Signature Setup:</strong></p><ul><li><p>When a user signs up, create a new multi-signature wallet (vault) with multiple signers.</p></li><li><p>Each signer is associated with a different private key, ensuring that no single key can authorize transactions.</p></li></ul></li><li><p><strong>Transaction Process:</strong></p><ul><li><p>When a user initiates a transaction (e.g., swapping or transferring funds), the request must be signed by at least two out of three signers.</p></li><li><p>This process ensures that even if one signer is compromised, the transaction cannot be completed without additional verification.</p></li></ul></li><li><p><strong>Implementation Considerations:</strong></p><ul><li><p><strong>Open-Source Solutions:</strong> Using open-source multi-signature implementations like Squad on Solana can be effective but comes with a one-time fee per vault creation, which may be impractical for large user bases.</p></li><li><p><strong>Custom Implementation:</strong> Deploying a custom multi-signature protocol contract can be more cost-effective but requires careful consideration of licensing and security implications.</p></li></ul></li><li><p><strong>Attack Vectors:</strong></p><ul><li><p>Even with multi-signature wallets, there are potential attack vectors such as an engineer within the team sending malicious requests on behalf of users.</p></li><li><p>To mitigate this, end-to-end encryption between the user's request and the signers is necessary to ensure that requests are not tampered with or originated from unauthorized sources.</p></li></ul></li><li><p><strong>Performance Considerations:</strong></p><ul><li><p>The multi-signature process can introduce latency as each transaction requires multiple signatures, potentially slowing down transaction times.</p></li></ul></li></ol><h3>Conclusion</h3><p>Securely storing private keys in centralized exchanges is a complex task that requires careful consideration of both security and performance. While centralized storage is easier to implement, it poses significant risks. The multi-signature approach offers a more secure solution by distributing control among multiple entities, but it also introduces additional complexity and potential latency. By understanding these challenges and implementing robust security measures, exchanges can significantly reduce the risk of unauthorized access and ensure the safety of user funds.</p><h3>Best Practices for Secure Private Key Storage</h3><ol><li><p><strong>Avoid Centralized Databases:</strong></p><ul><li><p>Do not store all private keys in a single database as this makes them highly vulnerable to theft and unauthorized access.</p></li></ul></li><li><p><strong>Use Multi-Signature Wallets:</strong></p><ul><li><p>Create multi-signature wallets with multiple signers to ensure that no single entity controls the funds.</p></li><li><p>Implement end-to-end encryption to prevent tampering with transaction requests.</p></li></ul></li><li><p><strong>Choose Secure Storage Solutions:</strong></p><ul><li><p>Consider using open-source solutions like Squad on Solana or custom implementations that fit your specific needs.</p></li><li><p>Ensure that any chosen solution is well-tested and secure.</p></li></ul></li><li><p><strong>Monitor and Log Transactions:</strong></p><ul><li><p>Implement robust logging and monitoring systems to detect any suspicious activity.</p></li><li><p>Regularly review transaction logs to identify potential security breaches.</p></li></ul></li><li><p><strong>Educate Users:</strong></p><ul><li><p>Inform users about the importance of keeping their private keys secure and the risks associated with centralized storage.</p></li><li><p>Provide guidance on how to manage their keys securely.</p></li></ul></li></ol><p>By following these best practices, centralized exchanges can significantly enhance the security of private key storage, protecting user funds from potential threats.</p><div><hr></div><h3>References</h3><ul><li><p>Stack Overflow: How to store access keys/private keys safely in database</p></li><li><p>Oracle Documentation: Using Oracle Wallet Manager</p></li><li><p>Reddit: Secure User Wallet Storage for Centralized Crypto Exchange (CEX)</p></li><li><p>Chainstack: How to store private keys securely</p></li><li><p>Bubble Forum: Best practice to save a private key in the database</p></li></ul><p>This comprehensive guide provides detailed insights into the challenges and best practices for securely storing private keys in centralized exchanges, ensuring the safety and integrity of user funds.</p>]]></content:encoded></item><item><title><![CDATA[Building A Centralized Exchange (Zerodha)]]></title><description><![CDATA[In this YouTube lecture, Harkirat explores building a centralized exchange like Zerodha. He covers the functional requirements, order book management, order matching, and the importance of low latency]]></description><link>https://indiaremotejobs.substack.com/p/building-a-centralized-exchange-zerodha</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/building-a-centralized-exchange-zerodha</guid><pubDate>Wed, 17 Jul 2024 21:24:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/aEMBp9Bqfwc" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-aEMBp9Bqfwc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;aEMBp9Bqfwc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/aEMBp9Bqfwc?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>High-Level Requirements of an Exchange</h2><h3><strong>1] User Registration and KYC</strong></h3><ul><li><p>Users need to sign up and complete the Know Your Customer (KYC) process</p></li><li><p>KYC involves providing identification documents like Aadhaar or PAN card</p></li><li><p>This ensures users have a Demat account and are Indian citizens</p></li></ul><h3><strong>2] Balances and Funds Management</strong></h3><ul><li><p>Users can view their current balances, including cash and stock holdings</p></li><li><p>Initially, users have zero cash balance and no stock holdings</p></li><li><p>Users can transfer funds from their bank account to the exchange</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dFW9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dFW9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 424w, https://substackcdn.com/image/fetch/$s_!dFW9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 848w, https://substackcdn.com/image/fetch/$s_!dFW9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 1272w, https://substackcdn.com/image/fetch/$s_!dFW9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dFW9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png" width="1456" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:421872,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dFW9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 424w, https://substackcdn.com/image/fetch/$s_!dFW9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 848w, https://substackcdn.com/image/fetch/$s_!dFW9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 1272w, https://substackcdn.com/image/fetch/$s_!dFW9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fcb7b75-c8ab-49c8-993b-b5c998bebd20_2000x909.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>3] Trading Functionality</strong></h3><ul><li><p>Users can buy and sell listed stocks on the exchange</p></li><li><p>Buying stocks deducts the cost from the user's cash balance and credits the stocks</p></li><li><p>Selling stocks removes the stocks from the user's holdings and adds the sale proceeds to the cash balance</p></li></ul><h3><strong>4] Order Types</strong></h3><ul><li><p>Users can place different types of orders, such as limit orders and market orders (explained later)</p></li></ul><h3><strong>5] Open Orders and Trade History</strong></h3><ul><li><p>Users can view their open (pending) orders</p></li><li><p>Users can access their trade history, including executed orders</p></li></ul><div><hr></div><h2>How Does an Exchange Work?</h2><h3><strong>1] User Registration and Authentication</strong></h3><ul><li><p>Users sign up and sign in to the exchange platform</p></li></ul><h3><strong>2] KYC and Demat Account Linking</strong></h3><ul><li><p>Users complete the KYC process by providing required documents</p></li><li><p>Users link their Demat account to the exchange</p></li></ul><h3><strong>3] Order Placement</strong></h3><ul><li><p>Users can place orders to buy or sell stocks listed on the exchange</p></li><li><p>Two main order types: limit orders and market orders (explained later)</p></li></ul><h3><strong>4] Balance and Holdings Management</strong></h3><ul><li><p>Users can view their cash balance and stock holdings</p></li><li><p>Cash balance is updated based on buy and sell transactions</p></li><li><p>Stock holdings are updated based on executed buy and sell orders</p></li></ul><h3><strong>5] Order Execution and Settlement</strong></h3><ul><li><p>Orders are matched and executed based on the exchange's order matching engine</p></li><li><p>Executed trades are settled, and balances are updated accordingly</p></li></ul><div><hr></div><h2>Price Determination Through Supply and Demand</h2><p>The price of a stock or any asset is determined by the principles of supply and demand. Here's how it works in our day to day lives:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MiD5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MiD5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 424w, https://substackcdn.com/image/fetch/$s_!MiD5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 848w, https://substackcdn.com/image/fetch/$s_!MiD5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 1272w, https://substackcdn.com/image/fetch/$s_!MiD5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MiD5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png" width="1456" height="563" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:455140,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MiD5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 424w, https://substackcdn.com/image/fetch/$s_!MiD5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 848w, https://substackcdn.com/image/fetch/$s_!MiD5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 1272w, https://substackcdn.com/image/fetch/$s_!MiD5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F951d7a29-6495-4359-acf9-12e3a4308438_2000x773.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>1] Supply and Demand Imbalance</strong></h3><ul><li><p>If there are more buyers (demand) than sellers (supply) for a particular stock, the price tends to rise</p></li><li><p>If there are more sellers than buyers, the price tends to fall</p></li></ul><h3><strong>2] Buyer and Seller Competition</strong></h3><ul><li><p>When there is high demand, buyers compete by offering higher prices to acquire the stock</p></li><li><p>When there is high supply, sellers compete by lowering prices to attract buyers</p></li></ul><div><hr></div><h2>Land Buying Example</h2><p>To illustrate the concept of supply and demand, consider the example of buying a plot of land:</p><ol><li><p><strong>Buyer's Offer:</strong> A buyer approaches a broker and expresses willingness to pay, say, &#8377;40 lakhs for a plot of land</p></li><li><p><strong>Seller's Counteroffer:</strong> The broker contacts the seller (owner of the land), who counters with an offer to sell at &#8377;42 lakhs</p></li><li><p><strong>Negotiation and Convergence:</strong> The buyer and seller negotiate until they reach an agreed-upon price, or the deal falls through</p></li><li><p><strong>Multiple Buyers and Limited Supply:</strong> If there are multiple buyers interested in the same property (high demand) and limited supply, buyers may outbid each other. This drives up the price as buyers compete to acquire the property</p></li><li><p><strong>Multiple Sellers and Limited Demand:</strong> Conversely, if there are multiple sellers and limited demand, sellers may lower their prices to attract buyers. This drives down the price as sellers compete to sell their properties</p></li></ol><blockquote><p>The principles of supply and demand apply to various assets, including stocks, real estate, and cryptocurrencies, determining their prices in the market.</p></blockquote><div><hr></div><h2>Financial Jargons to Understand Exchanges</h2><h3>1] Order Books</h3><p>An order book is a central record that displays the outstanding buy and sell orders for a particular asset, such as a stock or cryptocurrency. It provides a transparent view of the supply and demand for that asset at various price levels.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lzIV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lzIV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 424w, https://substackcdn.com/image/fetch/$s_!lzIV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 848w, https://substackcdn.com/image/fetch/$s_!lzIV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 1272w, https://substackcdn.com/image/fetch/$s_!lzIV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lzIV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png" width="1456" height="382" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:382,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:211318,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lzIV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 424w, https://substackcdn.com/image/fetch/$s_!lzIV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 848w, https://substackcdn.com/image/fetch/$s_!lzIV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 1272w, https://substackcdn.com/image/fetch/$s_!lzIV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff36959a-1680-436b-96ef-4bc9fa7556ca_2000x525.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To understand order books better, let's consider an example:</p><p>Imagine there are eight identical plots of land in Indiranagar, Bangalore. If you are a buyer interested in purchasing one of these plots, you would approach a broker and place your best offer, say &#8377;40 lakhs.</p><p>The broker maintains an order book, which is a record of all the buy and sell orders for these plots. Your offer of &#8377;40 lakhs would be recorded as a "bid" in the order book, represented by a green circle.</p><p>Now, if a seller comes along and is willing to sell one of the plots for &#8377;42 lakhs, the broker would record this as an "ask" in the order book, represented by a red circle.</p><p>The order book would then display:</p><ul><li><p>Bids (green circles): The prices buyers are willing to pay, arranged from highest to lowest.</p></li><li><p>Asks (red circles): The prices sellers are willing to accept, arranged from lowest to highest.</p></li></ul><p>As more buyers and sellers enter the market, their respective bids and asks are added to the order book. The goal is for the bids and asks to converge, where a buyer's bid matches a seller's ask. At this point, a transaction can occur, and the respective orders are removed from the order book.</p><p>For example, if a buyer increases their bid to &#8377;41 lakhs, and a seller lowers their ask to &#8377;41.5 lakhs, the spread between the bid and ask narrows. Eventually, when a bid and ask match, the transaction is executed, and the asset (in this case, the plot of land) is transferred from the seller to the buyer.</p><blockquote><p>The order book provides transparency by displaying the current supply and demand for an asset at various price levels. It helps buyers and sellers make informed decisions based on the prevailing market conditions.</p></blockquote><p>Understanding order books is crucial in comprehending the price discovery mechanism in financial markets, as the last executed transaction price becomes the current market price for that asset.</p><h3>2] Price of a Stock</h3><p>The price of a stock is determined by the last executed order in the exchange's order book. Here's how it works:</p><ul><li><p>Each stock exchange (e.g., Zerodha, Groww) maintains its own order book for a particular stock.</p></li><li><p>The order book records all the outstanding buy (bid) and sell (ask) orders for that stock at various price levels.</p></li><li><p>When a buy order matches a sell order, a transaction is executed at an agreed-upon price.</p></li><li><p>The price at which this last transaction occurred becomes the current market price of the stock on that exchange.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9350!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9350!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 424w, https://substackcdn.com/image/fetch/$s_!9350!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 848w, https://substackcdn.com/image/fetch/$s_!9350!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 1272w, https://substackcdn.com/image/fetch/$s_!9350!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9350!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5677416,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9350!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 424w, https://substackcdn.com/image/fetch/$s_!9350!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 848w, https://substackcdn.com/image/fetch/$s_!9350!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 1272w, https://substackcdn.com/image/fetch/$s_!9350!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2b2285-7b14-485e-8d5f-a3ce1a9af027_2000x1125.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For example, if the last executed order for Tata Steel on Zerodha was at &#8377;200.10, then the current market price of Tata Steel on Zerodha would be &#8377;200.10. However, on a different exchange like Groww, the last executed order for Tata Steel might have been at &#8377;200.05, making that the current market price on Groww.</p><p>While different exchanges may have slightly different prices for the same stock at any given time, the actual real-world price is typically calculated by taking inputs from all major exchanges and determining a consolidated price.</p><blockquote><p>Thus, the price of a stock is not an average of past transactions or a predetermined value. It is simply the last price at which a buy order and a sell order were matched and executed on a particular exchange's order book.[1] This price represents the fair market value of the stock at that moment, as determined by the forces of supply and demand.</p></blockquote><h3>3] Limit Order</h3><p>A limit order is a type of order where the trader specifies the maximum price they are willing to buy or the minimum price they are willing to sell a particular quantity of an asset.</p><p>When placing a limit order, the trader sets:</p><ol><li><p>The quantity of the asset (e.g., 10 stocks of Apple)</p></li><li><p>The limit price at which they want to buy or sell</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IlYb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IlYb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 424w, https://substackcdn.com/image/fetch/$s_!IlYb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 848w, https://substackcdn.com/image/fetch/$s_!IlYb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 1272w, https://substackcdn.com/image/fetch/$s_!IlYb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IlYb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png" width="1456" height="586" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0543d713-392c-4d21-b261-b7091f03820a_2000x805.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:586,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:406107,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IlYb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 424w, https://substackcdn.com/image/fetch/$s_!IlYb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 848w, https://substackcdn.com/image/fetch/$s_!IlYb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 1272w, https://substackcdn.com/image/fetch/$s_!IlYb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0543d713-392c-4d21-b261-b7091f03820a_2000x805.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For example, a buy limit order could be "Buy 10 stocks of Apple at $150 or lower per share." This order will only execute if the market price is $150 or less. If the market price is higher than $150, the order will remain in the order book until the price drops to $150 or lower, or until the order is canceled.</p><p>Similarly, a sell limit order could be "Sell 10 stocks of Apple at $160 or higher per share." This order will only execute if the market price is $160 or higher. If the market price is lower than $160, the order will remain in the order book until the price rises to $160 or higher, or until the order is canceled.</p><blockquote><p>Limit orders provide traders with control over the price at which they are willing to execute a trade. However, there is a risk that the order may not execute if the market price never reaches the specified limit price. Hence, they are typically used by traders who have a specific price target in mind and are willing to wait for the market to reach that price level before executing the trade.</p></blockquote><h3>4] Market Order</h3><p>A market order is a type of order where the trader instructs the broker or exchange to execute the trade immediately at the best available market price.</p><p>When placing a market order, the trader specifies only the quantity of the asset they want to buy or sell. The price is determined by the current market conditions and the availability of orders in the order book.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dZhD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dZhD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 424w, https://substackcdn.com/image/fetch/$s_!dZhD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 848w, https://substackcdn.com/image/fetch/$s_!dZhD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!dZhD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dZhD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:637967,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dZhD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 424w, https://substackcdn.com/image/fetch/$s_!dZhD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 848w, https://substackcdn.com/image/fetch/$s_!dZhD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!dZhD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2b7e775-3bb9-495b-ad18-caacda1f354d_2000x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For example, if a trader places a market order to buy 100 shares of a stock, the order will be filled by taking the best available ask prices (sell orders) from the order book until the entire quantity of 100 shares is filled.</p><p>Market orders are typically used by traders who prioritize immediate execution over a specific price. However, there is a risk that the market order may execute at an unfavorable price, especially in volatile or illiquid markets, as the order will be filled at the best available prices in the order book at the time of execution.</p><blockquote><p>Market orders are often used by retail traders who want to buy or sell an asset quickly without having to specify a limit price. However, it's important to note that market orders can result in higher trading costs due to potential slippage (the difference between the expected price and the actual execution price).</p></blockquote><p>Both limit orders and market orders are essential tools for traders, each with its own advantages and risks. Traders must carefully consider their trading strategies, risk tolerance, and market conditions when deciding which order type to use.</p><h3>5] Liquidity and Market Depth</h3><p>Liquidity and market depth refer to the ability of a market to handle large orders without significantly impacting the price of an asset. In the context of an exchange, these terms are closely related and describe the state of the order book.</p><ul><li><p>Liquidity refers to the ease with which an asset can be bought or sold without causing a significant change in its price. A liquid market has a high volume of trading activity and a large number of buy and sell orders in the order book.</p></li><li><p>Market depth, on the other hand, refers to the quantity of orders available at different price levels in the order book. A market with high depth has a large number of orders concentrated around the current market price, allowing large orders to be executed without significantly moving the price.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4eas!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4eas!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 424w, https://substackcdn.com/image/fetch/$s_!4eas!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 848w, https://substackcdn.com/image/fetch/$s_!4eas!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 1272w, https://substackcdn.com/image/fetch/$s_!4eas!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4eas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png" width="1456" height="783" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:783,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1163177,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4eas!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 424w, https://substackcdn.com/image/fetch/$s_!4eas!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 848w, https://substackcdn.com/image/fetch/$s_!4eas!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 1272w, https://substackcdn.com/image/fetch/$s_!4eas!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0123f13b-461e-46cc-adfb-d147f3b9c9dc_2000x1075.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When an order book has high liquidity and depth, it can absorb large buy or sell orders without causing significant price fluctuations. This is because there are enough orders on both sides of the book to match the incoming orders without depleting the available supply or demand.</p><p>For example, if a trader wants to buy 10,000 shares of a stock, a liquid market with high depth would have enough sell orders at or near the current market price to fill the order without significantly driving up the price. Conversely, if the market lacks depth, a large buy order could quickly consume the available sell orders, causing the price to rise sharply.</p><blockquote><p>Exchanges strive to maintain high liquidity and market depth to ensure efficient price discovery and smooth trading operations. They often incentivize market makers, who are firms or individuals that provide liquidity by continuously placing buy and sell orders in the order book, to enhance market depth and liquidity.</p></blockquote><p>Market makers are incentivized through various means, such as lower trading fees, rebates, or other incentives, to encourage them to provide liquidity and maintain tight bid-ask spreads (the difference between the highest buy order and the lowest sell order).</p><div><hr></div><h2>Maker and Taker</h2><p>In the context of an exchange, the terms "maker" and "taker" refer to the roles played by traders in executing orders.</p><ul><li><p>A maker is a trader who places an order in the order book, providing liquidity to the market. When a maker's order is matched and executed against an incoming order, they are considered the liquidity provider.</p></li><li><p>A taker, on the other hand, is a trader who submits an order that is immediately matched and executed against an existing order in the order book, removing liquidity from the market.</p></li></ul><p>For example, if a trader places a buy order at the current market price, they are considered a taker because their order is immediately matched and executed against existing sell orders in the order book, consuming the available liquidity.</p><p>Exchanges often incentivize makers by charging them lower trading fees compared to takers. This is because makers are providing liquidity to the market, which is beneficial for the overall health and efficiency of the exchange. Takers, on the other hand, are charged higher fees because they are removing liquidity from the market.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5GIx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5GIx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 424w, https://substackcdn.com/image/fetch/$s_!5GIx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 848w, https://substackcdn.com/image/fetch/$s_!5GIx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 1272w, https://substackcdn.com/image/fetch/$s_!5GIx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5GIx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png" width="1456" height="513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:513,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:294083,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5GIx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 424w, https://substackcdn.com/image/fetch/$s_!5GIx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 848w, https://substackcdn.com/image/fetch/$s_!5GIx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 1272w, https://substackcdn.com/image/fetch/$s_!5GIx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ac94008-fb95-474c-a409-c7bac004aeb7_2000x705.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The fee structure for makers and takers can vary across different exchanges and may also depend on factors such as trading volume, account type, or market conditions. Generally, the maker fee is lower than the taker fee, encouraging traders to provide liquidity to the order book.</p><p>By incentivizing makers and charging higher fees for takers, exchanges aim to maintain a healthy order book with sufficient liquidity, which ultimately benefits all market participants by facilitating efficient price discovery and trade execution.</p><blockquote><p>It's important to note that the roles of maker and taker are not fixed for a particular trader. A trader can be a maker on one trade and a taker on another, depending on whether their order is adding or removing liquidity from the order book.</p></blockquote><div><hr></div><h2>Why is Latency Important?</h2><p>Latency is crucial in the context of exchanges and trading systems. Here's why it's important and how it's addressed for exchanges and traders:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v8os!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v8os!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 424w, https://substackcdn.com/image/fetch/$s_!v8os!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 848w, https://substackcdn.com/image/fetch/$s_!v8os!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 1272w, https://substackcdn.com/image/fetch/$s_!v8os!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v8os!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png" width="1456" height="388" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/923479cc-b019-4e88-b459-4f830ff76323_2000x533.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:388,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:101369,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!v8os!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 424w, https://substackcdn.com/image/fetch/$s_!v8os!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 848w, https://substackcdn.com/image/fetch/$s_!v8os!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 1272w, https://substackcdn.com/image/fetch/$s_!v8os!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F923479cc-b019-4e88-b459-4f830ff76323_2000x533.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>For Exchanges:</h2><ul><li><p><strong>Order Placement Time</strong>: Exchanges need to process incoming orders (limit or market) and add them to the order book as quickly as possible.</p></li><li><p><strong>Order Book Updates</strong>: The order book is constantly changing, and exchanges must disseminate real-time updates to traders with minimal latency.</p></li><li><p><strong>Order Acknowledgment Time</strong>: Traders need to know if their orders were accepted, filled, or partially filled in a timely manner.</p></li></ul><h2>For Traders:</h2><ul><li><p><strong>Order Execution</strong>: Low latency is critical for traders, especially those engaged in high-frequency trading strategies, to execute orders at the desired price before the market moves.</p></li><li><p><strong>Order Cancellation</strong>: Traders may need to cancel orders quickly in response to market changes, and high latency can lead to significant losses.</p></li><li><p><strong>Order Priority</strong>: Some exchanges prioritize orders from traders who provide more liquidity, and low latency can give them an edge in order execution.</p></li></ul><div><hr></div><h1>How is Latency Improved?</h1><p>The ways to improve latency for exchanges as well as for traders are as follows:</p><h2>For Exchanges:</h2><ul><li><p><strong>Faster Programming Languages</strong>: Exchanges use low-level, high-performance languages like C, C++, and Rust for critical components to minimize latency.</p></li><li><p><strong>Efficient Serialization/Deserialization</strong>: Optimizing data serialization and deserialization can significantly reduce latency in processing orders and updates.</p></li><li><p><strong>In-Memory Order Books</strong>: Order books are often stored entirely in memory (RAM) instead of databases to minimize access latency, with mechanisms to recover from failures.</p></li></ul><h2>For Traders:</h2><ul><li><p><strong>Proximity to Exchange Servers</strong>: Traders aim to be physically closer to exchange servers to reduce network latency.</p></li><li><p><strong>Multiple Connections</strong>: Traders maintain multiple connections to exchanges and dynamically use the fastest one.</p></li><li><p><strong>Fast Data Processing</strong>: Efficient serialization/deserialization and data processing libraries are used to handle real-time market data with minimal latency.</p></li><li><p><strong>Low-Latency Prediction Models</strong>: Mathematical models are employed to predict current asset prices across exchanges, requiring low-latency data ingestion and processing.</p></li></ul><blockquote><p>Both exchanges and traders invest significant resources into minimizing latency, as even milliseconds can make a substantial difference in trading outcomes. Exchanges strive to provide a low-latency environment, while traders leverage various techniques and technologies to gain an edge in order execution and market data processing.</p></blockquote><div><hr></div><h1>Building Exchange Orderbook</h1><h2>1] Requirements:</h2><ol><li><p>Support placing limit orders</p></li><li><p>Orders can be fully or partially executed/filled</p></li><li><p>Users can query the current order book depth (bids and asks)</p></li><li><p>Users can retrieve their account balance (cash and stock holdings)</p></li><li><p>Implement an assignment to handle market orders by first requesting a quote and then placing a limit order at the quoted price</p></li></ol><h2>2] Architecture:</h2><ol><li><p><strong>HTTP Server</strong></p><ul><li><p>Use Node.js with Express.js framework</p></li><li><p>Written in TypeScript</p></li></ul></li><li><p><strong>Routes/Endpoints</strong></p><ul><li><p><code>/order</code> endpoint to place a limit order</p><ul><li><p>Input: side (buy/sell), price, quantity, ticker/market, user ID</p></li></ul></li><li><p><code>/balance</code> endpoint to retrieve user's balance</p><ul><li><p>Input: user ID</p></li><li><p>Returns: user's cash balance and stock holdings</p></li></ul></li><li><p><code>/depth</code> endpoint to retrieve the current order book depth</p><ul><li><p>Returns: bids (price and quantity) and asks (price and quantity)</p></li></ul></li></ul></li><li><p><strong>Order Book</strong></p><ul><li><p>Core component to maintain the list of outstanding buy (bid) and sell (ask) orders</p></li><li><p>Orders matched based on price-time priority</p></li><li><p>Handle partial order fills</p></li></ul></li><li><p><strong>Order Matching Engine</strong></p><ul><li><p>Match buy and sell orders in the order book</p></li><li><p>Execute trades when a buy order matches a sell order (or vice versa)</p></li></ul></li><li><p><strong>User Accounts</strong></p><ul><li><p>Maintain user accounts to track cash balances and stock holdings</p></li><li><p>Update balances based on executed trades</p></li></ul></li><li><p><strong>Market Order Implementation (Assignment)</strong></p><ul><li><p>User first sends a request to <code>/quote</code> endpoint to get the current best price</p></li><li><p>User then places a limit order at the quoted price via the <code>/order</code> endpoint, effectively executing a market order</p></li></ul></li></ol><blockquote><p>The architecture involves setting up an HTTP server with specific routes/endpoints to handle order placement, balance retrieval, and order book depth querying. The core components include the order book, order matching engine, and user account management. The assignment focuses on implementing market order functionality by combining quote requests and limit order placement.</p></blockquote><div><hr></div><h1>Technical Implementation</h1><p>To implement the order book in a MERN stack (Node.js, Express, and TypeScript), we will follow a structured approach. First, we will set up a Node.js server using Express and TypeScript. Then, we will create the necessary data structures and functions to manage the order book, handle order placement, order matching, and user account management.</p><p>Let's initialize a TypeScript backend in Node.js and create an&nbsp;<code>index.ts</code>&nbsp;file to start things off. In this file, we will import the required dependencies, set up the Express server, define routes for handling various requests (e.g., placing orders, retrieving balances, and fetching order book depth), and implement the core functionality of the order book system.</p><h3><strong>1] Imports and Setup</strong></h3><pre><code><code>import express from "express";
import bodyParser from "body-parser";

export const app = express();

app.use(bodyParser({}));
</code></code></pre><ul><li><p>The code imports the necessary modules: <code>express</code> for setting up the HTTP server and <code>body-parser</code> for parsing request bodies.</p></li><li><p>An instance of the Express application is created and assigned to the <code>app</code> constant.</p></li><li><p><code>body-parser</code> middleware is added to parse request bodies.</p></li></ul><h3><strong>2] Type Definitions</strong></h3><pre><code><code>interface Balances {
  [key: string]: number;
}

interface User {
  id: string;
  balances: Balances;
};

interface Order {
  userId: string;
  price: number;
  quantity: number;
}
</code></code></pre><ul><li><p>The code defines several TypeScript interfaces:</p><ul><li><p><code>Balances</code>: An object that maps asset names (strings) to their respective quantities (numbers).</p></li><li><p><code>User</code>: An object representing a user, containing an <code>id</code> (string) and <code>balances</code> (an instance of the <code>Balances</code> interface).</p></li><li><p><code>Order</code>: An object representing an order, containing <code>userId</code> (string), <code>price</code> (number), and <code>quantity</code> (number).</p></li></ul></li></ul><h3><strong>3] Global Variables</strong></h3><pre><code><code>export const TICKER = "GOOGLE";

const users: User[] = [{
  id: "1",
  balances: {
    "GOOGLE": 10,
    "USD": 50000
  }
}, {
  id: "2",
  balances: {
    "GOOGLE": 10,
    "USD": 50000
  }
}];

const bids: Order[] = [];
const asks: Order[] = [];
</code></code></pre><ul><li><p><code>TICKER</code>: A constant string representing the ticker symbol of the asset being traded (in this case, "GOOGLE").</p></li><li><p><code>users</code>: An array of <code>User</code> objects, representing the initial user accounts and their balances.</p></li><li><p><code>bids</code>: An array of <code>Order</code> objects, representing the outstanding buy orders (bids) in the order book.</p></li><li><p><code>asks</code>: An array of <code>Order</code> objects, representing the outstanding sell orders (asks) in the order book.</p></li></ul><h3><strong>4] HTTP Endpoints</strong></h3><ul><li><p><code>/order</code> (POST)</p></li></ul><pre><code><code>app.post("/order", (req: any, res: any) =&gt; {
  const side: string = req.body.side;
  const price: number = req.body.price;
  const quantity: number = req.body.quantity;
  const userId: string = req.body.userId;

  const remainingQty = fillOrders(side, price, quantity, userId);

  if (remainingQty === 0) {
    res.json({ filledQuantity: quantity });
    return;
  }

  if (side === "bid") {
    bids.push({
      userId,
      price,
      quantity: remainingQty
    });
    bids.sort((a, b) =&gt; a.price &lt; b.price ? -1 : 1);
  } else {
    asks.push({
      userId,
      price,
      quantity: remainingQty
    })
    asks.sort((a, b) =&gt; a.price &lt; b.price ? 1 : -1);
  }

  res.json({
    filledQuantity: quantity - remainingQty,
  })
})
</code></code></pre><ul><li><ul><li><p>This endpoint handles the placement of limit orders.</p></li><li><p>It expects the following request body parameters: <code>side</code> (string, either "bid" or "ask"), <code>price</code> (number), <code>quantity</code> (number), and <code>userId</code> (string).</p></li><li><p>The <code>fillOrders</code> function is called to match the incoming order against the existing orders in the order book.</p></li><li><p>If the order is fully filled, a JSON response is sent with the <code>filledQuantity</code> equal to the original <code>quantity</code>.</p></li><li><p>If the order is partially filled, the remaining quantity is added to the <code>bids</code> or <code>asks</code> array, sorted by price.</p></li><li><p>A JSON response is sent with the <code>filledQuantity</code> equal to the filled portion of the order.</p></li></ul></li><li><p><code>/depth</code> (GET)</p></li></ul><pre><code><code>app.get("/depth", (req: any, res: any) =&gt; {
  const depth: {
    [price: string]: {
      type: "bid" | "ask",
      quantity: number,
    }
  } = {};

  for (let i = 0; i &lt; bids.length; i++) {
    if (!depth[bids[i].price]) {
      depth[bids[i].price] = {
        quantity: bids[i].quantity,
        type: "bid"
      };
    } else {
      depth[bids[i].price].quantity += bids[i].quantity;
    }
  }

  for (let i = 0; i &lt; asks.length; i++) {
    if (!depth[asks[i].price]) {
      depth[asks[i].price] = {
        quantity: asks[i].quantity,
        type: "ask"
      }
    } else {
      depth[asks[i].price].quantity += asks[i].quantity;
    }
  }

  res.json({
    depth
  })
})
</code></code></pre><ul><li><ul><li><p>This endpoint returns the current order book depth, which is a representation of the outstanding bids and asks at various price levels.</p></li><li><p>It iterates through the <code>bids</code> and <code>asks</code> arrays, aggregating the quantities at each price level.</p></li><li><p>The resulting depth is returned as a JSON response, where the keys are prices, and the values are objects containing the <code>type</code> ("bid" or "ask") and the aggregated <code>quantity</code>.</p></li></ul></li><li><p><code>/balance/:userId</code> (GET)</p></li></ul><pre><code><code>app.get("/balance/:userId", (req, res) =&gt; {
  const userId = req.params.userId;
  const user = users.find(x =&gt; x.id === userId);
  if (!user) {
    return res.json({
      USD: 0,
      [TICKER]: 0
    })
  }
  res.json({ balances: user.balances });
})
</code></code></pre><ul><li><ul><li><p>This endpoint retrieves the balance of a specific user.</p></li><li><p>It expects the <code>userId</code> as a path parameter.</p></li><li><p>It finds the user object in the <code>users</code> array based on the provided <code>userId</code>.</p></li><li><p>If the user is found, their <code>balances</code> object is returned as a JSON response.</p></li><li><p>If the user is not found, a JSON response with <code>USD</code> and <code>TICKER</code> (GOOGLE) balances set to 0 is returned.</p></li></ul></li><li><p><code>/quote</code> (GET)</p></li></ul><pre><code><code>app.get("/quote", (req, res) =&gt; {
  // TODO: Assignment
});
</code></code></pre><ul><li><ul><li><p>This endpoint is currently empty, but it is intended to handle quote requests for market orders (as per the assignment mentioned in the transcript).</p></li></ul></li></ul><h3><strong>5] Helper Functions</strong></h3><ul><li><p><code>flipBalance</code></p></li></ul><pre><code><code>function flipBalance(userId1: string, userId2: string, quantity: number, price: number) {
  let user1 = users.find(x =&gt; x.id === userId1);
  let user2 = users.find(x =&gt; x.id === userId2);
  if (!user1 || !user2) {
    return;
  }
  user1.balances[TICKER] -= quantity;
  user2.balances[TICKER] += quantity;
  user1.balances["USD"] += (quantity * price);
  user2.balances["USD"] -= (quantity * price);
}
</code></code></pre><ul><li><ul><li><p>This function is responsible for updating the balances of two users involved in a trade.</p></li><li><p>It takes the <code>userId1</code>, <code>userId2</code>, <code>quantity</code>, and <code>price</code> as arguments.</p></li><li><p>It finds the corresponding user objects in the <code>users</code> array.</p></li><li><p>It updates the <code>TICKER</code> (GOOGLE) and <code>USD</code> balances of the users based on the trade details.</p></li></ul></li><li><p><code>fillOrders</code></p></li></ul><pre><code><code>function fillOrders(side: string, price: number, quantity: number, userId: string): number {
  let remainingQuantity = quantity;
  if (side === "bid") {
    for (let i = asks.length - 1; i &gt;= 0; i--) {
      if (asks[i].price &gt; price) {
        continue;
      }
      if (asks[i].quantity &gt; remainingQuantity) {
        asks[i].quantity -= remainingQuantity;
        flipBalance(asks[i].userId, userId, remainingQuantity, asks[i].price);
        return 0;
      } else {
        remainingQuantity -= asks[i].quantity;
        flipBalance(asks[i].userId, userId, asks[i].quantity, asks[i].price);
        asks.pop();
      }
    }
  } else {
    for (let i = bids.length - 1; i &gt;= 0; i--) {
      if (bids[i].price &lt; price) {
        continue;
      }
      if (bids[i].quantity &gt; remainingQuantity) {
        bids[i].quantity -= remainingQuantity;
        flipBalance(userId, bids[i].userId, remainingQuantity, price);
        return 0;
      } else {
        remainingQuantity -= bids[i].quantity;
        flipBalance(userId, bids[i].userId, bids[i].quantity, price);
        bids.pop();
      }
    }
  }

  return remainingQuantity;
}
</code></code></pre><ul><li><ul><li><p>This function is responsible for matching an incoming order against the existing orders in the order book.</p></li><li><p>It takes the <code>side</code> (bid or ask), <code>price</code>, <code>quantity</code>, and <code>userId</code> as arguments.</p></li><li><p>If the incoming order is a bid, it iterates through the <code>asks</code> array in reverse order (from highest price to lowest).</p><ul><li><p>If the ask price is higher than the bid price, it skips that ask order.</p></li><li><p>If the ask quantity is greater than the remaining quantity of the bid, it partially fills the ask order, updates the balances using <code>flipBalance</code>, and returns 0 (indicating the bid order is fully filled).</p></li><li><p>If the ask quantity is less than or equal to the remaining quantity of the bid, it fully fills the ask order, updates the balances using <code>flipBalance</code>, removes the ask order from the <code>asks</code> array, and continues to the next ask order.</p></li></ul></li><li><p>If the incoming order is an ask, the process is similar but with the <code>bids</code> array and the order of price comparison reversed.</p></li><li><p>If there are no matching orders or the incoming order cannot be fully filled, the remaining quantity is returned.</p></li></ul></li></ul><h3><strong>6] Order Book Management</strong></h3><ul><li><p>The order book is represented by two arrays: <code>bids</code> and <code>asks</code>.</p></li><li><p>When a new order is placed, the <code>fillOrders</code> function attempts to match it against the existing orders in the order book.</p></li><li><p>If the order is partially filled, the remaining quantity is added to the appropriate <code>bids</code> or <code>asks</code> array, sorted by price.</p></li><li><p>The <code>bids</code> array is sorted in descending order (highest price first), while the <code>asks</code> array is sorted in ascending order (lowest price first).</p></li></ul><h3><strong>7] User Balances</strong></h3><ul><li><p>User balances are stored in the <code>users</code> array, where each user object has a <code>balances</code> property.</p></li><li><p>The <code>balances</code> property is an object that maps asset names (e.g., "GOOGLE" and "USD") to their respective quantities.</p></li><li><p>When a trade is executed, the <code>flipBalance</code> function updates the balances of the involved users based on the trade details.</p></li></ul><div><hr></div><h1>Understanding Tests (index.spec.ts)</h1><ol><li><p><strong>Importing Dependencies</strong></p></li></ol><pre><code><code>import { app, TICKER } from "../";
import request from "supertest";
</code></code></pre><p>This section imports the <code>app</code> and <code>TICKER</code> constants from the main application file (<code>../index.ts</code>). It also imports the <code>request</code> module from the <code>supertest</code> library, which is used for testing HTTP servers.</p><ol><li><p><strong>Defining the Test Suite</strong></p></li></ol><pre><code><code>describe("Basic tests", () =&gt; {
  // Test cases...
});
</code></code></pre><p>This block defines a test suite named "Basic tests" using the <code>describe</code> function provided by Jest.</p><ol><li><p><strong>Test Case: "verify initial balances"</strong></p></li></ol><pre><code><code>it("verify initial balances", async () =&gt; {
  let res = await request(app).get("/balance/1").send();
  expect(res.body.balances[TICKER]).toBe(10);
  res = await request(app).get("/balance/2").send();
  expect(res.body.balances[TICKER]).toBe(10);
});
</code></code></pre><p>This test case verifies the initial balances of two users (with IDs "1" and "2") by sending GET requests to the <code>/balance/:userId</code> endpoint using the <code>request</code> function from <code>supertest</code>. It expects the initial balance of the <code>TICKER</code> asset (e.g., "GOOGLE") to be 10 for both users using the <code>expect</code> function provided by Jest.</p><ol><li><p><strong>Test Case: "Can create tests"</strong></p></li></ol><pre><code><code>it("Can create tests", async () =&gt; {
  await request(app).post("/order").send({
    type: "limit",
    side: "bid",
    price: 1400.1,
    quantity: 1,
    userId: "1"
  });

  // Additional order placements...

  let res = await request(app).get("/depth").send();
  expect(res.status).toBe(200);
  expect(res.body.depth["1501"].quantity).toBe(5);
});
</code></code></pre><p>This test case creates three limit orders by sending POST requests to the <code>/order</code> endpoint using the <code>request</code> function from <code>supertest</code>. It then sends a GET request to the <code>/depth</code> endpoint to retrieve the order book depth and expects the response status to be 200 (OK) and the quantity at the price level 1501 to be 5.</p><ol><li><p><strong>Test Case: "ensures balances are still the same"</strong></p></li></ol><pre><code><code>it("ensures balances are still the same", async () =&gt; {
  let res = await request(app).get("/balance/1").send();
  expect(res.body.balances[TICKER]).toBe(10);
});
</code></code></pre><p>This test case verifies that the balance of user "1" remains unchanged after creating the orders in the previous test case.</p><ol><li><p><strong>Test Case: "Places an order that fills"</strong></p></li></ol><pre><code><code>it("Places an order that fills", async () =&gt; {
  let res = await request(app).post("/order").send({
    type: "limit",
    side: "bid",
    price: 1502,
    quantity: 2,
    userId: "1"
  });
  expect(res.body.filledQuantity).toBe(2);
});
</code></code></pre><p>This test case places a buy order (bid) for 2 units of the <code>TICKER</code> asset at a price of 1502 for user "1" by sending a POST request to the <code>/order</code> endpoint using the <code>request</code> function from <code>supertest</code>. It expects the response to indicate that the entire quantity of 2 units was filled.</p><ol><li><p><strong>Test Case: "Ensures orderbook updates"</strong></p></li></ol><pre><code><code>it("Ensures orderbook updates", async () =&gt; {
  let res = await request(app).get("/depth").send();
  expect(res.body.depth["1400.9"]?.quantity).toBe(8);
});
</code></code></pre><p>This test case retrieves the order book depth by sending a GET request to the <code>/depth</code> endpoint using the <code>request</code> function from <code>supertest</code>. It expects the quantity at the price level 1400.9 to be 8 (assuming the previous order filled 2 units from the ask order at 1400.9).</p><ol><li><p><strong>Test Case: "Ensures balances update"</strong></p></li></ol><pre><code><code>it("Ensures balances update", async () =&gt; {
  let res = await request(app).get("/balance/1").send();
  expect(res.body.balances[TICKER]).toBe(12);
  expect(res.body.balances["USD"]).toBe(50000 - 2 * 1400.9);

  res = await request(app).get("/balance/2").send();
  expect(res.body.balances[TICKER]).toBe(8);
  expect(res.body.balances["USD"]).toBe(50000 + 2 * 1400.9);
});
</code></code></pre><p>This test case verifies the updated balances of users "1" and "2" after the order execution by sending GET requests to the <code>/balance/:userId</code> endpoint using the <code>request</code> function from <code>supertest</code>. For user "1", it expects the <code>TICKER</code> balance to be 12 (initial 10 + 2 units bought) and the USD balance to be decreased by the cost of the 2 units (2 * 1400.9). For user "2", it expects the <code>TICKER</code> balance to be 8 (initial 10 - 2 units sold) and the USD balance to be increased by the proceeds from selling 2 units (2 * 1400.9).</p><blockquote><p>This test suite uses the <code>supertest</code> library to send HTTP requests to the order book system implemented in the Node.js application and verifies the expected behavior by making assertions using the <code>expect</code> function provided by Jest. It covers various aspects of the order book system, including order placement, order matching, order book depth updates, and balance updates after order execution.</p></blockquote><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Announcing the WEB3 and web-dev Cohort !!]]></title><description><![CDATA[After delivering the best in cohort-2 we're here with the bestest !]]></description><link>https://indiaremotejobs.substack.com/p/announcing-the-web3-and-web-dev-cohort</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/announcing-the-web3-and-web-dev-cohort</guid><pubDate>Sun, 07 Jul 2024 20:00:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XZUm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello everyone! Welcome to the launch of 100xDevs Cohort 3.0. In this video, I'll guide you through the syllabus for the upcoming cohort, the technologies we'll be learning, the schedule for live classes, pricing details, and the exciting projects we&#8217;ll be building. Without further ado, let's dive in!</p><h3>Reflecting on Cohort 2.0</h3><p>Before delving into the new syllabus, let&#8217;s recap Cohort 2.0:</p><ul><li><p>Topics covered: DevOps, Full Stack Development, multiple projects, open-source contributions, and system design.</p></li><li><p>Duration: 8 months, from December of last year to July 2024.</p></li></ul><blockquote><p><a href="https://indiaremotejobs.substack.com/p/announcing-the-launch-of-merndevopssystem">Cohort-2 Syllabus</a></p></blockquote><div><hr></div><h1>Why Join Cohort 3.0?</h1><ul><li><p><strong>Updated Curriculum</strong>: Incorporating the latest industry trends and technologies.</p></li><li><p><strong>Live Classes</strong>: Engage in interactive, real-time session.</p></li><li><p><strong>Teaching Assistant(TA) Support</strong> : get your doubts solved at the earliest.</p></li><li><p><strong>Comprehensive Learning</strong>: From fundamentals to advanced concepts, all in one place.</p></li><li><p><strong>Project-Based Learning</strong>: Hands-on projects to build real-world applications and solutions.</p></li><li><p><strong>Extended Access</strong>: Course access for 3 years, allowing flexibility in learning pace.</p></li></ul><h2>Syllabus !</h2><ul><li><p>Web Dev : <a href="https://blog.100xdevs.com/Web-dev-6e1c515142e14347ae174c55e6c953c6">Syllabus Easy / Medium / Hard</a> </p></li><li><p>Devops : <a href="https://blog.100xdevs.com/Devops-39f1c2ef45e741e79b1f09f8793d6ad8">Syllabus Easy / Medium / Hard</a></p></li><li><p>Web3 Client Side : <a href="https://blog.100xdevs.com/Web3-Client-side-9375f2aa571f4644aa45c3b5a5b6927c">Syllabus Easy / Medium / Hard</a></p></li><li><p>Web3 Contracts : <a href="https://blog.100xdevs.com/Web3-Contracts-ce3796e9db0e45708bc173f718b23392">Syllabus Easy / Medium / Hard</a></p></li></ul><h2>Projects !</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XZUm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XZUm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 424w, https://substackcdn.com/image/fetch/$s_!XZUm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 848w, https://substackcdn.com/image/fetch/$s_!XZUm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 1272w, https://substackcdn.com/image/fetch/$s_!XZUm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XZUm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png" width="1456" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XZUm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 424w, https://substackcdn.com/image/fetch/$s_!XZUm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 848w, https://substackcdn.com/image/fetch/$s_!XZUm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 1272w, https://substackcdn.com/image/fetch/$s_!XZUm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3325640e-3c54-4251-a728-4e211d958de3_2000x1112.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Testimonials !</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lt_R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lt_R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 424w, https://substackcdn.com/image/fetch/$s_!Lt_R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 848w, https://substackcdn.com/image/fetch/$s_!Lt_R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 1272w, https://substackcdn.com/image/fetch/$s_!Lt_R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lt_R!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:1488,&quot;width&quot;:1196,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:831154,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Lt_R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 424w, https://substackcdn.com/image/fetch/$s_!Lt_R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 848w, https://substackcdn.com/image/fetch/$s_!Lt_R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 1272w, https://substackcdn.com/image/fetch/$s_!Lt_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F669c773e-ed9b-44b5-9687-e5204ebf195d_1196x1488.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nEx-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nEx-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 424w, https://substackcdn.com/image/fetch/$s_!nEx-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 848w, https://substackcdn.com/image/fetch/$s_!nEx-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!nEx-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nEx-!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:1350,&quot;width&quot;:1190,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:651262,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nEx-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 424w, https://substackcdn.com/image/fetch/$s_!nEx-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 848w, https://substackcdn.com/image/fetch/$s_!nEx-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!nEx-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F062a2c45-8b18-461a-b737-a790c884913b_1190x1350.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gnK0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png" data-component-name="Image2ToDOM"><div class="image2-inset image2-full-screen"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gnK0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 424w, https://substackcdn.com/image/fetch/$s_!gnK0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 848w, https://substackcdn.com/image/fetch/$s_!gnK0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 1272w, https://substackcdn.com/image/fetch/$s_!gnK0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gnK0!,w_5760,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;full&quot;,&quot;height&quot;:1548,&quot;width&quot;:1198,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:711557,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-fullscreen" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gnK0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 424w, https://substackcdn.com/image/fetch/$s_!gnK0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 848w, https://substackcdn.com/image/fetch/$s_!gnK0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 1272w, https://substackcdn.com/image/fetch/$s_!gnK0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb85a3f-d96b-491c-a5cb-4a77bbef1bd8_1198x1548.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>FIND MORE <a href="https://blog.100xdevs.com/Testimonials-2e81db38eddc40b28aaf83e67c5c3c62">TESTIMONIALS HERE</a></h3><div><hr></div><div id="youtube2-RKramRyUvHQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;RKramRyUvHQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/RKramRyUvHQ?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h1>Pricing !?</h1><ul><li><p><strong>Web Development and DevOps</strong>: &#8377;4,999</p></li><li><p><strong>Web3 and Blockchain</strong>: &#8377;4,999</p></li></ul><blockquote><p><strong>Bundle (Both Cohorts) </strong>: &#8377;<strong>6,499</strong> (<strong>RECOMMENDED</strong>)</p></blockquote><div class="pullquote"><p> Use the coupon code "<strong>EARLYBIRD</strong>" for a discount.</p></div><h3>FAQs</h3><ul><li><p><strong>Start Date</strong>: August 2nd, 2024</p></li><li><p><strong>Discord</strong> : Starts 20th July.</p></li><li><p><strong>Live Class Schedule</strong>: </p><ul><li><p><strong>Web Dev</strong> : Saturdays and Sundays, 19:00 to 21:00 IST</p></li><li><p> <strong>Web3</strong> : Fridays, 19:00 to 21:00 IST.</p></li></ul></li><li><p><strong>Recordings Available</strong>: Yes, for all sessions.</p></li><li><p><strong>Prerequisites</strong>: </p><ul><li><p><strong>Web Dev</strong> : Basic knowledge of HTML, CSS, JavaScript.</p></li><li><p><strong>Web3</strong> : JavaScript and basic React.</p></li></ul></li><li><p><strong>Duration</strong>: 6 to 7 months </p></li><li><p><strong>Validity : </strong>3 years access to course materials.</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Decentralized Exchange In NodeJS]]></title><description><![CDATA[In this YouTube lecture, Harkirat provides an in-depth explanation of building a decentralized exchange (DEX) using Node.js. He contrasts traditional centralized exchanges with DEXs.]]></description><link>https://indiaremotejobs.substack.com/p/decentralized-exchange-in-nodejs</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/decentralized-exchange-in-nodejs</guid><pubDate>Wed, 26 Jun 2024 05:27:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/Wb6MmUa0bu0" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div id="youtube2-Wb6MmUa0bu0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Wb6MmUa0bu0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Wb6MmUa0bu0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>How do we Buy and Store Crypto</strong></h2><p>There are two main ways to buy and store cryptocurrencies:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><ol><li><p><strong>Centralized Exchanges (CEXs)</strong>: You can buy cryptocurrencies on centralized exchanges like Binance, Coinbase, WazirX, etc. These platforms allow you to track your balances and holdings in a user interface. However, the exchange essentially holds your crypto assets, and you don't have direct control over the private keys.</p></li><li><p><strong>Cold Storage Wallets</strong>: These are hardware wallets (like the one shown) or software wallets (browser extensions) that store your private keys, giving you complete ownership and control over your crypto assets. As long as you have access to the wallet, no one can take your money away or block your access.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kPbd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kPbd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 424w, https://substackcdn.com/image/fetch/$s_!kPbd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 848w, https://substackcdn.com/image/fetch/$s_!kPbd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 1272w, https://substackcdn.com/image/fetch/$s_!kPbd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kPbd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png" width="1420" height="555" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:555,&quot;width&quot;:1420,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:524122,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kPbd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 424w, https://substackcdn.com/image/fetch/$s_!kPbd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 848w, https://substackcdn.com/image/fetch/$s_!kPbd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 1272w, https://substackcdn.com/image/fetch/$s_!kPbd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb3632cf-ae41-4cf0-a3d9-e8cabeb95b5c_1420x555.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p></li></ol><p>Storing your crypto in a cold storage wallet is considered more secure as you directly own and control your assets, unlike centralized exchanges where the exchange holds your funds.</p><h2><strong>How Centralized Exchanges (CEXs) Work</strong></h2><p>A centralized exchange like Binance acts as an intermediary, facilitating the trading of cryptocurrencies between buyers and sellers. There are two main types of participants on a CEX:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ESqe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ESqe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 424w, https://substackcdn.com/image/fetch/$s_!ESqe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 848w, https://substackcdn.com/image/fetch/$s_!ESqe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 1272w, https://substackcdn.com/image/fetch/$s_!ESqe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ESqe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png" width="1420" height="799" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:799,&quot;width&quot;:1420,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:297245,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ESqe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 424w, https://substackcdn.com/image/fetch/$s_!ESqe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 848w, https://substackcdn.com/image/fetch/$s_!ESqe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 1272w, https://substackcdn.com/image/fetch/$s_!ESqe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44ef0b85-3c21-4093-9764-75bd1e6a04bb_1420x799.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p><strong>Market Makers</strong>: These are companies or traders that continuously place buy and sell orders for various cryptocurrencies based on algorithms that determine the fair price. They aim to buy at slightly lower prices and sell at slightly higher prices to make a profit.</p></li><li><p><strong>Retail Traders</strong>: These are individual traders who place buy or sell orders at the available market prices, without necessarily considering the fair price.</p></li></ol><p>The CEX's goal is to match the buy and sell orders from these two groups of participants and facilitate the exchange of assets, charging a small fee for each transaction.</p><p>Here's how a typical transaction works on a CEX:</p><ol><li><p>A retail trader sends their cryptocurrency (e.g., 1 ETH) from their personal wallet to the exchange's wallet address.</p></li><li><p>The exchange holds this 1 ETH in its wallet.</p></li><li><p>The retail trader can then use the exchange's interface to trade their 1 ETH for another cryptocurrency (e.g., USDC) or fiat currency (e.g., USD) at the current market rate.</p></li><li><p>The exchange matches the trader's order with available buy/sell orders from market makers or other traders.</p></li><li><p>The exchange facilitates the trade, taking a small fee from both parties involved in the transaction.</p></li></ol><blockquote><p>The main advantage of using a CEX is the ability to easily buy, sell, and trade cryptocurrencies, as well as the option to convert between cryptocurrencies and fiat currencies. However, users don't have direct control over their assets, as the exchange holds the private keys.</p></blockquote><div><hr></div><h2><strong>How Prices are Determined in a Market</strong></h2><p>The price of an asset or commodity in a market is primarily determined by the interplay of supply and demand forces. The key factors that influence price determination are:</p><ol><li><p><strong>Number of Buyers and Sellers</strong>: The more buyers there are for a particular asset, the higher the demand, which drives up the price. Conversely, if there are more sellers than buyers, the supply exceeds demand, leading to a decrease in price.</p></li><li><p><strong>Willingness to Buy or Sell</strong>: The price is also influenced by the eagerness or desperation of buyers and sellers. If buyers are more willing to pay a higher price, it will drive up the price. Similarly, if sellers are more desperate to sell quickly, they may accept a lower price.</p></li><li><p><strong>Competition</strong>: The presence of competition among sellers can lead to lower prices as they try to undercut each other to attract buyers. On the other hand, limited competition or a monopolistic market can result in higher prices.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OLhx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OLhx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 424w, https://substackcdn.com/image/fetch/$s_!OLhx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 848w, https://substackcdn.com/image/fetch/$s_!OLhx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 1272w, https://substackcdn.com/image/fetch/$s_!OLhx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OLhx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png" width="1420" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1420,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1310368,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!OLhx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 424w, https://substackcdn.com/image/fetch/$s_!OLhx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 848w, https://substackcdn.com/image/fetch/$s_!OLhx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 1272w, https://substackcdn.com/image/fetch/$s_!OLhx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F771dc4f3-d18f-46fe-97f0-aa50891dc363_1420x856.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li></ol><p>The process of price determination can be illustrated with an example of a housing market:</p><ul><li><p>Suppose there are 10 houses for sale in a neighborhood, and multiple potential buyers are interested.</p></li><li><p>Initially, sellers may list their houses at different prices, say $400,000, $380,000, and $420,000.</p></li><li><p>Buyers will evaluate these prices based on their willingness to pay and make offers accordingly.</p></li><li><p>If there are more interested buyers than available houses, buyers may start bidding higher prices to secure a house, driving up the prices.</p></li><li><p>Conversely, if there are more houses for sale than interested buyers, sellers may lower their prices to attract buyers, leading to a decrease in prices.</p></li><li><p>The equilibrium price is reached when the number of buyers willing to pay a certain price matches the number of sellers willing to sell at that price.</p></li></ul><blockquote><p>The price of an asset or commodity in a market is determined by the dynamic interaction of supply (number of sellers and their willingness to sell) and demand (number of buyers and their willingness to buy), as well as the level of competition among sellers.</p></blockquote><div><hr></div><h2>Some Jargons</h2><p></p><h3><strong>1] Broker and Order Book</strong></h3><p>In traditional financial markets, there is typically a broker who acts as an intermediary between buyers and sellers. The broker maintains an order book, which is a list of buy and sell orders from various market participants, along with the quantities and prices they are willing to trade at.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L1yC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L1yC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 424w, https://substackcdn.com/image/fetch/$s_!L1yC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 848w, https://substackcdn.com/image/fetch/$s_!L1yC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 1272w, https://substackcdn.com/image/fetch/$s_!L1yC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L1yC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png" width="1456" height="765" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:765,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:504745,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L1yC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 424w, https://substackcdn.com/image/fetch/$s_!L1yC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 848w, https://substackcdn.com/image/fetch/$s_!L1yC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 1272w, https://substackcdn.com/image/fetch/$s_!L1yC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59be4133-bfd7-477e-a9e9-631a31f56bd7_1600x841.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>2] Web2 vs Web3 and Gas Fees</strong></h3><p>In a Web2 (traditional centralized) system, maintaining an order book is feasible as there is a central authority (the exchange) that can process and match orders efficiently. However, in Web3 (decentralized blockchain-based systems), maintaining a traditional order book on-chain becomes impractical due to the gas fees associated with each transaction.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZfYz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZfYz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 424w, https://substackcdn.com/image/fetch/$s_!ZfYz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 848w, https://substackcdn.com/image/fetch/$s_!ZfYz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 1272w, https://substackcdn.com/image/fetch/$s_!ZfYz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZfYz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png" width="1400" height="788" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:788,&quot;width&quot;:1400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:270237,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZfYz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 424w, https://substackcdn.com/image/fetch/$s_!ZfYz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 848w, https://substackcdn.com/image/fetch/$s_!ZfYz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 1272w, https://substackcdn.com/image/fetch/$s_!ZfYz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7fb6d6db-f5b0-4d47-892b-5c93965a507d_1400x788.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h3><strong>3] Liquidity Pools and Automated Market Makers (AMMs)</strong></h3><p>To address this challenge, the concept of liquidity pools and automated market makers (AMMs) was introduced in decentralized finance (DeFi). Instead of an order book, liquidity is provided by participants who deposit pairs of assets (e.g., ETH and USDC) into a shared pool.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4NnZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4NnZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 424w, https://substackcdn.com/image/fetch/$s_!4NnZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 848w, https://substackcdn.com/image/fetch/$s_!4NnZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 1272w, https://substackcdn.com/image/fetch/$s_!4NnZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4NnZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png" width="1420" height="749" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:1420,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96663,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4NnZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 424w, https://substackcdn.com/image/fetch/$s_!4NnZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 848w, https://substackcdn.com/image/fetch/$s_!4NnZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 1272w, https://substackcdn.com/image/fetch/$s_!4NnZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27bbead9-4e94-4bab-ad65-9ebeff095d89_1420x749.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>The AMM algorithm determines the price of an asset based on the ratio of the assets in the pool, following the constant product formula: x * y = k, where x and y are the quantities of the two assets, and k is a constant.</p><h2><strong>Example</strong></h2><p>Consider a liquidity pool with 10 houses and 20 crores (CR) of cash. The initial constant product is 10 * 20 CR = 200 CR.</p><ul><li><p>If someone wants to buy a house, they must deposit cash into the pool, and the price of a house is determined by the constant product formula.</p></li><li><p>For example, if the first person deposits 2.22 CR, they receive 1 house, and the pool becomes 9 houses and 18 CR (9 * 18 CR = 162 CR).</p></li><li><p>The next person must deposit more cash to receive a house, as the constant product must be maintained (e.g., 2.78 CR for the next house, leaving 8 houses and 20.78 CR in the pool).</p></li></ul><p>As more assets are traded, the price of the remaining assets increases due to the constant product formula, incentivizing liquidity providers to add more assets to the pool.</p><div><hr></div><h2>Summary</h2><p>Automated market makers and liquidity pools enable decentralized trading without the need for a traditional order book or market makers. The constant product formula determines the price of assets based on the ratio of assets in the pool, allowing for efficient and gas-efficient trading on blockchain networks.</p><blockquote><p>The more liquidity (assets) in the pool, the smaller the price impact of individual trades, providing better pricing for users. This innovative approach addresses the challenges of maintaining order books on-chain and facilitates decentralized trading in DeFi ecosystems</p></blockquote><div><hr></div><h2>Difference between CEX and DEX</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hzej!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hzej!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 424w, https://substackcdn.com/image/fetch/$s_!Hzej!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 848w, https://substackcdn.com/image/fetch/$s_!Hzej!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 1272w, https://substackcdn.com/image/fetch/$s_!Hzej!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hzej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1235030,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Hzej!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 424w, https://substackcdn.com/image/fetch/$s_!Hzej!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 848w, https://substackcdn.com/image/fetch/$s_!Hzej!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 1272w, https://substackcdn.com/image/fetch/$s_!Hzej!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd30debff-4e02-4e4c-850d-59ca57c3bfd2_2000x1125.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2><strong>1] Centralized Exchanges (CEXs)</strong></h2><ul><li><p>Use traditional order books to match buy and sell orders</p></li><li><p>Rely on market makers to provide liquidity</p></li><li><p>Operated by a central authority that holds user funds</p></li><li><p>More efficient for high trading volumes</p></li><li><p>Users face counterparty risk as they don't control their assets</p></li></ul><h2><strong>2] Decentralized Exchanges (DEXs)</strong></h2><ul><li><p>No order books due to high gas fees for on-chain transactions</p></li><li><p>Use automated market makers (AMMs) and liquidity pools</p></li><li><p>Liquidity providers deposit asset pairs into shared pools</p></li><li><p>Prices determined by the constant product formula (x * y = k)</p></li><li><p>Decentralized, without a central authority controlling trades</p></li><li><p>Users maintain self-custody of their assets</p></li><li><p>May face liquidity challenges for less popular trading pairs</p></li></ul><div><hr></div><h2>Technical Implementation</h2><p>With the theoretical understanding of how automated market makers and liquidity pools work for decentralized exchanges, the next step is to implement this concept in code. The key is to create a server that supports the necessary operations for users to interact with the liquidity pool.</p><p>To bring the decentralized exchange to life, we need to develop an HTTP server that exposes the following endpoints:</p><ol><li><p><strong>Add Liquidity</strong>: This endpoint allows liquidity providers to deposit pairs of assets (e.g., ETH and USDC) into the shared liquidity pool, initializing or contributing to the constant product formula.</p></li><li><p><strong>Buy Asset</strong>: Users can call this endpoint to purchase an asset (e.g., a house) from the liquidity pool by providing the required amount of the other asset (e.g., USDC) based on the constant product formula.</p></li><li><p><strong>Sell Asset</strong>: Conversely, users can sell an asset they hold by calling this endpoint, receiving the corresponding amount of the other asset from the liquidity pool.</p></li><li><p><strong>Get Quote</strong>: Before executing a trade, users can call this endpoint to obtain a quote for the amount of assets they would receive or need to provide for a specific trade, based on the current state of the liquidity pool.</p></li></ol><p>By implementing these four core operations as HTTP endpoints, users and liquidity providers can seamlessly interact with the decentralized exchange, facilitating the trading of assets through the automated market maker mechanism</p><div><hr></div><h2>Setting up a Node.js Express Backend in TypeScript</h2><p>To begin implementing the decentralized exchange (DEX) using automated market makers (AMMs) and liquidity pools, we'll set up a Node.js backend with Express and TypeScript. Here's how you can get started:</p><ol><li><p><strong>Initialize a new Node.js project</strong>:</p></li></ol><pre><code><code>mkdir dex-project
cd dex-project
npm init -
</code></code></pre><ol><li><p><strong>Install required dependencies</strong>:</p></li></ol><pre><code><code>npm install express body-parser
npm install --save-dev typescript @types/node @types/expres
</code></code></pre><ol><li><p>We're installing <code>express</code> for the web server, <code>body-parser</code> to parse request bodies, <code>typescript</code> for TypeScript support, and the corresponding type definitions for Node.js and Express.</p></li><li><p><strong>Configure TypeScript</strong>:</p><ul><li><p>Create a <code>tsconfig.json</code> file in the project root with the following content:</p></li></ul></li></ol><pre><code><code>{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "outDir": "dist",
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*"]
}
</code></code></pre><ol><li><ul><li><p>This configuration sets up TypeScript to compile our code to ES6 JavaScript, with strict type checking and support for ES6 module interoperability.</p></li></ul></li><li><p><strong>Create the entry point</strong>:</p><ul><li><p>Create a <code>src</code> directory in the project root.</p></li><li><p>Inside the <code>src</code> directory, create an <code>index.ts</code> file with the following content:</p></li></ul></li></ol><pre><code><code>import express, { Request, Response } from 'express';
import bodyParser from 'body-parser';

const app = express();
const port = 3000;

app.use(bodyParser.json());

app.get('/', (req: Request, res: Response) =&gt; {
  res.send('Hello, DEX!');
});

app.listen(port, () =&gt; {
  console.log(`Server is running on port ${port}`);
});
</code></code></pre><ol><li><ul><li><p>This code sets up a basic Express server with a root route that responds with "Hello, DEX!".</p></li></ul></li><li><p><strong>Build and run the server</strong>:</p><ul><li><p>Open <code>package.json</code> and add the following scripts:</p></li></ul></li></ol><pre><code><code>"scripts": {
  "build": "tsc",
  "start": "node dist/index.js"
}
</code></code></pre><ol><li><ul><li><p>Run the build script to compile the TypeScript code:</p></li></ul></li></ol><pre><code><code>npm run build
</code></code></pre><ol><li><ul><li><p>Start the server:</p></li></ul></li></ol><pre><code><code>npm start
</code></code></pre><ol><li><ul><li><p>You should see the "Server is running on port 3000" message in the console.</p></li></ul></li></ol><p>Now you have a basic Node.js Express backend set up with TypeScript support. You can access the root route by visiting </p><p>http://localhost:3000</p><p> in your web browser.</p><h2>Core Backend Functionality</h2><p>Now that we have out <code>index.ts</code> file initialized, lets jump in to write the code for handling our backend routes of the DEX.</p><ol><li><p><strong>Importing Dependencies</strong>:</p></li></ol><pre><code><code>import express from "express";
</code></code></pre><ol><li><p>The code starts by importing the <code>express</code> module, which is a popular web application framework for Node.js.</p></li><li><p><strong>Setting up Express</strong>:</p></li></ol><pre><code><code>const app = express();
app.use(express.json());
</code></code></pre><ol><li><p>An instance of the Express application is created using <code>express()</code>, and the <code>app.use(express.json())</code> middleware is added to parse incoming JSON request bodies.</p></li><li><p><strong>Initializing Balances and Constant Product</strong>:</p></li></ol><pre><code><code>let ETH_BALANCE = 200;
let USDC_BALANCE = 700000;
const CONSTANT_PRODUCT = ETH_BALANCE * USDC_BALANCE; // 200 * 700000 = 140000000
</code></code></pre><ol><li><p>The initial balances of ETH and USDC in the liquidity pool are set to 200 and 700000, respectively. The <code>CONSTANT_PRODUCT</code> is calculated by multiplying these two values, which is 140000000. This constant product will be used to determine the prices of assets in the liquidity pool.</p></li><li><p><strong>Buy Asset Endpoint</strong>:</p></li></ol><pre><code><code>app.post("/buy-asset", (req, res) =&gt; {
    const quantity = req.body.quantity; // Quantity of ETH to buy
    const updatedEthQuantity = ETH_BALANCE - quantity;
    const updatedUsdcBalance = CONSTANT_PRODUCT / updatedEthQuantity;
    const paidAmount = USDC_BALANCE - updatedUsdcBalance;

    ETH_BALANCE = updatedEthQuantity;
    USDC_BALANCE = updatedUsdcBalance;

    res.json({
        message: `You paid ${paidAmount} USDC for ${quantity} ETH`
    });
});
</code></code></pre><ol><li><p>The <code>/buy-asset</code> endpoint is defined to handle requests for buying ETH from the liquidity pool.</p><ul><li><p>The quantity of ETH to buy is extracted from the request body (<code>req.body.quantity</code>).</p></li><li><p>The updated ETH quantity (<code>updatedEthQuantity</code>) is calculated by subtracting the requested quantity from the current <code>ETH_BALANCE</code>.</p></li><li><p>The updated USDC balance (<code>updatedUsdcBalance</code>) is calculated using the constant product formula: <code>CONSTANT_PRODUCT / updatedEthQuantity</code>.</p></li><li><p>The amount of USDC paid (<code>paidAmount</code>) is calculated by subtracting the <code>updatedUsdcBalance</code> from the current <code>USDC_BALANCE</code>.</p></li><li><p>The <code>ETH_BALANCE</code> and <code>USDC_BALANCE</code> are updated with the new values.</p></li><li><p>A JSON response is sent back with a message indicating the amount of USDC paid and the quantity of ETH received.</p></li></ul></li><li><p><strong>Sell Asset Endpoint</strong>:</p></li></ol><pre><code><code>app.post("/sell-asset", (req, res) =&gt; {
    const quantity = req.body.quantity; // Quantity of ETH to sell
    const updatedEthQuantity = ETH_BALANCE + quantity;
    const updatedUsdcBalance = CONSTANT_PRODUCT / updatedEthQuantity;
    const gottenUsdc = USDC_BALANCE - updatedUsdcBalance;

    ETH_BALANCE = updatedEthQuantity;
    USDC_BALANCE = updatedUsdcBalance;

    res.json({
        message: `You got ${gottenUsdc} USDC for ${quantity} ETH`
    });
});
</code></code></pre><ol><li><p>The <code>/sell-asset</code> endpoint is defined to handle requests for selling ETH to the liquidity pool.</p><ul><li><p>The quantity of ETH to sell is extracted from the request body (<code>req.body.quantity</code>).</p></li><li><p>The updated ETH quantity (<code>updatedEthQuantity</code>) is calculated by adding the requested quantity to the current <code>ETH_BALANCE</code>.</p></li><li><p>The updated USDC balance (<code>updatedUsdcBalance</code>) is calculated using the constant product formula: <code>CONSTANT_PRODUCT / updatedEthQuantity</code>.</p></li><li><p>The amount of USDC received (<code>gottenUsdc</code>) is calculated by subtracting the <code>updatedUsdcBalance</code> from the current <code>USDC_BALANCE</code>.</p></li><li><p>The <code>ETH_BALANCE</code> and <code>USDC_BALANCE</code> are updated with the new values.</p></li><li><p>A JSON response is sent back with a message indicating the amount of USDC received and the quantity of ETH sold.</p></li></ul></li><li><p><strong>Starting the Server</strong>:</p></li></ol><pre><code><code>app.listen(3000, () =&gt; {
    console.log("Server is running on port 3000");
});
</code></code></pre><ol><li><p>The <code>app.listen(3000, ...)</code> method is called to start the server and listen for incoming requests on port 3000. A callback function is provided to log a message when the server starts.</p></li></ol><blockquote><p>This implementation follows the constant product formula for automated market makers (AMMs) to determine the prices of assets in the liquidity pool. As assets are bought or sold, the balances of ETH and USDC are updated accordingly, and the prices adjust based on the constant product formula.</p></blockquote><div><hr></div><h2>Working</h2><p>Here's how the constant product formula works:</p><ul><li><p>The initial constant product is calculated as <code>ETH_BALANCE * USDC_BALANCE</code>, which is 140000000 in this case.</p></li><li><p>When a user wants to buy ETH, the quantity is subtracted from the current <code>ETH_BALANCE</code>, and the updated USDC balance is calculated as <code>CONSTANT_PRODUCT / updatedEthQuantity</code>.</p></li><li><p>When a user wants to sell ETH, the quantity is added to the current <code>ETH_BALANCE</code>, and the updated USDC balance is calculated as <code>CONSTANT_PRODUCT / updatedEthQuantity</code>.</p></li></ul><p>The constant product formula ensures that as one asset is bought or sold, the price of the other asset adjusts accordingly, maintaining the constant product value. This mechanism allows for decentralized trading without the need for traditional order books or market makers.</p><div><hr></div><h2>Testing</h2><p>As we see in Postman, the dynamic pricing behavior of the automated market maker (AMM) implementation is demonstrated.</p><ul><li><p>When the user repeatedly sold ETH to the liquidity pool, the amount of USDC received decreased with each subsequent sale, reflecting the changing ratio of ETH to USDC in the pool based on the constant product formula.</p></li><li><p>Conversely, if another user were to start buying ETH, the price would increase due to the reduced supply of ETH in the pool. This real-time adjustment of prices based on supply and demand is a core feature of AMMs, enabling decentralized trading without the need for traditional order books or market makers.</p></li></ul><blockquote><p>The testing in Postman showcased how the constant product formula automatically rebalances asset prices in the liquidity pool as assets are bought and sold, maintaining an equilibrium through the market-making mechanism.</p></blockquote><div><hr></div><h2>Further Reference</h2><p>You can also refer to the Drift Protocol, an open-source decentralized exchange (DEX) built on the Solana blockchain. It combines different mechanisms like an order book, liquidity pools, and potentially other components to facilitate trading and swapping of assets. Despite being a DEX, it still incorporates an order book mechanism, which is more feasible on a high-throughput blockchain like Solana compared to Ethereum due to lower transaction costs.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Announcing the Launch of MERN+DevOps+System Design Cohort !]]></title><description><![CDATA[Exciting news for aspiring developers and tech enthusiasts!]]></description><link>https://indiaremotejobs.substack.com/p/announcing-the-launch-of-merndevopssystem</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/announcing-the-launch-of-merndevopssystem</guid><pubDate>Tue, 14 Nov 2023 09:04:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/hfqotwc1gfk" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3><strong>Exciting news for aspiring developers and tech enthusiasts!</strong> </h3><p>We're thrilled to announce the launch of our new and improved <a href="https://harkirat.classx.co.in/new-courses">MERN+DevOps+System Design cohort</a>. <br>Building on the success of our previous cohort, which received overwhelmingly positive feedback, check out the feedback here: <strong><a href="https://docs.google.com/spreadsheets/d/1IwHEaBd8f_ABeZ88M8TCxbBlDMNxJ6dgs9YJr-0is2w/edit#gid=0">FEEDBACKS</a></strong><br>we've made significant enhancements to make our course even more accessible and valuable.</p><div id="youtube2-hfqotwc1gfk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;hfqotwc1gfk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/hfqotwc1gfk?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3><strong>Addressing Your Feedback</strong></h3><p>Your feedback is invaluable to us, and we've taken two major points to heart:</p><ol><li><p><strong>Course Pricing:</strong> We understand that affordability is key. That's why we've slashed our prices &#8211; the course now starts at just 3199 INR!</p></li><li><p><strong>Beginner Friendliness:</strong> We've heard your requests for a more beginner-friendly approach. As a result, we've divided our cohort into two parts:</p></li></ol><ul><li><p> 0-1 for beginners and </p></li><li><p>1-100 for more advanced learners.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://harkirat.classx.co.in/new-courses" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nqiW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 424w, https://substackcdn.com/image/fetch/$s_!nqiW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 848w, https://substackcdn.com/image/fetch/$s_!nqiW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 1272w, https://substackcdn.com/image/fetch/$s_!nqiW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nqiW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png" width="1456" height="696" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:696,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:583173,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://harkirat.classx.co.in/new-courses&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nqiW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 424w, https://substackcdn.com/image/fetch/$s_!nqiW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 848w, https://substackcdn.com/image/fetch/$s_!nqiW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 1272w, https://substackcdn.com/image/fetch/$s_!nqiW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa076ce17-c811-49d8-aeb5-b579485f1ad5_1691x808.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>0-1 Cohort: A Strong Foundation for Beginners</strong></h3><p>Our 0-1 cohort is specially designed for those just starting their journey in tech. Here's a glimpse of what you'll learn:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://harkirat.classx.co.in/new-courses" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aefW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 424w, https://substackcdn.com/image/fetch/$s_!aefW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 848w, https://substackcdn.com/image/fetch/$s_!aefW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 1272w, https://substackcdn.com/image/fetch/$s_!aefW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aefW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png" width="1456" height="685" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:685,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:327447,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://harkirat.classx.co.in/new-courses&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aefW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 424w, https://substackcdn.com/image/fetch/$s_!aefW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 848w, https://substackcdn.com/image/fetch/$s_!aefW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 1272w, https://substackcdn.com/image/fetch/$s_!aefW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7655ecc3-b6f6-4b4b-8407-7c6fc362d2d0_1680x790.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>Foundation Javascript:</strong> From basics to the async nature of JS.</p></li><li><p><strong>Node.js:</strong> Understanding its runtime.</p></li><li><p><strong>Databases:</strong> Both NoSQL and SQL, with deep dives into Mongo and Postgres.</p></li><li><p><strong>Typescript:</strong> From beginner to advanced levels.</p></li><li><p><strong>Backend Skills:</strong> Including communication protocols, Express, ORMs, and more.</p></li><li><p><strong>Frontend Essentials:</strong> Covering React, state management, CSS, Tailwind, and more.</p></li><li><p><strong>Basic DevOps:</strong> Get hands-on with Docker, AWS, Nginx, and newer cloud technologies.</p></li><li><p><strong>Projects:</strong> Practical experience with GSoC projects, building Paytm/Wallet from scratch.</p></li></ul><div><hr></div><h3><strong>1-100 Cohort: Advanced Skills for Seasoned Learners</strong></h3><p>For those familiar with our 0-1 syllabus or previous cohort participants, the 1-100 section offers advanced learning</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://harkirat.classx.co.in/new-courses" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y9V4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 424w, https://substackcdn.com/image/fetch/$s_!y9V4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 848w, https://substackcdn.com/image/fetch/$s_!y9V4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 1272w, https://substackcdn.com/image/fetch/$s_!y9V4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y9V4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png" width="1456" height="578" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:578,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:330378,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://harkirat.classx.co.in/new-courses&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y9V4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 424w, https://substackcdn.com/image/fetch/$s_!y9V4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 848w, https://substackcdn.com/image/fetch/$s_!y9V4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 1272w, https://substackcdn.com/image/fetch/$s_!y9V4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb847588c-5fb1-4c13-b1b7-ad01c8183710_1707x678.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p><strong>Advanced Backend, System Design</strong></p><ol><li><p>Advanced backend communication</p></li><li><p>Message queues and PubSubs</p></li><li><p>Proxies, Load balancers</p></li><li><p>Redis Deep dive</p></li><li><p>Kafka Deep dive</p></li><li><p>Common Design Patterns in JS</p></li><li><p>Advanced DB concepts (Indexing, normalization)</p></li><li><p>Rate limitting</p></li><li><p>Captchas and DDoS protection</p></li><li><p>Sharding, Replication, Resiliency</p></li><li><p>Horizontal and vertical scaling</p></li><li><p>Polling and websockets</p></li><li><p>Grpc</p></li><li><p>Capacity Estimation</p></li><li><p>Load Balancers</p></li><li><p>CAP Theorem</p></li><li><p>Testing Node.js Apps in 2023</p></li><li><p>Real time communication, basics of WebRTC</p></li></ol><p><strong>Advanced Devops</strong></p><ol><li><p>Container Orchestration, Docker Swarm</p></li><li><p>Kubernetes</p></li><li><p>CI/CD</p></li><li><p>Monitoring systems basics to advance</p></li><li><p>Promhetheus, Grafana</p></li><li><p>Newrelic as a paid service</p></li><li><p>Serverless Deep dive</p></li><li><p>AWS Constructs (EC2, S3, CDNs, LB, EKS)</p></li></ol><p><strong>Projects</strong></p><ol><li><p><strong>Zerodha</strong> end to end</p></li><li><p><strong>Zapier</strong> end to end</p></li><li><p>Real world open source projects</p></li></ol></li></ul><div class="pullquote"><p><em><strong>Pricing and Offers</strong></em></p><p><strong>0-1 Cohort:</strong> <strong><a href="https://harkirat.classx.co.in/new-courses">3199 INR!</a></strong></p><p><strong>1-100 Cohort:</strong> <strong><a href="https://harkirat.classx.co.in/new-courses">3699 INR!</a></strong></p><p><strong><a href="https://harkirat.classx.co.in/new-courses">Combo Offer:</a></strong><a href="https://harkirat.classx.co.in/new-courses"> Get both for </a><strong><a href="https://harkirat.classx.co.in/new-courses">4999 INR!</a></strong></p><p>here: <a href="https://harkirat.classx.co.in/new-courses">https://harkirat.classx.co.in/new-courses</a></p></div><h2>Are there any Prerequisites?</h2><div id="youtube2--fErHJwbGFY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-fErHJwbGFY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/-fErHJwbGFY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3><strong>Don't Miss Out!</strong></h3><p>Our Early Bird + Diwali offer ends on 15th November. Prices might rise after this date, so hurry to secure your spot at these amazing rates. This is your chance to upskill and stay ahead in the tech world. Join us and embark on a journey of learning and growth with our expert-led MERN+DevOps+System Design cohort.</p><p><a href="https://harkirat.classx.co.in/new-courses">Enroll now</a> and transform your tech skills! &#128640;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/announcing-the-launch-of-merndevopssystem/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/announcing-the-launch-of-merndevopssystem/comments"><span>Leave a comment</span></a></p>]]></content:encoded></item><item><title><![CDATA[How I Earned 35 Lakhs INR in One Month!]]></title><description><![CDATA[Harkirat takes us on a journey through the world of freelancing, sharing his experiences of managing multiple commitments and offering valuable insights into earnings as a seasoned software dev.]]></description><link>https://indiaremotejobs.substack.com/p/how-i-earned-35-lakhs-inr-in-one</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/how-i-earned-35-lakhs-inr-in-one</guid><pubDate>Mon, 23 Oct 2023 21:03:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/kVH5EKJFR2c" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><div id="youtube2-kVH5EKJFR2c" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;kVH5EKJFR2c&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/kVH5EKJFR2c?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>Introduction</strong></h2><p>In today's blog, we will delve into the world of freelancing through the eyes of Harkirat. Harkirat will take us on a journey to answer some of the most pressing questions in the freelancing realm. Can one successfully work for multiple companies simultaneously? What kind of income is possible when dedicating a hundred hours a week to freelancing? And, most intriguingly, what was Harkirat's biggest freelancing month, and how much did he make? </p><div><hr></div><h2><strong>Understanding the Freelancing Landscape:</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pHzN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pHzN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pHzN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pHzN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pHzN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pHzN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Complete Guide to Freelancing in 2023 | Zero To Mastery&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Complete Guide to Freelancing in 2023 | Zero To Mastery" title="The Complete Guide to Freelancing in 2023 | Zero To Mastery" srcset="https://substackcdn.com/image/fetch/$s_!pHzN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pHzN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pHzN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pHzN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0b1be4f-f5ee-4e7c-83ad-02f85c948671_1920x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Before we dive into the details, it's crucial to acknowledge a few disclaimers. Like any video, Harkirat's insights come with a few important notes. <br>Freelancing can be demanding and isn't for everyone. However, if you're here seeking motivation or keen to understand the earnings of a remote software developer, especially one who's working for multiple companies, then read on.</p><div><hr></div><h2><strong>Harkirat's Pinnacle: July 2022</strong></h2><p>Let's rewind the clock to July 2022, a significant milestone in Harkirat's freelancing journey. At the time, he was juggling a full-time job, one he's discussed in previous content. His base salary was around $17,000 per month. But, he didn't stop there. He was also actively involved in freelancing projects, making July an exceptionally busy month.</p><h3><strong>Exploring Roles and Commitments</strong></h3><p>The responsibilities, the technologies he worked with, and the intricacies of each commitment.</p><ol><li><p><strong>Full-Time Job as Lead Video Engineer:</strong></p><ul><li><p>Backend and Deep Tech</p><ul><li><p>A lot of Typescript and Node.js, little bit of React.js</p></li><li><p>Low Latency WebRTC role.</p></li></ul></li></ul></li><li><p><strong>The Second Part-Time Commitment:</strong></p><ul><li><p>5 Hours/Week and $125/Hour</p><ul><li><p>The initial commitment was 20 hours/week, for two months And after that it was 5 hours/week, incase anything goes down, they had him on retainer.</p></li></ul></li></ul></li><li><p><strong>The Third Project: Specializing in WebRTC:</strong></p><ul><li><p>20 hours/Week and $150/hour</p><ul><li><p>Pure WebRTC, Building a Video System from Scratch</p></li></ul></li></ul></li><li><p><strong>The Fourth Company: A Full-Time Endeavor:</strong></p><ul><li><p>40 hours/week </p><ul><li><p>Pure Fullstack project in MERN stack. </p></li><li><p>Delving into Compliance and Legal Financing</p></li><li><p>This Finance startup company in Europe gave better learning than a giant corporate </p></li></ul></li></ul></li></ol><blockquote><h2><strong>Quantifying Earnings:</strong></h2><p><strong>Adding things up it was: $3000 + $15000 + $7500 + $15000 = $40,500</strong></p></blockquote><div><hr></div><p><strong>The Evolution of Harkirat's Freelancing Journey:</strong></p><p>Harkirat shares his journey, which began at $30 an hour in March 2020 and gradually progressed to $150 an hour. He highlights how his weekly work hours expanded from 40 hours to a remarkable 100 hours. However, he emphasizes that maintaining such an intense freelancing lifestyle isn't sustainable in the long term. Freelancing can be demanding, and effective management is crucial.</p><div><hr></div><h2><strong>Key Takeaways and Conclusion</strong></h2><p>In conclusion, Harkirat stresses that freelancing offers an excellent opportunity for skilled software developers to earn a premium for their expertise. Whether you're based in India or elsewhere, your specialized knowledge can be a valuable asset. </p><blockquote><p>He advises that, as a freelancer, one must handle the legal aspects properly, set clear expectations, and always remember that their skills are highly sought after.</p></blockquote><blockquote><p>hoping that this insight into his freelancing journey serves as a valuable resource for those considering freelancing as a career option.</p><div><hr></div></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/how-i-earned-35-lakhs-inr-in-one/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/how-i-earned-35-lakhs-inr-in-one/comments"><span>Leave a comment</span></a></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[How AI will change the 9-5 Job!]]></title><description><![CDATA[how AI automation is poised to revolutionize our daily tasks, making our workday more efficient and dynamic. Discover the solutions, challenges, and exciting developments in this ever-evolving field.]]></description><link>https://indiaremotejobs.substack.com/p/how-ai-will-change-the-9-5-job</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/how-ai-will-change-the-9-5-job</guid><pubDate>Mon, 25 Sep 2023 21:13:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/FDAs9mU8X5M" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/watch?v=FDAs9mU8X5M&quot;,&quot;text&quot;:&quot;Watch now on Youtube&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.youtube.com/watch?v=FDAs9mU8X5M"><span>Watch now on Youtube</span></a></p><div><hr></div><h2>1. Scope of AI in My Routine</h2><p>My workday primarily revolves around programming, dedicating 8 to 10 hours a day to coding. Additionally, I handle filmmaking tasks and manage this YouTube channel, which involves shooting, editing, and various operational activities. <br>I've identified two tasks within my daily routine that could be effectively outsourced to AI.</p><ol><li><p><strong>Coding Assistance</strong>: While I remain the architect of the applications I develop, there are instances where I can envision how code should be written. Instead of manually typing it, I believe I should be able to explain my intentions to an AI, which can generate the code for me. This is already possible to some extent using AI models like ChatGPT.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XIMn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XIMn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XIMn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XIMn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XIMn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XIMn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg" width="602" height="429" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:429,&quot;width&quot;:602,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Can a chat GPT write code? - Quora&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Can a chat GPT write code? - Quora" title="Can a chat GPT write code? - Quora" srcset="https://substackcdn.com/image/fetch/$s_!XIMn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XIMn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XIMn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XIMn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc64aa05-1122-4d48-86c9-bfd9f11797ec_602x429.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div></li><li><p><strong>Video Editing and Channel Management</strong>: Video editing and managing a YouTube channel involve a lot of manual work, from reviewing videos to analyzing performance data. An AI could monitor my channel, recommend thumbnail and title changes, and handle some editing tasks, reducing my involvement in these aspects.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v4Jf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v4Jf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 424w, https://substackcdn.com/image/fetch/$s_!v4Jf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 848w, https://substackcdn.com/image/fetch/$s_!v4Jf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 1272w, https://substackcdn.com/image/fetch/$s_!v4Jf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v4Jf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png" width="1456" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:757407,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!v4Jf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 424w, https://substackcdn.com/image/fetch/$s_!v4Jf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 848w, https://substackcdn.com/image/fetch/$s_!v4Jf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 1272w, https://substackcdn.com/image/fetch/$s_!v4Jf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ade8f6-0d02-4f04-bfee-9c8cd31a90a8_1756x820.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></li></ol><div><hr></div><h1>2. Current Limitations of AI</h1><p>Before we delve into the potential solutions and the future, it's essential to acknowledge the limitations of current AI technologies.</p><ol><li><p><strong>Time Limitations of ChatGPT</strong>: While ChatGPT is a powerful tool, it has its limitations. It might not understand newer programming libraries or offer outdated syntax. This issue is expected to be resolved as AI models improve over time.</p></li><li><p><strong>AI's Text-Centric Nature</strong>: Current AI models primarily understand text and lack the ability to comprehend other data types like video, files, or computer interfaces. Integrating these capabilities into AI systems is a challenge.</p></li><li><p><strong>Static Nature of AI</strong>: AI systems typically respond to specific queries but don't proactively seek solutions or identify problems independently. They lack the dynamic problem-solving abilities that humans possess.</p></li><li><p><strong>Lack of Chaining in AI</strong>: Most AI models provide discrete responses to queries and don't naturally chain tasks together. This limits their ability to handle complex, multi-step tasks seamlessly.</p></li></ol><div><hr></div><h1>3. Solutions !</h1><div id="youtube2-FDAs9mU8X5M" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;FDAs9mU8X5M&quot;,&quot;startTime&quot;:&quot;339&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/FDAs9mU8X5M?start=339&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong>Refer to the above video to know possible targets and solutions.</strong></p><div><hr></div><h2>4. Companies and Projects to get Started !</h2><p>If you're interested in this evolving field of AI, here are some companies and projects worth keeping an eye on:</p><ol><li><p><strong><a href="https://github.com/langchain-ai/langchain">Langchain</a></strong>: <a href="https://github.com/langchain-ai/langchain">Langchain</a> allows you to create agents that can offload tasks to other agents, making it a powerful tool for context-aware automation.</p></li><li><p><strong><a href="https://github.com/smol-ai">smolAI</a></strong>: This project focuses on generating code for specific websites and can iteratively improve the code based on user feedback. It's a great example of AI-assisted web development.</p></li><li><p><strong>Private AI Models</strong>: Keep an eye on companies developing AI models that respect user privacy by hosting them privately. This addresses concerns about data privacy and AI usage.</p><div class="pullquote"><p>In conclusion, the future of work, especially in fields like programming and content creation, is set to be transformed by AI. The limitations of today are being actively addressed, and we can expect more capable and dynamic AI systems in the near future. By staying informed and exploring projects like Langchain and smolAI, you can be at the forefront of this AI-powered revolution. I'm optimistic about the potential benefits this will bring to my workday and to many other industries. Let's keep an eye on these developments and see how they unfold in the coming months and years.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/how-ai-will-change-the-9-5-job/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/how-ai-will-change-the-9-5-job/comments"><span>Leave a comment</span></a></p></li></ol><div><hr></div>]]></content:encoded></item><item><title><![CDATA[GSOC 2024 Complete Roadmap-Takeaways!]]></title><description><![CDATA[Whether you're interested in GSoC or pursuing a career in open source, the roadmap about to outline can serve as a valuable guide.]]></description><link>https://indiaremotejobs.substack.com/p/gsoc-2024-complete-roadmap-takeaways</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/gsoc-2024-complete-roadmap-takeaways</guid><pubDate>Wed, 13 Sep 2023 22:04:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/5XRadxa0CfY" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://youtu.be/5XRadxa0CfY&quot;,&quot;text&quot;:&quot;Watch now on Youtube&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://youtu.be/5XRadxa0CfY"><span>Watch now on Youtube</span></a></p><div><hr></div><h2>Introduction</h2><p>This journey, which began nearly eight years ago, can be traced back to a single decision I made in college&#8212;to apply for Google Summer of Code (GSoC). At the time, I was presented with two high-level paths: algorithms and development. I chose the latter, setting in motion a series of events that would shape my career in software development.</p><p>In this blog, I want to take you through a journey as if I were a college student gearing up for the next season. Whether you're interested in GSoC or pursuing a career in open source, the roadmap I'm about to outline can serve as a valuable guide.</p><div><hr></div><div id="youtube2-5XRadxa0CfY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;5XRadxa0CfY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/5XRadxa0CfY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2><strong>1. Choose Your Tech Stack</strong> </h2><p>The first step in your GSoC journey is to select a technology stack to focus on. Four general stacks are popular in GSoC organizations:</p><ul><li><p> JavaScript/TypeScript </p></li><li><p>Python</p></li><li><p>Java, and</p></li><li><p>C++</p></li></ul><p>Each has its unique advantages and potential career implications. Choose the one that aligns with your long-term goals and start learning it.</p><div><hr></div><h2><strong>2. Find and Contribute to Organizations</strong> </h2><p>Identify at least two organizations that align with your chosen tech stack. Building a good reputation within these organizations is key. Start by solving small issues, introducing yourself in their community channels, and making your presence felt. </p><blockquote><p>By the time January rolls around, maintainers should recognize you as a valuable contributor.</p></blockquote><div><hr></div><h2><strong>3. Be Aggressive with Contributions</strong> </h2><p>As the new year begins, step up your contributions. Take on bigger tasks, and demonstrate your ability to work independently. </p><blockquote><p>While many newcomers flood in during January, your early reputation and contributions can set you apart. <strong>Continue actively contributing until the results are announced.</strong></p></blockquote><div><hr></div><h2><strong>4. Create Polished Proposals</strong></h2><p> Around February, start working on your GSoC proposals. Aim to submit two to three proposals across different organizations. </p><p>While the proposal is essential, remember that your contributions speak volumes. A well-crafted proposal is the final piece of the puzzle, <strong>but it should not be the sole focus of your efforts.</strong></p><div><hr></div><h2><strong>A Few Don&#8217;ts to Keep in Mind!</strong></h2><ul><li><p>Don't be overly aggressive or pushy in your communications with maintainers.</p></li><li><p>Don't give the impression that you're only interested in GSoC; focus on building your open source profile.</p></li><li><p>Don't bombard maintainers with questions, especially for local setup issues.</p></li><li><p>Don't tackle huge issues right away; gradually build up to larger tasks.</p></li><li><p>Always maintain politeness and clarity in your interactions.</p></li></ul><div><hr></div><div class="pullquote"><p>In your GSoC journey, remember that <strong>contributions matter most</strong>, followed by your reputation with maintainers, and then the quality of your proposal. Luck, timing, and other factors also play a role. Even if you don't make it into GSoC, the knowledge and experience gained through this process can be invaluable for your long-term career in software development.</p><p>Your journey might lead to your own <strong>"butterfly effect"</strong> moment that propels your career to new heights.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/gsoc-2024-complete-roadmap-takeaways/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/gsoc-2024-complete-roadmap-takeaways/comments"><span>Leave a comment</span></a></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[The Latest Tech Stack: Building a Modern Full Stack Application]]></title><description><![CDATA[We'll break it down into five key components: front end, back end, deployment, monitoring, and the database. By the end of this article, you'll have a clear picture of what technologies are trending a]]></description><link>https://indiaremotejobs.substack.com/p/the-latest-tech-stack-building-a</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/the-latest-tech-stack-building-a</guid><pubDate>Wed, 13 Sep 2023 21:45:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/Aih05VGzE-o" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><h3><strong>1. The Back End: Rust, Golang, or Node.js</strong> </h3><p>When it comes to the back end, you have a choice: Rust, Golang, or Node.js. Rust and Golang </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jb4r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jb4r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 424w, https://substackcdn.com/image/fetch/$s_!jb4r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 848w, https://substackcdn.com/image/fetch/$s_!jb4r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 1272w, https://substackcdn.com/image/fetch/$s_!jb4r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jb4r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp" width="638" height="358.875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:800,&quot;resizeWidth&quot;:638,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Node.js vs Golang: Compared Over 6 Key Areas | Boot.dev&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Node.js vs Golang: Compared Over 6 Key Areas | Boot.dev" title="Node.js vs Golang: Compared Over 6 Key Areas | Boot.dev" srcset="https://substackcdn.com/image/fetch/$s_!jb4r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 424w, https://substackcdn.com/image/fetch/$s_!jb4r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 848w, https://substackcdn.com/image/fetch/$s_!jb4r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 1272w, https://substackcdn.com/image/fetch/$s_!jb4r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b33381a-07b2-41a3-9ee6-205a63abe642_800x450.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>all of them offer speed, low-level control, and multi-threading capabilities, making them ideal for performance-critical applications. If you opt for Node.js, consider using Next.js for backend routes.</p><div><hr></div><h3><strong>2. The Front End: Next.js</strong> </h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w-mO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w-mO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 424w, https://substackcdn.com/image/fetch/$s_!w-mO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 848w, https://substackcdn.com/image/fetch/$s_!w-mO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 1272w, https://substackcdn.com/image/fetch/$s_!w-mO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w-mO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png" width="406" height="270.6666666666667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:720,&quot;resizeWidth&quot;:406,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Next.JS CMS - The Best Headless CMS for Next.JS Apps&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Next.JS CMS - The Best Headless CMS for Next.JS Apps" title="Next.JS CMS - The Best Headless CMS for Next.JS Apps" srcset="https://substackcdn.com/image/fetch/$s_!w-mO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 424w, https://substackcdn.com/image/fetch/$s_!w-mO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 848w, https://substackcdn.com/image/fetch/$s_!w-mO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 1272w, https://substackcdn.com/image/fetch/$s_!w-mO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb1d8203-8527-4116-a087-fe3c0d83cadf_720x480.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The front end has seen a shift towards Next.js, specifically Next.js 13. It introduces features like server-side components and client-side components, making it an exciting choice. Embrace TypeScript for strict typing and consider using Tailwind CSS for styling.</p><div><hr></div><h3><strong>3. State Management: Recoil</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sg9K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sg9K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 424w, https://substackcdn.com/image/fetch/$s_!sg9K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 848w, https://substackcdn.com/image/fetch/$s_!sg9K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 1272w, https://substackcdn.com/image/fetch/$s_!sg9K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sg9K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png" width="445" height="158.16976127320956" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:134,&quot;width&quot;:377,&quot;resizeWidth&quot;:445,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Recoil&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Recoil" title="Recoil" srcset="https://substackcdn.com/image/fetch/$s_!sg9K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 424w, https://substackcdn.com/image/fetch/$s_!sg9K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 848w, https://substackcdn.com/image/fetch/$s_!sg9K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 1272w, https://substackcdn.com/image/fetch/$s_!sg9K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F333fc1f6-11b1-456d-a138-1b173c6427b8_377x134.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p> For state management on the front end, Recoil is gaining popularity. It offers a robust solution for managing application state efficiently.</p><div><hr></div><div id="youtube2-Aih05VGzE-o" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Aih05VGzE-o&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Aih05VGzE-o?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3>Follow the video to know about:</h3><ul><li><p><strong>Databases</strong></p></li><li><p><strong>Deployment</strong></p></li><li><p><strong>Authentication and Monitoring</strong></p></li></ul><div><hr></div><h2><strong>The Project</strong></h2><p>To put these concepts into practice, check out the open-source project <strong><a href="https://dub.co/">dub.sh</a></strong>. It's a link-tracking application, similar to Bitly, built with the stack we discussed.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cgYt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cgYt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 424w, https://substackcdn.com/image/fetch/$s_!cgYt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 848w, https://substackcdn.com/image/fetch/$s_!cgYt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!cgYt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cgYt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png" width="1456" height="767" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:767,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!cgYt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 424w, https://substackcdn.com/image/fetch/$s_!cgYt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 848w, https://substackcdn.com/image/fetch/$s_!cgYt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 1272w, https://substackcdn.com/image/fetch/$s_!cgYt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a31ae4-ec18-41d5-a421-6c134f1c770d_2015x1062.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It's an excellent resource to gain hands-on experience with modern full-stack development.</p><div><hr></div><h3>Conclusion:</h3><p> In the ever-evolving landscape of software development, staying updated with the latest technologies is crucial. The stack we've explored today represents a modern approach to full-stack development, but remember that trends may shift.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/the-latest-tech-stack-building-a/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/the-latest-tech-stack-building-a/comments"><span>Leave a comment</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Teachers' Day Offer]]></title><description><![CDATA[This is the last call for the Full Stack Web Dev cohort if you've been wanting to join.]]></description><link>https://indiaremotejobs.substack.com/p/teachers-day-offer</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/teachers-day-offer</guid><pubDate>Tue, 05 Sep 2023 12:50:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Mq4N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><h1>1. ALERT!</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Mq4N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mq4N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Mq4N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Mq4N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Mq4N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mq4N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg" width="640" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1080,&quot;resizeWidth&quot;:640,&quot;bytes&quot;:94016,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Mq4N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Mq4N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Mq4N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Mq4N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f8595e3-b20c-423a-8c9f-e0129770e32c_1080x1080.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p>This is the last call for the <strong>Full Stack Web Dev cohort</strong> if you've been wanting to join. We're done with 13 weeks and have ~8 more weeks to go. Only join if you're comfortable with React already. Otherwise please wait for the next one. <br><br><strong>Use code TEACHERSDAY for 25% discount</strong>.</p></blockquote><p></p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://harkirat.classx.co.in/new-courses/2&quot;,&quot;text&quot;:&quot;Purchase Now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://harkirat.classx.co.in/new-courses/2"><span>Purchase Now</span></a></p><div><hr></div><h2>2. Syallbus of the Cohort</h2><p>The cohort syllabus has been as follows until now:</p><ul><li><p>Week 1</p><ul><li><p>JS, Pre-requisites, Async JS</p></li></ul></li><li><p>Week 2</p><ul><li><p>Backend (Express, Node.js, middlewares)</p></li><li><p>Auth using JWT</p></li><li><p>Databases, MongoDB</p></li></ul></li><li><p>Week 3</p><ul><li><p>Archaic Frontends</p></li><li><p>Introduction to reconcilers, building our own reconciler</p></li></ul></li><li><p>Week 4</p><ul><li><p>React, Custom hooks, Basic hooks</p></li></ul></li><li><p>Week 5</p><ul><li><p>Consolidation, axios, mui</p></li><li><p>Building TO-DO app</p></li><li><p>Context, Recoil, prop drilling</p></li></ul></li><li><p>Week 6 (<strong>Break</strong>)</p><ul><li><p>peer-to-peer WebRTC</p></li><li><p>Building a Google meet Clone</p></li></ul></li><li><p>Week 7</p><ul><li><p>state management using recoil</p></li><li><p>intro to TypeScript</p></li><li><p>Moving from JS to TS</p></li></ul></li><li><p>Week 8</p><ul><li><p>Generics in TS</p></li><li><p>Zod for input validation</p></li><li><p>Deploying packages to the npm registry</p></li><li><p>Monorepos, Using Turborepo</p></li></ul></li><li><p>Week 9</p><ul><li><p>BLR Meet-up</p></li><li><p>Github CI/CD</p></li><li><p>Deploying Backends</p></li></ul></li><li><p>Week 10</p><ul><li><p>Deploying Frontend</p></li><li><p>Server side Rendering</p></li><li><p>Next.js</p></li></ul></li><li><p>Week 11</p><ul><li><p>Building a complete end to end mono repo</p></li><li><p>Deploying it on aws using CI/CD</p></li></ul></li><li><p>Week 12</p><ul><li><p>GraphQL</p></li><li><p>Open API SPec</p></li></ul></li><li><p>Week 13</p><ul><li><p>more type safety</p></li><li><p>TRPC</p></li></ul></li></ul><div class="pullquote"><p>This has been the syllabus till now, far different and extended from the initial syllabus</p></div><p>The Upcoming syllabus would be as follows:</p><ul><li><p>Week 14</p><ul><li><p>SQL (Basics)</p></li><li><p>SQL Normalization, indexing, and connecting it to GraphQL</p></li></ul></li><li><p>Week 15</p><ul><li><p>Dockerization</p></li><li><p>Autoscaling Backend using AWS</p></li></ul></li><li><p>Week 16</p><ul><li><p>Tests</p></li><li><p>CI</p></li></ul></li><li><p><strong>Open Source Projects </strong>~ <strong>4 Weeks</strong></p></li></ul><div><hr></div><h2>3. FAQ</h2><ol><li><p>Use the coupon code <strong>TEACHERSDAY </strong>for 25% OF.<br></p></li><li><p>Will live classes take place?</p><ul><li><p>Yes, Live classes will be scheduled every Saturday and Sunday 7 PM IST.<br></p></li></ul></li><li><p>Where will I get the link/invite to the live class ?</p><ul><li><p>The invite will be sent to your registered email address a few hours prior to the class.<br></p></li></ul></li><li><p>Will I have access to previous lectures if I purchase the course now ?</p><ul><li><p>Yes, You&#8217;ll have access to all the previous classes (in recorded form)<br></p></li></ul></li><li><p>How will I have access to the recorded lectures if I purchase now?</p><ul><li><p>All the recorded lectures will be available for one year from the date of purchase. (The validity can be extended on request)<br></p></li></ul></li><li><p>Will I have access to Discord community and Teaching Assistants(TAs)?</p><ul><li><p>Yes, you&#8217;ll have access to the cohort discord server and TAs after verifying (the verification process is discussed in the server channel itself)</p></li></ul></li></ol><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://harkirat.classx.co.in/new-courses/2&quot;,&quot;text&quot;:&quot;Purchase Now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://harkirat.classx.co.in/new-courses/2"><span>Purchase Now</span></a></p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/teachers-day-offer/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/teachers-day-offer/comments"><span>Leave a comment</span></a></p><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[INDEPENDENCE-DAY Offer on MERN-OS Cohort]]></title><description><![CDATA[Incase you want to join the cohort it&#8217;s still open and there&#8217;s a coupon code at the end for a discount!]]></description><link>https://indiaremotejobs.substack.com/p/independence-day-offer-on-mern-os</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/independence-day-offer-on-mern-os</guid><pubDate>Tue, 15 Aug 2023 06:49:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8I6u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the past two months, Harkirat has been teaching a MERN Stack cohort. Incase you want to join the cohort it&#8217;s still open and <strong>there&#8217;s a coupon code at the end</strong> for a discount!</p><div><hr></div><h2>1. The Goal of the Cohort</h2><p>Our cohort embarked on a bold mission: to demystify the intricate web of open-source projects. Picture a React project &#8211; simple when built from scratch, but overwhelming in the open-source realm.</p><p>Our objective? In a few (4) intense months, condense years of learning into focused two-hour sessions. The goal wasn't instant expertise, but to provide a context-rich dive into key concepts. The MER stack (MongoDB, Express.js, React, Node.js) was our terrain, and we hustled through it.</p><p>Sure, mastery takes time &#8211; almost a year for some concepts. Yet, we distilled essentials into four hours a week, blending assignments and online resources. </p><blockquote><p><strong>Our aim? </strong>Equipping you to decode the open-source enigma and embark on your coding journey. It's not a shortcut, but a guided path to make complex projects conquerable.</p></blockquote><div><hr></div><h2>2. Why is the cohort extended from &#8220;2 months&#8221;         to &#8221;4+ months&#8221;?</h2><p>the Course thrives on feedback, ensuring each class's effectiveness. The curriculum's pace is a blend of fast and adaptable, shaped by real-time responses. Our focus? Tailoring content based on what the cohort truly needs.</p><blockquote><p>Open-source exploration taught us that a diverse toolkit is vital. A universal stack isn't enough. We dive into buzzwords weekly &#8211; GraphQL, TypeScript &#8211; to provide context. Our aim is not just mastering the "Month Stack," but also decoding the broader tech landscape of open source.</p></blockquote><div><hr></div><h2>3+ General Feedback of the Cohort </h2><blockquote><ul><li><p>You can find the feedbacks of the folks enrolled in the cohort on the twitter account mentioned below:</p></li></ul></blockquote><blockquote><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/kirat_tw&quot;,&quot;text&quot;:&quot;Kirat's Twitter&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://twitter.com/kirat_tw"><span>Kirat's Twitter</span></a></p><div><hr></div></blockquote><blockquote><ul><li><p>can get your queries addressed by the folks / moderator in the Discord Server as well :</p></li></ul></blockquote><blockquote><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://discord.gg/WAaXacK9bh&quot;,&quot;text&quot;:&quot;Discord Server&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://discord.gg/WAaXacK9bh"><span>Discord Server</span></a></p><div><hr></div></blockquote><div><hr></div><h2>4. Syllabus of the Cohort (not the initial one)</h2><p>The cohort syllabus has been as follows until now:</p><ul><li><p>Week 1</p><ul><li><p>JS, Pre-requisites, Async JS</p></li></ul></li><li><p>Week 2</p><ul><li><p>Backend (Express, Node.js, middlewares)</p></li><li><p>Auth using JWT</p></li><li><p>Databases, MongoDB</p></li></ul></li><li><p>Week 3</p><ul><li><p>Archaic Frontends</p></li><li><p>Introduction to reconcilers, building our own reconciler</p></li></ul></li><li><p>Week 4</p><ul><li><p>React, Custom hooks, Basic hooks</p></li></ul></li><li><p>Week 5</p><ul><li><p>Consolidation, axios, mui</p></li><li><p>Building TO-DO app</p></li><li><p>Context, Recoil, prop drilling</p></li></ul></li><li><p>Week 6 (<strong>Break</strong>)</p><ul><li><p>peer-to-peer WebRTC</p></li><li><p>Building a Google meet Clone</p></li></ul></li><li><p>Week 7</p><ul><li><p>state management using recoil</p></li><li><p>intro to TypeScript</p></li><li><p>Moving from JS to TS</p></li></ul></li><li><p>Week 8</p><ul><li><p>Generics in TS</p></li><li><p>Zod for input validation</p></li><li><p>Deploying packages to the npm registry</p></li><li><p>Monorepos, Using Turborepo</p></li></ul></li><li><p>Week 9</p><ul><li><p>BLR Meet-up</p></li><li><p>Github CI/CD</p></li><li><p>Deploying Backends</p></li></ul></li></ul><div class="pullquote"><p>This has been the syllabus till now, far different and extended from the initial syllabus</p></div><p>The Upcoming syllabus would be as follows:</p><ul><li><p>Week 10</p><ul><li><p>Deploying Frontend</p></li><li><p>Server side Rendering</p></li><li><p>Next.js</p></li></ul></li><li><p>Week 11</p><ul><li><p>Building a complete end to end mono repo</p></li><li><p>Deploying it on aws using CI/CD</p></li></ul></li><li><p>Week 12</p><ul><li><p>GraphQL</p></li><li><p>Open API SPec</p></li></ul></li><li><p>Week 13</p><ul><li><p>more type safety</p></li><li><p>TRPC</p></li></ul></li><li><p>Week 14</p><ul><li><p>SQL (Basics)</p></li><li><p>SQL Normalization, indexing, and connecting it to GraphQL</p></li></ul></li><li><p>Week 15</p><ul><li><p>Dockerization</p></li><li><p>Autoscaling Backend using AWS</p></li></ul></li><li><p>Week 16</p><ul><li><p>Tests</p></li><li><p>CI</p></li></ul></li><li><p><strong>Open Source Projects </strong>~ <strong>4 Weeks</strong></p></li></ul><div><hr></div><h1>DISCOUNT CODE</h1><blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8I6u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8I6u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8I6u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8I6u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8I6u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8I6u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:107585,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8I6u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8I6u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8I6u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8I6u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95c6ef1b-6a90-4e9f-99f3-1c1a0019c895_1280x720.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">ends on 15th Aug 23:59:59</figcaption></figure></div></blockquote><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/independence-day-offer-on-mern-os/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/independence-day-offer-on-mern-os/comments"><span>Leave a comment</span></a></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[How to Build a Strong Open Source Portfolio: A Reality Check]]></title><description><![CDATA[INTRODUCTION]]></description><link>https://indiaremotejobs.substack.com/p/how-to-build-a-strong-open-source</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/how-to-build-a-strong-open-source</guid><pubDate>Fri, 11 Aug 2023 15:32:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/ejHG16CZrXI" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/watch?v=ejHG16CZrXI&quot;,&quot;text&quot;:&quot;Watch now on Youtube&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.youtube.com/watch?v=ejHG16CZrXI"><span>Watch now on Youtube</span></a></p><div><hr></div><h3><strong>INTRODUCTION</strong></h3><p>Hello everyone, Today's topic revolves around a common concern among developers: how to create a compelling open source portfolio. While the allure of an impressive GitHub contribution graph might be tempting, this discussion aims to provide a reality check on the importance of such portfolios. Is the pursuit of a "green" GitHub graph truly worth it? Or should you focus your energies on a different approach to building a valuable open source portfolio? Let's dive deeper.</p><div><hr></div><h3><strong>1. The Illusion of Quantity</strong></h3><p>The quest for a vibrant green GitHub contribution graph often stems from the desire to improve job prospects. However, let's put this into perspective. Does the abundance of green squares truly matter? The answer is, not as much as you might think. While it might catch an employer's eye, it's only a superficial indicator of activity</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c1ov!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c1ov!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 424w, https://substackcdn.com/image/fetch/$s_!c1ov!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 848w, https://substackcdn.com/image/fetch/$s_!c1ov!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 1272w, https://substackcdn.com/image/fetch/$s_!c1ov!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c1ov!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png" width="1397" height="355" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:355,&quot;width&quot;:1397,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26185,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c1ov!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 424w, https://substackcdn.com/image/fetch/$s_!c1ov!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 848w, https://substackcdn.com/image/fetch/$s_!c1ov!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 1272w, https://substackcdn.com/image/fetch/$s_!c1ov!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e807833-54d4-49bd-9d86-0355fd544037_1397x355.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When hiring, recruiters and potential employers prioritize the quality of your contributions over the sheer number. Instead of focusing on how many issues you've resolved, consider what impact your contributions have made. Employers are more interested in the scope of your involvement, the size of the problem you tackled, and your level of initiative. </p><blockquote><p>One substantial contribution often speaks louder than a multitude of minor ones.</p></blockquote><div><hr></div><h3><strong>2. Contribution Depth over Quantity</strong></h3><p>While resolving minor issues is beneficial, true value comes from addressing significant challenges. Aiming to alleviate the pain points experienced by developers and the project's maintainers is what sets your contributions apart.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EasF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EasF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 424w, https://substackcdn.com/image/fetch/$s_!EasF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 848w, https://substackcdn.com/image/fetch/$s_!EasF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 1272w, https://substackcdn.com/image/fetch/$s_!EasF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EasF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png" width="702" height="503.19140625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:734,&quot;width&quot;:1024,&quot;resizeWidth&quot;:702,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Quality vs Quantity: What Wins in Content Marketing&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Quality vs Quantity: What Wins in Content Marketing" title="Quality vs Quantity: What Wins in Content Marketing" srcset="https://substackcdn.com/image/fetch/$s_!EasF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 424w, https://substackcdn.com/image/fetch/$s_!EasF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 848w, https://substackcdn.com/image/fetch/$s_!EasF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 1272w, https://substackcdn.com/image/fetch/$s_!EasF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93438c0f-7407-4263-ab98-92b1e7a19f43_1024x734.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Consider this analogy: if you're solving an easily fixable typo, it might save a few minutes, but it won't leave a lasting impact. On the other hand, if you tackle a long-standing, complex problem that developers have been avoiding, your contribution becomes substantial. </p><blockquote><p>Remember, your goal is to make a tangible difference, to make a task easier for your fellow developers, and to contribute to the project's progress.</p></blockquote><div><hr></div><h3><strong>3. Learning Framework: A Prerequisite</strong></h3><p>Now, let's switch gears and discuss the foundation of your contributions: your learning framework. It's crucial to prioritize learning the right things. <strong>Don't get bogged down in areas that are seldom used in real-world scenarios.</strong> Rather, focus on the technologies and languages that are integral to the industry. <strong>Seek guidance from mentors who are actively working in the field and can steer you toward what truly matters.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v6Wc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v6Wc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 424w, https://substackcdn.com/image/fetch/$s_!v6Wc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 848w, https://substackcdn.com/image/fetch/$s_!v6Wc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!v6Wc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v6Wc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg" width="676" height="380.25" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:675,&quot;width&quot;:1200,&quot;resizeWidth&quot;:676,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;What is a framework? All about software frameworks | Contentful&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="What is a framework? All about software frameworks | Contentful" title="What is a framework? All about software frameworks | Contentful" srcset="https://substackcdn.com/image/fetch/$s_!v6Wc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 424w, https://substackcdn.com/image/fetch/$s_!v6Wc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 848w, https://substackcdn.com/image/fetch/$s_!v6Wc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!v6Wc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac9adada-d0ad-476c-9bdd-9794dba23fe5_1200x675.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A real-world example serves as a valuable lesson. A friend's experience in a coding course emphasizes the importance of focusing on essential technologies. Delving deeply into technologies like TypeScript, which are extensively used in companies, is a smarter approach than spending disproportionate time on areas like CSS that have limited practical applications.</p><div><hr></div><h4>Follow the Video to know more about</h4><ul><li><p><strong>The REAL open-source Portfolio</strong></p></li></ul><div id="youtube2-ejHG16CZrXI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;ejHG16CZrXI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/ejHG16CZrXI?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/how-to-build-a-strong-open-source/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/how-to-build-a-strong-open-source/comments"><span>Leave a comment</span></a></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Checkpoints While Learning any Technology]]></title><description><![CDATA[Web3, AI, or Full Stack: Which One to Choose?]]></description><link>https://indiaremotejobs.substack.com/p/checkpoints-while-learning-any-technology</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/checkpoints-while-learning-any-technology</guid><pubDate>Mon, 07 Aug 2023 18:52:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/WRFbpissttY" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><h2>Web3, AI, or Full Stack: Which One to Choose?</h2><div id="youtube2-WRFbpissttY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;WRFbpissttY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/WRFbpissttY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2>INTRODUCTION</h2><p>With the tech landscape constantly evolving, deciding where to invest your time and effort can be daunting. Each field has its unique appeal and opportunities.<br>Web3, also known as decentralized web or blockchain technology, is gaining momentum and disrupting various industries. AI, on the other hand, is experiencing a significant boom. Full Stack Development remains a versatile choice, as it can be applied to both web3 and AI companies, and conventional businesses as well.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z3H2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z3H2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 424w, https://substackcdn.com/image/fetch/$s_!z3H2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 848w, https://substackcdn.com/image/fetch/$s_!z3H2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 1272w, https://substackcdn.com/image/fetch/$s_!z3H2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z3H2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png" width="568" height="378.6666666666667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1080,&quot;resizeWidth&quot;:568,&quot;bytes&quot;:848601,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!z3H2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 424w, https://substackcdn.com/image/fetch/$s_!z3H2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 848w, https://substackcdn.com/image/fetch/$s_!z3H2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 1272w, https://substackcdn.com/image/fetch/$s_!z3H2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff74db7b2-f33e-4390-a2ac-5cc6a10f97d1_1080x720.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p>While there is no one-size-fits-all answer, AI is currently riding a wave of popularity, making it a favourable choice. For those who want to be well-positioned for the future, Web3 might be the way to go, especially with the potential of a "bull run" on the horizon. However, starting with Full Stack Development is recommended as a solid foundation before delving into other technologies.</p></blockquote><div><hr></div><h3>1. Full Stack Development</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3Scx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3Scx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 424w, https://substackcdn.com/image/fetch/$s_!3Scx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 848w, https://substackcdn.com/image/fetch/$s_!3Scx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 1272w, https://substackcdn.com/image/fetch/$s_!3Scx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3Scx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png" width="622" height="413.046875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1024,&quot;resizeWidth&quot;:622,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;How To Hire A Full Stack Developer: A Complete Guide&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How To Hire A Full Stack Developer: A Complete Guide" title="How To Hire A Full Stack Developer: A Complete Guide" srcset="https://substackcdn.com/image/fetch/$s_!3Scx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 424w, https://substackcdn.com/image/fetch/$s_!3Scx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 848w, https://substackcdn.com/image/fetch/$s_!3Scx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 1272w, https://substackcdn.com/image/fetch/$s_!3Scx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4200264c-6f96-4962-81fc-08e0e51a7589_1024x680.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em><strong>Checkpoints !</strong></em></p><ol><li><p><strong>First Language- JavaScript</strong></p></li><li><p><strong>React</strong> </p></li><li><p><strong>Moving from JS to TypeScript</strong></p></li></ol><p>Once you go through this, comes the things that differentiate you from an Average Developer</p><ul><li><p><strong>TRPC</strong></p></li><li><p><strong>GraphQL</strong></p></li></ul><p>Moving beyond this:</p><ul><li><p><strong>React Native (for mobile dev)</strong></p></li><li><p><strong>CI / CD</strong></p></li><li><p><strong>DevOps</strong></p></li></ul><div><hr></div><h2>2. Web3 </h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PoGV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PoGV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PoGV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PoGV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PoGV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PoGV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg" width="900" height="303" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:303,&quot;width&quot;:900,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;What Is Web3&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="What Is Web3" title="What Is Web3" srcset="https://substackcdn.com/image/fetch/$s_!PoGV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PoGV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PoGV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PoGV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2dd913-5781-4d21-810f-620677800e93_900x303.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em><strong>Checkpoints !</strong></em></p><ol><li><p><strong>Understanding the Jargon</strong></p></li><li><p><strong>Learning New Language</strong></p></li><li><p><strong>EVM Development [web3.js, Smart Contract Engineer]</strong></p></li></ol><p>Moving beyond EVM</p><ul><li><p><strong>creating DAPPs</strong> [<strong>D</strong>ecentralised <strong>App</strong>]</p></li><li><p><strong>Moving across chains [Cosmos, Polka-dot, Solana]</strong></p></li><li><p><strong>Learning Rust or C</strong></p></li><li><p><strong>Moving Assets across Blockchains</strong></p></li></ul><div><hr></div><blockquote><p><strong>These are the steps we&#8217;ll be following in the WEB-3 Bootcamp coming on my channel !</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@harkirat1/videos&quot;,&quot;text&quot;:&quot;My YouTube&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.youtube.com/@harkirat1/videos"><span>My YouTube</span></a></p></blockquote><div><hr></div><h2>3. AI</h2><blockquote><p>Disclaimer:</p><p>I have not done AI development at all other than when I was applying for my Masters and trying to impress the professors in the US.<br>I now want to learn AI as a hobby, not a business. One of my friend who is a PhD in Machine Learning guides me for an Hour every 15 days with:</p><ol><li><p>What&#8217;s happening in the industry.</p></li><li><p>How should I learn it.</p></li></ol></blockquote><div><hr></div><p>My understanding till now (of 2 weeks) :</p><ol><li><p><strong>Python (understanding the libraries and writing very basic functions in them)</strong></p><ol><li><p><strong>Tensorflow</strong></p></li><li><p><strong>Numpy</strong></p></li><li><p><strong>Pandas</strong></p></li></ol></li><li><p><strong>To go through the lectures of</strong></p><ol><li><p><strong>Supervised Learning</strong></p></li><li><p><strong>Un-Supervised Learning</strong></p></li><li><p><strong>Deep Learning</strong></p></li><li><p><strong>Neural Networks</strong></p></li></ol></li></ol><div><hr></div><h3>Watch the linked video to understand the above in detail</h3><div id="youtube2-WRFbpissttY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;WRFbpissttY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/WRFbpissttY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/checkpoints-while-learning-any-technology/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/checkpoints-while-learning-any-technology/comments"><span>Leave a comment</span></a></p><div><hr></div><p></p>]]></content:encoded></item><item><title><![CDATA[Navigating through the codebase of a Million $ Company]]></title><description><![CDATA[INTRODUCTION]]></description><link>https://indiaremotejobs.substack.com/p/navigating-through-the-codebase-of</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/navigating-through-the-codebase-of</guid><pubDate>Fri, 28 Jul 2023 15:58:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/_X7_v0h_q3A" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://youtu.be/_X7_v0h_q3A&quot;,&quot;text&quot;:&quot;Watch now on Youtube&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://youtu.be/_X7_v0h_q3A"><span>Watch now on Youtube</span></a></p><div><hr></div><h3>INTRODUCTION</h3><p>We've all been there, faced with a vast open-source project, wondering where to start and how to make meaningful contributions. The goal of this blog post is to demystify the complexity of monolithic stack applications, especially for beginners. By breaking down cal.com's codebase, we hope to provide a clear picture of how different modules interact, making it easier for developers to understand and contribute to the project.</p><div><hr></div><h3>Understanding the Project Structure</h3><p>cal.com is the project we will be discussing today. It is a well-known open-source project that some of you have already set up and contributed to, while others may feel overwhelmed by its codebase. Today, we'll delve deeper into the cal.com codebase to understand how it is divided into specific modules and sub-modules, which is a common practice in most mon-stack open-source projects.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c6ne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c6ne!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 424w, https://substackcdn.com/image/fetch/$s_!c6ne!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 848w, https://substackcdn.com/image/fetch/$s_!c6ne!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 1272w, https://substackcdn.com/image/fetch/$s_!c6ne!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c6ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png" width="789" height="754" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8328159c-abb0-4d89-83aa-af90533e5100_789x754.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:754,&quot;width&quot;:789,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:291792,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c6ne!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 424w, https://substackcdn.com/image/fetch/$s_!c6ne!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 848w, https://substackcdn.com/image/fetch/$s_!c6ne!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 1272w, https://substackcdn.com/image/fetch/$s_!c6ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8328159c-abb0-4d89-83aa-af90533e5100_789x754.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Made by a Doctor-Turned-Software Developer.</figcaption></figure></div><h2>Packages Folder</h2><p>When you open the cal.com project, you'll notice two main folders: "apps" and "packages." The "packages" folder is where we'll spend most of our time, and it contains a collection of small independent packages that are used by the final apps. Here are some examples of what these packages contain:</p><ol><li><p><strong>UI</strong>: This package holds all the React components used in the project, such as buttons, input boxes, and standard styling using libraries like Material-UI or Tailwind CSS.</p></li><li><p><strong>Store/Recoil</strong>: In this package, you'll find hooks and mutations to manage the state of the application. It handles variables specific to each user or view, such as notifications or feed posts.</p></li><li><p><strong>Config</strong>: This package includes global variables like API URLs and secrets, which are stored securely and exposed as variables for use throughout the project.</p></li><li><p><strong>Common</strong>: It contains common types and shared components used by different modules within the project.</p></li><li><p><strong>Types</strong>: This package houses global types used across the entire codebase.</p></li><li><p><strong>DB/Prisma</strong>: It contains high-level functions to interact with the database, abstracting the use of raw SQL queries.</p></li></ol><div><hr></div><h2>Apps Folder</h2><p>The "apps" folder houses the final user-facing application. In cal.com's case, the main web application resides in the "<strong>web</strong>" folder. It contains various other apps, such as Storybook, which showcases design components, and Docs, the public documentation.</p><p>1. <strong>Storybook</strong></p><p>Storybook is a powerful tool used to visualize and test design components without having to navigate the main application. It allows designers and front-end developers to work together effectively by sharing and reusing components.</p><p><strong>2. Email </strong></p><p>cal.com sends various types of emails to users, and to make them visually appealing, the project uses React to build email templates. However, since email clients don't support client-side JavaScript, server-side rendering is employed to convert the React components into static HTML, CSS, and JavaScript that are sent as emails.</p><ul><li><p>To test email templates in the cal.com project, you can use an API endpoint to preview the rendered email content. This allows developers to ensure the emails look correct and function as expected before deploying them to users.</p></li></ul><div><hr></div><h3>Follow the linked video to know in detail about:</h3><ol><li><p><strong>Emails</strong></p></li><li><p><strong>Server Side Rendering</strong></p></li></ol><div id="youtube2-_X7_v0h_q3A" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;_X7_v0h_q3A&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/_X7_v0h_q3A?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/navigating-through-the-codebase-of/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/navigating-through-the-codebase-of/comments"><span>Leave a comment</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Why Moving from Windows to Linux Might Be a Game Changer for Coders]]></title><description><![CDATA[INTRODUCTION]]></description><link>https://indiaremotejobs.substack.com/p/why-moving-from-windows-to-linux</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/why-moving-from-windows-to-linux</guid><pubDate>Sat, 22 Jul 2023 18:32:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/ZJNDRWZ8L1U" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><div id="youtube2-ZJNDRWZ8L1U" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;ZJNDRWZ8L1U&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/ZJNDRWZ8L1U?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3>INTRODUCTION</h3><p>Today, we delve into an insightful video that explores the benefits of transitioning from Windows to Linux, particularly for coding purposes. The seniors at IIT Roorkee forced me to use Linux in my freshman year. Initially met with resistance due to the familiarity and comfort of the Windows environment, eventually realized the incredible advantages Linux offered for coding, leading to it becoming my primary operating system over the years.</p><div><hr></div><h3><strong>The Power of the Terminal</strong></h3><p>The terminal or the command line interface, which may seem daunting to those uninitiated in the world of coding. However, the terminal is an incredibly powerful tool that provides developers with direct access to the file system of remote machines. This is particularly important when deploying applications on the internet since the website or app is usually hosted on a server located elsewhere.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I6zZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I6zZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!I6zZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!I6zZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!I6zZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I6zZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png" width="642" height="361.125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:642,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Linux Operating System | CLI (Command Line Interface) and GUI (Graphic User  Interface) - GeeksforGeeks&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Linux Operating System | CLI (Command Line Interface) and GUI (Graphic User  Interface) - GeeksforGeeks" title="Linux Operating System | CLI (Command Line Interface) and GUI (Graphic User  Interface) - GeeksforGeeks" srcset="https://substackcdn.com/image/fetch/$s_!I6zZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!I6zZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!I6zZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!I6zZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24251ae3-a08b-48a7-9f9b-e7b2d4ba23b7_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>By using the terminal, developers can quickly and efficiently make changes to their remote applications. This level of accessibility and control would be quite challenging to achieve through graphical user interfaces (GUIs) provided by operating systems like Windows.</p><div><hr></div><h3><strong>Seamless Collaboration and Efficiency</strong></h3><p>One of the primary advantages of working in a terminal-based environment is the ease of collaboration. Multiple developers can simultaneously connect to a remote server through secure shell (SSH) sessions and work together seamlessly. In contrast, GUI-based environments struggle to offer this level of concurrent access and collaboration.</p><div><hr></div><h3><strong>Embracing the Learning Curve</strong></h3><p>Adopting Linux and the terminal comes with a learning curve, especially if you're new to it. However, investing time and effort into learning the terminal's intricacies will undoubtedly pay off in the long run. Additionally, exploring powerful text editors like Vim or Neovim enhances productivity further.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ay4F!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ay4F!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ay4F!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ay4F!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ay4F!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ay4F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg" width="606" height="588.325" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:480,&quot;resizeWidth&quot;:606,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No photo description available.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No photo description available." title="No photo description available." srcset="https://substackcdn.com/image/fetch/$s_!Ay4F!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ay4F!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ay4F!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ay4F!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F718ba661-a5fc-43dc-9ecd-88fcdb874bfc_480x466.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>Windows Subsystem for Linux (WSL) and Dual Booting</strong></h2><p>For those who are hesitant to fully transition to Linux, exploring the Windows Subsystem for Linux (WSL) or dual-booting between Windows and Linux. These approaches provide a gentle introduction to Linux while allowing developers to familiarize themselves with the terminal environment.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F9n8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F9n8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F9n8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F9n8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F9n8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F9n8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg" width="568" height="304.4125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:343,&quot;width&quot;:640,&quot;resizeWidth&quot;:568,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F9n8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F9n8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F9n8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F9n8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e9e64ab-f42d-4a0f-a814-cceeac37d030_640x343.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Some Assignment</h2><p>To those who are just starting with Linux and the terminal, working through various assignments provided below is recommended.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.freecodecamp.org/news/bash-scripting-tutorial-linux-shell-script-and-command-line-for-beginners/&quot;,&quot;text&quot;:&quot;Link to the Site&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.freecodecamp.org/news/bash-scripting-tutorial-linux-shell-script-and-command-line-for-beginners/"><span>Link to the Site</span></a></p><div><hr></div><h2><strong>Conclusion</strong></h2><p>In conclusion, while the transition from Windows to Linux may initially seem intimidating, the benefits it offers for coding and development are undeniable. The terminal's versatility, collaboration capabilities, and extensive customization options make it an essential tool for any serious coder.</p><p>So, if you're a coder looking to level up your skills, consider making the switch to Linux and embracing the power of the terminal. The rewards will undoubtedly be worth the effort.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/why-moving-from-windows-to-linux/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/why-moving-from-windows-to-linux/comments"><span>Leave a comment</span></a></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[5 Unique Projects ideas to land a Job]]></title><description><![CDATA[we'll explore five unique project ideas that go beyond the basics of full stack development. Each project focuses on building a clone of a popular website with a special twist, pushing your abilities]]></description><link>https://indiaremotejobs.substack.com/p/5-unique-projects-ideas-to-land-a</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/5-unique-projects-ideas-to-land-a</guid><pubDate>Mon, 17 Jul 2023 11:50:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/eZT8RUuWvR8" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><div id="youtube2-eZT8RUuWvR8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;eZT8RUuWvR8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/eZT8RUuWvR8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/hkirat/project-ideas-v2&quot;,&quot;text&quot;:&quot;GitHub Link&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/hkirat/project-ideas-v2"><span>GitHub Link</span></a></p><div><hr></div><h3>INTRODUCTION</h3><p>Challenging and exciting full-stack development projects to enhance your skills: Look no further! In this blog post, let&#8217;s explore five unique project ideas that go beyond the basics of full-stack development. Each project focuses on building a clone of a popular website with a special twist, pushing your abilities to the next level. So let's dive right in!</p><div><hr></div><h3>1. StreamYard Clone</h3><p>StreamYard (streamyard.com) is a powerful website that allows users to stream directly from their browsers to platforms like YouTube. Your task is to create a similar platform where users can effortlessly stream their content. The main challenge lies in establishing a browser-to-RTMP connection. You'll need to build a backend service that can convert the user's input stream and overlays into the RTMP format that YouTube understands. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oDSj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oDSj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 424w, https://substackcdn.com/image/fetch/$s_!oDSj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 848w, https://substackcdn.com/image/fetch/$s_!oDSj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 1272w, https://substackcdn.com/image/fetch/$s_!oDSj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oDSj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp" width="1088" height="660" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:660,&quot;width&quot;:1088,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;StreamYard&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="StreamYard" title="StreamYard" srcset="https://substackcdn.com/image/fetch/$s_!oDSj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 424w, https://substackcdn.com/image/fetch/$s_!oDSj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 848w, https://substackcdn.com/image/fetch/$s_!oDSj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 1272w, https://substackcdn.com/image/fetch/$s_!oDSj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6f0efd1-0aaa-4678-a265-1c100edde545_1088x660.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This can be achieved using WebRTC or WebSocket protocols. The key is to ensure smooth video streaming from the browser to the server and ultimately to YouTube.</p><div><hr></div><h2>2. Google Docs Clone</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!euft!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!euft!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 424w, https://substackcdn.com/image/fetch/$s_!euft!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 848w, https://substackcdn.com/image/fetch/$s_!euft!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 1272w, https://substackcdn.com/image/fetch/$s_!euft!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!euft!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png" width="303" height="166" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:166,&quot;width&quot;:303,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;How to turn Text to Speech with Google Docs? | Speaktor&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How to turn Text to Speech with Google Docs? | Speaktor" title="How to turn Text to Speech with Google Docs? | Speaktor" srcset="https://substackcdn.com/image/fetch/$s_!euft!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 424w, https://substackcdn.com/image/fetch/$s_!euft!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 848w, https://substackcdn.com/image/fetch/$s_!euft!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 1272w, https://substackcdn.com/image/fetch/$s_!euft!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ae77ac-86f7-4f37-b5ed-addc473665f7_303x166.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Google Docs is a widely-used collaborative document editing tool. Your goal is to create a real-time collaborative text editor similar to Google Docs. This project requires the implementation of WebSockets for real-time communication between users. Additionally, you'll need to tackle the challenge of avoiding conflicts when multiple users edit the same document simultaneously. Operational transforms can be utilized to synchronize and merge changes, ensuring a seamless collaborative experience.</p><div><hr></div><h2><strong>3. Google Meet Clone</strong> </h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o7ly!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o7ly!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o7ly!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o7ly!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o7ly!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o7ly!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Google Meet, Hangouts, and Chat: Everything you need to know&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Google Meet, Hangouts, and Chat: Everything you need to know" title="Google Meet, Hangouts, and Chat: Everything you need to know" srcset="https://substackcdn.com/image/fetch/$s_!o7ly!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 424w, https://substackcdn.com/image/fetch/$s_!o7ly!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 848w, https://substackcdn.com/image/fetch/$s_!o7ly!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!o7ly!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb70e9a6-4b04-4464-8022-d954cf416213_1548x774.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Google Meet is a popular video conferencing platform that enables users to connect and communicate seamlessly. Your task is to create a clone of Google Meet, focusing on the real-time video and audio communication features. Leveraging WebRTC, you'll facilitate peer-to-peer communication between users in the same room. Participants should be able to see each other's video feeds, hear the audio, and share their screens. While building this project, you'll gain a deeper understanding of WebRTC and its capabilities.</p><div><hr></div><h3><strong>4. Google Drive Clone</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9kLG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9kLG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9kLG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9kLG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9kLG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9kLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Google Drive gets PDF annotation on Android, here's how to use it - Times  of India&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Google Drive gets PDF annotation on Android, here's how to use it - Times  of India" title="Google Drive gets PDF annotation on Android, here's how to use it - Times  of India" srcset="https://substackcdn.com/image/fetch/$s_!9kLG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9kLG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9kLG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9kLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F303ab38c-5863-426c-b198-86931c4e0902_1280x720.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Google Drive provides a robust cloud storage solution for users to upload and share files. Your project is to create a clone of Google Drive that allows users to upload files seamlessly. The main challenge lies in securely storing files directly on cloud storage platforms like AWS S3. Utilize pre-signed URLs to upload files directly from the client to the cloud storage service, ensuring the file's security and reducing the load on your server. Focus on creating a reliable and user-friendly file management system.</p><div><hr></div><h3><strong>5. LeetCode Platform</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rskB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rskB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 424w, https://substackcdn.com/image/fetch/$s_!rskB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 848w, https://substackcdn.com/image/fetch/$s_!rskB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 1272w, https://substackcdn.com/image/fetch/$s_!rskB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rskB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png" width="1200" height="800" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;New Technical Interview Tool: LeetCode &#8211; Career Development Office | MIT  Sloan School of Management&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="New Technical Interview Tool: LeetCode &#8211; Career Development Office | MIT  Sloan School of Management" title="New Technical Interview Tool: LeetCode &#8211; Career Development Office | MIT  Sloan School of Management" srcset="https://substackcdn.com/image/fetch/$s_!rskB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 424w, https://substackcdn.com/image/fetch/$s_!rskB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 848w, https://substackcdn.com/image/fetch/$s_!rskB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 1272w, https://substackcdn.com/image/fetch/$s_!rskB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce9fb040-cd5e-416d-a0e0-0d20f43242d3_1200x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>LeetCode is a well-known coding platform that offers a wide range of programming challenges. Your task is to create a simplified version of LeetCode, where users can submit their code solutions for various programming problems. The most challenging aspect of this project is running user-submitted code in a secure and isolated environment. Utilize containerization technologies like Docker to execute the code within a restricted environment. Implement a task queue to manage code submissions and process them in a scalable and efficient manner. Provide feedback to users based on the correctness of their code solutions.</p><div><hr></div><h3>At Last</h3><p>These five full-stack development projects offer exciting opportunities to enhance your skills and showcase your expertise. You can find the detailed project descriptions and resources in the project repository linked in the description. Choose the project that interests you the most and let me know in the comments which one you'd like me to build. I'll create a one-and-a-half to two-hour video where I'll time-box the development process and aim to complete all the essential functionalities.</p><p>If you get stuck somewhere you can take help from Chat-GPT however, I strongly encourage you to take on these projects yourself as well. Building them will provide valuable hands-on experience and help solidify your understanding of full-stack development concepts. Feel free to ask any questions or share your progress with me. </p><div class="pullquote"><p>Happy coding!</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/5-unique-projects-ideas-to-land-a/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/5-unique-projects-ideas-to-land-a/comments"><span>Leave a comment</span></a></p>]]></content:encoded></item><item><title><![CDATA[Unlocking Leverage: 5 Evergreen and Hard-to-Hire Roles in Software Development]]></title><description><![CDATA[In this blog post, we will explore five unconventional roles that are currently in high demand.]]></description><link>https://indiaremotejobs.substack.com/p/unlocking-leverage-5-evergreen-and</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/unlocking-leverage-5-evergreen-and</guid><pubDate>Wed, 12 Jul 2023 16:31:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/7rCAuEWYM4w" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><div id="youtube2-7rCAuEWYM4w" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;7rCAuEWYM4w&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/7rCAuEWYM4w?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2>INTRODUCTION</h2><p>In the world of software development, certain roles are consistently difficult to fill. These positions require specialized skills that are not widely known or taught, giving those who possess them significant leverage during the hiring process. In the video (linked above), we have explored five unconventional roles that are currently in high demand. By acquiring these skills, you can go beyond traditional full-stack development and negotiate from a position of strength.</p><div><hr></div><h2>1. Designer Plus Front-End Developer: </h2><p>One role that is highly sought after is that of a designer plus front-end developer. Rather than being solely a designer or a front-end developer, this role combines both skill sets. Companies often have separate design and development teams, but individuals who possess good design skills along with the ability to create front-end components are more sought after.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KaoG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KaoG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 424w, https://substackcdn.com/image/fetch/$s_!KaoG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 848w, https://substackcdn.com/image/fetch/$s_!KaoG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 1272w, https://substackcdn.com/image/fetch/$s_!KaoG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KaoG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png" width="672" height="336" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:672,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Web Designer vs. Web Developer: What's the Difference?&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Web Designer vs. Web Developer: What's the Difference?" title="Web Designer vs. Web Developer: What's the Difference?" srcset="https://substackcdn.com/image/fetch/$s_!KaoG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 424w, https://substackcdn.com/image/fetch/$s_!KaoG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 848w, https://substackcdn.com/image/fetch/$s_!KaoG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 1272w, https://substackcdn.com/image/fetch/$s_!KaoG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8d92ea-c180-41fe-a37a-a79942bcdac5_1667x834.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>By using tools like Figma to create mockups and designs, and then converting them into React components, these individuals streamline the collaboration between designers and developers. This reduces context switching between the design team and the development team and saves time, making them a valuable asset to any fast-paced development environment.</p><div><hr></div><h2>2. Mobile App Developer with Versatility: </h2><p>Another highly sought-after role is that of a mobile app developer who can handle a range of platforms. In addition to developing Android and iOS apps, proficiency in frameworks like Flutter and React Native is essential. By having experience in Swift, Java, Kotlin, React Native, and Flutter, along with deploying applications to both the App Store and the Play Store, these developers become versatile assets to any company.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4y2e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4y2e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4y2e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4y2e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4y2e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4y2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;ABM College: 7 Most Popular Skills For Mobile App Developers&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="ABM College: 7 Most Popular Skills For Mobile App Developers" title="ABM College: 7 Most Popular Skills For Mobile App Developers" srcset="https://substackcdn.com/image/fetch/$s_!4y2e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4y2e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4y2e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4y2e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffbdc7a8-5516-4f72-9421-3cf47a6e2164_2500x1667.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With the increasing demand for mobile apps, this role ensures that you can take ownership of the entire mobile development stack.</p><div><hr></div><h2>3. Full-Stack Developer - The One-Person Army: </h2><p>Being a one-person army in full-stack development is a valuable skill set. By mastering both front-end and back-end development, you become a highly sought-after candidate. Companies often face situations where there is a surplus of front-end work or a lull in back-end tasks. Having the ability to seamlessly transition between the two saves resources and makes you more appealing to employers. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G6Kl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G6Kl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 424w, https://substackcdn.com/image/fetch/$s_!G6Kl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 848w, https://substackcdn.com/image/fetch/$s_!G6Kl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 1272w, https://substackcdn.com/image/fetch/$s_!G6Kl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G6Kl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png" width="1024" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;How To Hire A Full Stack Developer: A Complete Guide&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How To Hire A Full Stack Developer: A Complete Guide" title="How To Hire A Full Stack Developer: A Complete Guide" srcset="https://substackcdn.com/image/fetch/$s_!G6Kl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 424w, https://substackcdn.com/image/fetch/$s_!G6Kl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 848w, https://substackcdn.com/image/fetch/$s_!G6Kl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 1272w, https://substackcdn.com/image/fetch/$s_!G6Kl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16ee25e6-906e-4275-ab88-115a47f3dcdc_1024x680.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even if you primarily focus on either front-end or back-end, having a solid understanding of both areas allows you to take on tasks when needed, making you an invaluable team member.</p><div><hr></div><h2>4. DevOps Engineer with Code Awareness: </h2><p>In the realm of DevOps, it is crucial to have code awareness. While many DevOps engineers focus solely on infrastructure and deployment, those who understand the application code become highly effective problem solvers. By having knowledge beyond DevOps and being able to grasp the intricacies of application code, these individuals can provide significant value during emergencies or critical situations. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sHnF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sHnF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 424w, https://substackcdn.com/image/fetch/$s_!sHnF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 848w, https://substackcdn.com/image/fetch/$s_!sHnF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 1272w, https://substackcdn.com/image/fetch/$s_!sHnF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sHnF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp" width="1456" height="921" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:921,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;DevOps For Business: All You Need To Know&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="DevOps For Business: All You Need To Know" title="DevOps For Business: All You Need To Know" srcset="https://substackcdn.com/image/fetch/$s_!sHnF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 424w, https://substackcdn.com/image/fetch/$s_!sHnF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 848w, https://substackcdn.com/image/fetch/$s_!sHnF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 1272w, https://substackcdn.com/image/fetch/$s_!sHnF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F420b34c9-440d-4a8f-adef-11182de050c7_2560x1619.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Being the go-to person to fix bugs or address issues when others are unavailable makes them indispensable members of the team.</p><div><hr></div><h2>5. Dev Tooling</h2><p>A role often overlooked but extremely valuable is that of a developer productivity and test advocate. These individuals focus on optimizing workflows, improving code quality, and making developers' lives easier. By reducing build times, implementing strict code checks, and introducing efficient development practices, they save time and resources for the entire team. Their expertise extends to optimizing infrastructure, making architectural decisions, and even transitioning codebases to more efficient technologies. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6fw3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6fw3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 424w, https://substackcdn.com/image/fetch/$s_!6fw3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 848w, https://substackcdn.com/image/fetch/$s_!6fw3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 1272w, https://substackcdn.com/image/fetch/$s_!6fw3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6fw3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png" width="1200" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;7 Tips To Write Clean And Better Code in 2020 - GeeksforGeeks&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="7 Tips To Write Clean And Better Code in 2020 - GeeksforGeeks" title="7 Tips To Write Clean And Better Code in 2020 - GeeksforGeeks" srcset="https://substackcdn.com/image/fetch/$s_!6fw3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 424w, https://substackcdn.com/image/fetch/$s_!6fw3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 848w, https://substackcdn.com/image/fetch/$s_!6fw3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 1272w, https://substackcdn.com/image/fetch/$s_!6fw3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b8a9847-9dc9-48c3-b5b4-c5c5dd0ee5b3_1200x722.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Their role is essential in maintaining code cleanliness, eliminating technical debt, and ensuring developer productivity.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/unlocking-leverage-5-evergreen-and?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thank you for reading Remote work newsletter. This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/unlocking-leverage-5-evergreen-and?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/unlocking-leverage-5-evergreen-and?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/unlocking-leverage-5-evergreen-and/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/unlocking-leverage-5-evergreen-and/comments"><span>Leave a comment</span></a></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[The Best Place for Coders]]></title><description><![CDATA[No, GitHub is not the answer for this one. Based on my personal experience in these 10+ years of being in the industry let me drop some of my opinions.]]></description><link>https://indiaremotejobs.substack.com/p/the-best-place-for-coders</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/the-best-place-for-coders</guid><pubDate>Wed, 05 Jul 2023 10:37:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/3Tw_Q8KiIj4" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>INTRODUCTION</h3><p>we have discussed the best countries for software developers to work in the video (linked below). Specifically the pros, cons, and unique aspects of working in different countries/cities. I have personally experienced working in these countries and shared insights about salary, taxes, living expenses, learning curve, and overall lifestyle. Please note that these are my personal experiences, and your own experiences may differ. </p><div><hr></div><div id="youtube2-3Tw_Q8KiIj4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;3Tw_Q8KiIj4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/3Tw_Q8KiIj4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h2>Bangalore</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qr7M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qr7M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Qr7M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Qr7M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Qr7M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qr7M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg" width="676" height="380.0622222222222" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:506,&quot;width&quot;:900,&quot;resizeWidth&quot;:676,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Bengaluru: Economy, Industries, and Infrastructure - India Briefing News&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Bengaluru: Economy, Industries, and Infrastructure - India Briefing News" title="Bengaluru: Economy, Industries, and Infrastructure - India Briefing News" srcset="https://substackcdn.com/image/fetch/$s_!Qr7M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Qr7M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Qr7M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Qr7M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad844513-ff4b-42b8-8bee-e29a7bdf12a8_900x506.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Pay-scale: 7/10</p></li><li><p>Learning curve: 8/10</p></li><li><p>Saving on Expenses: 6/10</p></li><li><p>Social-Life: 9/10</p></li></ul><blockquote><p>Nevertheless, Bangalore offers excellent opportunities for founders and entrepreneurs, making it a great place for networking and fundraising.</p></blockquote><div><hr></div><h2>Remote work (US based)</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j3Vb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j3Vb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 424w, https://substackcdn.com/image/fetch/$s_!j3Vb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 848w, https://substackcdn.com/image/fetch/$s_!j3Vb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 1272w, https://substackcdn.com/image/fetch/$s_!j3Vb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j3Vb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png" width="526" height="556.6006289308176" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:673,&quot;width&quot;:636,&quot;resizeWidth&quot;:526,&quot;bytes&quot;:578536,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j3Vb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 424w, https://substackcdn.com/image/fetch/$s_!j3Vb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 848w, https://substackcdn.com/image/fetch/$s_!j3Vb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 1272w, https://substackcdn.com/image/fetch/$s_!j3Vb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5df0fd7-c402-4735-9bb4-62b4d67f303b_636x673.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Pay-scale: 9/10</p></li><li><p>Learning curve: 9/10</p></li><li><p>Saving on Expenses: 9/10</p></li><li><p>Social-Life: 3/10</p></li></ul><blockquote><p>In addition to earning a competitive salary, remote work enables developers to interact with highly skilled team members and boosts their learning curve.</p></blockquote><div><hr></div><h3>U.S.A (H1B or B1/B2)</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nCBc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nCBc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nCBc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nCBc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nCBc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nCBc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg" width="551" height="384.44513457556934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:337,&quot;width&quot;:483,&quot;resizeWidth&quot;:551,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;E-Visa-USA (@e_visa_usa) / Twitter&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="E-Visa-USA (@e_visa_usa) / Twitter" title="E-Visa-USA (@e_visa_usa) / Twitter" srcset="https://substackcdn.com/image/fetch/$s_!nCBc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nCBc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nCBc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nCBc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe04d24f7-5dec-4c7e-ba0c-196e5742e74d_483x337.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Pay-scale: 8/10</p></li><li><p>Learning curve: 9/10</p></li><li><p>Saving on Expenses: 4/10</p></li><li><p>Social-Life: 8/10</p></li></ul><blockquote><p>Moreover, building a strong social circle might be more difficult for some expats. Pursuing a Master's degree in the US can provide a pathway to well-paying jobs, but student loans could become a factor to consider.</p></blockquote><div><hr></div><h3>DEL / HYD</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E3AG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E3AG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 424w, https://substackcdn.com/image/fetch/$s_!E3AG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 848w, https://substackcdn.com/image/fetch/$s_!E3AG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 1272w, https://substackcdn.com/image/fetch/$s_!E3AG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E3AG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png" width="1456" height="715" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:715,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1258358,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!E3AG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 424w, https://substackcdn.com/image/fetch/$s_!E3AG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 848w, https://substackcdn.com/image/fetch/$s_!E3AG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 1272w, https://substackcdn.com/image/fetch/$s_!E3AG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9f2bf2e-a07d-4c43-8c13-10b63dc99b05_1928x947.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>Pay-scale: 7/10</p></li><li><p>Learning curve: 7/10</p></li><li><p>Saving on Expenses: 6/10</p></li><li><p>Social-Life: 7/10</p></li></ul><blockquote><p><strong>Companies in these cities often prioritize profitability, which can be advantageous for employees who receive significant equity</strong>. <br><strong>Joining early-stage startups could lead to substantial wealth in the long run, provided the company's profits grow steadily</strong>. </p><p>This approach is different from the valuation-focused startups prevalent in Bangalore, where equity might be worth less during VC bull runs.</p></blockquote><div><hr></div><h2>Dubai, Hong Kong, Japan</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tV_6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tV_6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tV_6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tV_6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tV_6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tV_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg" width="1200" height="738" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:738,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;$34 Million For Sand? Dubai Island Sale Sets Record For Vacant Land&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="$34 Million For Sand? Dubai Island Sale Sets Record For Vacant Land" title="$34 Million For Sand? Dubai Island Sale Sets Record For Vacant Land" srcset="https://substackcdn.com/image/fetch/$s_!tV_6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 424w, https://substackcdn.com/image/fetch/$s_!tV_6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 848w, https://substackcdn.com/image/fetch/$s_!tV_6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!tV_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe86addee-1bf1-47fe-a638-953ee96c74e7_1200x738.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol><li><p>Pay-scale = 8/10</p></li><li><p>Saving on Taxes = 9/10</p></li><li><p>Learning curve = 9/10</p></li><li><p>Saving on Expenses = 7/10</p></li><li><p>Social-Life = 9/10</p></li></ol><blockquote><p>Dubai offers a good pay scale and has a high learning curve. The expenses are moderate, and the social life is vibrant, especially for Indians.</p></blockquote><blockquote><p><strong>Southeast Asia is suggested as a promising region for web3 opportunities, with potential financial growth.</strong></p><div><hr></div></blockquote><div class="pullquote"><p><strong>My Preference would be</strong></p><p><strong>1. REMOTE WORK<br>2. South-East Asia    <br>3.Noida [Del / Hyd]  <br>4. U.S.A                     <br>5. Bangalore</strong>              </p></div><p>Watch the video to know about my opinions in detail</p><div id="youtube2-3Tw_Q8KiIj4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;3Tw_Q8KiIj4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/3Tw_Q8KiIj4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/the-best-place-for-coders/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/the-best-place-for-coders/comments"><span>Leave a comment</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How Much HTML, CSS, & JavaScript Needed for FSD ?]]></title><description><![CDATA[Let's know how much HTML, CSS & JS is enough for you to start into Full-Stack Development.]]></description><link>https://indiaremotejobs.substack.com/p/how-much-html-css-and-javascript</link><guid isPermaLink="false">https://indiaremotejobs.substack.com/p/how-much-html-css-and-javascript</guid><pubDate>Tue, 04 Jul 2023 07:30:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/92bkNXvnpmg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><div id="youtube2-92bkNXvnpmg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;92bkNXvnpmg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/92bkNXvnpmg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div><hr></div><h3>INTRODUCTION</h3><p>When it comes to becoming a full stack developer, knowing how much HTML, CSS, and JavaScript is enough to get started is a common question. In my experience of teaching a course on this subject, I have observed individuals who were proficient in React but struggled in the initial stages, while others with no prior knowledge excelled because they focused on building a strong foundation. In this blog post, I will provide a roadmap outlining the essential steps to take before diving into full stack development. By dedicating a few days to mastering the fundamentals, you can gain the necessary skills to confidently explore any framework of your choice. So, let's delve into and explore the crucial elements to cover in this initial phase.</p><h2>1. JavaScript</h2><p>In full stack development, JavaScript serves as the scripting language connecting the front-end and back-end components. Before proceeding further, it's vital to have a solid understanding of JavaScript. I highly recommend watching the video mentioned below that offers a comprehensive overview of JavaScript, covering topics such as basic syntax, for loops, if-else statements, and more. Taking the time to familiarize yourself with these concepts will make it easier to dive into frameworks like React later on. </p><div id="youtube2-W6NZfCO5SIk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;W6NZfCO5SIk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/W6NZfCO5SIk?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>By investing a day or two and practicing coding exercises and problem-solving on LeetCode, you can solidify your grasp of JavaScript's foundational elements.</p><h2>2. HTML </h2><p>While frameworks like React and Vue abstract the need for extensive HTML and CSS knowledge, it's essential to understand the underlying concepts. Begin by learning basic HTML tags, focusing on elements like divs, spans, typography, headings, input boxes, and buttons. This will allow you to create simple yet functional websites. Once you are comfortable with HTML, connect it with the JavaScript knowledge you have gained by adding functionality through event handling, such as button clicks and key presses. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zpih!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zpih!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zpih!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zpih!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zpih!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zpih!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg" width="513" height="426.5204582651391" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:508,&quot;width&quot;:611,&quot;resizeWidth&quot;:513,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Ugliest Website On The Internet&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Ugliest Website On The Internet" title="The Ugliest Website On The Internet" srcset="https://substackcdn.com/image/fetch/$s_!zpih!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zpih!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zpih!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zpih!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb04175e-e400-4797-bcad-b8ec92f15998_611x508.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of an Ugly looking website made using HTML</figcaption></figure></div><p>By achieving this milestone, you can create basic websites and even develop a simple game using HTML canvas, incorporating JavaScript's ability to capture and respond to key presses.</p><h2>3. CSS</h2><p>Next, turn your attention to CSS and explore basic styling concepts like background colors and font colors. Although modern frameworks often handle CSS abstraction, understanding how HTML tags can be styled using CSS will enable you to comprehend the underlying mechanics. Familiarize yourself with inline CSS and consider creating a structured CSS file to handle styling systematically. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NkyL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NkyL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 424w, https://substackcdn.com/image/fetch/$s_!NkyL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 848w, https://substackcdn.com/image/fetch/$s_!NkyL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 1272w, https://substackcdn.com/image/fetch/$s_!NkyL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NkyL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp" width="652" height="366.75" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:652,&quot;bytes&quot;:20228,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NkyL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 424w, https://substackcdn.com/image/fetch/$s_!NkyL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 848w, https://substackcdn.com/image/fetch/$s_!NkyL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 1272w, https://substackcdn.com/image/fetch/$s_!NkyL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6fd8f537-e293-4b9c-84e9-1e66d660df96_1600x900.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">You can now be creating functional as well as visually appealing websites.</figcaption></figure></div><p>At this stage, you will possess a solid foundation in HTML, CSS, and JavaScript, allowing you to build functional websites and apply visual enhancements.</p><h2>4. Not yet Done !</h2><p>Now you need to understand Two more things:</p><ul><li><p><strong>The Asynchronous nature of JavaScript</strong></p></li><li><p><strong>Talking to Backend APIs using JavaScript</strong></p></li><li><p><strong>DOM Manipulation</strong></p></li></ul><p>These are some very very important concepts to know before progressing with React or Vue. Follow the video below to understand these in detail.</p><div id="youtube2-92bkNXvnpmg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;92bkNXvnpmg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/92bkNXvnpmg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><blockquote><div><hr></div><p><strong>Once your Fundamentals are strong you can use AI for assistance. Using Chat-GPT to write code which in turns write a simple HTML, CSS, JS file.<br>Learn HTML, CSS, JS first, then React then you are good to delegate your work to chatGPT.</strong></p><div><hr></div></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/p/how-much-html-css-and-javascript/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://indiaremotejobs.substack.com/p/how-much-html-css-and-javascript/comments"><span>Leave a comment</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://indiaremotejobs.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Remote work newsletter! Subscribe to receive new posts</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div>]]></content:encoded></item></channel></rss>