<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kedar Basutkar's Blog]]></title><description><![CDATA[Kedar Basutkar's Blog]]></description><link>https://blog.kedarbasutkar.com</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 04:10:40 GMT</lastBuildDate><atom:link href="https://blog.kedarbasutkar.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introducing VideoAI: Query Videos Like a Database]]></title><description><![CDATA[Hey everyone, I'm Kedar, and I’m excited to introduce you to VideoAI, a tool that lets you query video content just like a database using natural language! No more wasting time manually seeking through video footage to find key moments—VideoAI makes ...]]></description><link>https://blog.kedarbasutkar.com/introducing-videoai-query-videos-like-a-database</link><guid isPermaLink="true">https://blog.kedarbasutkar.com/introducing-videoai-query-videos-like-a-database</guid><dc:creator><![CDATA[Kedar Basutkar]]></dc:creator><pubDate>Fri, 27 Sep 2024 04:32:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727444498220/5cb02984-f1f7-456e-a75c-935249022f9c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey everyone, I'm Kedar, and I’m excited to introduce you to <strong>VideoAI</strong>, a tool that lets you query video content just like a database using natural language! No more wasting time manually seeking through video footage to find key moments—VideoAI makes searching and retrieving information from videos seamless. 🤌</p>
<p>In this blog, I’ll walk you through how VideoAI works, from its processing flow to how it handles user queries. I’ll also highlight the exciting use cases that demonstrate the potential of this tool. Let’s dive in!</p>
<h2 id="heading-tldr">TL:DR</h2>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.loom.com/share/c3f6bc005c9a4db9b0abd9aa7ca3e22a">https://www.loom.com/share/c3f6bc005c9a4db9b0abd9aa7ca3e22a</a></div>
<p> </p>
<h2 id="heading-what-is-videoai">What is VideoAI?</h2>
<p><strong>VideoAI</strong> allows you to search video content as easily as you would query a database. It processes videos in the background, extracting and storing essential metadata so you can simply enter a query like “show me the crocodile” in a animal video and instantly find the corresponding moments in the video.</p>
<p>No more manual scrubbing through hours of footage—just ask, and VideoAI will deliver!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727411790866/a1b96ab1-2a38-4d5f-8ac5-cc4a99a2638d.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-how-videoai-works">How VideoAI Works</h2>
<p>This is the overall working of the app. It has 2 flows, viz., video processing flow and video querying flow.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727411687145/85ce7318-cb24-454d-af04-69f6e22bb5eb.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-part-1-uploading-and-processing-your-video">Part 1: Uploading and Processing Your Video</h3>
<p>The first step is uploading your video to VideoAI. Once uploaded, the platform begins to process it in the background. Here’s a step-by-step breakdown of how the magic happens:</p>
<ol>
<li><p><strong>Frame Extraction</strong>: VideoAI extracts frames from the video at regular intervals (e.g., every 1 second).</p>
</li>
<li><p><strong>Captioning Each Frame</strong>: Using an image captioning model, VideoAI generates descriptive captions for each extracted frame. For example, if a frame contains a crocodile swimming in a lake, the model outputs something like, <em>"a crocodile is swimming in the lake in the jungle."</em></p>
</li>
<li><p><strong>Storing Captions in a Vector Database</strong>: These captions, along with their respective timestamps, are then stored in a vector database, making the video content searchable by time and description.</p>
</li>
</ol>
<h3 id="heading-step-2-querying-the-video">Step 2: Querying the Video</h3>
<p>Once your video is processed, querying is as simple as typing or saying what you’re looking for. VideoAI takes your query—like <em>"show me the monkey"</em>—and performs the following:</p>
<ol>
<li><p><strong>Vectorizing Your Query</strong>: VideoAI converts your natural language query into a vector using the same embedding model that processed the video captions.</p>
</li>
<li><p><strong>Searching the Vector Database</strong>: The system compares your query’s vector with the stored caption vectors in the database.</p>
</li>
<li><p><strong>Returning the Relevant Timestamps</strong>: It then returns the exact timestamps of the frames that match your query, allowing you to jump straight to the moments you care about.</p>
</li>
</ol>
<p>For instance, in a jungle-themed video containing animals like lions, monkeys, and crocodiles, you can search for <em>"show me the crocodile,"</em> and VideoAI will return the precise timestamp where the crocodile appears.</p>
<h2 id="heading-real-world-applications-of-videoai">Real-World Applications of VideoAI</h2>
<p>VideoAI’s potential spans several industries and use cases. Here are a few exciting possibilities:</p>
<h3 id="heading-1-surveillance-footage-analysis">1. Surveillance Footage Analysis</h3>
<p>Security operators can type in a natural language query like <em>"person entering the building"</em> or <em>"car speeding"</em> and VideoAI will return the exact moments in the surveillance footage where those events occurred. This feature could revolutionize how we handle and analyze security footage.</p>
<h3 id="heading-2-rapid-media-curation-for-broadcasters">2. Rapid Media Curation for Broadcasters</h3>
<p>Imagine a sports channel needing to curate the <em>"best goals"</em> or <em>"top tackles"</em> from a game. With VideoAI, they can pull these moments by simply querying those terms, saving countless hours of manual editing and review.</p>
<h3 id="heading-3-video-driven-search-engines">3. Video-Driven Search Engines</h3>
<p>Picture a future where video search engines don’t rely solely on video titles, but on the actual content inside the videos. Imagine searching on YouTube not by title, but by asking for the specific scene or content you’re looking for!</p>
<h2 id="heading-built-as-an-mvp-everything-runs-locally">Built as an MVP: Everything Runs Locally</h2>
<p>VideoAI is currently an MVP. Everything is running locally on my machine—from the AI models that generate captions and embeddings, to the storage of video data in the vector database.</p>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>I’ve had an absolute blast building VideoAI, and I’m incredibly excited about its potential to transform how we interact with videos.</p>
<p>I hope you’re as excited about VideoAI as I am. I’d love to hear your thoughts, feedback, and ideas. Thank you for taking the time to explore this with me!</p>
]]></content:encoded></item><item><title><![CDATA[Solving 𝑁 × 𝑁 Sudoku with Backtracking]]></title><description><![CDATA[UPDATE

24/9/2024 - Added best case and average case time complexity

Introduction
I recently had a chance to tinker with some aspect of sudoku that I hadn’t done before; aspects such as creating and solving a sudoku puzzle programmatically. This blo...]]></description><link>https://blog.kedarbasutkar.com/solving-sudoku-with-backtracking</link><guid isPermaLink="true">https://blog.kedarbasutkar.com/solving-sudoku-with-backtracking</guid><dc:creator><![CDATA[Kedar Basutkar]]></dc:creator><pubDate>Mon, 23 Sep 2024 13:02:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727097092741/8ab2307b-c2bb-4d4e-a0f9-4259426155a8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>UPDATE</strong></p>
<ul>
<li>24/9/2024 - Added best case and average case time complexity</li>
</ul>
<h2 id="heading-introduction">Introduction</h2>
<p>I recently had a chance to tinker with some aspect of sudoku that I hadn’t done before; aspects such as creating and solving a sudoku puzzle programmatically. This blog encompasses the latter part - solving a sudoku programmatically. More specifically, the blog is going to focus on time complexity of the solver’s algorithm and and provide empirical measurements of the time required for various grid sizes.</p>
<h2 id="heading-what-is-sudoku">What is Sudoku?</h2>
<p>According to Wikipedia,</p>
<blockquote>
<p><strong>Sudoku</strong> is a logic-based, combinatorial number-placement puzzle. In classic Sudoku, the objective is to fill a 9 × 9 grid with digits so that each column, each row, and each of the nine 3 × 3 subgrids that compose the grid contains all of the digits from 1 to 9.</p>
</blockquote>
<p>As mentioned, classically, the game of sudoku involves a square grid of 9×9 size. But it can be extended to larger board sizes of 16×16 or even up to 25×25 sized boards.</p>
<pre><code class="lang-plaintext">// A typical sudoku puzzle
+-------+-------+-------+
| . 8 . | . 7 . | . . 3 |
| . . . | . . . | . 8 9 |
| . . . | 6 . . | . 1 . |
+-------+-------+-------+
| . . . | . . . | . 7 . |
| . . . | . . 5 | . . 6 |
| 9 7 . | 8 6 . | . . 2 |
+-------+-------+-------+
| 3 . 6 | 1 5 . | 9 . . |
| 5 . . | . . 6 | . . . |
| . . . | . 4 7 | . . . |
+-------+-------+-------+
</code></pre>
<h2 id="heading-algorithm-for-solving-sudoku">Algorithm for Solving Sudoku</h2>
<p>The algorithm uses a backtracking approach for solving a sudoku puzzle. Backtracking is a method used to solve problems by trying out different solutions step by step. If it finds that a particular choice doesn't work, it goes back and tries a different option. For Sudoku, this means filling in one cell at a time and checking if each number is valid before moving on to the next cell. If a choice leads to a dead end, it "backs up" to try another number.</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> solve = <span class="hljs-function">(<span class="hljs-params">board: Board</span>) =&gt;</span> {
  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; board.length; i++) {
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-number">0</span>; j &lt; board.length; j++) {
      <span class="hljs-keyword">if</span> (board[i][j] === <span class="hljs-number">0</span>) {
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> num = <span class="hljs-number">1</span>; num &lt; board.length + <span class="hljs-number">1</span>; num++) {
          <span class="hljs-keyword">if</span> (isValid(board, i, j, num)) {
            board[i][j] = num;
            <span class="hljs-keyword">if</span> (solve(board)) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
            <span class="hljs-keyword">else</span> board[i][j] = <span class="hljs-number">0</span>;
          }
        }
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
      }
    }
  }
  <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
};

<span class="hljs-comment">/**
 * Checks if the current number placement satifies all sudoku rules
 */</span>
<span class="hljs-keyword">const</span> isValid = <span class="hljs-function">(<span class="hljs-params">board: Board, row: <span class="hljs-built_in">number</span>, col: <span class="hljs-built_in">number</span>, num: <span class="hljs-built_in">number</span></span>) =&gt;</span> {
  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; board.length; i++) {
    <span class="hljs-keyword">if</span> (board[row][i] === num) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    <span class="hljs-keyword">if</span> (board[i][col] === num) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
  }

  <span class="hljs-keyword">const</span> subgridSize = <span class="hljs-built_in">Math</span>.sqrt(board.length);
  <span class="hljs-keyword">const</span> rowStart = row - <span class="hljs-built_in">Math</span>.trunc(row % subgridSize);
  <span class="hljs-keyword">const</span> colStart = col - <span class="hljs-built_in">Math</span>.trunc(col % subgridSize);

  <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; subgridSize; i++) {
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-number">0</span>; j &lt; subgridSize; j++) {
      <span class="hljs-keyword">if</span> (board[rowStart + i][colStart + j] === num) <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    }
  }

  <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
};
</code></pre>
<p>Here’s a simple breakdown of how the solver works:</p>
<ol>
<li><p><strong>Loop Through the Board</strong>: The function starts by checking every cell in the Sudoku board using two nested loops. The outer loop iterates through each row, and the inner loop iterates through each column. That means the board is looped over from left to right and top to bottom.</p>
</li>
<li><p><strong>Find an Empty Cell</strong>: If it encounters an empty cell, it will try to fill it with numbers from 1 to 𝑁 (where 𝑁 is the size of the board).</p>
</li>
<li><p><strong>Check Validity</strong>: For each number, it calls the <code>isValid</code> function to check if placing that number in the current cell is allowed according to Sudoku rules.</p>
</li>
<li><p><strong>Recursive Call</strong>: If the number is valid, it places the number in the cell and recursively calls <code>solve</code> with the newly filled board to try to fill the next cell. If the recursive call returns <code>true</code>, it means the puzzle is solved.</p>
</li>
<li><p><strong>Backtrack if Necessary</strong>: If placing the number doesn’t lead to a solution (the recursive call returns <code>false</code>), it resets the cell to 0 (indicating empty cell) and tries the next number.</p>
</li>
<li><p><strong>Return True When Solved</strong>: If all cells are filled correctly, the function returns <code>true</code>.</p>
</li>
</ol>
<h3 id="heading-the-isvalid-function">The <code>isValid</code> Function</h3>
<p>This function checks if placing a number in a specific cell follows Sudoku rules:</p>
<ol>
<li><p><strong>Row and Column Check</strong>: It first checks if the number already exists in the same row or column. If it does, the function returns <code>false</code>.</p>
</li>
<li><p><strong>Subgrid Check</strong>: It calculates which subgrid the cell belongs to and checks all cells in that subgrid to see if the number is already present. If it is, the function returns <code>false</code>.</p>
</li>
</ol>
<p>If the number passes all checks (not found in the row, column, or subgrid), the function returns <code>true</code>, indicating it can be placed there.</p>
<h2 id="heading-time-complexity-analysis">Time Complexity Analysis</h2>
<ol>
<li><p><strong>Board size</strong>: If board size is 𝑁. Then a sudoku board has 𝑁² cells.</p>
</li>
<li><p><strong>Empty Cells</strong>: In the worst case, the algorithm may need to fill all the cells, i.e., 𝑁² cells.</p>
</li>
<li><p><strong>Number placement attempts:</strong> For each empty cell, we may attempt to place numbers from 1 to 𝑁. This means we have up to 𝑁 attempts for each empty cell.</p>
</li>
<li><p><strong>Validity Checks:</strong> The <code>isValid</code> function performs checks across a row, column and a subgrid of the current cell. The size of row and column are 𝑁 and size of the subgrid is √𝑁 * √𝑁 = 𝑁. That means it runs for 3𝑁 ≈ 𝑁; resulting in a total validity check complexity of O(𝑁).</p>
</li>
<li><p><strong>Recursive Nature:</strong> The backtracking approach can lead to a branching factor of 𝑁, as for every empty cell, the algorithm may have explore placing each of the 𝑁 numbers.</p>
</li>
</ol>
<h2 id="heading-overall-time-complexity"><strong>Overall Time Complexity</strong></h2>
<h3 id="heading-worst-case">Worst Case</h3>
<p>Putting this together gives us:</p>
<p>$$N^{N*N}= N^{N^2}$$</p><p>This is because we potentially explore each cell 𝑁² and for each cell, try up to 𝑁 numbers. This is the worst case time complexity.</p>
<h3 id="heading-best-case">Best Case</h3>
<p>The best-case time complexity of the backtracking algorithm for solving Sudoku can occur when the puzzle is almost solved, with only a few empty cells to fill, and the first attempts at placing numbers are successful without much backtracking. In this scenario, the best-case complexity would be significantly lower than the worst case.</p>
<p>That means, the best-case time complexity would be <strong>O(</strong>𝑁<strong>²)</strong>, where the algorithm only has to check each empty cell once and fill it correctly on the first attempt. But it’s important to note that this best-case scenario is highly optimistic.</p>
<h3 id="heading-average-case">Average Case</h3>
<p>The <strong>average-case time complexity</strong> of a backtracking algorithm for solving Sudoku is challenging to define precisely, as it depends on factors such as the puzzle's structure, the number of pre-filled cells, and how effectively the algorithm prunes the search space.</p>
<p>Due to constraint propagation and early pruning of the search space, the algorithm doesn't need to explore every possible board configuration. A reasonable estimate for the average case is</p>
<p>$$O(K^{N^2})$$</p><ul>
<li><p><strong>K</strong> is a constant less than <strong>N</strong>, reflecting that not all numbers are tested in every cell.</p>
</li>
<li><p><strong>N²</strong> is the total number of cells in the grid.</p>
</li>
</ul>
<h2 id="heading-benchmarking">Benchmarking</h2>
<p>To better understand the practical implications of this time complexity, I conducted empirical measurements by solving Sudoku puzzles of different sizes and recording the time taken.</p>
<p>The setup involves generating puzzles of varying sizes of 9×9, 16×16 and 25×25 using a puzzle generator and solving these puzzles using the algorithm mentioned above and timing each solve.</p>
<h3 id="heading-results">Results</h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Board size</td><td>Average solve time (in ms)</td><td>Iterations</td></tr>
</thead>
<tbody>
<tr>
<td>9×9</td><td>1.04</td><td>9901</td></tr>
<tr>
<td>16×16</td><td>554</td><td>8809</td></tr>
</tbody>
</table>
</div><p>The reason the iteration count is odd because the puzzle generator creates unsolvable puzzles which are omitted.</p>
<p>The algorithm took forever to solve a 25×25 puzzle. Hence, it is not mentioned in the data above.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this exploration of the backtracking algorithm for solving Sudoku puzzles, we demonstrated how it fills cells one at a time, backtracking when necessary. While this method is effective for smaller grids, its time complexity of <code>N^{N^2}</code> makes it impractical for larger sizes. The empirical measurements show that smaller puzzles can be solved relatively quickly, whereas larger ones, such as 25×25 grids, present significant challenges.</p>
<p>The code used for the demo above can be found <a target="_blank" href="https://github.com/kedaroo/sudoku-solver-benchmarking">here</a>.</p>
<p>Thank you!</p>
]]></content:encoded></item><item><title><![CDATA[Introducing ConvoDigest ✨💬]]></title><description><![CDATA[Hi, I’m Kedar, and today, I’m excited to share the story behind ConvoDigest, an app I built to tackle a problem I encountered in my everyday life. While exploring AI technologies like large language models (LLMs), retrieval-augmented generation (RAG)...]]></description><link>https://blog.kedarbasutkar.com/introducing-convodigest</link><guid isPermaLink="true">https://blog.kedarbasutkar.com/introducing-convodigest</guid><dc:creator><![CDATA[Kedar Basutkar]]></dc:creator><pubDate>Thu, 12 Sep 2024 16:06:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1726156366827/f7095dca-06fa-44fb-ba6d-7459eef922ac.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi, I’m Kedar, and today, I’m excited to share the story behind <strong>ConvoDigest</strong>, an app I built to tackle a problem I encountered in my everyday life. While exploring AI technologies like large language models (LLMs), retrieval-augmented generation (RAG), and embeddings, I realized that these tools could help me deal with a common issue.</p>
<p>As a committee member of a large housing society, our group chats are flooded with messages every day. It became nearly impossible to stay on top of everything without spending hours sifting through the conversations. This is the problem <strong>ConvoDigest</strong> solves—a local-first solution that enables me (and others) to summarize and query long, unstructured group chats while keeping the data entirely private.</p>
<h2 id="heading-the-problem">The Problem</h2>
<p>In large communities, group chats are a vital means of communication, but the sheer volume of messages—often scattered across multiple topics—makes it easy to lose track of important information. From minor maintenance issues to significant resident concerns, these chats provide valuable insights, but accessing that information amidst the clutter is challenging.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726156981618/9f85b728-05d0-44de-991f-64ce4fefd6e0.png" alt class="image--center mx-auto" /></p>
<p>That’s where <strong>ConvoDigest</strong> comes in. It transforms raw conversations into actionable insights by generating summaries, identifying key points, and answering specific questions. For example, I can now ask, “What were the main issues discussed this week?” or “How many times was a certain issue mentioned?”—and get precise, contextually aware responses.</p>
<h2 id="heading-a-local-first-privacy-focused-solution"><strong>A Local-First, Privacy-Focused Solution</strong></h2>
<p>Privacy is a significant concern for many people, particularly when it comes to sensitive chat data. I knew that offloading this data to external servers would be off-putting for most people. Instead, <strong>ConvoDigest</strong> processes everything locally on your device, ensuring that your data never leaves your control.</p>
<h2 id="heading-how-it-works"><strong>How It Works</strong></h2>
<p>At its core, <strong>ConvoDigest</strong> uses a combination of <strong>Vectra</strong> (a vector database) and AI models like <strong>LLaMA 3.1</strong> (7B parameters) via <strong>Ollama</strong> to process and analyze chat data. By creating <strong>embeddings,</strong> the app can understand the content better and provide meaningful responses.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726156906202/a1bfd0fc-3698-4e1c-a4b1-3541160c5785.png" alt class="image--center mx-auto" /></p>
<p>The frontend and backend were built using <strong>Node.js</strong>, <strong>Express</strong>, and <strong>React</strong>, inspired by the minimal design of ChatGPT to keep the interface simple. Users can upload their WhatsApp chat data, and the app processes it locally, turning it into searchable summaries and insights.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1726157042588/4f98cc91-3605-4c92-b832-38b2433c24e9.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-challenges">Challenges</h2>
<p><strong>Embedding Nuanced Conversations</strong>: WhatsApp chats are typically unstructured, with abrupt topic changes, slang, and even code-mixed content. Properly embedding these into a vector database required refining the embedding process to capture the meaning behind the words.</p>
<p><strong>Contextual Chunking</strong>: Breaking long chats into manageable chunks for embedding meant dealing with context loss across chunks.</p>
<p><strong>Temporal and Cross-Chunk Dependencies</strong>: Chat conversations are often temporal in nature, meaning the sequence and timing of messages matter. Capturing these subtleties using static embeddings is a significant technical hurdle.</p>
<p><strong>Non-Textual Data</strong>: Conversations often contain non-textual elements like images, videos, and PDFs. Although these are not processed by the app yet, handling mixed media will be an important step in future iterations.</p>
<h2 id="heading-future-plans">Future plans</h2>
<p>At this stage, <strong>ConvoDigest</strong> is an MVP, and there’s much more I want to explore. One of the immediate next steps is to <strong>containerize</strong> the app so users can easily deploy it with a single <strong>Docker command</strong>. This would make installation and setup far simpler.</p>
<p>I’m also excited about experimenting with more advanced embeddings techniques and possibly integrating other LLMs to further improve the app’s accuracy and performance. Refining how context is handled across conversations and exploring ways to incorporate non-textual data into the summarization process are key areas I’ll be focusing on moving forward.</p>
<h2 id="heading-final-thoughts"><strong>Final Thoughts</strong></h2>
<p>Building <strong>ConvoDigest</strong> has been a rewarding journey that allowed me to bridge AI concepts like <strong>LLMs</strong>, <strong>RAG</strong>, and <strong>embeddings</strong> with a practical a use case. It’s been a deep dive into how these technologies can simplify complex, overwhelming data—in this case, lengthy group chats—and transform it into something much more digestible and actionable.</p>
<p>I’m looking forward to improving the app and helping others with similar issues in the future.</p>
<p>Check out the app <a target="_blank" href="https://www.loom.com/share/d2ddf44ca4d54fb7a0a8c630afb4a243?sid=29c829c7-1cb3-4c02-83a4-07a600d78bac">here</a>.</p>
]]></content:encoded></item><item><title><![CDATA[My First Internship Experience at Eaton!]]></title><description><![CDATA[Introduction 👋
For the past few months, I’ve had the incredible opportunity to intern with the Aerospace Division at Eaton, an experience that not only shaped my professional skills but also gave me invaluable exposure to working alongside some of t...]]></description><link>https://blog.kedarbasutkar.com/my-first-internship-experience-at-eaton</link><guid isPermaLink="true">https://blog.kedarbasutkar.com/my-first-internship-experience-at-eaton</guid><category><![CDATA[internships]]></category><category><![CDATA[Python]]></category><category><![CDATA[Experience ]]></category><dc:creator><![CDATA[Kedar Basutkar]]></dc:creator><pubDate>Sat, 17 Sep 2022 09:38:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1663406642423/oTqEVyHHl.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-introduction">Introduction <strong>👋</strong></h1>
<p>For the past few months, I’ve had the incredible opportunity to intern with the Aerospace Division at Eaton, an experience that not only shaped my professional skills but also gave me invaluable exposure to working alongside some of the brightest minds in the industry. Here's a glimpse into my journey, from the technical challenges I tackled to the dynamic teamwork that made it all possible.</p>
<h1 id="heading-the-work-i-did">The Work I Did 👨‍💻</h1>
<p>As part of Eaton’s Aerospace Division, I was worked on the development of an in-house automation tool called <strong>AReG</strong>. Built using Python for business logic and Qt for the graphical interface, this tool automates the preparation of Test Plans for Fluid Conveyance products—a highly critical process in the aerospace sector where precision and reliability are paramount.</p>
<p>The aerospace industry, by its very nature, demands zero error tolerance, and every component undergoes rigorous testing to meet industry standards. <strong>AReG</strong> revolutionizes this by automating the entire Test Plan preparation, potentially reducing the turnaround time by an astounding 90-95%. This automation not only increased efficiency but also contributed to the team's overall productivity and the division’s success in meeting tight deadlines.</p>
<p>Working on AReG required a deep understanding of aerospace product requirements, fluid conveyance standards, and testing protocols. I quickly adapted to the complexities of the industry, diving into high-level problem-solving with precision. I collaborated closely with senior engineers to refine the automation algorithms, ensuring that they were not only efficient but also adaptable to varying product requirements.</p>
<p>This project helped me sharpen my skills in both Python and Qt, and it was incredibly rewarding to develop an application with such a significant impact on business operations at an industry level. The insights I gained into automation, software development processes, and the aerospace domain are experiences I’ll carry forward into my career.</p>
<h1 id="heading-experience-with-the-team">Experience with the Team 🚀</h1>
<p>Working alongside Eaton’s highly talented and seasoned professionals, many of whom came from prestigious institutions like IITs and held advanced degrees, was an incredible experience. From the moment I joined, the team was welcoming and eager to share their knowledge. My direct collaboration with a Senior Engineer and Lead Engineer gave me hands-on learning and the chance to witness their problem-solving approaches firsthand.</p>
<p>What stood out to me was the balance the team maintained between hard work and a great work culture. We celebrated each other's successes and collaborated in an environment that fostered both professional and personal growth. Being part of such a close-knit and high-achieving group made the internship experience even more fulfilling.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663404960469/je3I7e7Dk.jpg" alt="My team at the celebration. I am on the extreme left!" class="image--center mx-auto" /></p>
<p>My team at the celebration. I am on the extreme left!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1663405125581/5PZFwnCSZ.jpg" alt="IMG-20220812-WA0037.jpg" class="image--center mx-auto" /></p>
<p>This is us celebrating Independence Day at the office.</p>
<h1 id="heading-the-interview-process">The Interview Process 👨‍🏫</h1>
<p>I secured this opportunity through my college’s campus placement, where Eaton had come to recruit summer interns. The interview process was straightforward, consisting of a resume shortlisting followed by a technical round and an HR round.</p>
<p>The technical round was led by an engineering manager who created a calm and engaging environment right from the start. The 40-minute conversation was insightful and revolved around my projects and the possible contributions I could make to their team. We also discussed real-world engineering challenges, which helped me understand their expectations and gave me a chance to showcase my problem-solving skills.</p>
<p>I was thrilled when the results were announced the next day—I was selected!</p>
<h1 id="heading-key-takeaways">Key Takeaways ✨</h1>
<p>Throughout this internship, I learned how to solve complex problems effectively and gained deep insight into how senior engineers approach challenges. My ability to adapt and apply theoretical knowledge in real-world settings grew exponentially. I also gained firsthand exposure to how leadership teams at the engineering manager level strategize and execute on timelines for critical projects.</p>
<p>Being able to collaborate with engineers from different teams expanded my understanding of various technical domains and processes. The entire experience has made me more confident in my skills, whether it's technical problem-solving, communication, or teamwork.</p>
<h1 id="heading-conclusion">Conclusion 🙌</h1>
<p>This internship has been one of the most enriching experiences of my career so far. From building a high-impact automation tool to working alongside a phenomenal team of engineers, every moment at Eaton was filled with learning and growth. My exit interview was a gratifying close to the journey, with my manager appreciating my dedication, technical contributions, and adaptability.</p>
<p>If you have any questions or want to discuss more about my experience, feel free to reach out!</p>
]]></content:encoded></item><item><title><![CDATA[Introducing Get Interview Ready: Nail tech interviews with your favorite prep app! 🎯]]></title><description><![CDATA[About our Team 🤝
I am Kedar. I am a full-stack web developer. I started learning and building with React in March 2022.
Siddhi is also a full-stack web developer.  She has been building projects for hackathons since last year.
Both of us are student...]]></description><link>https://blog.kedarbasutkar.com/introducing-get-interview-ready-nail-tech-interviews-with-your-favorite-prep-app</link><guid isPermaLink="true">https://blog.kedarbasutkar.com/introducing-get-interview-ready-nail-tech-interviews-with-your-favorite-prep-app</guid><category><![CDATA[PlanetScale]]></category><category><![CDATA[PlanetScaleHackathon]]></category><dc:creator><![CDATA[Kedar Basutkar]]></dc:creator><pubDate>Mon, 01 Aug 2022 05:13:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1659330773198/ygWIXhrIs.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-about-our-team">About our Team 🤝</h2>
<p>I am <a target="_blank" href="https://hashnode.com/@kedaroo">Kedar</a>. I am a full-stack web developer. I started learning and building with React in March 2022.</p>
<p><a target="_blank" href="https://hashnode.com/@siddhigate">Siddhi</a> is also a full-stack web developer.  She has been building projects for hackathons since last year.</p>
<p>Both of us are students in senior year.</p>
<p>Together, we have formed a team for Hashnode x PlanetScale hackathon! 🔥</p>
<h2 id="heading-inspiration">Inspiration</h2>
<p>Siddhi and I are entering the senior year of college; so, we have to start preparing for interviews and applying to companies for jobs and internships. As we started preparing, it seemed that everything was all over the place, 👇</p>
<ul>
<li>we could not keep track of our notes; technical questions gathered from previous interview experiences of others on the internet and our solutions to it.</li>
<li>we also missed preparing some common behavioral questions too.</li>
<li>and keeping track of people who would give referrals and a tailor-made referral message for different companies.</li>
<li>we also needed to revise certain conceptual/theoretical questions for the interview.</li>
</ul>
<p>Hence, was born the <a target="_blank" href="https://getinterviewready.vercel.app/">Get Interview Ready</a> app!</p>
<h2 id="heading-introducing-get-interview-ready">Introducing Get Interview Ready! 🎯</h2>
<p>Get Interview Ready is the one-stop solution for helping you with all aspects of interview preparation, from practicing technical and behavioral questions to helping you manage your referral network, and so much more! Let's find out how through its features 🌟👇</p>
<h3 id="heading-behavioral-questions">Behavioral Questions</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659329473041/PUYj_wtGu.gif" alt="behavioral.gif" /></p>
<blockquote>
<p>What is your approach to handling project delays?</p>
</blockquote>
<p>Ever been asked such a question at an interview? It is a typical example of a behavioral question that is asked in 99.99% of the interviews. Although there are no single correct answers to these types of questions, it helps to prepare in advance, so that you will be able to answer this with confidence and without any hesitation during the live interview where one might usually feel under pressure. The app comes with a set of most commonly asked behavioral questions which you can prepare for, and also add your own to the list!</p>
<h3 id="heading-technical-questions">Technical Questions</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659329543317/pwlH8IpfF.gif" alt="technical.gif" /></p>
<p>Ever spent hours, solving an excruciatingly hard technical question only to lose the notes and its solution when needed the most? We’ve been there, and we know how it feels to find notes and solutions scrambled all over the place during revision (on different websites such as Repl, Codesandbox or Codepen). Even the handwritten notes sometimes go missing! </p>
<p>Hence, we introduce the Technical Questions feature ✨. </p>
<p>You can add all the questions in one place and provide an embed link from either <a target="_blank" href="https://codepen.io/">Codepen</a>, <a target="_blank" href="https://codesandbox.io/">Codesandbox</a>, <a target="_blank" href="https://replit.com/">Repl</a> or <a target="_blank" href="https://gist.github.com/">GitHub Gist</a>, for adding a solution. Along with that, there's also a markdown editor which you can use to write important notes and steps for solving the problem. This feature comes in handy while solving and keeping track of questions gotten from previous interview experiences on the internet! </p>
<h3 id="heading-project-questions">Project Questions</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659329553534/fTeD_W8Fu.gif" alt="project.gif" /></p>
<p>Ever been caught off guard while answering questions related to your own projects? This is common as one is likely to feel stressed or pressurized in an interview situation, because of that, we hesitate to answer without exuberating much confidence. This can foil all the effort that we put into building projects!</p>
<p>Hence, we introduce the Project Questions feature ✨. </p>
<p>Project Questions help you prepare a few sets of common questions regarding projects which are ordinarily repeated in interviews. In this feature, you can add your projects, tag them with the tech stack that you used, answer a few common questions regarding them, and also add your own questions which you feel might be relevant! This feature comes in handy to keep a note of questions such as “What challenges did you face while building this project?” Preparing this beforehand can greatly go in your favor in interviews!</p>
<h3 id="heading-conceptual-questions">Conceptual Questions</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659329563574/rpFf1Bbj9.gif" alt="flashcards.gif" /></p>
<p>Ever found yourself scrambling to answer questions that need memorization for the most part? Such conceptual/theoretical questions are definitely asked in interviews! To help you prepare for such questions;</p>
<p>We introduce Flash Cards ✨</p>
<p>Flash cards refer to cards that have a question on one side and its answer on the other side. The Flash Cards feature has the same functionality, wherein you can create a deck of cards for different subjects or topics and add multiple cards in one deck. You can practice all the info in these decks of cards by taking a test in which the questions are displayed in random order!</p>
<h3 id="heading-dream-companies">Dream Companies</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659329575385/4IY69TFLq.gif" alt="company.gif" /></p>
<p>Ever found it hard to recollect the person that you met on LinkedIn who could possibly give you a good referral? Referrals help us get interview opportunities with much ease. Along with that, having a rough idea of what companies you are aiming for and why helps build clarity while forming messages/emails asking for referrals. It’s important to manage and keep track of these referrals.</p>
<p>Hence, we introduce Dream Companies ✨</p>
<p>Dream Companies feature lets you add companies that you are targeting. For every dream company of yours, you can write a tailor-made message stating your intent and relevant skillset, asking for referrals. Along with that, you can add a list of people you might give you referrals along with their links such as LinkedIn, Twitter, etc. For every person that you add, you can keep a track of whether you have contacted them or not.</p>
<h3 id="heading-dashboard-analysis">Dashboard Analysis</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659329614641/yJmwnZObv.gif" alt="getprepped-dashboard.gif" /></p>
<p>The Dashboard is what you are greeted with when you first login into the app. It's full of cards, and these cards convey information to stay motivated in your interview preparation journey</p>
<ul>
<li><p><strong>Flash Card Stats</strong> card shows a graph of the scores of tests that you have taken in terms of % over the last 7 days. </p>
</li>
<li><p><strong>A pie chart</strong> reflects how many behavioral questions you have practiced out of the recommended ones.</p>
</li>
<li><p>The other cards show the number of dream companies and project questions you’ve added and the number of people you’ve contacted for referrals.</p>
</li>
</ul>
<h2 id="heading-technologies-and-tools">Technologies and Tools 🛠</h2>
<ul>
<li><a target="_blank" href="https://reactjs.org/">React.js</a> for building the frontend</li>
<li><a target="_blank" href="https://www.chartjs.org/">Chart.js</a> for data visualization</li>
<li><a target="_blank" href="https://planetscale.com/">PlanetScale</a> for the database 🌟</li>
<li><a target="_blank" href="https://nodejs.org/en/">Node.js</a> with <a target="_blank" href="https://expressjs.com/">Express.js</a> for building the backend</li>
</ul>
<h2 id="heading-building-get-interview-ready">Building get Interview Ready 👩‍🏭</h2>
<h3 id="heading-planning">Planning 🌱</h3>
<p>We used <a target="_blank" href="https://www.notion.so/">Notion</a> to plan the project, and its UI and to write our daily to-dos. While planning, we divided the entire work into 2 parts; UI design and implementation. Further, the implementation part was divided into different features. We made a list of all the possible tasks that need to be done to build our planned features.</p>
<h3 id="heading-designing">Designing 🎨</h3>
<p>We used <a target="_blank" href="https://excalidraw.com/">Excalidraw</a> for designing the UI for our app. It is a simple tool to design the wireframes of the app. </p>
<ul>
<li>The initial design of the app looked like this👇</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659328126129/Y68fOYWjx.gif" alt="getprep.gif" /></p>
<ul>
<li>The database design looked like this 👇</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659328755663/C5FORtQ8U.png" alt="Untitled (2).png" /></p>
<ul>
<li>The backend API design looked like this 👇</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1659328904038/KYWS9gPYo.png" alt="image.png" /></p>
<h3 id="heading-building">Building 👩‍💻</h3>
<p>We created an organization on GitHub for the app. The app is logically divided into 2 repos in the organization, viz. frontend, and backend. After our feature requirements and UI designs were ready, we got to building 💪 🛠️.</p>
<p>We divided the features that needed to be built among us and worked asynchronously. On completion of every feature, we would review each other’s PR and merge it in the repo. For the backend database, we used PlanetScale ✨. The backend server is hosted on Heroku, and it is built using Node and Express! The main frontend app is built using React and hosted on Vercel.</p>
<h2 id="heading-challenges-we-faced">Challenges we faced ☠</h2>
<p>The main all-encompassing challenge itself was taking on a project with a good deal of features, that needed to be completed in a week’s time. </p>
<p>Since the app is big, we had difficulties structuring the frontend app until we came up with a good and manageable folder structure. </p>
<p>Also, we pondered a lot on making the UI as intuitive and as simple to use as possible. Hence, we came up with multiple solutions, and choosing one out of them seemed difficult.</p>
<h2 id="heading-whats-next">What’s next ✨</h2>
<p>We are looking forward to adding more features to our app:</p>
<ul>
<li>Audio Recording answers to questions</li>
<li>Listening to the recorded answers to revise</li>
<li>Transcribing audio to text</li>
</ul>
<h2 id="heading-useful-links">Useful links 🔗</h2>
<ul>
<li><a target="_blank" href="https://getinterviewready.vercel.app/">App Link</a></li>
<li><a target="_blank" href="https://github.com/get-interview-ready/frontend">GitHub Repo for frontend</a></li>
<li><a target="_blank" href="https://github.com/get-interview-ready/backend">GitHub Repo for backend</a></li>
</ul>
<h2 id="heading-thats-all-folks"><strong>That’s all folks 👋</strong></h2>
<p>We would like to thank PlanetScale for providing such excellent documentation and Q/A community!</p>
<p>That's a wrap. We hope that Get Interview Ready will help you nail your interviews! 🎯</p>
]]></content:encoded></item><item><title><![CDATA[Introducing PAViC: Payment App for Vitcoin Cryptocurrency!]]></title><description><![CDATA[Hello everyone! 👋
Stoked to present to you, my submission for  Auth0 x Hashnode  Hackathon! ⚡
Introduction
Introducing  PAViC, a simple, easy-to-use and a hassle-free app for making fast and secure payments using your mobile phone, powered by blockc...]]></description><link>https://blog.kedarbasutkar.com/introducing-pavic-payment-app-for-vitcoin-cryptocurrency</link><guid isPermaLink="true">https://blog.kedarbasutkar.com/introducing-pavic-payment-app-for-vitcoin-cryptocurrency</guid><category><![CDATA[Auth0]]></category><category><![CDATA[Auth0Hackathon]]></category><category><![CDATA[React Native]]></category><category><![CDATA[Cryptocurrency]]></category><category><![CDATA[Blockchain]]></category><dc:creator><![CDATA[Kedar Basutkar]]></dc:creator><pubDate>Tue, 31 Aug 2021 13:48:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1630347381866/Hzaq78gHe.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-hello-everyone">Hello everyone! 👋</h1>
<p>Stoked to present to you, my submission for  <a target="_blank" href="https://townhall.hashnode.com/auth0-hackathon">Auth0 x Hashnode</a>  Hackathon! ⚡</p>
<h1 id="heading-introduction">Introduction</h1>
<p>Introducing  <a target="_blank" href="https://play.google.com/store/apps/details?id=com.kedaroo.pave">PAViC</a>, a simple, easy-to-use and a hassle-free app for making fast and secure payments using your mobile phone, powered by blockchain. It uses its own cryptocurrency called Vitcoin (named after my alma mater VIT, Pune.😉🏫). Based on a completely decentralized platform, PAViC stores all your personal and sensitive financial data in a distributed fashion with strict access controls. The app makes sure that it's only you who has the right to access to your sensitive data and nobody else. There is no central entity in control, hence, gone are the days of abuse of your personal information. Read on to find out more!</p>
<h1 id="heading-tl-dr">TL; DR</h1>
<h2 id="heading-things-you-can-do-on-pavic"><strong>Things you can do on PAViC:</strong></h2>
<h3 id="heading-app-walkthrough">App Walkthrough</h3>
<ul>
<li><p><strong>One click signup powered by Auth0⚡. Create free account!</strong> 
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630384769990/LIxGIzWVb.gif" alt="ezgif.com-gif-maker (3).gif" /></p>
</li>
<li><p><strong>Get a reward on signup! </strong>💰</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630387439469/GS8Bi6bM2Z.png" alt="222.png" /></p>
<ul>
<li><p><strong>Make hassle free payments. </strong>💸
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630385421242/p1FKvfGxp.gif" alt="ezgif.com-gif-maker (4).gif" /></p>
</li>
<li><p><strong>Mine transactions and earn rewards! </strong>✨</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630387731789/MWULhTWJu.png" alt="333.png" /></p>
<ul>
<li><strong>View your transaction history.</strong> 📃</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630385745488/zTUYjeSaw.png" alt="Presentation1 - Copy.png" /></p>
<h2 id="heading-whats-more">What's more?</h2>
<ul>
<li><strong>Powered by Blockchain Tech!</strong></li>
<li><strong>100% secure, with privacy at its core! 💯</strong></li>
<li><strong>Built for the community, powered by the community! No single person in-charge!</strong></li>
</ul>
<h1 id="heading-what-are-the-objectives-of-the-app">What are the objectives of the app?</h1>
<ul>
<li><strong>Build a decentralized cryptocurrency network and maintain a distributed database on mobile devices.</strong>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630346087662/gDXJvMhW-.png" alt="1.png" /></li>
</ul>
<p>A decentralized mobile network illustrated.</p>
<p>The first objective is to build a network of mobile devices which will be able to communicate with each other in a decentralized fashion. The transactions (ledger) and blockchain data would be distributed and stored with every mobile device in a decentralized manner. The transactions data contain the amount and the parties involved in that transaction, and every transaction is associated with a specific block on the blockchain.</p>
<ul>
<li><strong>Enable payment transactions and implement a reward system.</strong> 💰</li>
</ul>
<p>Through this decentralized channel, any mobile device would be able to make a payment to another mobile device on the network. We need to verify these transactions to maintain the integrity in the network. As there is no central third party involved to verify (mediate) any transaction, this job of verification is performed by any mobile device on the network itself. For this job, that user is rewarded with a sum.</p>
<h1 id="heading-how-pavic-works">How PAViC Works? 💡</h1>
<p>PAViC system is based on a network of mobile devices. These mobile devices have the ability to communicate with one another. Every time a user wants to make a payment, he/she has to enter the details in the app such as the name of the recipient and the amount, and this transaction data gets broadcasted to all other mobile devices on the network, since, this is a decentralized financial system. But the other mobile devices would not be able to see the information contained in this broadcast, hence, privacy is preserved! </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630346225007/SpXVNXCWh.gif" alt="Screen Recording 2021-08-26 at 09.09.29.09 PM.gif" /></p>
<p>A transaction getting broadcasted.</p>
<p>Every mobile device stores the transaction data in a 'pending transaction' buffer. Mind you, the payment is not complete at this point. The money has not exchanged hands yet. The transaction in this buffer has to be verified (mined). This verification task can be done by any user on the network, even the person who's made the payment in the first place! This can be accomplished by simply tapping a button in the app, which runs a verification algorithm behind the scenes. After the verification is done, the transaction gets completed, the money exchanges hands and the user responsible for verifying pending transactions gets a reward!  </p>
<h1 id="heading-how-i-built-this-app">How I built this app? 👨🏻‍🔧</h1>
<p>This is my first app! My first time ever building an end-to-end product! The journey was full of challenges, setbacks, drowning in docs and rewarding experiences at the end! Here's a brief summary of my journey...</p>
<h2 id="heading-planning-phase">Planning Phase 📝</h2>
<p>As I had figured out the main objectives, I needed to plan a way to implement them into the app. I divided the whole development procedure into phases. Firstly, I worked on system design and then proceeded onto the implementation phase. Trello was my best friend through this whole procedure, it helped me keep a track of everything and stay organized.</p>
<h2 id="heading-design-phase">Design Phase 👨🏻‍🏫</h2>
<h3 id="heading-database-design">Database Design</h3>
<p>There are 4 main entities in put system, viz., users, transactions, pending transaction and blocks. I made a table for each of the entity. I chose to go with a SQL database for this one. This is the schema design of the database:
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630346272118/q6vGKArq5.png" alt="SDP PPT.png" /></p>
<h3 id="heading-ui-design">UI Design</h3>
<p>The design part of the app was the toughest for me to figure out as I lack the knack for coming up up good design ideas. I looked for inspiration and templates all over the internet, especially on dribbble. I wanted the design to be very minimal, intuitive and dead easy to use and figure out. This process also consists of trying to come up with a color scheme. The proven way was to go for Tailwind CSS color palette. How can you go wrong, eh?😉 I went with the blue palette for mainly one reason. My app comes under finance category and the color blue signifies freedom, confidence and trust. These characteristics go perfectly together with what a cryptocurrency is supposed to be. So everything just fell in place together perfectly!</p>
<p>I used Excalidraw to create wireframes of the screens in the app. The main app consists of 3 screens:
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1630346374187/gEUzlzXM_.png" alt="Untitled-2021-08-04-1553.png" /></p>
<h2 id="heading-implementation">Implementation 🛠️</h2>
<h3 id="heading-tech-stack">Tech Stack 💻</h3>
<ul>
<li><strong>React Native</strong> - Framework for mobile app development 📱🛠</li>
<li><strong>Auth0</strong> - One stop for all your User Authentication needs! 🛡️🔐</li>
<li><strong>SQLite3</strong> - The deployed and trusted local database for mobile ⚡</li>
<li><strong>Socket.io &amp; Node.js -</strong> For communication between mobile devices</li>
</ul>
<h3 id="heading-authentication">Authentication 🛡️</h3>
<p>Auth0 provides user authentication API with docs and guides that's dead easy to follow and implement. For someone like me, who's not familiar with the ins and outs of configuring their own custom authentication flow greatly appreciates this. 😉</p>
<p>It provides a great feature called Universal Login, which comes with its own login infrastructure and a whole set of features. Hence, I did not need to create my own login page in the app. So every time a user wants to sign-in, he/she is directed to Auth0's secure login page. It has a clean and customizable UI, in which I configured my own logo. Auth0 made integrating social login providers such as Google superbly easy. There's a whole host of features that I have yet to tinker with such as Multi-factor Authentication and Passwordless Connections. Definitely in the future some time...</p>
<h3 id="heading-communication">Communication 🌐</h3>
<p>The channel through which the mobile devices communicate and share data is created using socket.io.</p>
<h1 id="heading-challenges-that-i-faced">Challenges that I faced 🥶</h1>
<p>I worked with JavaScript and React Native for the first time. Almost everything seemed challenging, and the initial period of development was full of rookie mistakes. Here's a highlight of a few of them:</p>
<ul>
<li>I'm not awfully fluent when it comes to writing SQL queries. I ended up making a good deal of mistakes at the beginning and, in turn, created so many bugs. So I had to go back to the docs again to rectify these mistakes. 😛</li>
<li>Configuring the event listeners in the socket.io was a little tough for me in the beginning. But with their docs and stackoverflow to the rescue, I had it figured out in no time.</li>
<li>Certain features such as calculating a user's balance or verifying transactions are asynchronous. Hence, I had to wrap my head around the concepts of Promises and async/await to get them working correctly.</li>
</ul>
<h1 id="heading-whats-next">What's next? ✨</h1>
<ul>
<li>Phone book like interface for quickly selecting contacts while making payments.</li>
<li>QR Code Scanning for quick transactions.</li>
<li>Support for other cryptocurrencies.</li>
<li>A web-app for browser for accessing your account. (Will offer me a chance to work with React.js as well😉)</li>
</ul>
<h1 id="heading-useful-links">Useful Links 🔗</h1>
<h3 id="heading-github-repositories">GitHub Repositories</h3>
<ul>
<li><a target="_blank" href="https://github.com/kedaroo/PAViC"><strong>Mobile App Repo Link</strong></a></li>
<li><a target="_blank" href="https://github.com/kedaroo/PAViC-Communication-Channel"><strong>Communication Channel Repo Link</strong></a></li>
</ul>
<h3 id="heading-app-store-download-links">App Store Download Links ✨✨</h3>
<ul>
<li><a target="_blank" href="https://expo.dev/@kedaroo/gamezone"><strong>EXPO</strong></a></li>
<li><a target="_blank" href="https://play.google.com/store/apps/details?id=com.kedaroo.pave"><strong>Play Store</strong></a></li>
</ul>
<h1 id="heading-winding-up">Winding up...</h1>
<p>Thanks a ton for making it till here. 🙌🏻
I would absolutely love to hear what you think about PAViC, so let me know down in the comment section and while you are at it, also drop a like. 😉</p>
]]></content:encoded></item></channel></rss>