<?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>Forem: Sourav Dey</title>
    <description>The latest articles on Forem by Sourav Dey (@souravdey777).</description>
    <link>https://forem.com/souravdey777</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%2F407413%2F0a0da4ce-26ab-41c2-be88-5fa451d8c3cd.png</url>
      <title>Forem: Sourav Dey</title>
      <link>https://forem.com/souravdey777</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/souravdey777"/>
    <language>en</language>
    <item>
      <title>My Blog Syndication Strategy 📣</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:00:00 +0000</pubDate>
      <link>https://forem.com/souravdey777/my-blog-syndication-strategy-4ho8</link>
      <guid>https://forem.com/souravdey777/my-blog-syndication-strategy-4ho8</guid>
      <description>&lt;p&gt;For a long time, I treated publishing a blog post like crossing a finish line. I would write the post, hit publish, share it once, and move on. It felt tidy. It also meant I kept confusing publication with discovery. 😅&lt;/p&gt;

&lt;p&gt;My blog syndication strategy came from that mistake. 📌&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The source of truth lives on &lt;a href="https://souravdey.space" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/strong&gt; &lt;a href="https://dev.to/souravdey777"&gt;Dev.to&lt;/a&gt; and &lt;a href="https://blogs.souravdey.space/" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; help me distribute the same idea further, but they do not become the home of the work. That distinction sounds small until you have been writing long enough to care about URLs, long tails, and the difference between being discoverable and being dependent.&lt;/p&gt;

&lt;p&gt;I wrote about this in &lt;a href="https://souravdey.space/blogs/portfolio-website-development-part-4" rel="noopener noreferrer"&gt;Portfolio Website Development Part 4&lt;/a&gt;, where I said I should have moved canonical hosting to my own domain much sooner. I meant that. The older I get in public writing, the less romantic I am about platforms. A platform is useful. A platform is not ownership.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow at a glance
&lt;/h2&gt;

&lt;p&gt;This is the shape I keep in my head.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow:&lt;/strong&gt; Write the blog, open a PR, merge it into main, then let GitHub Actions fan the post out to Dev.to, Hashnode, Medium, and the GitHub issue checklist.&lt;/p&gt;

&lt;p&gt;The process is simple: I write the blog, I open a PR, and once that PR lands in &lt;code&gt;main&lt;/code&gt;, GitHub Actions pick up the follow-up work.&lt;/p&gt;

&lt;p&gt;At the command line, the ritual is small enough to remember:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn build
yarn crosspost &lt;span class="nt"&gt;--&lt;/span&gt; blog-syndication-strategy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first command checks whether the post can survive syndication cleanly. The second is the escape hatch I use when I want to inspect or trigger a single post by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  What those two commands actually do
&lt;/h3&gt;

&lt;p&gt;This looks tiny. It is not tiny.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn build&lt;/code&gt; is my rehearsal. In this repo it does not just build the Next.js site. It runs &lt;code&gt;yarn check:syndication&lt;/code&gt; first, then the site build. So before I ever merge, the pipeline has already asked a useful question: &lt;strong&gt;if this post leaves my website, will it still make sense?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn crosspost -- slug&lt;/code&gt; is narrower and more practical. It resolves one MDX file, reads the frontmatter, converts the body into platform-friendly Markdown, talks to the Dev.to and Hashnode APIs, and updates the saved crosspost state so the next run knows whether it is creating something new or updating something that already exists.&lt;/p&gt;

&lt;p&gt;That division matters. One command protects quality. The other handles distribution.&lt;/p&gt;

&lt;p&gt;The mental model in code is even simpler: publish once, then automate the platform copies that are truly repeatable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;syndicationTargets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dev.to&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hashnode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;publishCanonical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;syndicationTargets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;crosspost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;publishCanonical(post)&lt;/code&gt; is the whole philosophy in one line. Home first. 🏠&lt;/p&gt;

&lt;p&gt;Then the loop fans out only across targets that are predictable enough to automate. That is why the array is short. Dev.to and Hashnode fit that model. Medium does not sit in that loop because the action I care about there is different. I do not want “post some Markdown.” I want “import this canonical URL and preserve the original source.”&lt;/p&gt;

&lt;p&gt;Medium stays outside that automated loop on purpose. I handle it manually through link import, because preserving the canonical URL matters more to me than forcing every destination to behave the same way.&lt;/p&gt;

&lt;p&gt;There are GitHub Actions around this too. I think of them as guardrails, not magic. The local commands are how I work. The workflows are how I stop that process from depending on my memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canonical first
&lt;/h2&gt;

&lt;p&gt;My site is where the post starts, where it gets updated, and where it stays.&lt;/p&gt;

&lt;p&gt;That choice shapes everything else. I write in MDX under &lt;code&gt;src/content/blogs&lt;/code&gt;, and the frontmatter decides whether a draft is ready to leave the building. If a post is published, the site treats it as part of the content graph, not as a one-off asset. Search, sitemap entries, RSS, structured data, and the page itself all point back to the same canonical home.&lt;/p&gt;

&lt;p&gt;That is the part I care about most.&lt;/p&gt;

&lt;p&gt;If someone finds me on Dev.to or Hashnode, I still want the post to know where home is. If search finds the original article, I want that version to be the one search engines remember. If I update the post later, the canonical copy should be the one that carries the truth forward.&lt;/p&gt;

&lt;p&gt;Ownership is not just a philosophical preference. It is a maintenance strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the actual loop looks like
&lt;/h2&gt;

&lt;p&gt;The loop is simpler than it sounds.&lt;/p&gt;

&lt;p&gt;I write the post. I open a PR. Review happens there. When that PR lands in &lt;code&gt;main&lt;/code&gt;, that is the moment the canonical post becomes live and the follow-up automation starts.&lt;/p&gt;

&lt;p&gt;Before any of that merge machinery matters, &lt;code&gt;yarn build&lt;/code&gt; runs the syndication checks locally so I get early feedback if a post contains something the crosspost pipeline cannot translate cleanly.&lt;/p&gt;

&lt;p&gt;Then GitHub Actions repeat that discipline in CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the GitHub Actions actually do
&lt;/h3&gt;

&lt;p&gt;The first workflow is &lt;code&gt;syndication-check.yml&lt;/code&gt;. It runs on pull requests and on pushes to &lt;code&gt;main&lt;/code&gt; when blog files or the syndication code changes. I like that detail more than I expected to. It means the check is not some vague “content pipeline” that wakes up for everything. It wakes up only when the parts that matter change. If I change the syndication logic, or I change a blog post that will be published, the workflow reruns the exact question I care about: &lt;strong&gt;can this MDX survive outside my site without falling apart?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That workflow is the skeptical friend in the system. 👀 It does not publish anything. It just refuses to let me feel prematurely done.&lt;/p&gt;

&lt;p&gt;At the YAML level, it is doing something very plain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;src/content/blogs/**"&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not glamorous. It is also the reason the workflow feels trustworthy. It runs when blog content changes, and when the code that handles syndication changes. Not on every random edit in the repo.&lt;/p&gt;

&lt;p&gt;The second workflow is &lt;code&gt;post-publish-blogs.yml&lt;/code&gt;, and this one is the real follow-through. It runs only after content lands on &lt;code&gt;main&lt;/code&gt;. That boundary matters to me. Drafting is one phase. Review is another. Distribution starts only when the canonical post is actually live on my domain.&lt;/p&gt;

&lt;p&gt;Once that workflow wakes up, it diffs what changed, filters down to published blog slugs, and runs the follow-up work in one place. It can generate OG thumbnails when the image is missing, create audio, crosspost to Dev.to and Hashnode, send social announcements, and open the GitHub distribution checklist issue that reminds me about the manual side of the job. Medium lives there indirectly. Not as an automated API call, but as a deliberate item in the checklist.&lt;/p&gt;

&lt;p&gt;The code path is surprisingly readable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publishedSlugs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;publishedBlogSlugsFromChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;changed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;runOgThumbnails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publishedSlugs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;runAudio&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;crosspostOk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;runCrosspost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publishedSlugs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;socialOk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;runSocialAnnounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publishedSlugs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;runDistributionChecklist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publishedSlugs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;crosspostOk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;socialOk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sequence is the process in miniature. First figure out which published posts actually changed. Then do the repeatable work around them. Then open the checklist for the parts that still deserve a human hand.&lt;/p&gt;

&lt;p&gt;That is the real payoff for me. I do not want to remember five slightly different publishing rituals. I want one publishing model. Let the machine handle repetition. Let me handle judgment.&lt;/p&gt;

&lt;p&gt;The crosspost layer does the boring work well. Under the hood, it is basically this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mdxToCrosspostMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;siteUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;footer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;originAttributionFooter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;souravdey.space&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;siteUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What that conversion code is really doing
&lt;/h3&gt;

&lt;p&gt;That little pair of lines carries most of the weight. It turns MDX into platform-friendly Markdown, absolutizes links, strips out components that only make sense on my site, and adds the attribution footer that tells readers where the original lives. In practice, that is the bridge between the thing I enjoy writing and the thing platforms are willing to accept.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mdxToCrosspostMarkdown&lt;/code&gt; is the messy realism function in this whole setup. It is where custom site-only components stop being UI elements and start becoming readable plain Markdown. It is where local image paths become absolute URLs. It is where embeds that work beautifully on my site turn into links, summaries, or simplified fallbacks for platforms that do not know anything about my component system.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;originAttributionFooter&lt;/code&gt; is simpler, but maybe more important. It is the line that keeps ownership visible after the post travels. Without that footer, syndication can quietly become duplication. With it, the copied post still remembers where home is.&lt;/p&gt;

&lt;p&gt;There is another small detail here that makes the whole setup feel grown-up to me. The post-publish workflow commits generated assets back with &lt;code&gt;[skip ci]&lt;/code&gt;, so the automation does not keep waking itself up in a loop. That sounds like a tiny implementation detail. It is also the difference between “automation” and “a bot that eats its own tail.” ♻️&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A blog post is not done when I finish writing it. It is done when it survives distribution without losing its shape.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a different bar.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GitHub issue checklist
&lt;/h2&gt;

&lt;p&gt;The automated path is only half the story. I also keep a GitHub issue open for the manual side of distribution, so Medium, social shares, and aggregator submissions do not live in my head. The issue is created from the post metadata and labeled &lt;code&gt;distribution&lt;/code&gt; by the same follow-up workflow that handles crossposting.&lt;/p&gt;

&lt;p&gt;That part matters more than it sounds. A lot of publishing systems look “automated” right up until the moment they quietly dump the human steps back into your brain. I did not want that. If a step is manual, I still want it in the system. Visible. Attached to the post, not floating around as a half-remembered note.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dmtdn9z1pg2ai03f71c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dmtdn9z1pg2ai03f71c.png" alt="A dark themed GitHub issue checklist shows automated crossposts, manual Medium import, social shares, and aggregator submissions." width="800" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Medium row is still a direct link paste, because I want the import tool to preserve the canonical URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt; ] [Medium&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://medium.com/new-story&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ge"&gt;*(use Import tool to preserve canonical URL: https://souravdey.space/blogs/blog-syndication-strategy)*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That line is intentionally verbose. I do not want future me guessing what “publish to Medium” meant on a sleepy evening.&lt;/p&gt;

&lt;p&gt;And if I need to recreate the issue itself by hand, the CLI version is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh issue create &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"📢 Distribution: My Blog Syndication Strategy 📣"&lt;/span&gt; &lt;span class="nt"&gt;--label&lt;/span&gt; distribution &lt;span class="nt"&gt;--body-file&lt;/span&gt; checklist.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That checklist is the human half of the system. It catches the little things automation should not guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I still syndicate
&lt;/h2&gt;

&lt;p&gt;I do not syndicate because I am unsure where my work belongs.&lt;/p&gt;

&lt;p&gt;I syndicate because attention is fragmented, and readers do not all arrive through the same door. Some people discover a post through Dev.to. Some through Hashnode. Some through RSS. Some through search. Some land on my homepage because they already know my name. I want to meet all of them without making every post depend on one channel.&lt;/p&gt;

&lt;p&gt;That is the balance I was after: reach without surrendering the original. ✨&lt;/p&gt;

&lt;p&gt;If I only published on my own site, I would own everything and reach fewer people. If I only published on platforms, I would get reach and lose some control. Syndication is the middle path I actually believe in. It is not a compromise if the canonical story is strong.&lt;/p&gt;

&lt;p&gt;There is also a softer reason. Crossposting makes my writing travel. A good post should be able to sit in different places and still feel like the same thought. That constraint makes me write cleaner, structure better, and keep my MDX honest. If a post depends too heavily on site-specific presentation, I usually need to think harder about whether the core idea stands clearly enough on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tradeoffs are real
&lt;/h2&gt;

&lt;p&gt;I am not pretending this setup is free.&lt;/p&gt;

&lt;p&gt;Every layer of automation adds another place where content can break. Some MDX components do not translate neatly. Some images need better alt text than I would otherwise bother with when I am in a hurry. Some internal links need to become absolute URLs on syndicated copies. That is why I like having &lt;code&gt;check:syndication&lt;/code&gt; wired into the build. I would rather learn about a conversion problem before the post is public than after I have shared two broken copies.&lt;/p&gt;

&lt;p&gt;There is also a mental tradeoff. Syndication can tempt you into caring too much about platform performance. I try not to let that happen. If Dev.to gets more clicks on one post and Hashnode gets more comments on another, that is interesting, but it is not the point. The point is that the original post stays intact, searchable, and under my control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I want the platform to amplify the writing, not define it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That line keeps me honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently
&lt;/h2&gt;

&lt;p&gt;I would move canonical hosting to my own domain even earlier.&lt;/p&gt;

&lt;p&gt;That is the cleanest lesson in the whole thing. For years I cared too much about where a post could travel and not enough about where it should live. In &lt;a href="https://souravdey.space/blogs/portfolio-website-development-part-4" rel="noopener noreferrer"&gt;Part 4&lt;/a&gt; I admitted that. The older version of me thought syndication was a distribution decision. The better version of me sees it as an architecture decision.&lt;/p&gt;

&lt;p&gt;I would also document my content conventions sooner. Once a site has more than one content type, memory stops being a reliable system. Frontmatter, tags, images, series, and syndication rules all start to interact. A short internal doc saves future me from guessing, and guessing gets expensive when it happens at publish time.&lt;/p&gt;

&lt;p&gt;If I were starting again today, I would still syndicate. I would just be much less sentimental about the platform copy and much more protective of the original.&lt;/p&gt;

&lt;p&gt;That is the whole strategy, really.&lt;/p&gt;

&lt;p&gt;Write once. Keep the canonical copy at home. Let other platforms do the discovery work. Update the source, and let the copies follow.&lt;/p&gt;

&lt;p&gt;The original should always know where home is. 🏠&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on April 15, 2026 at &lt;a href="https://souravdey.space/blogs/blog-syndication-strategy" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>buildinginpublic</category>
      <category>reflection</category>
    </item>
    <item>
      <title>Facebook Developer Circle 🏆 - Open Source Immersion Challenge 2020</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Tue, 14 Apr 2026 11:06:18 +0000</pubDate>
      <link>https://forem.com/souravdey777/facebook-developer-circle-open-source-immersion-challenge-2020-4878</link>
      <guid>https://forem.com/souravdey777/facebook-developer-circle-open-source-immersion-challenge-2020-4878</guid>
      <description>&lt;p&gt;Got Facebook Developer Swags 😁😁 for Contributions to Facebook-led Open Source projects in Facebook Open Source Immersion Challenge, a month-long initiative by Developer Circles from Facebook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhnjx7lmb2tyohg1zw95.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffhnjx7lmb2tyohg1zw95.jpeg" width="800" height="1731"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzflwknwnnf50vmn4674l.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzflwknwnnf50vmn4674l.jpeg" width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Facebook Open Source Immersion Challenge?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Facebook Open Source Immersion Challenge initiative is a month-long celebration of Open Source technology, run by Facebook. The goal of this initiative is to provide developers with practical education and experience contributing to Open Source projects in preparation for our annual Developer Circles Community Challenge later this year.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbpbk90gdnb8qypnnnjmj.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbpbk90gdnb8qypnnnjmj.jpeg" alt="FB OS" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✨ Want to know more about it: &lt;a href="https://developers.facebook.com/developercircles/open-source-immersion/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Steps to Participate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Register or login at &lt;a href="https://github.com" rel="noopener noreferrer"&gt;github.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sign up on the Developer Circles Open Source Immersion &lt;a href="https://www.facebook.com/help/contact/557546521476284" rel="noopener noreferrer"&gt;registration page&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sign Facebook’s contributor license agreement (CLA) &lt;a href="https://code.facebook.com/cla/" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a minimum of 4 contributions/PR into Open Source projects with at least 1 out of 4 PR towards any project within DevC GitHub Org or any Facebook-led Open Source project. Make sure you submit these before the deadline, August 15, 2020, at 11:59:59 PM PST.&lt;/li&gt;
&lt;li&gt;Share your GitHub profile or the link of your PR to your local Developer Circles Facebook group.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Here is the list of Pull Requests:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2gv34ebqd4pr1n1oqoag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2gv34ebqd4pr1n1oqoag.png" alt="PRs" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can also check the PRs in my &lt;a href="https://github.com/Souravdey777/" rel="noopener noreferrer"&gt;Github&lt;/a&gt; profile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Finally, Got the email
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x1u0epmtusd5gc3deoy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3x1u0epmtusd5gc3deoy.png" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Achieved Swags from Facebook for being in the top 1000 of the Open Source Developer Immersion 2020
&lt;/h3&gt;

&lt;p&gt;I have also shared a &lt;a href="https://www.linkedin.com/posts/souravdey777_facebook-developercircles-opensource-activity-6753374179309039616-tUnQ?utm_source=share&amp;amp;utm_medium=member_desktop" rel="noopener noreferrer"&gt;LinkedIn post&lt;/a&gt; regarding the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contact me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Souravdey777/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/souravdey777" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on December 7, 2020 at &lt;a href="https://souravdey.space/blogs/facebook-developer-circle-open-source-immersion-challenge-2020" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>engineering</category>
      <category>career</category>
    </item>
    <item>
      <title>Winning the HackGPT 2.0 Hackathon: 2nd Runner-up Position 🧑🏻‍💻</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Tue, 14 Apr 2026 11:06:15 +0000</pubDate>
      <link>https://forem.com/souravdey777/winning-the-hackgpt-20-hackathon-2nd-runner-up-position-iac</link>
      <guid>https://forem.com/souravdey777/winning-the-hackgpt-20-hackathon-2nd-runner-up-position-iac</guid>
      <description>&lt;p&gt;⏱️ 24 hours of non-stop building. ☕ 12 cups of coffee. 🃏 2 hours of poker (someone had to lose their dignity 😂). And somehow, in between all of that, we shipped a working AI-powered code quality platform that might actually change how developer assessments work.&lt;/p&gt;

&lt;p&gt;This is the story of &lt;strong&gt;HackGPT 2.0, HackerRank's internal 24-hour hackathon during our May P&amp;amp;E Offsite&lt;/strong&gt;. Our team of 8 engineers reached 2nd runner-up position, but the real win was proving something the product team had been theorizing about for months: AI-powered holistic code review isn't just feasible, it's practical at scale.&lt;/p&gt;

&lt;p&gt;Kudos to the entire team: &lt;a href="https://www.linkedin.com/in/akakro/" rel="noopener noreferrer"&gt;Ankur&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/meankush/" rel="noopener noreferrer"&gt;Ankush&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/hannad-rehman/" rel="noopener noreferrer"&gt;Hannad&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/nattsudarshan/" rel="noopener noreferrer"&gt;Sudarshan&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/satyam-setia/" rel="noopener noreferrer"&gt;Satyam&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/dineshyadav009/" rel="noopener noreferrer"&gt;Dinesh&lt;/a&gt;, and &lt;a href="https://www.linkedin.com/in/dhruv-khirwar-b309b4118/" rel="noopener noreferrer"&gt;Dhruv&lt;/a&gt; 🙏.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyp8iusr1lsxjhvttina3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyp8iusr1lsxjhvttina3.png" alt="HackGPT 2.0 team with the 2nd runner-up prize cheque" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 The Problem: Scoring Developers on a Single Axis
&lt;/h2&gt;

&lt;p&gt;Here's the reality of how most coding assessments work today: a candidate writes code, the platform runs testcases, and the output is a single number. Pass 7 out of 10 testcases? That's your score.&lt;/p&gt;

&lt;p&gt;But anyone who's done a real code review knows that the score tells you almost nothing about the developer. Two candidates can both score 70%, but one of them wrote clean, well-structured code with thoughtful edge case handling, while the other brute-forced a solution with global variables everywhere and got lucky on the test cases.&lt;/p&gt;

&lt;p&gt;The current model measures two things: correctness and partial performance. Everything else (code style, maintainability, security patterns, debugging skills, how the candidate actually &lt;em&gt;approached&lt;/em&gt; the problem) is invisible.&lt;/p&gt;

&lt;p&gt;This has real consequences. At enterprise scale, one of our customers was manually reviewing &lt;strong&gt;74,000 candidates per year&lt;/strong&gt; to compensate for what automated scoring couldn't capture. That's over &lt;strong&gt;12,000 hours&lt;/strong&gt; of engineering time spent on manual code review, every single year.&lt;/p&gt;

&lt;p&gt;We wanted to build something that could see what the score can't.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗺️ Designing a Holistic Skill Profile
&lt;/h2&gt;

&lt;p&gt;Before writing any code, we spent the first couple of hours whiteboarding what a "complete" developer evaluation would actually look like. We landed on five dimensions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Solution:&lt;/strong&gt; Does the code work? Is it performant? This is the baseline that existing systems already cover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧹 Code Quality:&lt;/strong&gt; Is it readable? Is it maintainable? Would you want to inherit this codebase?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛡️ Reliability:&lt;/strong&gt; Does the candidate think about security, scalability, exception handling, and technical design? These are the signals that separate a junior developer from a senior one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;♿ User Experience:&lt;/strong&gt; Does the code consider accessibility? This is especially relevant for frontend assessments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧠 Logical Progression:&lt;/strong&gt; This is the one that got us most excited. Instead of just reviewing the final submission, what if we could understand &lt;em&gt;how&lt;/em&gt; the candidate got there? Their debugging patterns, their persistence when stuck, the moments where they pivoted their approach.&lt;/p&gt;

&lt;p&gt;That last dimension is what made our project different from "just another AI code reviewer." We weren't just analyzing code. We were analyzing the &lt;em&gt;process&lt;/em&gt; of writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏗️ The Architecture (Plus 12 Cups of Coffee)
&lt;/h2&gt;

&lt;p&gt;Hour 3. Whiteboard phase over. Coffee cup #3. Time to build.&lt;/p&gt;

&lt;p&gt;We designed the system as a standalone platform service, intentionally decoupled from any single product UI so it could eventually plug into screening, interviews, and skill assessments across the board.&lt;/p&gt;

&lt;p&gt;The data flow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⌨️ Keystroke ingestion:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow:&lt;/strong&gt; Assessment Frontend → Attempt Processing Worker → Candidate DB&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔬 Code quality analysis:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow:&lt;/strong&gt; Candidate DB → Code Quality Platform Service → Core API&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🤖 AI review engine:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow:&lt;/strong&gt; Code Review Rubric → Next.js App → AI Platform (LLM)&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Code Quality Platform Service&lt;/strong&gt; is the central piece. It receives attempt data (including raw keystroke streams), runs a combination of static analysis and LLM-powered review against a configurable rubric, and pushes structured results back to the API layer for rendering.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Next.js app&lt;/strong&gt; handles the review orchestration, consuming rubric definitions and coordinating with the AI platform to produce categorized, line-level code comments.&lt;/p&gt;

&lt;p&gt;And then there was the part I spent most of my 24 hours on.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⏪ My Contribution: Turning Keystrokes into a Time Machine
&lt;/h2&gt;

&lt;p&gt;Here's the thing about keystroke data: it's raw. Really raw. A stream of individual key events with timestamps. Insert character. Delete character. Cursor move. Paste. Undo. Thousands of events per coding session.&lt;/p&gt;

&lt;p&gt;My job was to turn that raw stream into something an AI reviewer could actually reason about.&lt;/p&gt;

&lt;p&gt;I built a &lt;strong&gt;keystroke serialization engine&lt;/strong&gt; that reconstructs snapshots of the candidate's code at configurable intervals. Instead of just handing the LLM the final submission and saying "review this," the engine generates a sequence of code states, a snapshot every &lt;em&gt;n&lt;/em&gt; keystrokes, that captures the candidate's code at different points in their journey.&lt;/p&gt;

&lt;p&gt;Think of it like git commits, but automatic and granular 📸. Snapshot at keystroke 50. Snapshot at keystroke 150. Snapshot at keystroke 300. Each one is a frozen moment of the candidate's progress.&lt;/p&gt;

&lt;p&gt;This changes what the AI reviewer can see. It's not just &lt;em&gt;what&lt;/em&gt; the candidate wrote, it's &lt;em&gt;how&lt;/em&gt; they got there 🕵️.&lt;/p&gt;

&lt;p&gt;Did they start with a brute-force approach and refactor? Did they handle the happy path first and then circle back for edge cases? Did they get stuck on a syntax error for 10 minutes or catch it in 30 seconds? Did they delete half their code and restart with a better approach, or did they keep patching a broken foundation?&lt;/p&gt;

&lt;p&gt;The configurable gap parameter is where the real tradeoff lives: you tune snapshot frequency based on question complexity. For a quick algorithm question, every 30 keystrokes gives enough resolution. For a longer system design problem, every 100.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;More granular snapshots = more LLM calls, higher latency, and higher inference cost. The cost-to-resolution curve is a real production problem this approach needs to address before it can scale.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On top of the serialization engine, I built the &lt;strong&gt;Next.js frontend&lt;/strong&gt; that surfaces all of this: the code playback UI, the inline AI review comments, and the attempt timeline that shows the candidate's phases visually.&lt;/p&gt;

&lt;p&gt;By hour 18, keystroke-to-snapshot serialization was working end to end. By hour 22, it was integrated with the AI review pipeline and rendering in the UI. The last two hours were pure polish and demo prep (and coffee cups #11 and #12).&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 What the AI Reviewer Actually Outputs
&lt;/h2&gt;

&lt;p&gt;The review engine produces structured, line-level comments. Not vague "this could be better" feedback, but specific, categorized, severity-tagged observations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"High"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Code Style"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5-6"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"comment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Extensive use of global variables. Leads to unexpected side effects and complicates debugging."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These comments overlay directly on the code playback, so a reviewer sees the AI's observations at the exact lines where issues appear.&lt;/p&gt;

&lt;p&gt;Beyond line-level feedback, the system generates an &lt;strong&gt;Attempt Summary&lt;/strong&gt;, a natural-language overview designed for non-technical hiring stakeholders. It includes a composite score, a phase timeline (initial setup → debugging → edge-case handling → optimization), and structured highlights and lowlights.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Defined evaluation criteria fed as structured prompts is what makes LLM code review reliable enough to surface to hiring teams. Without the rubric layer, you get opinions. With it, you get a repeatable process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🌙 24 Hours of In-Office Hackathon Culture
&lt;/h2&gt;

&lt;p&gt;I want to talk about the vibe for a second, because it matters.&lt;/p&gt;

&lt;p&gt;There's something different about building alongside your team in a room at 3 AM with empty coffee cups and a deadline. The brainstorming is faster. The decisions are bolder. Nobody's overthinking a PR review. You're just shipping. The energy of an in-office hackathon compresses months of "we should build this someday" into one intense, focused burst.&lt;/p&gt;

&lt;p&gt;The first hour was chaos, eight people talking over each other about what to build. Then someone pulled up a whiteboard and it clicked. The next 22 hours were a mix of deep focus sprints, quick syncs standing around someone's laptop, and exactly the right amount of distraction (the poker game was competitive, I'll leave it at that 🃏).&lt;/p&gt;

&lt;p&gt;This is the stuff that builds team trust. You learn more about how someone thinks and works in 24 hours of hackathon pressure than in months of regular sprint work.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 From Hackathon to Product
&lt;/h2&gt;

&lt;p&gt;By demo time, we had two things working end to end:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A fully operational &lt;strong&gt;Code Quality Platform Service&lt;/strong&gt;: keystroke ingestion, snapshot serialization, AI-powered multi-dimensional review, and structured output via API.&lt;/li&gt;
&lt;li&gt;A working &lt;strong&gt;frontend integration&lt;/strong&gt;: inline code review comments, skill dimension indicators, attempt timeline, and natural-language summary, all rendered in the assessment UI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We placed &lt;strong&gt;2nd runner-up&lt;/strong&gt; 🥉 out of all teams at HackGPT 2.0. More importantly, the prototype demonstrated something the product team had been theorizing about for months: that AI-powered holistic code review is not just feasible, but practical at scale.&lt;/p&gt;

&lt;p&gt;Our CEO later called it out publicly 📢:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/rvivek/status/1825563452229767607" rel="noopener noreferrer"&gt;Post on X&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That validation felt great 🙌. But what I keep thinking about is the second-order implication: if keystroke data becomes a first-class evaluation signal, the way assessments get &lt;em&gt;designed&lt;/em&gt; changes. Question complexity, time windows, the balance between free-form coding and structured problems, all of it needs rethinking. The technology isn't the hard part. Rethinking the assessment design around it is 🤝.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;⛏️ &lt;strong&gt;Keystroke data is an underrated goldmine.&lt;/strong&gt; Most platforms throw it away or use it only for proctoring. Treating it as a first-class data source for skill assessment opens up an entirely new evaluation dimension.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🤖 &lt;strong&gt;LLMs are good at code review, with guardrails.&lt;/strong&gt; You can't just dump code into an LLM and expect consistent, structured output. The rubric-driven approach, where you define evaluation criteria separately and feed them as structured prompts, is what makes the output reliable enough to surface to hiring teams.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⚡ &lt;strong&gt;Hackathons compress learning.&lt;/strong&gt; I went deeper on keystroke event processing, snapshot reconstruction, and LLM orchestration in 24 hours than I would have in weeks of regular work. Constraints breed focus.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eight people with different expertise areas, 24 hours, one shared vision. That's how real systems get built ✨&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on June 5, 2024 at &lt;a href="https://souravdey.space/blogs/2nd-runner-up-hackgpt-2" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>product</category>
      <category>career</category>
    </item>
    <item>
      <title>Why Side Projects Compound 🏗️</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Mon, 06 Apr 2026 07:56:56 +0000</pubDate>
      <link>https://forem.com/souravdey777/why-side-projects-compound-5hcp</link>
      <guid>https://forem.com/souravdey777/why-side-projects-compound-5hcp</guid>
      <description>&lt;p&gt;For years I treated side projects like a second job I was failing at. 😅&lt;/p&gt;

&lt;p&gt;I was still building. The fuel was not a trophy list. It was &lt;strong&gt;ideas&lt;/strong&gt;: problems I could not drop, small "what ifs," things I wanted to exist whether or not anyone asked. Some turned into code and demos. Some stayed half-born in notes. When something did ship, I parked it on &lt;a href="https://souravdey.space/sideProjects" rel="noopener noreferrer"&gt;Side Projects&lt;/a&gt; so I could point back without turning the build into a performance. The hard part was not a lack of sparks. It was guilt. Every hour on a personal repo felt like an hour I stole from rest, from my day job, from whatever version of adulthood the noise online says you should perform.&lt;/p&gt;

&lt;p&gt;If you have ever closed your laptop at 1 AM 🌙 and thought, &lt;em&gt;this does not count&lt;/em&gt;, you know the feeling.&lt;/p&gt;

&lt;p&gt;Here is the lesson that took me too long to learn: &lt;strong&gt;side projects add up over time even when they never become startups.&lt;/strong&gt; Not because every repo needs a prize. Because they train skills your sprint board rarely optimizes for. ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  What side projects teach beyond your job 🧾
&lt;/h2&gt;

&lt;p&gt;At work, someone else shapes the problem, writes the ticket, and often picks the hard choices for you. That is not a knock on you. It is how real companies ship.&lt;/p&gt;

&lt;p&gt;Side projects push you into the step before that: choosing what is worth building when no one asked, when the scope is yours, when the only deadline is your own pride. That is where you practice &lt;strong&gt;decisions when nothing is spelled out&lt;/strong&gt;, the same habit that later helps when two technical options are both "fine" and someone has to pick.&lt;/p&gt;

&lt;p&gt;You also get &lt;strong&gt;shipping in public&lt;/strong&gt; if you publish the work. 📣 A private spike teaches syntax. A public repo teaches taste, communication, and the slow work of explaining your own mess.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4krvepuxqpw4gdlmw64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb4krvepuxqpw4gdlmw64.png" alt="Austin Kleon's Show Your Work: Learn 🔁 Teach cycle" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure from Austin Kleon's &lt;a href="https://austinkleon.com/show-your-work/" rel="noopener noreferrer"&gt;Show Your Work!&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That book is where I first saw the &lt;strong&gt;learn and teach&lt;/strong&gt; loop drawn as one circle. You learn, you share what you know, and sharing feeds the next round of learning. Austin Kleon's "show your work" idea is not about showing off. It is about letting your thinking meet real people. I wrote about why that cycle is a career catalyst for builders, and how I use it in mentorship, &lt;a href="https://www.linkedin.com/posts/souravdey777_techmentorship-learnandteach-careergrowth-activity-7242487643702231040-CVI7" rel="noopener noreferrer"&gt;in this LinkedIn post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And Guess what? The web is not fair. Polished demos can flop. Rough hacks can take off. You cannot chase likes without turning the whole thing into a second social media job. You can still chase &lt;strong&gt;practice reps&lt;/strong&gt;: ship, write it down, cut scope, finish something. 🎯&lt;/p&gt;

&lt;h2&gt;
  
  
  What compounding means for side projects 📈
&lt;/h2&gt;

&lt;p&gt;When I say compound, I do not mean every project becomes a clean story for interviews. I mean a set of skills that still help you after you stop opening the repo every week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spotting patterns&lt;/strong&gt; is the big one. After you debug your own auth flow, deploy surprises, and your own "why is this slow" hunts, incidents at work start to look familiar. The details change. The shape of the problem often does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing your tools&lt;/strong&gt; is the quiet kind of compound interest. 🛠️ You learn a framework because a weekend idea needed it. Two years later that is not just a resume line. It is speed when the team needs a prototype, or when you read someone else's system and you actually get the constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proof you can ship&lt;/strong&gt; matters more than people say, especially early. ✅ Not proof you are a genius. Proof you can take an idea from zero to something another person can run. That is a different signal than "I finished courses."&lt;/p&gt;

&lt;p&gt;There is a follow-on effect too. 🤖 You can ship side projects &lt;strong&gt;lightning fast&lt;/strong&gt; now: AI handles boilerplate, glue code, and first drafts so an idea can become a working thing in hours, not weeks. As that wall gets lower, the hard part moves earlier. The rare skill is not typing UI faster. It is naming the problem, picking limits, and knowing what "good enough" means for a user. Side projects are a &lt;strong&gt;low-risk place&lt;/strong&gt; to grow that product sense without treating a tutorial like owning a real feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product engineering&lt;/strong&gt; is part of that same stack, and it grows fast when you &lt;strong&gt;build for yourself&lt;/strong&gt;. You are the user, the scope owner, and the engineer in one loop, so tradeoffs land in your head instead of across three roles in a meeting. I wrote about why that mindset is the skill that survives when AI handles more of the code in &lt;a href="https://souravdey.space/blogs/product-engineers-and-the-ai-era" rel="noopener noreferrer"&gt;product engineering in the AI era&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side projects are not free ⚖️
&lt;/h2&gt;

&lt;p&gt;Growth needs finish lines, not only new ideas. If every spark becomes a new foundation and nothing ships, you get the joke instead of the skills.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxb6bet45z86xrqarpyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxb6bet45z86xrqarpyf.png" alt="CommitStrip comic: a developer leaves a nearly done stone wall for a new wooden frame, says the old project was almost finished, and the last panel shows many half-built structures in a field" width="650" height="995"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Strip: &lt;a href="https://www.commitstrip.com/en/2014/11/25/west-side-project-story/" rel="noopener noreferrer"&gt;West Side-project story&lt;/a&gt; (CommitStrip, 2014).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Side projects still cost something. Sleep. 😴 Relationships. The trap of using "hustle" to skip rest. I will not tell you every engineer needs a perfect GitHub graph. That is not wellness. It is stress with a brand. 😬&lt;/p&gt;

&lt;p&gt;The useful idea is smaller: &lt;strong&gt;if you already build on the side, stop treating it like a character flaw.&lt;/strong&gt; Call it practice that stacks over time, then guard your time like a grown person. A side project that ships in six weeks with weekends intact beats a "rewrite everything" dream that eats six months of guilt.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently 🧭
&lt;/h2&gt;

&lt;p&gt;I would pick smaller scope and celebrate done more loudly. I would treat docs as part of the product, not an afterthought, because future me is also a user. 📝&lt;/p&gt;

&lt;p&gt;I would split real learning from "learning for the feed." Some spikes stay private. Not everything needs a post. The value still lands in your head. 🧠&lt;/p&gt;

&lt;p&gt;Most of all, I would stop forcing side projects to prove themselves in the same frame as my job. They are not copies of each other. They are different gyms. One pays your salary. The other builds &lt;strong&gt;more choices&lt;/strong&gt;, &lt;strong&gt;speed&lt;/strong&gt;, and &lt;strong&gt;confidence&lt;/strong&gt; when you see a work problem no one filed yet.&lt;/p&gt;

&lt;p&gt;If you are building something odd this weekend and part of you feels guilty for not "optimizing" your career, that build might already be the optimization. Ship the smallest version. Ship it. Then step away.&lt;/p&gt;

&lt;p&gt;The compound part was never the repo. It was the person all those reps built. ✨&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://souravdey.space/blogs/why-side-projects-compound" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>buildinginpublic</category>
      <category>sideprojects</category>
      <category>productengineering</category>
    </item>
    <item>
      <title>LeetCode #376: Wiggle Subsequence</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Tue, 31 Mar 2026 13:59:03 +0000</pubDate>
      <link>https://forem.com/souravdey777/leetcode-376-wiggle-subsequence-46o8</link>
      <guid>https://forem.com/souravdey777/leetcode-376-wiggle-subsequence-46o8</guid>
      <description>&lt;h2&gt;
  
  
  LeetCode Question - 376. Wiggle Subsequence 🧠
&lt;/h2&gt;

&lt;h3&gt;
  
  
  About the Series
&lt;/h3&gt;

&lt;p&gt;Problem-solving is a key skill set for any tech-related stuff you might be working on.&lt;/p&gt;

&lt;p&gt;When it comes to developers it's one of the most crucial skills which is needed in almost any day-to-day code you might be writing.&lt;/p&gt;

&lt;p&gt;So, this series of blogs is all about practicing Daily LeetCode Challenges &amp;amp; Problem-solving. 🚀&lt;/p&gt;

&lt;p&gt;Earlier in this series: &lt;a href="https://souravdey.space/blogs/leetcode-daily-challenge-02" rel="noopener noreferrer"&gt;LeetCode #1465: Maximum Area of Cake After Cuts&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem Statement
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://leetcode.com/problems/wiggle-subsequence/" rel="noopener noreferrer"&gt;&lt;strong&gt;Wiggle Subsequence&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;wiggle sequence&lt;/strong&gt; is a sequence where the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with one element and a sequence with two non-equal elements are trivially wiggle sequences.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For example, &lt;code&gt;[1, 7, 4, 9, 2, 5]&lt;/code&gt; is a wiggle sequence because the differences &lt;code&gt;(6, -3, 5, -7, 3)&lt;/code&gt; alternate between positive and negative.&lt;/li&gt;
&lt;li&gt;In contrast, &lt;code&gt;[1, 4, 7, 2, 5]&lt;/code&gt; and &lt;code&gt;[1, 7, 4, 5, 5]&lt;/code&gt; are not wiggle sequences. The first is not because its first two differences are positive, and the second is not because its last difference is zero.
A &lt;strong&gt;subsequence&lt;/strong&gt; is obtained by deleting some elements (possibly zero) from the original sequence, leaving the remaining elements in their original order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given an integer array &lt;code&gt;nums&lt;/code&gt;, return the length of the longest wiggle subsequence of &lt;code&gt;nums&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Video Explanation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=mp5-uz6W8MA" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Algorithm&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First check if the length of the &lt;code&gt;nums&lt;/code&gt; array is smaller than two or not. If yes, we will simply return the length of the array ie. &lt;code&gt;0&lt;/code&gt; for &lt;code&gt;[]&lt;/code&gt; and &lt;code&gt;1&lt;/code&gt; for &lt;code&gt;[x]&lt;/code&gt; (where x can be any value)&lt;/li&gt;
&lt;li&gt;We check the first difference between the &lt;code&gt;1st&lt;/code&gt; from the &lt;code&gt;0th&lt;/code&gt; value in the &lt;code&gt;nums&lt;/code&gt; array and store it in the &lt;code&gt;previousdiff&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If the values are not equal we will count both the no. for the wiggle sequence thus our counter will be &lt;code&gt;2&lt;/code&gt; and if equal we take our counter to be &lt;code&gt;1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Now, While iterating the &lt;code&gt;nums&lt;/code&gt; array we will compare the compare current difference and the previous difference. If one is positive the other should be negative or vice versa. Now, we will increment the count if the conditions are satisfied and update the previous difference with the current difference.&lt;/li&gt;
&lt;li&gt;Finally return the count of the wiggle sequence.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Code in JS 🧑‍💻&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * @param {number[]} nums
 * @return {number}
 */&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;wiggleMaxLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;previousdiff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;previousdiff&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;currentDiff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentDiff&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;previousdiff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;currentDiff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;previousdiff&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;previousdiff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;currentDiff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Time Complexity : &lt;code&gt;O(n)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Space Complexity: &lt;code&gt;O(1)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Similar Questions for practice
&lt;/h3&gt;

&lt;p&gt;Now it is time to try more similar questions&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leetcode.com/problems/rearrange-array-elements-by-sign/" rel="noopener noreferrer"&gt;Rearrange Array Elements by Sign&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  You can find me on the web 🌍
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Souravdey777" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/souravdey777" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Souravdey777" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add your solution or approach in the comments below. Also, show your love by Sharing the blog. 🤗&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Dream big. Start small. But most of all, start."&lt;/p&gt;

&lt;p&gt;~ Simon Sinek&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on July 3, 2022 at &lt;a href="https://souravdey.space/blogs/leetcode-daily-challenge-03" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>javascript</category>
    </item>
    <item>
      <title>LeetCode #1465: Maximum Area of Cake After Cuts</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Tue, 31 Mar 2026 13:59:01 +0000</pubDate>
      <link>https://forem.com/souravdey777/leetcode-1465-maximum-area-of-cake-after-cuts-36ac</link>
      <guid>https://forem.com/souravdey777/leetcode-1465-maximum-area-of-cake-after-cuts-36ac</guid>
      <description>&lt;h2&gt;
  
  
  LeetCode Question - 1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts 🍰
&lt;/h2&gt;

&lt;h3&gt;
  
  
  About the Series
&lt;/h3&gt;

&lt;p&gt;Problem-solving is a key skill set for any tech-related stuff you might be working on.&lt;/p&gt;

&lt;p&gt;When it comes to developers it's one of the most crucial skills which is needed in almost any day-to-day code you might be writing.&lt;/p&gt;

&lt;p&gt;So, this series of blogs is all about practicing Daily LeetCode Challenges &amp;amp; Problem-solving. 🚀&lt;/p&gt;

&lt;p&gt;Earlier in this series: &lt;a href="https://souravdey.space/blogs/leetcode-daily-challenge-01" rel="noopener noreferrer"&gt;LeetCode #1710: Maximum Units on a Truck&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem Statement
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://leetcode.com/problems/maximum-area-of-a-piece-of-cake-after-horizontal-and-vertical-cuts/" rel="noopener noreferrer"&gt;&lt;strong&gt;Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts 🍰&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are given a rectangular cake of size &lt;code&gt;h x w&lt;/code&gt; and two arrays of integers &lt;code&gt;horizontalCuts&lt;/code&gt; and &lt;code&gt;verticalCuts&lt;/code&gt; where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;horizontalCuts[i]&lt;/code&gt; is the distance from the top of the rectangular cake to the &lt;code&gt;ith&lt;/code&gt; horizontal cut and similarly, and&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;verticalCuts[j]&lt;/code&gt; is the distance from the left of the rectangular cake to the &lt;code&gt;jth&lt;/code&gt; vertical cut.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Return the maximum area of a piece of cake after you cut at each horizontal and vertical position provided in the arrays &lt;code&gt;horizontalCuts&lt;/code&gt; and &lt;code&gt;verticalCuts&lt;/code&gt;. Since the answer can be a large number, return this &lt;code&gt;modulo 109 + 7&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Video Explanation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=gErjVSkoKDA" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Algorithm&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Push &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;h&lt;/code&gt; in the &lt;code&gt;horizontalCuts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sort the &lt;code&gt;horizontalCuts&lt;/code&gt; array in Ascending Order.&lt;/li&gt;
&lt;li&gt;Take the maximum difference between the cuts by iterating on the list of &lt;code&gt;horizontalCuts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Push &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;h&lt;/code&gt; in the &lt;code&gt;horizontalCuts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sort the &lt;code&gt;horizontalCuts&lt;/code&gt; array in Ascending Order.&lt;/li&gt;
&lt;li&gt;Take the maximum difference between the cuts by iterating on the list of &lt;code&gt;horizontalCuts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Multiply both the max values and return the modulo &lt;code&gt;10^9 + 7&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Now, we got the largest piece of Cake 🍰&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Code in JS 🧑‍💻&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * @param {number} h
 * @param {number} w
 * @param {number[]} horizontalCuts
 * @param {number[]} verticalCuts
 * @return {number}
 */&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maxArea&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;horizontalCuts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verticalCuts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;horizontalCuts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;horizontalCuts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maxH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;verticalCuts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;verticalCuts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maxW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;horizontalCuts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;maxH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;horizontalCuts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;horizontalCuts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;verticalCuts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;maxW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verticalCuts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;verticalCuts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxW&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;e9&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Time Complexity : &lt;code&gt;O(nlogn)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Space Complexity: &lt;code&gt;O(1)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  You can find me on the web 🌍
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Souravdey777" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/souravdey777" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Souravdey777" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add your solution or approach in the comments below.&lt;/p&gt;

&lt;p&gt;Show your love by Sharing the blog. 🤗&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The best way to predict the future is to create it.”&lt;/p&gt;

&lt;p&gt;~ Peter Drucker&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published on July 2, 2022 at &lt;a href="https://souravdey.space/blogs/leetcode-daily-challenge-02" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Product Engineering: The Only Skill That Survives AI 🏗️</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Mon, 30 Mar 2026 08:16:54 +0000</pubDate>
      <link>https://forem.com/souravdey777/product-engineering-the-only-skill-that-survives-ai-2pad</link>
      <guid>https://forem.com/souravdey777/product-engineering-the-only-skill-that-survives-ai-2pad</guid>
      <description>&lt;p&gt;I've been building customer-facing products for seven years now. From the Test Creation Experience used across 1.9M+ tests at HackerRank to GPT-4o powered features in production, I've seen what separates products that stick from those that get shelved after three months of development.&lt;/p&gt;

&lt;p&gt;Here's what I've learned: &lt;strong&gt;the only limitation in the AI era is product thinking.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Acceleration Problem
&lt;/h2&gt;

&lt;p&gt;Everyone's talking about AI making us 10x faster. Write a prompt, get a component. Describe a feature, get working code. The demos are compelling. The productivity gains are real.&lt;/p&gt;

&lt;p&gt;But here's what nobody's talking about: &lt;strong&gt;speed without direction is just expensive motion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I see engineers shipping faster than ever and wondering why their features don't land. They can build anything now. The question they can't answer is: what should I build? 🤔&lt;/p&gt;

&lt;p&gt;That gap is product engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Product Engineering Actually Means
&lt;/h2&gt;

&lt;p&gt;Product engineering isn't about choosing React over Vue. It's not about microservices architecture or deployment pipelines.&lt;/p&gt;

&lt;p&gt;Product engineering is &lt;strong&gt;building with the user's problem as your north star&lt;/strong&gt;, not the technology.&lt;/p&gt;

&lt;p&gt;Back in 2023, I was discussing my promotion with my manager at HackerRank. Around the same time, I stumbled upon Gergely Orosz's &lt;a href="https://blog.pragmaticengineer.com/the-product-minded-engineer/" rel="noopener noreferrer"&gt;The Product-Minded Software Engineer&lt;/a&gt; on The Pragmatic Engineer blog. Reading it felt like someone had written down exactly what I do. Every trait he described, from proactive product ideas to end-to-end feature ownership, mapped to how I have been working for years. That article became my pitch for the promotion. I've never been the strongest "pure coder" in the room, but I've always been a solid product engineer. That's what sets me apart 💪 There is another book on this, &lt;a href="https://www.oreilly.com/library/view/the-product-minded-engineer/9781098173722/" rel="noopener noreferrer"&gt;The Product-Minded Engineer&lt;/a&gt; (November 2025) by Drew Hoskins, and it reinforces the same core truth: the engineers who have the most impact are the ones who care deeply about the product, not just the code.&lt;/p&gt;

&lt;p&gt;When we built the Test Creation Experience at HackerRank, the engineering challenge wasn't the hardest part. The hard part was understanding that recruiters weren't failing to create tests because our UI was clunky. They were failing because they didn't know what good technical questions looked like in the first place.&lt;/p&gt;

&lt;p&gt;The feature that moved the needle wasn't better form validation. It was a question recommendation engine that suggested problems based on the role they were hiring for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product engineering is seeing the gap between what users say they want and what they actually need.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the longer career arc behind that idea, see &lt;a href="https://souravdey.space/blogs/7-years-being-a-software-engineer" rel="noopener noreferrer"&gt;seven years as a software engineer&lt;/a&gt;. For shipping under a brutal clock with a product-shaped goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI Makes This More Critical, Not Less
&lt;/h2&gt;

&lt;p&gt;In 2019, if you wanted to build a feature, you needed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design the database schema&lt;/li&gt;
&lt;li&gt;Write the API endpoints&lt;/li&gt;
&lt;li&gt;Build the frontend components&lt;/li&gt;
&lt;li&gt;Handle edge cases and error states&lt;/li&gt;
&lt;li&gt;Deploy and monitor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That took weeks. The friction forced you to think: is this worth building?&lt;/p&gt;

&lt;p&gt;In 2026, I can describe a feature to Claude and have working code in 20 minutes. The friction is gone. &lt;strong&gt;The forcing function for good judgment disappeared.&lt;/strong&gt; 🫠&lt;/p&gt;

&lt;p&gt;Now anyone can build anything. The engineers who survive aren't the ones who can prompt better. They're the ones who know what's worth building.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Obsession With "Great Engineering"
&lt;/h2&gt;

&lt;p&gt;I've worked with brilliant engineers who could optimize a database query from 200ms to 15ms, architect systems that handle millions of requests, and debug race conditions in distributed systems.&lt;/p&gt;

&lt;p&gt;Some of them built features nobody used. 😅&lt;/p&gt;

&lt;p&gt;The ones who had impact? They started every conversation with: &lt;strong&gt;"What problem are we solving, and for whom?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They asked questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who specifically has this problem?&lt;/li&gt;
&lt;li&gt;How do they solve it today?&lt;/li&gt;
&lt;li&gt;What would make them change their workflow?&lt;/li&gt;
&lt;li&gt;How do we know if we fixed it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions matter more than knowing the latest JavaScript framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Product Engineering Principles
&lt;/h2&gt;

&lt;p&gt;After seven years and dozens of shipped features, here's what I've learned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Fall in love with the problem, not your solution.&lt;/strong&gt;&lt;br&gt;
I've killed features I spent months building because user research showed we were solving the wrong problem. It hurt. But shipping the wrong thing perfectly is worse than not shipping at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Build for one person first.&lt;/strong&gt;&lt;br&gt;
Every successful feature I've shipped started with understanding one specific user's workflow in detail. Generic "user personas" don't build products. Real humans with real problems do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The best code is code you don't write.&lt;/strong&gt;&lt;br&gt;
Before building anything, ask: what's the simplest thing that could work? Half the features I thought I needed to build turned out to be configuration changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Measure behavior, not opinions.&lt;/strong&gt;&lt;br&gt;
Users will tell you they want feature X. Then you build feature X and nobody uses it. Watch what they do, not what they say they'll do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Era Divide
&lt;/h2&gt;

&lt;p&gt;I predict a split in our industry:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI-Assisted Code Writers:&lt;/strong&gt; Fast at implementation, focused on technical craft. They can build anything you spec out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product Engineers:&lt;/strong&gt; Focused on what to build and why. They use AI as a tool to ship faster, but they're solving the right problems.&lt;/p&gt;

&lt;p&gt;Both roles matter. But if you're building customer-facing products, &lt;strong&gt;you need to be in the second category.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The companies that win in the AI era won't be the ones with the best AI engineers. They'll be the ones with the best product engineers who happen to use AI. 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;If I were starting my career today, I wouldn't spend time learning every new framework or AI tool that comes out.&lt;/p&gt;

&lt;p&gt;I'd spend time with users. I'd sit in customer support calls. I'd read every piece of feedback. I'd understand how people actually work, not how I think they should work.&lt;/p&gt;

&lt;p&gt;The frameworks change every two years. Understanding humans compounds forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product engineering isn't a nice-to-have anymore. In the AI era, it's how you stay relevant.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The future belongs to engineers who can think like builders, not just coders. AI will handle the coding part. &lt;strong&gt;The building part still needs humans.&lt;/strong&gt; ✨&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on March 30, 2026 at &lt;a href="https://souravdey.space/blogs/product-engineers-and-the-ai-era" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>product</category>
      <category>ai</category>
      <category>engineering</category>
      <category>career</category>
    </item>
    <item>
      <title>7 Years as a Software Engineer: What Actually Changed 💼</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Wed, 25 Mar 2026 14:10:14 +0000</pubDate>
      <link>https://forem.com/souravdey777/7-years-as-a-software-engineer-what-actually-changed-341i</link>
      <guid>https://forem.com/souravdey777/7-years-as-a-software-engineer-what-actually-changed-341i</guid>
      <description>&lt;p&gt;Green build. Staging fine. I still walked away feeling off 💻&lt;/p&gt;

&lt;p&gt;The code did what we agreed on. &lt;strong&gt;The agreement was the broken part.&lt;/strong&gt; That week stuck with me more than any refactor I have shipped since.&lt;/p&gt;

&lt;p&gt;Seven years in, I still write code. I also still Google things I have looked up a hundred times, and I am fine admitting that. The job stopped being mostly syntax ages ago. It moved into requirements nobody wrote down, roadmaps that pretend six things are one thing, and the gap between what product imagines and what the system can honestly do. You feel that gap in your calendar before you feel it in the compiler.&lt;/p&gt;

&lt;p&gt;I am not going to give you a promotion timeline or a framework bingo card.&lt;/p&gt;

&lt;p&gt;Here is what moved in how I work, and what I would say to the version of me who was scared of sounding dumb in standup 🙈&lt;/p&gt;

&lt;h2&gt;
  
  
  🧭 The first shift: when “it runs” is not the win
&lt;/h2&gt;

&lt;p&gt;Early on I treated success like a checklist. Tests pass ✅ PR merged. Done. That bar matters. You cannot skip it.&lt;/p&gt;

&lt;p&gt;The first time it failed me was ordinary. Everything behaved in staging, users were still unhappy, and the bug was the assumption behind the feature, not a null pointer.&lt;/p&gt;

&lt;p&gt;These days I slow down before I type. Who is this actually for? What happens at 10x traffic? What is the cheapest way to prove we are wrong? I used to think those questions were someone else’s job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They are the job&lt;/strong&gt; 🎯&lt;/p&gt;

&lt;p&gt;Hackathons taught me scope is the real villain 🏃 Side projects taught me demos follow their own physics. HackerRank taught me the expensive problems sit between intent and reality. Same muscle, different costumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌫️ Ambiguity stopped feeling like a personal failure
&lt;/h2&gt;

&lt;p&gt;Junior me assumed if I asked enough questions in one Slack thread, uncertainty would pack up and leave.&lt;/p&gt;

&lt;p&gt;It does not work that way. Some fog only lifts after there is a real thing to poke at.&lt;/p&gt;

&lt;p&gt;I stopped pretending I had it all figured out on day one. I try to pick a step we can undo, say the tradeoff out loud, and invite correction early. A rough prototype still beats a three-day thread. A written assumption beats a silent guess every time ✍️&lt;/p&gt;

&lt;p&gt;I mentored at a hackathon once (&lt;a href="https://souravdey.space/blogs/mentoring-hackathon-experience" rel="noopener noreferrer"&gt;notes from CentuRITon&lt;/a&gt;), on the other side of the table. The struggling teams were rarely lazy. They were drowning in parallel goals 🌊 Helping them kill features felt like coaching courage, not debugging. I still use that instinct when a roadmap tries to ship six epics like they are one.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚖️ Speed, quality, and the lie of having both for free
&lt;/h2&gt;

&lt;p&gt;You have heard both sermons.&lt;/p&gt;

&lt;p&gt;Move fast and break things. Quality is non-negotiable. Real teams live in the middle and rarely say the quiet part out loud.&lt;/p&gt;

&lt;p&gt;What helped me was naming the tradeoff in a room full of people. If we optimize for learning speed, we accept rough edges and we instrument them. If we optimize for reliability, we skip shortcuts and we staff for that choice. The painful failure mode is when leadership says one priority and the calendar and incentives say another. Then you get slow and brittle together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No prize&lt;/strong&gt; 💥&lt;/p&gt;

&lt;p&gt;I still misread that alignment sometimes. I just catch it faster.&lt;/p&gt;

&lt;p&gt;Sounds tiny. It cost a lot of Tuesday evenings to get there 🩹&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Communication is not fluff. It is part of the ship.
&lt;/h2&gt;

&lt;p&gt;I am not the person who “only wants to code.” Not because I love calendars 📅 Because when alignment drifts, it shows up as reverts, sharp tickets, and that quiet distrust nobody puts in writing.&lt;/p&gt;

&lt;p&gt;A decent PR description. A diagram someone can find next month. A short note on why we picked this shape. Those things feel soft until you pay for not having them.&lt;/p&gt;

&lt;p&gt;When I &lt;a href="https://souravdey.space/blogs/portfolio-website-development-part-1" rel="noopener noreferrer"&gt;built this portfolio&lt;/a&gt; in public, I realized people read the thinking, not only the pixels. Same thing shows up in code review and design feedback. They are judging whether they can trust your judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Competence and confidence refuse to stay in sync
&lt;/h2&gt;

&lt;p&gt;Call it imposter syndrome or call it a brain that loves your mistakes more than your wins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same glitch.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I stopped waiting for the doubt to vanish. I keep boring receipts now. What shipped. What broke. What I fixed. What someone else shipped because I unblocked them.&lt;/p&gt;

&lt;p&gt;Loud moments under pressure helped once. They do not cure anything. They just remind you that you have done hard things before. Without the small receipts, one bad deploy on a random Tuesday eats the whole story 📉&lt;/p&gt;

&lt;h2&gt;
  
  
  🧰 What actually aged well
&lt;/h2&gt;

&lt;p&gt;Syntax turns over. Tools churn 🔄&lt;/p&gt;

&lt;p&gt;The skills that kept paying were unglamorous. Reading a stack trace without ego. Tracing a bug across services and saying which layer lied 🐛 Knowing when a library saves time and when it hides the learning you still need.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any fool can write code that a computer can understand. Good programmers write code that humans can understand.&lt;/p&gt;

&lt;p&gt;— Martin Fowler&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I still enjoy a gnarly bug.&lt;/p&gt;

&lt;p&gt;I enjoy it less when the gnarl exists because nobody wrote how the system is supposed to behave. Docs are not admin homework. They are kindness to whoever is on call at 11 PM 🌙 Future you counts.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Leadership without the title
&lt;/h2&gt;

&lt;p&gt;Influence is not a level on a ladder.&lt;/p&gt;

&lt;p&gt;It shows up in a clearer ticket, a safer rollback plan, a review comment that teaches instead of scores points. Sometimes it is saying I do not know when everyone else is improvising confidence 🤷&lt;/p&gt;

&lt;p&gt;I have spent five years at HackerRank now 🌱 Sustained product engineering, for me, is not heroics. It is &lt;strong&gt;ownership.&lt;/strong&gt; It is the quiet work of keeping a platform understandable while it grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✉️ What I would tell past me
&lt;/h2&gt;

&lt;p&gt;Ask earlier. Ship smaller. Write down why you chose something, not only what you built.&lt;/p&gt;

&lt;p&gt;Guard your attention the way you guard uptime, because it is the same finite resource.&lt;/p&gt;

&lt;p&gt;Busy is not the same as useful. I am still learning that last one ⏳&lt;/p&gt;

&lt;h2&gt;
  
  
  🪨 What still feels hard
&lt;/h2&gt;

&lt;p&gt;Saying no without becoming the villain in someone else’s story. Estimating when the information is incomplete, without faking precision. Staying curious when the backlog is shouting. Remembering the win is not owning the thread. It is leaving the system less confusing than you found it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seven years is not mastery&lt;/strong&gt; 🎓&lt;/p&gt;

&lt;p&gt;It is enough repetitions to spot the same traps: fake urgency, complexity sold as intelligence, teams confusing motion for progress. Enough time, too, to feel grateful for people who raised the bar 🙏 and a little gentler with myself when I was the bottleneck.&lt;/p&gt;

&lt;p&gt;If you are earlier in the curve, the takeaway is smaller than everyone makes it sound.&lt;/p&gt;

&lt;p&gt;Show up. Say the risky true thing. Make the next step obvious. Keep building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The code is only one part of the craft&lt;/strong&gt; ✨&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on March 25, 2026 at &lt;a href="https://souravdey.space/blogs/7-years-being-a-software-engineer" rel="noopener noreferrer"&gt;souravdey.space&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>engineering</category>
      <category>reflection</category>
    </item>
    <item>
      <title>⚡ Flexbox-Guide 🚀 Flexbox layout made simple with an Interactive tool</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Wed, 14 Apr 2021 08:49:49 +0000</pubDate>
      <link>https://forem.com/souravdey777/flexbox-guide-flexbox-layout-made-simple-with-an-interactive-tool-5g77</link>
      <guid>https://forem.com/souravdey777/flexbox-guide-flexbox-layout-made-simple-with-an-interactive-tool-5g77</guid>
      <description>&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;p&gt;An &lt;code&gt;Interactive Tool&lt;/code&gt; for the concept of Flexbox and Responsive Design. Simply set the attributes as needed and copy the CSS code. 🎉&lt;/p&gt;

&lt;p&gt;Website Link -  &lt;a href="http://flexbox-guide.vercel.app/" rel="noopener noreferrer"&gt;http://flexbox-guide.vercel.app/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Github Repo -  &lt;a href="https://github.com/Souravdey777/flexbox-guide" rel="noopener noreferrer"&gt;https://github.com/Souravdey777/flexbox-guide&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Docs Link -  &lt;a href="https://souravdey777.github.io/flexbox-guide/" rel="noopener noreferrer"&gt;https://souravdey777.github.io/flexbox-guide/&lt;/a&gt; &lt;/p&gt;




&lt;h3&gt;
  
  
  About &lt;code&gt;Flexbox-Guide&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Flexbox-Guide is a website developed for web developers and Coding newbies learning &lt;code&gt;CSS Flexbox Layout&lt;/code&gt;. This website can be used for both learnings or generating the code. Simply arrange the flex items as you need and copy the CSS to your code.&lt;/p&gt;

&lt;p&gt;Before the Flexbox Layout module, there were four layout modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block, for sections in a webpage&lt;/li&gt;
&lt;li&gt;Inline, for text&lt;/li&gt;
&lt;li&gt;Table, for two-dimensional table data&lt;/li&gt;
&lt;li&gt;Positioned, for the explicit position of an element&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Flexible Box Layout Module makes it easier to design a flexible responsive layout structure without using float or positioning.&lt;/p&gt;

&lt;p&gt;For a detailed explanation please check &lt;a href="https://css-tricks.com/snippets/css/a-guide-to-flexbox/" rel="noopener noreferrer"&gt;A Complete Guide to Flexbox&lt;/a&gt; by &lt;code&gt;Chris Coyier&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why wait? Straightaway go to the website and join the Awesomeness&lt;/strong&gt; 😎&lt;br&gt;
&lt;a href="https://flexbox-guide.vercel.app" rel="noopener noreferrer"&gt;https://flexbox-guide.souravdey777.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgoyuz8wjhn6magif2kh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgoyuz8wjhn6magif2kh.gif" alt="flexbox-guide.gif" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Inspiration 💡
&lt;/h3&gt;

&lt;p&gt;I got the Idea while I was explaining flexbox to a few of the interns in my office. I was explaining to them with three sample cards that how to make responsive cards with flexbox. And I have seen a lot of web developers using static &lt;code&gt;paddings&lt;/code&gt; and &lt;code&gt;margins&lt;/code&gt; and handling it with a lot of media queries. But, why go for such a mess when we have the &lt;code&gt;CSS flexbox layout&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This tool was also created with the same thought process. So that all the budding software developers can learn flexbox layout with an interactive tool, where you can set the attributes and check the layout as well as It will generate the CSS code for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technologies 🔨
&lt;/h3&gt;

&lt;p&gt;Built with Reactjs and Love ❤️&lt;/p&gt;

&lt;p&gt;Hosted in Vercel Cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accomplishment 🚀
&lt;/h3&gt;

&lt;p&gt;I have integrated 📈 analytics with &lt;a href="https://plausible.io/" rel="noopener noreferrer"&gt;plausible&lt;/a&gt; with the website recently on the 29th of Jan and here are the stats &lt;a href="https://plausible.io/flexbox-guide.vercel.app" rel="noopener noreferrer"&gt;https://plausible.io/flexbox-guide.vercel.app&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It also got published in a &lt;code&gt;Weekly Magzine for Designers&lt;/code&gt; 🎉&lt;br&gt;
&lt;a href="https://speckyboy.com/weekly-news-for-designers-577/" rel="noopener noreferrer"&gt;https://speckyboy.com/weekly-news-for-designers-577/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://speckyboy.com/weekly-news-for-designers-577/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1612687433048%2FmsEKE347P.png" alt="Group 31.png" width="800" height="1115"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The greatest of all is that It will help the community. &lt;/p&gt;

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

&lt;p&gt;📝 Distributed under the &lt;code&gt;MIT&lt;/code&gt; License. See &lt;a href="https://github.com/Souravdey777/flexbox-guide/blob/main/LICENSE" rel="noopener noreferrer"&gt;LICENSE&lt;/a&gt; for more information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contribution and Support
&lt;/h3&gt;

&lt;p&gt;Upvote Flexbox-Guide in 🚀 &lt;strong&gt;Product Hunt&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/flexbox-guide?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-flexbox-guide" rel="noopener noreferrer"&gt;&lt;br&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.producthunt.com%2Fwidgets%2Fembed-image%2Fv1%2Ffeatured.svg%3Fpost_id%3D281660%26theme%3Dlight" alt="Flexbox-Guide - Flexbox-Guide : A flexbox code generator | Product Hunt" width="250" height="54"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Souravdey777/flexbox-guide/pulls" rel="noopener noreferrer"&gt;Open a Pull Request&lt;/a&gt; or &lt;a href="https://github.com/Souravdey777/flexbox-guide/issues" rel="noopener noreferrer"&gt;Raise an Issue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;👨‍🚀 Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.&lt;/p&gt;

&lt;p&gt;Hope you Loved it! Do let me know in the comments.&lt;/p&gt;

&lt;p&gt;Want to learn more about flexbox?? Check the below link&lt;br&gt;
&lt;a href="https://souravdey777.github.io/flexbox-guide/#learn-more-about-flexbox" rel="noopener noreferrer"&gt;https://souravdey777.github.io/flexbox-guide/#learn-more-about-flexbox&lt;/a&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  Contact me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Souravdey777/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/souravdey777" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Souravdey777" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>100daysofcode</category>
      <category>css</category>
      <category>codenewbie</category>
      <category>flexbox</category>
    </item>
    <item>
      <title>Creating your own npm package</title>
      <dc:creator>Sourav Dey</dc:creator>
      <pubDate>Sun, 11 Apr 2021 12:18:17 +0000</pubDate>
      <link>https://forem.com/souravdey777/creating-your-own-npm-package-4f4g</link>
      <guid>https://forem.com/souravdey777/creating-your-own-npm-package-4f4g</guid>
      <description>&lt;h4&gt;
  
  
  First of all, &lt;strong&gt;What is npm?&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;npm&lt;/strong&gt; is two things: first and foremost, it is an online repository for the publishing of open-source Node.js projects; second, it is a command-line utility for interacting with a said repository that aids in package installation, version management, and dependency management. A plethora of Node.js libraries and applications are published on npm, and many more are added every day.&lt;/p&gt;

&lt;p&gt;☝ This is not out of my brain. 🧠 &lt;/p&gt;

&lt;p&gt;Reference to the definition &lt;br&gt;
 &lt;a href="https://nodejs.org/en/knowledge/getting-started/npm/what-is-npm/" rel="noopener noreferrer"&gt;https://nodejs.org/en/knowledge/getting-started/npm/what-is-npm/&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Setting the things up
&lt;/h2&gt;

&lt;p&gt;What you need to start is with simple Node.js installation and yes, that is it.&lt;br&gt;
Refer to the below links 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.dev/learn/how-to-install-nodejs" rel="noopener noreferrer"&gt;How to install Node.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Download link for Node.js&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Let us break this down into simple steps
&lt;/h2&gt;
&lt;h4&gt;
  
  
  1. Creating the package.json file
&lt;/h4&gt;

&lt;p&gt;For publishing an npm package you don't need anything apart from package.json. But, yeah it will not be having any functionalities.&lt;/p&gt;

&lt;p&gt;There are two ways to create the &lt;strong&gt;package.json&lt;/strong&gt; file. You can simply open any code editor and go for the good old-fashioned way of editing it yourself. I will suggest trying it once. You will get to know how to and what to add as key-value pair in the JSON file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "name": "your-amazing-package",
    "version": "1.0.0",
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the minimum key-value pair that is required to publish a package&lt;/p&gt;

&lt;p&gt;But, again if you want things to be done efficiently. Create the package.json with the below command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1617826535417%2FhfogJLNk8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1617826535417%2FhfogJLNk8.jpeg" alt="Capture.JPG"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow the instructions and enter the details one after another and after that just select enter after confirming the details.&lt;/p&gt;

&lt;p&gt;This is how your &lt;strong&gt;Package.json&lt;/strong&gt; is going to look after that 👇&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "awesome-npm",
  "version": "1.0.0",
  "description": "the awesome package",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" &amp;amp;&amp;amp; exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/YOUR_Git_USERNAME/awesome-npm.git"
  },
  "keywords": [
    "awesome"
  ],
  "author": "Sourav Dey",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/YOUR_Git_USERNAME/awesome-npm/issues"
  },
  "homepage": "https://github.com/YOUR_Git_USERNAME/awesome-npm#readme"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have the package.json ready. Now, index.js comes to the picture that is defined in pacakge.json as "main": "index.js"&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Creating the index.js file.
&lt;/h4&gt;

&lt;p&gt;Let's create a simple function in the &lt;strong&gt;index.js&lt;/strong&gt; file. 👇&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function awesomeEmojiLog(message) {
    if (message === undefined) throw new Error("No Message Found");
    console.log("😎", message)
};

module.exports = awesomeEmojiLog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is any day better to test your function before publishing it.&lt;br&gt;
It can be easily called inside index.js as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;awesomeEmojiLog("This is awesome emoji")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test it with a simple command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output will be&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;😎 This is awesome emoji
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once done. It is now time to publish it.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Publish the npm package
&lt;/h4&gt;

&lt;p&gt;To publish an npm package you first need to create an account in the npm registry with this link 👉 &lt;a href="https://www.npmjs.com/signup" rel="noopener noreferrer"&gt;Signup for npm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Done. Cool. &lt;/p&gt;

&lt;p&gt;Log in to npm using the terminal with any of these two commands&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm adduser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter the &lt;strong&gt;username&lt;/strong&gt;, &lt;strong&gt;password&lt;/strong&gt;, and &lt;strong&gt;email ID&lt;/strong&gt; as asked.&lt;/p&gt;

&lt;p&gt;After that, you are one command away from your npm package. Just type this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note- If your package name starts with "@Your-username/packageName"&lt;/p&gt;

&lt;p&gt;use the below command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm publish --access=public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉🥳 The npm package is Published. You will get a mail for the same and You can check your list of packages in the npm registry if you are logged in.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Create the Github Repo for your package.
&lt;/h4&gt;

&lt;p&gt;Create your repo &lt;strong&gt;awesome-npm&lt;/strong&gt; and push the code. &lt;/p&gt;

&lt;p&gt;Follow the command to push the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "# awesome-npm" &amp;gt;&amp;gt; README.md
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/Souravdey777/awesome-npm.git
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the Licence for your package. I have used MIT.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1617877466920%2F0-GJeGt2Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1617877466920%2F0-GJeGt2Q.png" alt="tempsnip.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write the package's basic details in the Readme file like how to use it and what it does. Now, you can &lt;strong&gt;Create a new release&lt;/strong&gt; for the npm package with proper versioning.&lt;/p&gt;

&lt;p&gt;you can check the repo for reference 👉&lt;br&gt;
&lt;a href="https://github.com/Souravdey777/awesome-npm" rel="noopener noreferrer"&gt;https://github.com/Souravdey777/awesome-npm&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;and the npm package 👉&lt;br&gt;
 &lt;a href="https://www.npmjs.com/package/awesome-npm" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/awesome-npm&lt;/a&gt; &lt;/p&gt;

&lt;h1&gt;
  
  
  😎
&lt;/h1&gt;

&lt;p&gt;Your awesome npm package is ready. 🎉🎉&lt;/p&gt;

&lt;p&gt;Hope you Loved it! Do let me know in the comments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contact me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Souravdey777/" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/souravdey777" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Souravdey777" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>npm</category>
      <category>javascript</category>
      <category>node</category>
      <category>100daysofcode</category>
    </item>
  </channel>
</rss>
