<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sourav Badami</title>
    <link>https://souravbadami.com/</link>
    <description>Recent content on Sourav Badami</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-US</language>
    <lastBuildDate>Wed, 12 Aug 2026 18:00:00 +0530</lastBuildDate><atom:link href="https://souravbadami.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>neverbuy — shop everything, own nothing</title>
      <link>https://souravbadami.com/neverbuy-shop-everything-own-nothing/</link>
      <pubDate>Wed, 12 Aug 2026 18:00:00 +0530</pubDate>
      
      <guid>https://souravbadami.com/neverbuy-shop-everything-own-nothing/</guid>
      <description>i recently shipped neverbuy.online — an ecommerce store that&amp;rsquo;s intentionally fake.
browse departments. add things to your bag. checkout. track your order. feel the rush.
no money leaves your account; nothing shows up at your door. GST included; goods not included.
where the idea came from i first came across this concept through Instagram School of Advanced Studies — the Korean-style fake shopping thing where people get the dopamine of buying without the consequences.</description>
    </item>
    
    <item>
      <title>consumer apps are becoming digital DTC brands</title>
      <link>https://souravbadami.com/consumer-apps-are-becoming-digital-dtc-brands/</link>
      <pubDate>Mon, 10 Aug 2026 19:40:00 +0530</pubDate>
      
      <guid>https://souravbadami.com/consumer-apps-are-becoming-digital-dtc-brands/</guid>
      <description>everyone in consumer tech is obsessed with lowering CPI. or lowering CAC. or improving ROAS.
every meeting somehow comes back to acquisition. can we get cheaper installs? can we improve click-through rates? can we reduce our CPP by 10%?
but i&amp;rsquo;ve been thinking about something else lately.
a few days ago i came across a post on how DTC brands think about increasing AOV. the idea was simple: instead of trying to acquire more customers, make every customer worth more.</description>
    </item>
    
    <item>
      <title>the 4 signals of economically scalable demand</title>
      <link>https://souravbadami.com/the-4-signals-of-economically-scalable-demand/</link>
      <pubDate>Wed, 29 Jul 2026 08:30:00 +0530</pubDate>
      
      <guid>https://souravbadami.com/the-4-signals-of-economically-scalable-demand/</guid>
      <description>i keep coming back to the same four questions whenever i look at a consumer product:
CAC → can you acquire users cheaply?
Retention → do users actually keep coming back?
AOV → do users spend enough each transaction?
LTV → does the business make enough over the customer&amp;rsquo;s lifetime?
that&amp;rsquo;s it; most of the noise around &amp;ldquo;demand&amp;rdquo; collapses into these.
huge demand with terrible unit economics isn&amp;rsquo;t a great business; low retention or weak LTV will eat you alive no matter how many installs you rack up.</description>
    </item>
    
    <item>
      <title>how’s the world shaping up in 2030</title>
      <link>https://souravbadami.com/hows-the-world-shaping-up-in-2030/</link>
      <pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>https://souravbadami.com/hows-the-world-shaping-up-in-2030/</guid>
      <description>introduction the skyline of Neo Mumbai gleamed with chrome and glass, reflecting the midday sun as autonomous taxis floated silently down the streets below; the year was 2030, and cities like this were no longer the exception but the standard. what had once been considered future technology was now as ordinary as a cup of morning chai; AI had woven itself into every fiber of daily life, shaping society in ways unimaginable just a decade ago.</description>
    </item>
    
    <item>
      <title>using generative AI for creating game assets</title>
      <link>https://souravbadami.com/using-generative-ai-for-creating-game-assets/</link>
      <pubDate>Fri, 19 May 2023 00:48:00 +0530</pubDate>
      
      <guid>https://souravbadami.com/using-generative-ai-for-creating-game-assets/</guid>
      <description>generative AI can be a powerful tool for creating game assets in several ways; here are some ways in which generative AI can assist in the creation of game assets:
procedural content generation: generative AI algorithms can generate game assets procedurally, meaning they can create content algorithmically based on predefined rules or patterns; this can include generating terrain, landscapes, textures, buildings, and other environmental elements. procedural generation allows for the creation of vast and diverse game worlds without the need for manual design of every individual asset.</description>
    </item>
    
    <item>
      <title>workspace in Golang 1.18&#43;</title>
      <link>https://souravbadami.com/workspace-in-golang-1.18-/</link>
      <pubDate>Tue, 13 Sep 2022 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/workspace-in-golang-1.18-/</guid>
      <description>introduction Go 1.18 introduced workspace which makes life easy with multi-module development spaces; here&amp;rsquo;s a sneak peek on how to use it and set up the development environment on Goland. each module has it&amp;rsquo;s own go.mod; and all the dependencies can be synced in one shot throughout the project.
what&amp;rsquo;s a Golang workspace? workspaces in Go 1.18 let you work on multiple modules simultaneously without having to edit go.mod files for each module; each module within a workspace is treated as a main module when resolving dependencies.</description>
    </item>
    
    <item>
      <title>heating issues with MacBook Pro</title>
      <link>https://souravbadami.com/heating-issues-with-macbook-pro/</link>
      <pubDate>Tue, 31 May 2022 16:39:01 +0530</pubDate>
      
      <guid>https://souravbadami.com/heating-issues-with-macbook-pro/</guid>
      <description>this post covers a set of configurations and external factors to assess and fix heating issues with MacBook Pro; some of the below might work for you and some might not. i&amp;rsquo;ve curated this list from my own hit and trial experiments.
Device: MacBook Pro (16-inch, 2019)
activity monitor check your activity monitor and figure out the processes with max CPU and memory consumption; manually close some of them if you&amp;rsquo;re not using it.</description>
    </item>
    
    <item>
      <title>deploying service to Google App Engine using GitHub and GitHub Actions</title>
      <link>https://souravbadami.com/deploying-service-to-google-app-engine-using-github-and-github-actions/</link>
      <pubDate>Thu, 23 Jul 2020 00:00:59 +0530</pubDate>
      
      <guid>https://souravbadami.com/deploying-service-to-google-app-engine-using-github-and-github-actions/</guid>
      <description>introduction what the hell is GitHub Actions and Google App Engine?
GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD; build, test, and deploy your code right from GitHub. make code reviews, branch management, and issue triaging work the way you want.
Google App Engine is a Platform as a Service and cloud computing platform for developing and hosting web applications in Google-managed data centers; applications are sandboxed and run across multiple servers.</description>
    </item>
    
    <item>
      <title>identifying default vs unset values in Google Protocol Buffers (proto3)</title>
      <link>https://souravbadami.com/identifying-default-vs-unset-values-in-google-protocol-buffers-proto3/</link>
      <pubDate>Wed, 24 Jun 2020 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/identifying-default-vs-unset-values-in-google-protocol-buffers-proto3/</guid>
      <description>what are Protocol Buffers / Protobuf? Protocol Buffers are Google&amp;rsquo;s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler; you define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.
problem in proto3, all fields are &amp;ldquo;optional&amp;rdquo; (it is not an error if the sender fails to set them); but fields are no longer &amp;ldquo;nullable&amp;rdquo;, there&amp;rsquo;s no way to tell the difference between a field being explicitly set to its default value vs.</description>
    </item>
    
    <item>
      <title>systems and methods for leasing equipments or facilities using Blockchain technology</title>
      <link>https://souravbadami.com/systems-and-methods-for-leasing-equipments-or-facilities-using-blockchain-technology/</link>
      <pubDate>Sat, 13 Jun 2020 20:33:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/systems-and-methods-for-leasing-equipments-or-facilities-using-blockchain-technology/</guid>
      <description>introduction a method for leasing equipment or facilities using Blockchain technology may include: receiving, through a Blockchain network, a request from a lessor device or lessee device to initiate an electronic lease agreement transaction between a lessor and a lessee for a select equipment or facility; verifying an identity of the lessor and the lessee via a digital identity of the lessor and the lessee stored in a Blockchain shared ledger to determine if the lessor and lessee are authorized users of the Blockchain network; verifying an identity of the equipment or facility via a digital identity of the equipment or facility stored in the Blockchain shared ledger; and if the identities of the lessor and lessee and the equipment or facility are verified, electronically executing a smart contract for the lease agreement between the lessor and the lessee, the smart contract including rules for enforcing the lease agreement.</description>
    </item>
    
    <item>
      <title>Emacs configuration</title>
      <link>https://souravbadami.com/emacs-configuration/</link>
      <pubDate>Fri, 12 Jun 2020 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/emacs-configuration/</guid>
      <description>introduction this is my personal Emacs configuration tree, continually used and tweaked since the last 365 days, and it may be a good starting point for other new Emacs users.
configuration  init.el  (require &amp;#39;package) ;; Define package repositories (add-to-list &amp;#39;package-archives &amp;#39;(&amp;#34;melpa-stable&amp;#34; . &amp;#34;https://stable.melpa.org/packages/&amp;#34;)) (add-to-list &amp;#39;package-archives &amp;#39;(&amp;#34;melpa&amp;#34; . &amp;#34;https://melpa.org/packages/&amp;#34;)) ;; Load and activate emacs packages. Do this first so that the ;; packages are loaded before you start trying to modify them.</description>
    </item>
    
    <item>
      <title>first contribution to open source</title>
      <link>https://souravbadami.com/first-contribution-to-open-source/</link>
      <pubDate>Sat, 02 Nov 2019 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/first-contribution-to-open-source/</guid>
      <description>it’s hard; it’s always hard the first time you do something. collaborating makes it worse — mistakes feel public, and git doesn’t exactly hold your hand.
reading articles helps a little; doing the thing in a safe environment helps a lot more. we built a small practice track so beginners can make a real first contribution without needing to understand a giant codebase on day one. the point isn’t the commit — it’s crossing the line from “i want to contribute” to “i already did.</description>
    </item>
    
    <item>
      <title>important HTTP status codes</title>
      <link>https://souravbadami.com/important-http-status-codes/</link>
      <pubDate>Fri, 26 Oct 2018 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/important-http-status-codes/</guid>
      <description>HTTP_100_CONTINUE = 100 HTTP_101_SWITCHING_PROTOCOLS = 101 HTTP_200_OK = 200 HTTP_201_CREATED = 201 HTTP_202_ACCEPTED = 202 HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203 HTTP_204_NO_CONTENT = 204 HTTP_205_RESET_CONTENT = 205 HTTP_206_PARTIAL_CONTENT = 206 HTTP_207_MULTI_STATUS = 207 HTTP_300_MULTIPLE_CHOICES = 300 HTTP_301_MOVED_PERMANENTLY = 301 HTTP_302_FOUND = 302 HTTP_303_SEE_OTHER = 303 HTTP_304_NOT_MODIFIED = 304 HTTP_305_USE_PROXY = 305 HTTP_306_RESERVED = 306 HTTP_307_TEMPORARY_REDIRECT = 307 HTTP_400_BAD_REQUEST = 400 HTTP_401_UNAUTHORIZED = 401 HTTP_402_PAYMENT_REQUIRED = 402 HTTP_403_FORBIDDEN = 403 HTTP_404_NOT_FOUND = 404 HTTP_405_METHOD_NOT_ALLOWED = 405 HTTP_406_NOT_ACCEPTABLE = 406 HTTP_407_PROXY_AUTHENTICATION_REQUIRED = 407 HTTP_408_REQUEST_TIMEOUT = 408 HTTP_409_CONFLICT = 409 HTTP_410_GONE = 410 HTTP_411_LENGTH_REQUIRED = 411 HTTP_412_PRECONDITION_FAILED = 412 HTTP_413_REQUEST_ENTITY_TOO_LARGE = 413 HTTP_414_REQUEST_URI_TOO_LONG = 414 HTTP_415_UNSUPPORTED_MEDIA_TYPE = 415 HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE = 416 HTTP_417_EXPECTATION_FAILED = 417 HTTP_422_UNPROCESSABLE_ENTITY = 422 HTTP_423_LOCKED = 423 HTTP_424_FAILED_DEPENDENCY = 424 HTTP_428_PRECONDITION_REQUIRED = 428 HTTP_429_TOO_MANY_REQUESTS = 429 HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431 HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS = 451 HTTP_500_INTERNAL_SERVER_ERROR = 500 HTTP_501_NOT_IMPLEMENTED = 501 HTTP_502_BAD_GATEWAY = 502 HTTP_503_SERVICE_UNAVAILABLE = 503 HTTP_504_GATEWAY_TIMEOUT = 504 HTTP_505_HTTP_VERSION_NOT_SUPPORTED = 505 HTTP_507_INSUFFICIENT_STORAGE = 507 HTTP_511_NETWORK_AUTHENTICATION_REQUIRED = 511 </description>
    </item>
    
    <item>
      <title>use MySQL’s `replace into` safely!</title>
      <link>https://souravbadami.com/use-mysqls-replace-into-safely/</link>
      <pubDate>Thu, 20 Sep 2018 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/use-mysqls-replace-into-safely/</guid>
      <description>introduction MySQL’s popular replace into destination_database.destination_table (fields) select fields from source_database.source_table; query can be very dangerous if not used properly.
illustration say, you have schemas like:
create table source_table ( field1 bigint not null, field2 int not null, field3 varchar(50) default &amp;#39;0&amp;#39; not null, primary key (field1, field2) ); create table destination_table ( field1 bigint not null, field2 int not null, field3 varchar(50) default &amp;#39;0&amp;#39; not null, primary key (field1, field2) ); now, if you want to replace some data from source table to the destination table, you can do something like:</description>
    </item>
    
    <item>
      <title>the hacker manifesto</title>
      <link>https://souravbadami.com/the-hacker-manifesto/</link>
      <pubDate>Sun, 22 Apr 2018 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/the-hacker-manifesto/</guid>
      <description>credits: +++The Mentor+++, written January 8, 1986.
Another one got caught today, it’s all over the papers. “Teenager Arrested in Computer Crime Scandal”, Hacker, Arrested after Bank Tampering”…
Damn kids. They’re all alike.
But did you, in your three-piece psychology and 1950’s technobrain, ever take a look behind the eyes of the hacker,? Did you ever wonder what made him tick, what forces shaped him, what may have molded him?</description>
    </item>
    
    <item>
      <title>the requested address is not valid in its context</title>
      <link>https://souravbadami.com/the-requested-address-is-not-valid-in-its-context/</link>
      <pubDate>Wed, 15 Nov 2017 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/the-requested-address-is-not-valid-in-its-context/</guid>
      <description>facing this with Python 2.7 and ftplib? i won’t waste your time; let’s fix it.
the error shows up when passive mode returns an address your client can’t route to. ftplib trusts that address; your network doesn’t. so we stop trusting it — subclass FTP_TLS, keep the port from makepasv, and force the host you already connected to.
import ftplib class FTP_TLS_UNROUTABLE_HOST(ftplib.FTP_TLS, object): def makepasv(self): _, port = super(FTP_TLS_UNROUTABLE_HOST, self).makepasv() return self.</description>
    </item>
    
    <item>
      <title>Logstash -&gt; Azure Event Hub | log &amp; event management utility | NodeJS</title>
      <link>https://souravbadami.com/logstash-azure-event-hub-log-event-management-utility-nodejs/</link>
      <pubDate>Fri, 17 Mar 2017 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/logstash-azure-event-hub-log-event-management-utility-nodejs/</guid>
      <description>Logstash is an open source data collection engine with real-time pipelining capabilities; Logstash can dynamically unify data from disparate sources and normalize the data into destinations of your choice. cleanse and democratize all your data for diverse advanced downstream analytics and visualization use cases. (Source)
Event Hubs is a highly scalable data streaming platform capable of ingesting millions of events per second; data sent to an Event Hub can be transformed and stored using any real-time analytics provider or batching/storage adapters.</description>
    </item>
    
    <item>
      <title>MyCleanIndia app</title>
      <link>https://souravbadami.com/mycleanindia-app/</link>
      <pubDate>Mon, 09 Jan 2017 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/mycleanindia-app/</guid>
      <description>you can’t fix what you can’t see; cities have plenty of unhygienic spots that never make it onto a map.
MyCleanIndia was a project to tag those places on Google Maps (Maps API v3), with a Python backend. the goal was simple — make cleanliness gaps visible so people and civic systems have something concrete to act on. it was a student project, rough in places, but it taught me a lot about shipping something public instead of just talking about impact.</description>
    </item>
    
    <item>
      <title>passport status change notifier</title>
      <link>https://souravbadami.com/passport-status-change-notifier/</link>
      <pubDate>Sun, 16 Oct 2016 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/passport-status-change-notifier/</guid>
      <description>waiting on an Indian passport application is mostly refreshing a status page and hoping the text moved.
i wrote a small Python script that checks the status every hour and fires a desktop notification when it changes. no dashboard, no app store listing — just one less tab open in my brain while bureaucracy does its thing.
code: passportstatus.py.</description>
    </item>
    
    <item>
      <title>DuckDuckGo — ComeToTheDuckSide</title>
      <link>https://souravbadami.com/duckduckgo-cometotheduckside/</link>
      <pubDate>Fri, 16 Sep 2016 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/duckduckgo-cometotheduckside/</guid>
      <description>the open source search engine that doesn’t track or store your personal information; the other giants show you creepy ads and sell your data to advertisers. stop being followed; start using DuckDuckGo.
what i liked beyond privacy: you can extend the engine itself. Instant Answers and cheatsheets push useful info onto the results page — ZeroClickInfo — so people get what they need without drowning in blue links.
you can build fatheads, goodies, and other IAs to help people find answers faster.</description>
    </item>
    
    <item>
      <title>advanced packaging tool</title>
      <link>https://souravbadami.com/advanced-packaging-tool/</link>
      <pubDate>Mon, 12 Sep 2016 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/advanced-packaging-tool/</guid>
      <description>if you’ve used Debian for more than a week, you’ve typed apt-get without thinking; that’s the point.
APT is the front end over dpkg — a simpler, safer way to install and upgrade packages than wrestling the lower-level tools by hand. the SCM history lived at https://alioth.debian.org/anonscm/git/apt/apt.git; around the time i wrote this, Release 1.3~rc4 was the latest in the logs.
sometimes you still need an rpm on a Debian box; compatibility is messy, but alien gets you most of the way:</description>
    </item>
    
    <item>
      <title>calendar application</title>
      <link>https://souravbadami.com/calendar-application/</link>
      <pubDate>Mon, 29 Aug 2016 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/calendar-application/</guid>
      <description>i got tired of juggling events across apps; so i built one place for them.
this is a Django app where you can save events on a calendar and sync them with a private Google Calendar. the interesting bit wasn’t the UI — it was wiring auth, sync, and persistence so the two calendars don’t fight each other.
repo with build steps: calendarapp. an older instance lived on Heroku.</description>
    </item>
    
    <item>
      <title>birthday wishing bot</title>
      <link>https://souravbadami.com/birthday-wishing-bot/</link>
      <pubDate>Tue, 23 Aug 2016 02:31:13 +0530</pubDate>
      
      <guid>https://souravbadami.com/birthday-wishing-bot/</guid>
      <description>forgetting birthdays is easy; automating them is easier.
this is a small Python bot that reads a list of birthdays and posts a wish to a Facebook page via the Graph API. nothing clever about the wish itself — the point was learning how page publishing works end to end, and removing one more thing from my head.
code’s here.</description>
    </item>
    
    <item>
      <title>auto hibernate</title>
      <link>https://souravbadami.com/auto-hibernate/</link>
      <pubDate>Sun, 14 Aug 2016 02:28:01 +0530</pubDate>
      
      <guid>https://souravbadami.com/auto-hibernate/</guid>
      <description>most machines don’t know when you’ve walked away; they just sit there burning power until you remember to close the lid.
i built a small Python script that watches the room through a camera, uses OpenCV for motion detection, and hibernates the system when nobody’s nearby for a while. no fancy product — just a useful automation for a machine that sits idle too often.
code’s on GitHub.</description>
    </item>
    
    <item>
      <title>Oppia interactive tutor</title>
      <link>https://souravbadami.com/oppia-interactive-tutor/</link>
      <pubDate>Sat, 23 Jul 2016 02:09:56 +0530</pubDate>
      
      <guid>https://souravbadami.com/oppia-interactive-tutor/</guid>
      <description>most online lessons are still PDFs with a quiz bolted on; Oppia is closer to a tutor sitting across the table.
you build “explorations” — interactive activities that feel like a one-on-one conversation. students learn by doing, get feedback along the way, and contributors can ship lessons without waiting for a curriculum committee. i spent time around this project because the idea is simple and hard: education that responds, instead of education that broadcasts.</description>
    </item>
    
    <item>
      <title>about</title>
      <link>https://souravbadami.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://souravbadami.com/about/</guid>
      <description>i run Propel — an operating system for everyday life; we build consumer apps across categories, used by millions of people.
before that, i built Timepass, a social gaming platform that reached millions of users globally.
previously i&amp;rsquo;ve worked across gaming, fintech, aerospace, blockchain, and ride-hailing — including Gojek, Honeywell, Perpule 1Pay (acquired by Amazon), and Linkbynet.
on the side: open source. contributions to Google, DuckDuckGo, Zulip, and others; mentored for Google Summer of Code with the OWASP Foundation.</description>
    </item>
    
    <item>
      <title>archive</title>
      <link>https://souravbadami.com/archives/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://souravbadami.com/archives/</guid>
      <description>archives</description>
    </item>
    
    <item>
      <title>search</title>
      <link>https://souravbadami.com/search/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://souravbadami.com/search/</guid>
      <description>search</description>
    </item>
    
  </channel>
</rss>
