<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shrey Dabhi</title>
    <description>The latest articles on DEV Community by Shrey Dabhi (@sdabhi23).</description>
    <link>https://dev.to/sdabhi23</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F69282%2F9cee7ba0-7077-4a65-a3aa-305909dfa188.jpg</url>
      <title>DEV Community: Shrey Dabhi</title>
      <link>https://dev.to/sdabhi23</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sdabhi23"/>
    <language>en</language>
    <item>
      <title>Rappel: An idea &amp; repo management tool [DO Hackathon Submission]</title>
      <dc:creator>Shrey Dabhi</dc:creator>
      <pubDate>Sun, 10 Jan 2021 19:31:04 +0000</pubDate>
      <link>https://dev.to/sdabhi23/rappel-an-idea-management-tool-do-hackathon-submission-32bh</link>
      <guid>https://dev.to/sdabhi23/rappel-an-idea-management-tool-do-hackathon-submission-32bh</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;Rappel - An idea management tool which is inspired from kanban boards and integrated with GitHub&lt;/p&gt;

&lt;h3&gt;
  
  
  Category Submission: &lt;strong&gt;Built for Business&lt;/strong&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  App Link
&lt;/h3&gt;

&lt;p&gt;The app (frontend): &lt;a href="https://rappel.tech"&gt;https://rappel.tech&lt;/a&gt;&lt;br&gt;
API documentation (backend): &lt;a href="https://api.rappel.tech/api/schema/redoc/"&gt;https://api.rappel.tech/api/schema/redoc/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sKLD9zk_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ef5hjzcc0rlzeutgyuo7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sKLD9zk_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ef5hjzcc0rlzeutgyuo7.png" alt="homepage / landing page" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---cQkeTVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9jw98srtocip6g9ictnq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---cQkeTVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9jw98srtocip6g9ictnq.png" alt="onboarding" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IaqAOWSV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/sw132ilfy734r7y7lbc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IaqAOWSV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/sw132ilfy734r7y7lbc2.png" alt="onboarding - callback" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CcLTOdo2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/scoeygb9yfj3rcvzay4j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CcLTOdo2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/scoeygb9yfj3rcvzay4j.png" alt="dashboard" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z2AQRRCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/07g7yhq2kgnpf5ndeprm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z2AQRRCX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/07g7yhq2kgnpf5ndeprm.png" alt="api docs" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Description
&lt;/h3&gt;

&lt;p&gt;An idea management tool, inspired from kanban boards and integrated with GitHub. It has the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically sync your GitHub repos&lt;/li&gt;
&lt;li&gt;Sort the repos into 5 categories:

&lt;ol&gt;
&lt;li&gt;Backlog&lt;/li&gt;
&lt;li&gt;Active&lt;/li&gt;
&lt;li&gt;Work In Progress&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;li&gt;Archive&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Add working notes for the repos directly inside their cards&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Link to Source Code
&lt;/h3&gt;

&lt;p&gt;Frontend: &lt;a href="https://github.com/sdabhi23/rappel-ui"&gt;https://github.com/sdabhi23/rappel-ui&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sdabhi23"&gt;
        sdabhi23
      &lt;/a&gt; / &lt;a href="https://github.com/sdabhi23/rappel-ui"&gt;
        rappel-ui
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An idea management tool, inspired from kanban boards and integrated with GitHub
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Rappel&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://cloud.digitalocean.com/apps/new?repo=https://github.com/sdabhi23/rappel-ui/tree/master" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/ef097b66debd48bb8b3a9cf3ee81d91c2a0b0753b8f6749572ead97bfb809250/68747470733a2f2f7777772e6465706c6f79746f646f2e636f6d2f646f2d62746e2d626c75652d67686f73742e737667" alt="Deploy to DO"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An idea management tool, inspired from kanban boards and integrated with GitHub&lt;/p&gt;
&lt;p&gt;This repo only contains the frontend for the app. Please check &lt;a href="https://github.com/sdabhi23/rappel"&gt;sdabhi23/rappel&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automatically sync your GitHub repos&lt;/li&gt;
&lt;li&gt;Sort the repos into 5 categories
&lt;ol&gt;
&lt;li&gt;Backlog&lt;/li&gt;
&lt;li&gt;Active&lt;/li&gt;
&lt;li&gt;Work In Progress&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;li&gt;Archive&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Add working notes for the repos directly inside their cards&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Roadmap&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add notes for new ideas&lt;/li&gt;
&lt;li&gt;Filter repos&lt;/li&gt;
&lt;li&gt;Search repos&lt;/li&gt;
&lt;li&gt;Hide stale repos into a separate tab&lt;/li&gt;
&lt;li&gt;Automatically delete repos when they are deleted from GitHub&lt;/li&gt;
&lt;li&gt;Integration with PyPI and NPM&lt;/li&gt;
&lt;li&gt;Integration with GitLab&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Run locally&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install dependencies&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;➜ npm install&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the app locally&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;➜ npm start&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The api docs should be available at &lt;a href="http://localhost:8000/api/schema/redoc/" rel="nofollow"&gt;http://localhost:8000/api/schema/redoc/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Screenshots&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Homepage&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sdabhi23/rappel-uiscreenshots/home.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gz29fskv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/sdabhi23/rappel-uiscreenshots/home.png" alt="homepage"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Authorize GitHub&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sdabhi23/rappel-uiscreenshots/onboard.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8NXtS5nP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/sdabhi23/rappel-uiscreenshots/onboard.png" alt="onboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GitHub Callback&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sdabhi23/rappel-uiscreenshots/onboard-callback.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U6GOKuhk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/sdabhi23/rappel-uiscreenshots/onboard-callback.png" alt="onboard callback"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dashboard&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/sdabhi23/rappel-uiscreenshots/dashboard-repos.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--76KDlEWh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/sdabhi23/rappel-uiscreenshots/dashboard-repos.png" alt="dashboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
License&lt;/h2&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;Copyright 2021 Shrey Dabhi
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sdabhi23/rappel-ui"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Backend: &lt;a href="https://github.com/sdabhi23/rappel"&gt;https://github.com/sdabhi23/rappel&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sdabhi23"&gt;
        sdabhi23
      &lt;/a&gt; / &lt;a href="https://github.com/sdabhi23/rappel"&gt;
        rappel
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An idea management tool, inspired from kanban boards and integrated with GitHub
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Rappel&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://cloud.digitalocean.com/apps/new?repo=https://github.com/sdabhi23/rappel/tree/master" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/ef097b66debd48bb8b3a9cf3ee81d91c2a0b0753b8f6749572ead97bfb809250/68747470733a2f2f7777772e6465706c6f79746f646f2e636f6d2f646f2d62746e2d626c75652d67686f73742e737667" alt="Deploy to DO"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An idea management tool, inspired from kanban boards and integrated with GitHub&lt;/p&gt;
&lt;p&gt;This repo only contains the backend for the app. Please check &lt;a href="https://github.com/sdabhi23/rappel-ui"&gt;sdabhi23/rappel-ui&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Automatically sync your GitHub repos&lt;/li&gt;
&lt;li&gt;Sort the repos into 5 categories
&lt;ol&gt;
&lt;li&gt;Backlog&lt;/li&gt;
&lt;li&gt;Active&lt;/li&gt;
&lt;li&gt;Work In Progress&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;li&gt;Archive&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Add working notes for the repos directly inside their cards&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Roadmap&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Add notes for new ideas&lt;/li&gt;
&lt;li&gt;Filter repos&lt;/li&gt;
&lt;li&gt;Search repos&lt;/li&gt;
&lt;li&gt;Hide stale repos into a separate tab&lt;/li&gt;
&lt;li&gt;Automatically delete repos when they are deleted from GitHub&lt;/li&gt;
&lt;li&gt;Integration with PyPI and NPM&lt;/li&gt;
&lt;li&gt;Integration with GitLab&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Run locally using Docker&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Generate dependency lists from Pipfile.lock using &lt;a href="https://stedolan.github.io/jq/" rel="nofollow"&gt;jq tool&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;➜ jq -r &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;.default | to_entries[] | .key + .value.version&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; Pipfile.lock &lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; requirements.txt
➜ jq -r &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;.develop | to_entries[] | .key + .value.version&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; Pipfile.lock &lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; requirements-dev.txt&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the app&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;➜ docker build -t rappel-tst &lt;span class="pl-c1"&gt;.&lt;/span&gt;
➜ docker-compose up -d
➜ docker run -d --name rappel -p&lt;/pre&gt;…
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sdabhi23/rappel"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Permissive License
&lt;/h3&gt;

&lt;p&gt;Frontend: &lt;a href="https://github.com/sdabhi23/rappel-ui/blob/master/LICENSE"&gt;Apache License 2.0&lt;/a&gt;&lt;br&gt;
Backend: &lt;a href="https://github.com/sdabhi23/rappel/blob/master/LICENSE"&gt;Apache License 2.0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I completed my bachelor's degree in mid-2020. I always made it a point to put whatever meaningful projects I built on GitHub. That combined with forks of some projects and a few more projects that I actively managed left me with more than 50 repos.&lt;/p&gt;

&lt;p&gt;I was already looking for some tool which can provide me an overview of all my repos and categorize and manage them in a better way, but couldn't find anything which exactly fit the bill. So I decided to build it on my own.&lt;/p&gt;

&lt;h3&gt;
  
  
  How I built it
&lt;/h3&gt;

&lt;p&gt;I had to make choices about tech stacks and though I wanted to explore new horizons I decided to go with the tools and technologies I am most comfortable with in-order to build a solid stable application.&lt;/p&gt;

&lt;p&gt;I have deployed Flask apps earlier, but this is the first time I deployed a Django application. The DNS management service provided by DigitalOcean is great.&lt;/p&gt;

&lt;h3&gt;
  
  
  Additional Resources/Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Libraries / frameworks used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic-UI React for styling&lt;/li&gt;
&lt;li&gt;React-Trello for boards&lt;/li&gt;
&lt;li&gt;React-Quill for rich-text editor&lt;/li&gt;
&lt;li&gt;Django and Django Rest Framework for api&lt;/li&gt;
&lt;li&gt;Django Rest Knox for better token management&lt;/li&gt;
&lt;li&gt;Daphne for deployment&lt;/li&gt;
&lt;li&gt;drf-spectacular for API docs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DigitalOcean’s App Platform is pretty good but the Docker builds take longer than expected and monorepo support can be improved.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dohackathon</category>
      <category>react</category>
      <category>django</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Minimum viable product</title>
      <dc:creator>Shrey Dabhi</dc:creator>
      <pubDate>Sun, 10 Jan 2021 17:32:47 +0000</pubDate>
      <link>https://dev.to/sdabhi23/minimum-viable-product-229o</link>
      <guid>https://dev.to/sdabhi23/minimum-viable-product-229o</guid>
      <description>&lt;p&gt;In the last post I discussed about technology choices for Rappel. In this post I would like to discuss which features I prioritized for the first version and how.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/heyarnold-nickelodeon-hey-arnold-xUNd9WbEMv0CGDEK3u"&gt;&lt;img src="https://i.giphy.com/media/xUNd9WbEMv0CGDEK3u/giphy.gif" alt="priorities"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also realized that ideas have their own life-cycle and considering them as a subset of repos would be a really bad idea. I wanted to put them in a separate section. So the whole &lt;code&gt;ideas&lt;/code&gt; board in the app went on the back-burner.&lt;/p&gt;

&lt;p&gt;The priority was to build a system which can help manage a large number of repos on GitHub. I kept working diligently kept working towards that one goal.&lt;/p&gt;

&lt;p&gt;It was quite difficult to wrap my head around the way GitHub OAuth apps work. The most complex part was figuring out how to create and use access tokens without hitting the rate limits when multiple users are using the system simultaneously. Turns out that OAuth apps can create a token per user.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/dance-ryan-8bit-l2Sqb0owUC5s5tz5m"&gt;&lt;img src="https://i.giphy.com/media/l2Sqb0owUC5s5tz5m/giphy.gif" alt="yayy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I finally built a working prototype on my machine, but with so many repos (57 to be precise in my case), it was not much effective. It still needs an option to hide certain repos from the main board, search repos and filter repos based on various tags.&lt;/p&gt;

&lt;p&gt;We had already stepped into 2021 by the time I was able to work out all the kinks in the basic prototype. I still had to check-in the code into Git and deploy it on DigitalOcean. I had to put these things on roadmap instead of feature list and move on to completing all other tasks. You might even notice that all of the posts were written and published in under 24 hours.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/foilarmsandhog-foil-arms-and-hog-fah-conor-mckenna-e1fSXUdwLkTePlyox5"&gt;&lt;img src="https://i.giphy.com/media/e1fSXUdwLkTePlyox5/giphy.gif" alt="running out of time"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started testing the domain name I had bought and realized that the default DNS management capabilities were not good enough. They did not even support CAA records 🤷🏻‍♂️. Thankfully, if we already own the domain name, DigitalOcean provides DNS management for free. The transfer took more than 24 hours and now any DNS changes propagate very quickly, plus I get a nice shiny interface to manage it, so a win-win!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/cbs-ncisla-1110-ncisla1110-jSK3IO8LlJ0gZRoizt"&gt;&lt;img src="https://i.giphy.com/media/jSK3IO8LlJ0gZRoizt/giphy.gif" alt="win win"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflections
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I had a choice: either to create a rock solid base version and defer nice to haves until after the hackathon OR implement all features at a "it just works level" without taking care of edge cases. I went with the former options and am quite happy with it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DigitalOcean App Platform can have better support for mono-repos. I was not able to deploy from sub-folders. For example, I had my react app stored in a UI subfolder, but as there was a Dockerfile at the root of the repo I was not able to choose any other buildpack. Using multistage builds and storing the output of &lt;code&gt;npm run build&lt;/code&gt; in the final stage would be an alternative, but the build time was too high for that.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cover image: &lt;span&gt;Photo by &lt;a href="https://unsplash.com/@childeye?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Alexis Fauvet&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

</description>
      <category>dohackathon</category>
      <category>react</category>
      <category>python</category>
      <category>django</category>
    </item>
    <item>
      <title>Technology choices</title>
      <dc:creator>Shrey Dabhi</dc:creator>
      <pubDate>Sun, 10 Jan 2021 16:35:45 +0000</pubDate>
      <link>https://dev.to/sdabhi23/technology-choices-1o7a</link>
      <guid>https://dev.to/sdabhi23/technology-choices-1o7a</guid>
      <description>&lt;p&gt;In the previous post, I discussed how I decided what to build. In this post I would like to discuss more about the technology choices.&lt;/p&gt;

&lt;p&gt;I heard about the DigitalOcean Hackathon and immediately decided that it would be the perfect motivation and opportunity to complete building the tool. The first choice I faced was to choose the components, some of the options I came up with are:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. PostgreSQL + Hasura + Frontend (logic stays on frontend)
&lt;/h3&gt;

&lt;p&gt;The schema management would be difficult and would need a separate service to manage users. I would end up with too many moving parts and all the keys and credentials would be exposed in the browser. Not a good choice for multi-user apps&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Database + Serverless functions + Frontend (logic stays in functions)
&lt;/h3&gt;

&lt;p&gt;This would definitely solve the problem of securing the keys and credentials. The number of functions required for CRUD operations would be just too many.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Database + Serverless functions + Hasura + Frontend (logic stays in functions)
&lt;/h3&gt;

&lt;p&gt;Same as #2, but uses Hasura for CRUD. There's a slight chance of exposing user info stored in the same DB via Hasura.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A monolithic app which can handle both backend and frontend
&lt;/h3&gt;

&lt;p&gt;This is a very promising option. Just that I didn't know about any good frameworks, so would have to roll my own CSS and the board like structure would be next to impossible to build with vanilla JS.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. REST API server + SPA for frontend
&lt;/h3&gt;

&lt;p&gt;This option felt like a silver bullet when I set-out to build this tool. I had to choose from ExpressJS, Ruby on Rails and Django for building the API, and Angular and React for building the frontend. I chose Django and React as I am more comfortable with them as compared to the other options.&lt;/p&gt;

&lt;p&gt;Initially I was very skeptical about completing this project, but soon I was confident enough that I bought a domain name for it. I named it "Rappel". It is a synonym of Abseiling.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Abseiling, also known as rappelling from French rappeler, 'to recall' or 'to pull through', is a controlled descent off a vertical drop, such as a rock face, using a rope.&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Abseiling"&gt;Abseiling on Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cover image: &lt;span&gt;Photo by &lt;a href="https://unsplash.com/@victoriano?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Victoriano Izquierdo&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/choices?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

</description>
      <category>dohackathon</category>
    </item>
    <item>
      <title>How to manage ideas and repos</title>
      <dc:creator>Shrey Dabhi</dc:creator>
      <pubDate>Sun, 10 Jan 2021 16:01:03 +0000</pubDate>
      <link>https://dev.to/sdabhi23/how-to-manage-ideas-and-repos-16jf</link>
      <guid>https://dev.to/sdabhi23/how-to-manage-ideas-and-repos-16jf</guid>
      <description>&lt;p&gt;I completed my bachelor's degree in mid-2020. I always made it a point to put whatever meaningful projects I built on GitHub. That combined with forks of some projects and a few more projects that I actively managed left me with more than 50 repos.&lt;/p&gt;

&lt;p&gt;I was already looking for some tool which can provide me an overview of all my repos and categorize and manage them in a better way, but couldn't find anything which exactly fit the bill.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/U4VXRfcY3zxTi"&gt;&lt;img src="https://i.giphy.com/media/U4VXRfcY3zxTi/giphy.gif" alt="disappointed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I decided to build one such tool on my own and started working on the basic concept in November, 2020. It did not look like much work back then.. just dump metadata from GitHub APIs into some DB and add a few additional fields and that's it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://giphy.com/gifs/outlander-season-4-starz-PoHTJgxBHCCJ2zCbvf"&gt;&lt;img src="https://i.giphy.com/media/PoHTJgxBHCCJ2zCbvf/giphy-downsized.gif" alt="naive"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I already had a basic structure in my mind by the 2nd week of December. In my initial designs the app looked like a single Kanban board (you can also call it a Trello board). Each lane would signify a stage in the lifecycle of the idea:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Idea&lt;/li&gt;
&lt;li&gt;Active (initial POC completed)&lt;/li&gt;
&lt;li&gt;WIP (more detailing is being done)&lt;/li&gt;
&lt;li&gt;Active (is being actively monitored for issues and features)&lt;/li&gt;
&lt;li&gt;Archive (project has gone stale)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The cards in &lt;code&gt;Idea&lt;/code&gt; lane here might or might not have a GitHub repo. All the cards in all other lanes would have been populated using GitHub repos of the logged in user.&lt;/p&gt;

&lt;p&gt;I had originally planned to deploy it on Heroku, as the Postgres db with 10k row limit that comes with the free tier would be more than sufficient for my needs. It was at this stage that I came across the post &lt;a href="https://dev.to/devteam/announcing-the-digitalocean-app-platform-hackathon-on-dev-2i1k"&gt;Announcing the DigitalOcean App Platform Hackathon on DEV!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cover image: &lt;span&gt;Photo by &lt;a href="https://unsplash.com/@pankajpatel?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Pankaj Patel&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/project-management?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

</description>
      <category>dohackathon</category>
      <category>programming</category>
      <category>management</category>
    </item>
    <item>
      <title>My first experience as a speaker</title>
      <dc:creator>Shrey Dabhi</dc:creator>
      <pubDate>Sun, 08 Nov 2020 10:53:37 +0000</pubDate>
      <link>https://dev.to/sdabhi23/my-first-experience-as-a-speaker-38dk</link>
      <guid>https://dev.to/sdabhi23/my-first-experience-as-a-speaker-38dk</guid>
      <description>&lt;p&gt;This is a story about how I got my first shot at public speaking/teaching. I was in 5th semester back then, the college has just reopened and the clubs were gearing up to attract the new students to join as members. I had just spent majority of my 4th semester trying to learn this awesome language called Python, the Flask framework to be more precise. I had created a few projects, which I thought were unimpressive, but my seniors who ran a student’s chapter of a club called Computer Society of India found them pretty interesting!&lt;/p&gt;

&lt;p&gt;They wanted me to start a lecture series about python. Naturally I was a bit nervous and initially declined the offer, but they insisted and somehow I made up my mind to do it. To be really honest it felt like a very bad idea to me at that time, but now when I look back I realize that that one decision changed a lot of things for me.&lt;/p&gt;

&lt;p&gt;The preparations were in full swing. We had created a Google form for registrations. We went from class to class to publicize this event. We used social media as well for publicity. We received about 80 to 90 registrations, and hence we booked an auditorium with a capacity of about 60 people, because that’s the general ratio, and I was quite prepared for that amount of audience.&lt;/p&gt;

&lt;p&gt;It was a hands on session, so I sent an email with a few instructions. I had a couple of flash drives loaded with the required software. I had decided against using a PPT and decided to code then and there along with the participants.&lt;/p&gt;

&lt;p&gt;Then came the D day! The stage was set, and I was prepared. I was running late but we had a few volunteers handling the crowd. As soon as I reached the auditorium one of the volunteers told me that around 70 people have already arrived and more students are coming. I was shocked a bit, but still I went in, tested the projector and sound systems and went to the canteen to grab a quick byte.&lt;/p&gt;

&lt;p&gt;By the time I came back everyone had arrived. As soon as I stepped into the auditorium I was completely overwhelmed. People had turned up in large numbers. There was a scarcity of chairs. Some students were even perched on the ledges, all with their laptops ready and eagerly waiting for me to begin.&lt;/p&gt;

&lt;p&gt;I was utterly speechless. I never anticipated such a huge crowd. With sweaty palms and shaky legs I began my 2 hour long tirade on what Python is and how to approach it as a beginner.&lt;/p&gt;

&lt;p&gt;I then went on to conduct 4 more sessions on topics ranging from advanced features of Python to the Flask framework to web scraping using Python. We held a HackerRank contest as well as a session on developing command line apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WEWqrbMw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AUyd3MTGCvjXbZ-SP2NKfbA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WEWqrbMw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AUyd3MTGCvjXbZ-SP2NKfbA.jpeg" alt="" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C7Yu50ak--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AdkRf7rRiwWHeWtISApGSKQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C7Yu50ak--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AdkRf7rRiwWHeWtISApGSKQ.jpeg" alt="" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z3-YTq7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AGheM-fw96zYtLoanMlJCnw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z3-YTq7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AGheM-fw96zYtLoanMlJCnw.jpeg" alt="" width="800" height="600"&gt;&lt;/a&gt;Some glimpses from the first session of LearnPy&lt;/p&gt;

&lt;p&gt;The lecture series ran from July, 2018 to October, 2018.&lt;/p&gt;

&lt;p&gt;In hindsight this experience gave me a lot of confidence in communicating my thoughts and ideas. I learned how to gauge the level of interest of the audience from their body language, which is something very valuable during face-to-face team meetings. I also became more receptive to constructive criticism and started looking at my ideas and solutions from multiple perspectives!&lt;/p&gt;

&lt;p&gt;Cover Image: &lt;span&gt;Photo by &lt;a href="https://unsplash.com/@xteemu?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Teemu Paananen&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/presentation?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

</description>
      <category>speaking</category>
      <category>beginners</category>
      <category>student</category>
      <category>python</category>
    </item>
  </channel>
</rss>
