<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/feed.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sanjay Gupta - Blog</title>
    <link>https://guptasanjay.com.np/blog</link>
    <atom:link href="https://guptasanjay.com.np/feed.xml" rel="self" type="application/rss+xml" />
    <description>Engineering write-ups by Sanjay Gupta on decisions behind FLITO, Duleko and other projects.</description>
    <language>en</language>
    <lastBuildDate>Mon, 19 Oct 2026 14:55:23 GMT</lastBuildDate>
    <item>
      <title>Who Can Call Me: Keeping Phone Numbers Private</title>
      <link>https://guptasanjay.com.np/blog/duleko-who-can-call-me-phone-numbers</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/duleko-who-can-call-me-phone-numbers</guid>
      <pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate>
      <description>How Duleko keeps phone numbers private: their own table, one can_call() check behind every Call button, and a chat that refuses messages with a number in them.</description>
    </item>
    <item>
      <title>Real Road Distances for FLITO on Free Services</title>
      <link>https://guptasanjay.com.np/blog/flito-road-distances-free-osrm</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/flito-road-distances-free-osrm</guid>
      <pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate>
      <description>How FLITO gets road distances and route lines from a free OSRM server: queued, batched, cached for a week, thinned to 5 m, and never fatal when it fails.</description>
    </item>
    <item>
      <title>ID Checks Behind Duleko's Verified Badge</title>
      <link>https://guptasanjay.com.np/blog/duleko-verified-badge-id-checks</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/duleko-verified-badge-id-checks</guid>
      <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
      <description>How Duleko made its verified badge mean an ID was checked: photos in a private bucket, 10-minute links, and a badge only one Postgres function can grant.</description>
    </item>
    <item>
      <title>Mapping People Without Revealing Where They Live</title>
      <link>https://guptasanjay.com.np/blog/duleko-map-without-revealing-where-people-live</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/duleko-map-without-revealing-where-people-live</guid>
      <pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate>
      <description>How Duleko's map shows skilled people nearby without revealing where anyone lives: a work area picked once, ~1 km squares and counts for guests, in Postgres.</description>
    </item>
    <item>
      <title>Billing by Nepali Month: FLITO's Invoices and Fees</title>
      <link>https://guptasanjay.com.np/blog/flito-invoices-fees-nepali-calendar</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/flito-invoices-fees-nepali-calendar</guid>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <description>How FLITO records payments it never holds, bills truck owners by Nepali month, and numbers PDF invoices per Nepali fiscal year, with dates in Bikram Sambat.</description>
    </item>
    <item>
      <title>Android Notifications Without Firebase on Duleko</title>
      <link>https://guptasanjay.com.np/blog/duleko-android-notifications-without-firebase</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/duleko-android-notifications-without-firebase</guid>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <description>Duleko's Android app shows chats and work requests in the notification bar with no push service, and keeps email inside Brevo's free 300 a day. Here's how.</description>
    </item>
    <item>
      <title>EPAM Interview Experience 2026: Rounds and Questions</title>
      <link>https://guptasanjay.com.np/blog/epam-interview-experience-ai-native-intern</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/epam-interview-experience-ai-native-intern</guid>
      <pubDate>Mon, 28 Sep 2026 00:00:00 GMT</pubDate>
      <description>My EPAM campus placement experience (August 2026): eligibility, the LRU cache coding round, the GD topic, technical interview questions and tips that worked.</description>
    </item>
    <item>
      <title>Engineering in Nepal vs India: A Nepali Student's Story</title>
      <link>https://guptasanjay.com.np/blog/study-engineering-in-india-from-nepal</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/study-engineering-in-india-from-nepal</guid>
      <pubDate>Sun, 27 Sep 2026 00:00:00 GMT</pubDate>
      <description>Why I chose to study engineering in India instead of Nepal: the IOE entrance, Chitkara fees and Nepali student concessions, placements, and the honest trade-offs.</description>
    </item>
    <item>
      <title>Tech Lead at Duleko: What's Live and What's Next</title>
      <link>https://guptasanjay.com.np/blog/building-duleko-as-tech-lead</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/building-duleko-as-tech-lead</guid>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <description>As Tech Lead of Duleko, a bilingual local skills marketplace for Nepal, I own the platform end to end. Here's what's live today - guest browsing, typo-tolerant distance search, price negotiation, per-person call privacy and a native Android build - the one rule every screen is held to, and what we're building next.</description>
    </item>
    <item>
      <title>How FLITO Decides Which Truck Fits a Load</title>
      <link>https://guptasanjay.com.np/blog/flito-freight-matching-which-truck-fits</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/flito-freight-matching-which-truck-fits</guid>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <description>FLITO filters out every truck that can't do a job, scores the rest out of 100 on fit, proximity, reputation, price and readiness, and reserves a truck's days with one conditional write so two bookings can never land on the same truck. Here's how the matching works and why.</description>
    </item>
    <item>
      <title>Making a React Portfolio Readable to Search Engines</title>
      <link>https://guptasanjay.com.np/blog/making-a-react-portfolio-crawlable</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/making-a-react-portfolio-crawlable</guid>
      <pubDate>Thu, 24 Sep 2026 00:00:00 GMT</pubDate>
      <description>This site is a Vite + React single-page app, which by default hands crawlers an almost empty page. Here's how one metadata table now drives both the live React head and a prerendered HTML file per route, why the sitemap dates come from git, and what Google's Rich Results Test still caught.</description>
    </item>
    <item>
      <title>Enforcing Business Rules in Postgres, Not the Frontend</title>
      <link>https://guptasanjay.com.np/blog/postgres-row-level-security-business-rules</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/postgres-row-level-security-business-rules</guid>
      <pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
      <description>Duleko's work lifecycle - pending, accepted, confirmed, completed - is modelled as Postgres triggers with Row Level Security on every table, so a modified client can't skip a step. Here's why that decision, plus the outbox pattern behind its notifications.</description>
    </item>
    <item>
      <title>Treat Email Verification Codes Like Passwords</title>
      <link>https://guptasanjay.com.np/blog/hash-email-verification-codes-like-passwords</link>
      <guid isPermaLink="true">https://guptasanjay.com.np/blog/hash-email-verification-codes-like-passwords</guid>
      <pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
      <description>A 6-digit email code is a password with worse UX expectations and a shorter lifespan - so FLITO stores only its hash, expires it in 15 minutes, burns it after one use, and locks out after 5 wrong tries. Here's the reasoning and what it protects against.</description>
    </item>
  </channel>
</rss>
