<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Siddhesh Shirdhankar</title>
    <description>The latest articles on DEV Community by Siddhesh Shirdhankar (@siddhesh_shirdhankar_902f).</description>
    <link>https://dev.to/siddhesh_shirdhankar_902f</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%2F2700090%2F821a76a2-fa9f-43b6-9b15-d2ef9e76a53d.jpg</url>
      <title>DEV Community: Siddhesh Shirdhankar</title>
      <link>https://dev.to/siddhesh_shirdhankar_902f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siddhesh_shirdhankar_902f"/>
    <language>en</language>
    <item>
      <title>I Built 1Note - A Secure Ephemeral Note Sharing Tool (and What It Taught Me)</title>
      <dc:creator>Siddhesh Shirdhankar</dc:creator>
      <pubDate>Sat, 21 Mar 2026 13:59:08 +0000</pubDate>
      <link>https://dev.to/siddhesh_shirdhankar_902f/i-built-1note-a-secure-ephemeral-note-sharing-tool-and-what-it-taught-me-3ola</link>
      <guid>https://dev.to/siddhesh_shirdhankar_902f/i-built-1note-a-secure-ephemeral-note-sharing-tool-and-what-it-taught-me-3ola</guid>
      <description>&lt;h1&gt;
  
  
  Most developers have done this at least once:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Sent a password over Slack&lt;/li&gt;
&lt;li&gt;Shared credentials in email&lt;/li&gt;
&lt;li&gt;Copied secrets into a notes app and forgot about them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works — &lt;strong&gt;until it doesn’t.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s where the idea for &lt;strong&gt;1Note&lt;/strong&gt; came from. It is a simple tool:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Share a secret → view it once → it disappears&lt;/strong&gt;&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%2F4r6lt4w3tm48ny6d24gb.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%2F4r6lt4w3tm48ny6d24gb.png" alt=" " width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1note.siddheshshirdhankar.com/" rel="noopener noreferrer"&gt;Click here to checkout 1Note&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is 1Note?
&lt;/h2&gt;

&lt;p&gt;1Note is a secure, ephemeral note-sharing tool designed for both quick use and developer workflows. You create a note, get a link, share it — and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can expire after &lt;strong&gt;one view&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It can have a &lt;strong&gt;view limit&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It can expire after &lt;strong&gt;time&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It can be &lt;strong&gt;password-protected&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;No accounts. No friction.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem I Wanted to Solve
&lt;/h2&gt;

&lt;p&gt;We all share sensitive data in unsafe ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;Database passwords&lt;/li&gt;
&lt;li&gt;Tokens&lt;/li&gt;
&lt;li&gt;Temporary credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most tools don’t enforce ephemeral access. Once shared, the data lives forever. That’s the real problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Idea
&lt;/h3&gt;

&lt;p&gt;Make secrets &lt;strong&gt;temporary by default&lt;/strong&gt; instead of &lt;strong&gt;permanent unless deleted&lt;/strong&gt;. That single shift changes how you think about sharing data.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works (High Level)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create Note&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User sends content&lt;/li&gt;
&lt;li&gt;Backend stores it securely&lt;/li&gt;
&lt;li&gt;Returns a unique link&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access Note&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User opens link&lt;/li&gt;
&lt;li&gt;System validates: Not expired, Not deleted, Within view limits&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consumption&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View count increments atomically&lt;/li&gt;
&lt;li&gt;If limit reached → note is destroyed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Security Model
&lt;/h3&gt;

&lt;p&gt;1Note uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS&lt;/strong&gt; (encryption in transit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encryption at rest&lt;/strong&gt; (server-side)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional password protection&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rate limiting&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br&gt;
The current version uses server-side encryption, not zero-knowledge encryption. This was a conscious tradeoff to keep the system simple and usable.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Hardest Part: Concurrency
&lt;/h2&gt;

&lt;p&gt;One of the most interesting challenges was: &lt;strong&gt;How do you ensure a note is only consumed once?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine two users opening the same link at the same time. To solve this, we use an atomic database operation:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
sql
UPDATE SecureNote
SET viewCount = viewCount + 1
WHERE slug = $slug
AND (maxViews IS NULL OR viewCount &amp;lt; maxViews)
AND isDeleted = false
AND (expiresAt IS NULL OR expiresAt &amp;gt; now())
RETURNING *
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why hiding IDs wasn’t enough for secure share links</title>
      <dc:creator>Siddhesh Shirdhankar</dc:creator>
      <pubDate>Fri, 16 Jan 2026 04:55:26 +0000</pubDate>
      <link>https://dev.to/siddhesh_shirdhankar_902f/why-hiding-ids-wasnt-enough-for-secure-share-links-5egj</link>
      <guid>https://dev.to/siddhesh_shirdhankar_902f/why-hiding-ids-wasnt-enough-for-secure-share-links-5egj</guid>
      <description>&lt;p&gt;I recently went down a rabbit hole thinking about how secure share links are usually designed.&lt;/p&gt;

&lt;p&gt;My first instinct was the obvious one: hash the internal ID, put it in the URL, resolve it on the backend. It works — until you start thinking about revocation, expiry, and access control.&lt;/p&gt;

&lt;p&gt;What finally clicked for me was realizing that a shared link isn’t the resource itself, it’s permission to access the resource. Once I separated those two ideas and added an indirection layer (slug → resource), a lot of awkward edge cases disappeared.&lt;/p&gt;

&lt;p&gt;I wrote a short reflection on this shift in thinking — not a tutorial, just a design lesson I learned the hard way:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://medium.com/codetodeploy/building-a-secure-sharing-system-why-slugs-matter-more-than-hashes-609ed0f1e066?source=friends_link&amp;amp;sk=95d0931b87bc0303c4871009f567b413" rel="noopener noreferrer"&gt;Building a Secure Sharing System: Why Slugs Matter More Than Hashes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear how others have approached this problem.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Tab Wise v2.1.0 is live</title>
      <dc:creator>Siddhesh Shirdhankar</dc:creator>
      <pubDate>Tue, 30 Dec 2025 06:50:57 +0000</pubDate>
      <link>https://dev.to/siddhesh_shirdhankar_902f/tab-wise-v210-is-live-c5i</link>
      <guid>https://dev.to/siddhesh_shirdhankar_902f/tab-wise-v210-is-live-c5i</guid>
      <description>&lt;p&gt;Drowning in Tabs? Try This Chrome Extension&lt;/p&gt;

&lt;p&gt;If your browser regularly looks like this:&lt;/p&gt;

&lt;p&gt;“I’ll close these tabs later”&lt;br&gt;
(opens 5 more)&lt;/p&gt;

&lt;p&gt;—I built something for you.&lt;/p&gt;

&lt;p&gt;🚀 Tab Wise v2.1.0&lt;/p&gt;

&lt;p&gt;Tab Wise is a modern Chrome extension that helps you organize, search, and manage tabs without breaking your flow.&lt;/p&gt;

&lt;p&gt;What it helps with:&lt;/p&gt;

&lt;p&gt;🔍 Instantly search tabs by title or URL&lt;/p&gt;

&lt;p&gt;🧩 Automatically group tabs (by domain, activity, time, or context)&lt;/p&gt;

&lt;p&gt;🎨 Create custom groups with colors &amp;amp; favorites&lt;/p&gt;

&lt;p&gt;⏱️ Track tab activity and identify stale tabs&lt;/p&gt;

&lt;p&gt;🧠 Side panel UI that stays open while you browse&lt;/p&gt;

&lt;p&gt;👉 Install Tab Wise (Free):&lt;br&gt;
🔗 &lt;a href="https://chromewebstore.google.com/detail/tab-wise/ohpilcjcbejponkajcccllodpgcnnlpg?authuser=0&amp;amp;hl=en-GB" rel="noopener noreferrer"&gt;Chrome Web Store – Tab Wise&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👋 Built by a tab-hoarder, for tab-hoarders&lt;/p&gt;

&lt;p&gt;I built Tab Wise during a hackathon after failing to find a tab manager that felt fast, modern, and non-intrusive.&lt;br&gt;
It’s privacy-first, lightweight, and stores everything locally.&lt;/p&gt;

&lt;p&gt;If you’re curious about the build journey, tech stack, and lessons learned, I also wrote about it here:&lt;br&gt;
📖 (&lt;a href="https://medium.com/p/78100bc56348" rel="noopener noreferrer"&gt;https://medium.com/p/78100bc56348&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%2F63a9jekaheqodrmhqayc.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%2F63a9jekaheqodrmhqayc.png" alt=" " width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💬 Feedback welcome&lt;/p&gt;

&lt;p&gt;Try the extension, break it, and tell me what you think.&lt;br&gt;
If it saves you even one “where did that tab go?” moment, it’s done its job.&lt;/p&gt;

&lt;p&gt;Let’s make tab chaos optional ✨&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title># 🧠 My First Online Hackathon Experience — How I Built InterviewCoach.AI</title>
      <dc:creator>Siddhesh Shirdhankar</dc:creator>
      <pubDate>Sun, 09 Nov 2025 16:20:35 +0000</pubDate>
      <link>https://dev.to/siddhesh_shirdhankar_902f/-my-first-online-hackathon-experience-how-i-built-interviewcoachai-nba</link>
      <guid>https://dev.to/siddhesh_shirdhankar_902f/-my-first-online-hackathon-experience-how-i-built-interviewcoachai-nba</guid>
      <description>&lt;p&gt;Just wrapped up my &lt;strong&gt;first ever online hackathon — Google Built-in AI Hackathon 2025&lt;/strong&gt;, and it was an absolute rollercoaster 🎢  &lt;/p&gt;

&lt;p&gt;From late-night coding to last-minute demo edits, I learned more in 48 hours than I had in weeks.&lt;br&gt;&lt;br&gt;
Built &lt;strong&gt;InterviewCoach.AI&lt;/strong&gt;, a Chrome extension powered by &lt;strong&gt;Gemini Nano + Gemini 2.5 Flash&lt;/strong&gt;, that helps users analyze job descriptions, generate interview questions, record voice answers, and even craft cover letters.  &lt;/p&gt;

&lt;p&gt;I wrote about the full experience here 👇&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://medium.com/@siddhesh.shirdhankar18/my-first-hackathon-sleepless-nights-ai-magic-a-lot-of-ctrl-z-moments-1f82076e9627" rel="noopener noreferrer"&gt;Read the full story on Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re planning to participate in your first hackathon — or just curious how AI extensions come together — this might give you some inspiration ⚡&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The REAL reason React apps slow down — and the 3 tools to fight it</title>
      <dc:creator>Siddhesh Shirdhankar</dc:creator>
      <pubDate>Mon, 25 Aug 2025 08:14:35 +0000</pubDate>
      <link>https://dev.to/siddhesh_shirdhankar_902f/the-real-reason-react-apps-slow-down-and-the-3-tools-to-fight-it-2n6g</link>
      <guid>https://dev.to/siddhesh_shirdhankar_902f/the-real-reason-react-apps-slow-down-and-the-3-tools-to-fight-it-2n6g</guid>
      <description>&lt;p&gt;React felt fast… until it didn’t.&lt;/p&gt;

&lt;p&gt;Ever built a React app that was buttery smooth at first, but once your app grew, your UI suddenly lagged like an old laptop running 50 Chrome tabs?&lt;/p&gt;

&lt;p&gt;That’s usually when people discover the "holy trinity" of React performance optimization:&lt;/p&gt;

&lt;p&gt;React.memo&lt;/p&gt;

&lt;p&gt;useCallback&lt;/p&gt;

&lt;p&gt;useMemo&lt;/p&gt;

&lt;p&gt;But here’s the truth:&lt;br&gt;
👉 Most devs either overuse them or don’t actually know what’s happening under the hood.&lt;/p&gt;

&lt;p&gt;I just finished writing an in-depth breakdown that goes beyond the usual surface-level definitions.&lt;br&gt;
Instead of just “React.memo prevents unnecessary re-renders” 🙄, I dug into how React reconciles components, why references break equality checks, and when memoization actually helps vs hurts.&lt;/p&gt;

&lt;p&gt;🔍 Covered in the guide:&lt;/p&gt;

&lt;p&gt;What really happens during React’s reconciliation cycle.&lt;/p&gt;

&lt;p&gt;Why useCallback/useMemo aren’t “free” optimizations.&lt;/p&gt;

&lt;p&gt;Common pitfalls (like wrapping everything in memoization).&lt;/p&gt;

&lt;p&gt;A mental model to know exactly when to use them — and when not to.&lt;/p&gt;

&lt;p&gt;If you’ve ever wondered why your memoized code still re-renders or felt guilty sprinkling useMemo everywhere withoutunderstanding… this might help.&lt;/p&gt;

&lt;p&gt;Would love feedback from the community:&lt;br&gt;
👉 Do you consciously think about reconciliation &amp;amp; referential equality when optimizing?&lt;br&gt;
👉 Or do you mostly rely on profiling after things feel slow?&lt;/p&gt;

&lt;p&gt;Link to full write-up (if you want): &lt;a href="https://medium.com/codetodeploy/react-memo-vs-usecallback-vs-usememo-explained-like-youre-5-but-for-pros-too-5d51808fe56e" rel="noopener noreferrer"&gt;Click Here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>“Build Features, Not Folders”: Scalable React Architecture</title>
      <dc:creator>Siddhesh Shirdhankar</dc:creator>
      <pubDate>Sun, 27 Jul 2025 07:47:29 +0000</pubDate>
      <link>https://dev.to/siddhesh_shirdhankar_902f/build-features-not-folders-scalable-react-architecture-6ng</link>
      <guid>https://dev.to/siddhesh_shirdhankar_902f/build-features-not-folders-scalable-react-architecture-6ng</guid>
      <description>&lt;p&gt;🚨 Most frontend projects don’t fail because of bad code.&lt;br&gt;&lt;br&gt;
They fail because of chaotic structure. After working on real-world apps with growing teams and evolving features, I’ve realized: &lt;br&gt;
_how you structure your project determines how fast (or slow) your team moves. _&lt;/p&gt;

&lt;p&gt;That’s why I wrote this new article:  👉 “Build Features, Not Folders”: Scalable React Architecture for Frontend System Design &lt;a href="https://medium.com/@siddhesh.shirdhankar18/build-features-not-folders-scalable-react-architecture-for-frontend-system-design-0bb0bdb0dcd1" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I go into: Why file-based routing isn’t enough for serious apps The power of feature-first thinking How to design folders that scale with your team A simple diagram that makes things click.&lt;/p&gt;

&lt;p&gt;This is Week 1 of a new series I’m writing — designed to help frontend engineers write cleaner, more scalable code. 🧠 If you're building with React, Next.js, Remix or Expo — this is for you.  &lt;/p&gt;

&lt;p&gt;🔖 Topics: #React #FrontendDevelopment #SoftwareArchitecture #WebDev #CleanCode Let me know your thoughts — and feel free to share how your team structures projects!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
