<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xml" href="https://staygeo.com/feed.xslt.xml"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://staygeo.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://staygeo.com/" rel="alternate" type="text/html" /><updated>2026-10-16T06:22:41+00:00</updated><id>https://staygeo.com/feed.xml</id><title type="html">StayGeo</title><subtitle>Genuine Insights, Honest Opinions</subtitle><author><name>Chethan</name></author><entry><title type="html">I Set Rules to Buy the Dip. Then the Dip Came.</title><link href="https://staygeo.com/finance/2026/10/07/i-set-rules-to-buy-the-dip-then-the-dip-came.html" rel="alternate" type="text/html" title="I Set Rules to Buy the Dip. Then the Dip Came." /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://staygeo.com/finance/2026/10/07/i-set-rules-to-buy-the-dip-then-the-dip-came</id><content type="html" xml:base="https://staygeo.com/finance/2026/10/07/i-set-rules-to-buy-the-dip-then-the-dip-came.html"><![CDATA[<p>In August I started cutting my portfolio down to a short list. Then the market fell before I had finished, and that list went on sale.</p>

<p>It’s my first time doing this, so read it as a log rather than advice.</p>

<p>For years my investing was a monthly SIP plus the odd stock I bought when something felt cheap. “Felt cheap” was doing a lot of heavy lifting there. When prices actually fell, I did one of two things. I waited for them to fall a bit more and missed the rebound. Or I bought early, watched the price keep sliding, and had nothing left when it got properly cheap.</p>

<p>This year I tried something different. I wrote the rules down before I needed them.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-i-set-rules-to-buy-the-dip-then-the-dip-came/featured-ladder.png" alt="A falling price line crossing three dashed buy levels, with a larger buy marker at each lower level" loading="eager" />
  
    <figcaption>Three levels, each buy bigger than the last</figcaption>
  
</figure>

<!--more-->

<h2 id="the-setup">The setup</h2>

<p><strong>A short list, picked in advance.</strong> I chose a handful of businesses I would be happy to own for ten years. They earn high returns on capital, carry little or no debt, and lead their categories: FMCG, private banking, auto and market infrastructure. I made that call on a calm day, because a red day is the worst time to decide what’s good.</p>

<p>The list is where the <a href="/finance/2026/08/14/money-has-no-memory-pruning-my-portfolio.html">pruning I wrote about in August</a> is headed. That pruning isn’t done. I have given it 12 to 18 months, and the fall changed the order of things. Some of what I still plan to trim are good businesses, HDFC Bank among them, and I’m not going to sell them at crash prices just to stick to a timeline. That isn’t the anchoring I warned about in August. It has nothing to do with what I paid. Selling a good business at a crash price is just a bad trade. They can wait for a better exit. New money goes only to the list.</p>

<p><strong>A separate pool of money.</strong> I maintain a reserve that exists only for these buys. It isn’t the family emergency fund and it isn’t next month’s credit card bill. If I have to wonder whether I can afford a buy, I won’t make it.</p>

<p><strong>Price levels and sizes, fixed ahead of time.</strong> Each stock has three levels below its recent high: a starter level, a deeper one, and a “this is overdone” one. Each level gets a fixed, small amount, and the amount grows as the price drops. I sized everything so the reserve could cover all of it, even if every level got hit.</p>

<p><strong>Plain alerts, market orders.</strong> I don’t trade from a phone. Each level is a simple price alert on Zerodha’s Kite, which emails me when the stock touches it. When one fires, I buy the planned amount at market from Kite on the web. The rule decides the level. Once it’s reached, I want the order filled, not haggled over.</p>

<p>I used an AI assistant to pressure-test the levels and sizing against the reserve.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-i-set-rules-to-buy-the-dip-then-the-dip-came/setup-flow.png" alt="Four steps in a row: the list, the reserve, the levels, and the alert that triggers a buy, with the first three decided on a calm day and the last one running on a red day" loading="lazy" />
  
    <figcaption>Three decisions made in advance, one rule for the red day</figcaption>
  
</figure>

<h2 id="what-actually-happened">What actually happened</h2>

<p><strong>HUL, the slow grind.</strong> FMCG has been out of favour for months. HUL kept drifting lower without ever crashing. Left to myself, I would have either written it off as dead money or spent the whole allocation on the first small dip. The ladder made me do neither. I bought three tranches, each larger than the one before, as the price fell through my levels. My average now sits well below where my first instinct would have bought. Nothing exciting happened, and that was the idea.</p>

<p><strong>Eicher, where the alert fired and I hesitated.</strong> Royal Enfield’s parent fell hard from its peak and my first alert went off. I did not act. I watched it slide further through the day before buying a small starter position, well below its high. It worked out, but I learned something uncomfortable. An alert doesn’t take the emotion away. It hands you the decision, and you still have to make it.</p>

<p><strong>NSE, the issue price rule.</strong> I already held some from the IPO allotment. Instead of adding on listing-day excitement, I set one rule: buy more only if selling after listing pushed the price below the issue price. Flippers sold, the alert fired, and I added a tranche below the issue price, which brought my average cost down a little. It’s a rule I would use for any IPO I actually want to own.</p>

<p><strong>SBI Card, the one I didn’t buy.</strong> It slid toward multi-year lows and looked cheap. I wanted it. But it’s an unsecured lender with rising credit costs, and it didn’t fit what I had written down for the list. So I passed. Having the list on paper turned out to be as useful for saying no as for saying yes.</p>

<p><strong>A few days away.</strong> Alerts only work if you’re around to act on them. This week I was away, so for the first time I tried GTT (Good Till Triggered) orders instead: standing buy orders on five stocks from the list that Zerodha places by itself when a trigger price is hit. I checked that the cash in my trading account could cover all five if they fired together, and logged out. None of them triggered, so there’s no fill to report. But not having to watch anything while away was the most useful thing I tried in this whole exercise, and it’s where I would suggest anyone start.</p>

<h2 id="what-im-not-claiming">What I’m not claiming</h2>

<p>I don’t know whether this was the bottom. The market could fall another 10%, go sideways for a year, or rally on Monday. If it keeps falling, my deeper levels trigger and I will have spent more of the reserve at lower prices. That is the plan. If it recovers, some levels never trigger and I’m left holding unspent cash. That’s also the plan.</p>

<p>I was never trying to hit the bottom. I was trying to stop making decisions while anxious.</p>

<p>A few things I would already change:</p>

<ul>
  <li><strong>My first levels were too shallow.</strong> A 5 to 7% fall in a large, good company is ordinary noise. Next time the first level goes further down.</li>
  <li><strong>An alert price isn’t a fill price.</strong> By the time I open the email and place a market order, the price has moved. On a fast fall it may fill lower. On a sharp bounce I pay more. GTTs place limit orders instead, so a big gap down at the open can skip past the limit and leave the order unfilled.</li>
  <li><strong>Write down why each stock is on the list.</strong> A couple of sentences per stock. When a holding is down 15% in a broad sell-off, that note is what stops you second-guessing the whole process.</li>
</ul>

<h2 id="setting-this-up-on-kite">Setting this up on Kite</h2>

<p>For anyone on Zerodha who wants to try the same thing (menus as of when I’m writing this):</p>

<ol>
  <li><strong>Alerts.</strong> On Kite web, open the stock from your watchlist and choose <em>Create alert</em>. Set the condition to last traded price <em>less than or equal to</em> your level. Name each alert with the stock, the level and the planned quantity, so the email tells you exactly what to do.</li>
  <li><strong>GTT for time away.</strong> From the watchlist, choose <em>Create GTT</em>. Pick a <em>Single</em> trigger, <em>Buy</em>, and <em>CNC</em> so it’s a delivery trade. Enter the trigger price, the quantity, and a limit price a little above the trigger (around half a percent) so the order has room to fill. Open GTTs are listed under <em>Orders → GTT</em>.</li>
  <li><strong>Check the money first.</strong> GTTs don’t block funds when you place them. If several fire on the same day and the free cash isn’t there, they get rejected. Either keep the full amount in the trading account, or add up what all your open GTTs would cost before you log off.</li>
</ol>

<p><em>This is my own log, not a recommendation. Do your own homework on any stock before buying it.</em></p>]]></content><author><name>Chethan</name></author><category term="finance" /><category term="investing" /><category term="dip-buying" /><category term="gtt-orders" /><category term="behavioral-finance" /><category term="position-sizing" /><summary type="html"><![CDATA[My first attempt at rule-based dip buying: a fixed list, a separate reserve, price levels and plain Kite alerts, and what happened once prices actually fell.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-10-07-i-set-rules-to-buy-the-dip-then-the-dip-came/featured-ladder.png" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-10-07-i-set-rules-to-buy-the-dip-then-the-dip-came/featured-ladder.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Our five day Goa trip, stop by stop</title><link href="https://staygeo.com/travel/2026/10/07/our-five-day-goa-trip-stop-by-stop.html" rel="alternate" type="text/html" title="Our five day Goa trip, stop by stop" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://staygeo.com/travel/2026/10/07/our-five-day-goa-trip-stop-by-stop</id><content type="html" xml:base="https://staygeo.com/travel/2026/10/07/our-five-day-goa-trip-stop-by-stop.html"><![CDATA[<p>We live about 35 km from the Karnataka coast, so a beach on its own has never been enough to make us pack the car. Goa, with its reputation for crowded shores and parties, was never on our list for that reason. Then we decided to see what else it had to offer, and drove down from Karkala in our Tata Punch with the kids for five days.</p>

<p>We based ourselves in a service apartment at Majorda and spent the days chasing forts, museums, forests, waterfalls and temples instead of sunbeds. Some of it was better than the reviews promised and some of it was a letdown. Here is the trip day by day, with the costs, the wrong turns from Google Maps and the honest verdicts.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_165915.webp" alt="Rocks and a quiet shoreline at Tilmati" loading="eager" />
  
    <figcaption>Rocks and a quiet shoreline at Tilmati</figcaption>
  
</figure>

<!--more-->

<h2 id="day-1-karkala-to-majorda">Day 1: Karkala to Majorda</h2>

<p>We left Karkala on 2 October and made our usual stop at Kamat in Murudeshwar, which has been our break on this route for years. We treated ourselves to buns, idlis and samosas with good tea and coffee. Lunch was at Kamat Upachar in Ankola, and this one was sub-par. It did not match our earlier experiences from the days when we were regulars on the Mangalore to Hyderabad bus route.</p>

<p>Next we headed to INS Chapal (K94), the Warship and Aircraft Museum at Karwar. The area itself is well maintained, but there were no information placards inside the machines, so it was hard for a layman to understand what was what. Visitors were busy clicking photographs anyway.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_150858.webp" alt="INS Chapal (K94), the missile boat on display at Karwar" loading="lazy" />
  
    <figcaption>INS Chapal (K94), the missile boat on display at Karwar</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_150910.webp" alt="A retired maritime patrol aircraft in the same museum" loading="lazy" />
  
    <figcaption>A retired maritime patrol aircraft in the same museum</figcaption>
  
</figure>

<p>Next up was Tilmati beach. Google took us down a wrong road that was nowhere close to the destination. Locals told us to head back the opposite way and enter near a fish market, which leads to the shoreline. From there we had to take a right and drive to the dead end, where a house owner had turned the empty area into a parking lot, and we left our car there. We were told it would be a 15 minute walk, but it turned out much longer, through bushes on the hill and over rocks along the shore. We were exhausted, but the result was worth it. The kids enjoyed playing in the water and on a new kind of sand, and then we headed back to the car. The landlady had generously sprayed water on all the parked cars, and for a moment I wondered if it had rained in that area.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_165841.webp" alt="The dark, fine sand at Tilmati" loading="lazy" />
  
    <figcaption>The dark, fine sand at Tilmati</figcaption>
  
</figure>

<figure class="post-figure portrait">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_171028.webp" alt="Sunset from the beach" loading="lazy" />
  
    <figcaption>Sunset from the beach</figcaption>
  
</figure>

<figure class="post-figure portrait">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_173604.webp" alt="The narrow path back along the hill" loading="lazy" />
  
    <figcaption>The narrow path back along the hill</figcaption>
  
</figure>

<p>Thereafter we headed towards Goa. The road surface was much better on the Goa side than in Karnataka, though it was only two-lane in stretches. Used to potholed roads back home, we found Goa a stark contrast, with clean markings and no unscientific speed breakers. Traffic was disciplined too, which might have something to do with stricter enforcement, as I hear.</p>

<p>We reached our service apartment, Treehouse Blue, at Majorda. To give a bit of background, I prefer chain hotels, but the food is mostly hit or miss, especially with kids. I thought of trying Airbnb but didn’t muster the courage, mainly because of doubts around host friendliness and facilities such as power backup. So we took the service apartment route, a first for us, and it didn’t disappoint. The 1 BHK and the overall complex were well maintained and the staff were great. We could also cook our own food, with a kitchen stocked with utensils, an induction cooktop, a refrigerator, a toaster and a microwave.</p>

<figure class="post-figure portrait">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261005_070437.webp" alt="The view from our service apartment window in Majorda" loading="lazy" />
  
    <figcaption>The view from our service apartment window in Majorda</figcaption>
  
</figure>

<h2 id="day-2-fontainhas-mapusa-and-houses-of-goa">Day 2: Fontainhas, Mapusa and Houses of Goa</h2>

<p>We started at Fontainhas and the painted bridge. The drive on Goan highways was a pleasure, and no wonder people make Fontainhas a destination to click rich photographs. We found a parking spot in a corner and began walking around. People paid no heed to the “private property, no photographs please” warning signs and were busy clicking. After some customary photos, we headed to the Mapusa market. I wasn’t sure what to expect there, but many reviewers called it a must visit. We found it to be just another crowded market with people going about their routine shopping. Honestly, I did not find it any different from the central market or market roads in South Indian towns! Adding to our woes, Google Maps took us around in circles even when direct U-turns were possible, and we ended up crossing the Mapusa area multiple times.</p>

<p>Next was the Houses of Goa museum. The roads leading to it were scenic and the place itself looked nice. Adult tickets were ₹150 per head and child tickets ₹50. Each adult ticket came with a ₹50 coupon that could be exchanged for a discount on food or on an item from the art gallery. Built with laterite stones and red oxide flooring, the museum was cool and pleasant inside, and the green surroundings helped too! Inside, the first floor sets out Goa’s history and its links to the wider world, the second holds salvaged heritage pieces such as carved wooden doors and ceramic tiles, and the top level is an open space with views of the surroundings.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261003_115807.webp" alt="Houses of Goa, covered in creepers" loading="lazy" />
  
    <figcaption>Houses of Goa, covered in creepers</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261003_121152.webp" alt="An information board on how Goan architecture responds to the climate" loading="lazy" />
  
    <figcaption>An information board on how Goan architecture responds to the climate</figcaption>
  
</figure>

<p>Hungry by then, stellar Google reviews led us to Dwarka Pure Veg Restaurant at Calangute, Goa. The experience was horrible as their standards in terms of food and hygiene were very low.</p>

<p>Next we headed to Chapora fort, which again turned out to be a disappointment. Parking was far away thanks to crowd and the fort itself was poorly maintained. Reviews that were months old indicated restoration in progress and the situation on the ground indicated the same. Beach views from the top were good but that was about it. The steep uphill walk exhausted most tourists, and we heard people say “isme dekhne ke liye kya hai”. So we were not alone!</p>

<p>Next was the Anjuna Flea Market. Google Maps took us through a narrow lane around the market to the other end, while the market was visible from the straight road. Sometimes I wonder if it’s a trick by vested interests like the parking lobby to bring users to their parking lot. The parking fee set us back by ₹100, and we did not find anything special in the flea market, despite the hype from influencers.</p>

<h2 id="day-3-netravali-and-the-forest-route">Day 3: Netravali and the forest route</h2>

<p>Day 3 gave us an opportunity to experience rural Goa while going to Netravali Wildlife Sanctuary. The forest route was beautiful and we couldn’t stop appreciating the well built roads. Being a forest, my Jio network turned patchy and kept complaining about lost GPS signal. My secondary number is BSNL and that offered LTE and H+ closer to the wildlife sanctuary making navigation easier. This became more important when visiting the bubbling lake and then heading to the sanctuary for waterfalls. It was a delight to see water bubbles rise from the bottom in a clear lake. However, we did not see any correlation between clapping our hands and bubbles rising (as some online reviews claim). The bubbles were coming naturally.</p>

<p>With the forest department celebrating wildlife week, entry was free while life jacket deposit had to be paid at ₹40 per head. This was non-negotiable even if we said we wouldn’t step into water. We chose to drive instead of trek to the Savri waterfall. This required only 1 km trek after parking the vehicle whereas others required 3+ kms. We enjoyed the walk and appreciated how the Govt had built stairs right to the bottom of the waterfall where one could grab a life jacket and play in water. It still pays to have a BSNL number when traveling to remote places!</p>

<figure class="post-figure portrait">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261004_125338.webp" alt="Savri waterfall inside Netravali Wildlife Sanctuary" loading="lazy" />
  
    <figcaption>Savri waterfall inside Netravali Wildlife Sanctuary</figcaption>
  
</figure>

<p>We had learnt about the possibility of reaching a strawberry farm by passing through the forest route. However, the guards mentioned that this is not the season for strawberries. They would be found in winter, more like Nov/December to March.</p>

<p>On the way back, we went to Rivona buddhist caves. While we were expecting some sort of a tunnel that wasn’t the case. The visit could be concluded in less than 10 minutes. Undoubtedly good place to check out but if you make a 40 km trip just to see the caves, you are likely to be disappointed!</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261004_142258.webp" alt="The main Rivona cave" loading="lazy" />
  
    <figcaption>The main Rivona cave</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261004_142341.webp" alt="A small cave opening" loading="lazy" />
  
    <figcaption>A small cave opening</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261004_142510.webp" alt="Inside, the red laterite floor" loading="lazy" />
  
    <figcaption>Inside, the red laterite floor</figcaption>
  
</figure>

<p>Then we headed to the spice garden aka Sahakari Spice Farm. It was an unbelievable sight, perhaps due to the fact that arecanut plantations are plenty in our region to see people clicking photographs against arecanut tree backdrop. Our idea was to purchase some spices but it turned out that the store is inside the ticketed area which costs ₹500/head which also includes food. We felt it was too pricey even with a guided tour since we are not strangers to this kind of plantations. Headed back to Japanese Gardens. The route took us through industrial area of Goa where we could see multiple factories such as those of IFB and many pharma units. Unlike crowded tourist beaches, the Japanese Garden had local vibes. The garden sits inside the Mormugao Port Trust colony, with staff quarters all around, and the locality took us back to the 90s.</p>

<p>As it turned dark, we drove to the Birla temple. It was a magnificent sight and the evening air was cool and breezy. Offered prayers, spent some time around in the well maintained gardens and headed back to our stay.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261004_190241.webp" alt="The plaque at Birla Mandir" loading="lazy" />
  
    <figcaption>The plaque at Birla Mandir</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261004_190430.webp" alt="Birla Mandir after dark" loading="lazy" />
  
    <figcaption>Birla Mandir after dark</figcaption>
  
</figure>

<p>In this duration, we felt that Goa does not have as many supermarkets as it must probably have. There are hardly any Smart Bazaars or D-Marts!</p>

<h2 id="day-4-fort-aguada-and-the-science-centre">Day 4: Fort Aguada and the Science Centre</h2>

<p>We headed to Fort Aguada after breakfast. The experience here was significantly better. We specifically visited the upper fort that contains a lighthouse and rainwater harvesting reservoir, and the Lower site, which houses the Port and Jail complex. We headed next to check out the jail museum and the site looked great from the outside itself. Apparently well maintained! However the tickets at ₹300/adult put us off and we headed back clicking some photographs of the scenic destination.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261005_113153.webp" alt="The key plan of Upper Fort Aguada, with the lighthouse and water tank" loading="lazy" />
  
    <figcaption>The key plan of Upper Fort Aguada, with the lighthouse and water tank</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261005_113408.webp" alt="A relief map of Goa listing the forts and their distance from Aguada" loading="lazy" />
  
    <figcaption>A relief map of Goa listing the forts and their distance from Aguada</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261005_120437.webp" alt="The entrance to the Fort Aguada Jail Museum" loading="lazy" />
  
    <figcaption>The entrance to the Fort Aguada Jail Museum</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261005_120619.webp" alt="Looking out to sea from the Fort Aguada Jail Museum complex" loading="lazy" />
  
    <figcaption>Looking out to sea from the Fort Aguada Jail Museum complex</figcaption>
  
</figure>

<p>While on the way to Aguada via Candolim, we had noticed a good number of pure veg restaurants. Therefore we returned back to have our lunch at Navaratna Udupi Pure veg restaurant. While the service was slow, the food itself was decent.</p>

<p>Next we headed to the Goa Science Centre and Planetarium. The science centre has many hands-on exhibits related to physics, space, energy, and everyday science concepts. While old, they are still functional and we saw visitors enjoying experimenting and interacting with the displays. We were lucky to reach the centre just before a 3D show was set to begin and the security ensured that we got timely entry. It was a first 3D show we watched and we thoroughly enjoyed it. Our toddler was scared at one point given the realistic experience. I must add that it was just a part of the actual movie!</p>

<p>We could also catch the Taramandal show. It was about the significance of sun but it felt like an old recording offering namesake experience. I wish the show duration could be extended to add more information. Again, it was a first planetarium experience for us.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261005_145110.webp" alt="The 3D show at the Goa Science Centre: 13 minutes, four shows a day" loading="lazy" />
  
    <figcaption>The 3D show at the Goa Science Centre: 13 minutes, four shows a day</figcaption>
  
</figure>

<p>With time to spare, we headed to the Utorda beach close to our stay. Being in a rural area, the beach was clean and we spent quality time there until sunset.</p>

<h2 id="day-5-the-drive-home">Day 5: the drive home</h2>

<p>We went to the Naval Aviation Museum that we couldn’t cover on Day 4 since it is closed on Mondays. Unlike the one at Karwar, this had multiple naval aircrafts on display and detailed information boards. Visitors are also allowed to walk into a defunct aircraft and sit in a helicopter cockpit. There is also a small theatre where a short documentary and a video song are played at hourly intervals. The videos are inspiring, but in my opinion more could be done in that direction, with a longer duration and more content. As of now, it runs only about 10 minutes!</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261006_101540.webp" alt="The Super Constellation airliner on display" loading="lazy" />
  
    <figcaption>The Super Constellation airliner on display</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261006_101839.webp" alt="Super Constellation on the lawn" loading="lazy" />
  
    <figcaption>Super Constellation on the lawn</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261006_101944.webp" alt="The cockpit of a Sikorsky UH-3H helicopter" loading="lazy" />
  
    <figcaption>The cockpit of a Sikorsky UH-3H helicopter</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261006_102542.webp" alt="The UH-3H information board" loading="lazy" />
  
    <figcaption>The UH-3H information board</figcaption>
  
</figure>

<p>The museum also has a souvenir shop with items like t-shirts, coffee mugs and mobile stands at reasonable rates. We picked up two books there.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261008_162139.webp" alt="Two books from the museum shop, The Golden Wings and The Tail Hooker by Sareshth Kumar" loading="lazy" />
  
    <figcaption>Two books from the museum shop, The Golden Wings and The Tail Hooker by Sareshth Kumar</figcaption>
  
</figure>

<p>On the way back we visited the Shri Shantadurga Kunkallikarin Temple. We had hoped to savour the temple lunch, but were told that it is served only on Sundays.</p>

<figure class="post-figure portrait">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261006_130412.webp" alt="Shri Shantadurga Kunkallikarin Temple, our last stop on the way back" loading="lazy" />
  
    <figcaption>Shri Shantadurga Kunkallikarin Temple, our last stop on the way back</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261006_130422.webp" alt="The temple complex at Shri Shantadurga Kunkallikarin" loading="lazy" />
  
    <figcaption>The temple complex at Shri Shantadurga Kunkallikarin</figcaption>
  
</figure>

<p>Lunch was at Amrut Inn in Karwar, and it was the best of all the lunches we had on this trip. The rotis were simply delicious. After that, we drove back home. The trip meter read 1335.9 kms.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261007_105850.webp" alt="Trip meter at the end of the drive" loading="lazy" />
  
    <figcaption>Trip meter at the end of the drive</figcaption>
  
</figure>

<h2 id="what-we-could-have-done-better">What we could have done better</h2>

<p>We chose to stay in South Goa because most reviews said it lacks the hustle and bustle of the north and is peaceful. However, this meant a lot of extra driving, especially on the days we covered North Goa.</p>

<p>We also wish we had chosen places by reading reviews more thoroughly for ticket prices and weekly closure days. As we love to drive, trips such as the one to the Spice Garden were not entirely wasted, since the route was rich in greenery with great roads and let us see Goa beyond the touristy places. It just burnt additional time and fuel.</p>

<p>Overall, we loved the trip. Goa was clean with wide roads, and civic workers were on duty every morning picking up trash. If only tourists stayed responsible, their job would have been a lot easier.</p>]]></content><author><name>Chethan</name></author><category term="travel" /><category term="goa" /><category term="travel" /><category term="itinerary" /><category term="road-trip" /><summary type="html"><![CDATA[Five days in Goa by car from Karkala: Netravali, Fort Aguada, a science centre, caves and two naval museums, with honest verdicts and what we would skip.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_165915.webp" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-10-07-our-five-day-goa-trip-stop-by-stop/20261002_165915.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Building a Heavy-Duty Extension Box: 4 Wiring Tips</title><link href="https://staygeo.com/projects/2026/09/04/building-a-heavy-duty-extension-box-4-wiring-tips.html" rel="alternate" type="text/html" title="Building a Heavy-Duty Extension Box: 4 Wiring Tips" /><published>2026-09-04T00:00:00+00:00</published><updated>2026-09-04T00:00:00+00:00</updated><id>https://staygeo.com/projects/2026/09/04/building-a-heavy-duty-extension-box-4-wiring-tips</id><content type="html" xml:base="https://staygeo.com/projects/2026/09/04/building-a-heavy-duty-extension-box-4-wiring-tips.html"><![CDATA[<p>Commercial plastic extension boards are practically disposable. A couple of minor drops on a concrete floor, and the brittle internal plastic standoffs crack, leaving 220V live terminals floating loose inside a flimsy shell.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-09-04-building-a-heavy-duty-extension-box-4-wiring-tips/20260903_085755.webp" alt="Old plastic extension board with a cracked body" loading="eager" />
  
    <figcaption>The old board that started this project - a tiny screw-mounted plastic standoff holding the socket block had snapped off inside</figcaption>
  
</figure>

<p>Electrical shops readily stock boards like the one that broke. A wooden one like this has to be made to order, but it fixes the durability problem outright. Real safety, though, comes down to mechanical details most basic diagrams overlook.</p>

<p>Past wiring jobs I’ve pieced together from whatever YouTube tutorial came closest to the job at hand. This time I worked through it with AI instead, which gave instructions specific to this box’s layout and a quick check of the wiring before anything went live.</p>

<!--more-->

<figure class="post-figure center">
  <img src="/assets/images/2026-09-04-building-a-heavy-duty-extension-box-4-wiring-tips/20260903_083534.webp" alt="Wooden enclosure cut for four switch and socket modules" loading="lazy" />
  
    <figcaption>The wooden enclosure, cut for four modules and reusing the switch/socket plates salvaged from the old board</figcaption>
  
</figure>

<h3 id="treat-terminal-blocks-as-your-busbars">Treat terminal blocks as your busbars</h3>

<p>Avoid stripping and taping T-splices inside the box. Run direct jumper leads between the switch and socket terminals instead. Clamping inside brass terminal blocks is far more reliable and heat-resistant than insulation tape.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-09-04-building-a-heavy-duty-extension-box-4-wiring-tips/20260903_220735.webp" alt="Interior wiring showing blue jumper leads clamped directly into terminal blocks" loading="lazy" />
  
    <figcaption>Direct jumper leads clamped into the brass terminal blocks, no spliced or taped joints inside the box</figcaption>
  
</figure>

<p>One thing I would do differently here: every jumper lead here is the same blue, since it was what I had on hand. Color-coded wire, a separate shade for line and neutral, is strongly recommended so the run stays readable at a glance instead of reading up the markings or a multimeter to tell them apart later.</p>

<h3 id="strain-relief-is-non-negotiable">Strain relief is non-negotiable</h3>

<p>When someone trips over a 10-meter extension lead, that physical force must never reach the electrical connections. Gemini pointed this one out: a tight zip-tie collar, one inside and one outside the entry hole, transfers all the pulling force to the outer wooden frame instead of the terminals. None of this is obvious unless you do this kind of wiring daily and pick it up from watching things fail.</p>

<h3 id="protect-the-strands-and-your-fingers">Protect the strands, and your fingers</h3>

<p>Some of this only comes with practice. I can run a wire stripper down the insulation cleanly now, where I used to either chop off the wire end entirely or nick several strands trying to get the skin off. I went in fairly paranoid about the rest too, splayed copper strands puncturing a finger or bridging a terminal gap. Again, Gemini guided me to twist the fine strands neatly by hand, bring the jumper and the main wire together, bend the twisted end back on itself, and tuck it into the terminal before tightening the screw down.</p>

<h3 id="master-the-over-under-coil">Master the over-under coil</h3>

<p>Long 3-core cables retain strong mechanical memory. Coiling the cable around your arm introduces continuous twists that kink the sheath permanently. An alternating over-under wrap neutralizes that internal torque, keeping the line tangle-free for years.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-09-04-building-a-heavy-duty-extension-box-4-wiring-tips/20260904_162214.webp" alt="Finished wooden extension box with a neatly over-under coiled cable" loading="lazy" />
  
    <figcaption>The finished box, cable coiled over-under and stored beneath it</figcaption>
  
</figure>

<p>Before the plug went anywhere near a wall socket, I ran a multimeter in continuity mode across the whole build: each switch in both positions, to confirm it actually breaks the circuit instead of staying live regardless, and the line and neutral runs, to catch any swap before it turned into a surprise. Only once all of that checked out clean did the plug go into a real socket for the first time.</p>]]></content><author><name>Chethan</name></author><category term="projects" /><category term="diy" /><category term="hardware" /><category term="electrical" /><category term="wiring" /><category term="engineering" /><category term="home-improvement" /><summary type="html"><![CDATA[Commercial extension boards crack easily indoors, so I built a wooden one and picked up four wiring habits that actually keep it safe.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-09-04-building-a-heavy-duty-extension-box-4-wiring-tips/20260904_162214.webp" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-09-04-building-a-heavy-duty-extension-box-4-wiring-tips/20260904_162214.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The AI Repatriation Cycle</title><link href="https://staygeo.com/tech/2026/08/28/the-ai-repatriation-cycle.html" rel="alternate" type="text/html" title="The AI Repatriation Cycle" /><published>2026-08-28T00:00:00+00:00</published><updated>2026-08-28T00:00:00+00:00</updated><id>https://staygeo.com/tech/2026/08/28/the-ai-repatriation-cycle</id><content type="html" xml:base="https://staygeo.com/tech/2026/08/28/the-ai-repatriation-cycle.html"><![CDATA[<p>Thomson Reuters just launched <strong>Thomson</strong>, its first proprietary large language model. Not a fine-tuned wrapper around GPT-5.5 or Claude. It’s a model the company owns outright, trained on its own compute, and it’s already live inside Tabular Analysis in CoCounsel Legal, reviewing up to 10,000 documents against up to 100 questions at once, with every answer traceable back to its source. It’s exactly the kind of high-volume, judgment-heavy review where a purpose-built model’s edge is measurable, not just claimed, and Thomson Reuters has said this is only the first rollout, with more of the product line expected to run on Thomson over time.</p>

<p>That’s the headline. The interesting part is why, and it’s a pattern enterprise infrastructure has run through before.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-08-28-the-ai-repatriation-cycle/featured-cycle.png" alt="Three-stage diagram: Migration Rush (wrap a frontier API, ship fast), Reality Check (invoices scale with volume, compliance flags appear), and Hybrid Equilibrium (sovereign models for high-volume work, frontier APIs for open-ended reasoning, both on purpose)" loading="eager" />
  
    <figcaption>The same three-stage curve cloud adoption went through, playing out again for AI</figcaption>
  
</figure>

<!--more-->

<h2 id="weve-seen-this-curve-already">We’ve seen this curve already</h2>

<p>Early cloud adoption went through three phases:</p>

<ul>
  <li><strong>The migration rush.</strong> Move everything to public multi-tenant cloud for speed and zero infra overhead.</li>
  <li><strong>The reality check.</strong> Steady-state scale hits. Monthly invoices balloon. Compliance flags start popping.</li>
  <li><strong>The equilibrium.</strong> Workloads split. Elastic, unpredictable edge cases stay on public cloud. Core, high-volume, predictable workloads get repatriated to owned or dedicated infrastructure.</li>
</ul>

<p>Generative AI is mirroring this step for step. 2023 to 2024 was the migration rush: wrap a frontier API, ship fast, worry about margins later. Thomson Reuters building its own model is the equilibrium phase arriving early, because the reality check hit faster this time than it did for cloud. Per-token pricing makes the invoice line painfully legible in a way that “our AWS bill is high” never quite was.</p>

<h2 id="the-token-toll-vs-owned-compute">The token toll vs. owned compute</h2>

<p>Frontier APIs are unbeatable for prototyping: no infra, no ops burden, immediate quality. But the pricing model is linear, cost scales directly with volume, forever. There’s no economy of scale on the buyer’s side, only on the vendor’s.</p>

<p>Run the math on a realistic enterprise document pipeline: 100,000 documents a day, averaging 4,000 prompt tokens and 500 completion tokens each. That’s roughly 12,000 million input tokens and 1,500 million output tokens a month. Using <a href="https://platform.claude.com/docs/en/about-claude/pricing">Claude Sonnet 5 pricing</a> as a frontier benchmark:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Item</th>
      <th style="text-align: center">Volume</th>
      <th style="text-align: center">Rate</th>
      <th style="text-align: center">Monthly cost</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">Input tokens</td>
      <td style="text-align: center">12,000M</td>
      <td style="text-align: center">$2/M</td>
      <td style="text-align: center">$24,000</td>
    </tr>
    <tr>
      <td style="text-align: center">Output tokens</td>
      <td style="text-align: center">1,500M</td>
      <td style="text-align: center">$10/M</td>
      <td style="text-align: center">$15,000</td>
    </tr>
    <tr>
      <td style="text-align: center"><strong>Total</strong></td>
      <td style="text-align: center"> </td>
      <td style="text-align: center"> </td>
      <td style="text-align: center"><strong>$39,000/mo ($468K/yr)</strong></td>
    </tr>
  </tbody>
</table>

<p>A dedicated open-weight model in the 30B to 70B range, roughly the size class enterprises actually fine-tune, specialized on domain data and running on a reserved 8xH100 node, lands closer to half that, all-in. AWS’s own <a href="https://instances.vantage.sh/aws/ec2/p5.48xlarge">p5.48xlarge reserved pricing</a> puts an 8x H100 node at $23.78 an hour on a 3-year commit, against roughly 730 hours in a month:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Item</th>
      <th style="text-align: center">Detail</th>
      <th style="text-align: center">Monthly cost</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">8x H100 node (reserved)</td>
      <td style="text-align: center">$23.78/hr x 730 hrs</td>
      <td style="text-align: center">$17,400</td>
    </tr>
    <tr>
      <td style="text-align: center">Monitoring &amp; control plane</td>
      <td style="text-align: center">flat estimate</td>
      <td style="text-align: center">$2,000</td>
    </tr>
    <tr>
      <td style="text-align: center"><strong>Total</strong></td>
      <td style="text-align: center"> </td>
      <td style="text-align: center"><strong>$19,400/mo (~$233K/yr)</strong></td>
    </tr>
  </tbody>
</table>

<p>On-demand, the same node runs $55 an hour, which is the number that makes API pricing look cheap by comparison. Reserved is what makes owned compute pencil out. Same workload, about half the cost, and the number doesn’t move if volume grows.</p>

<p>That “about half” only holds at this volume, though. The self-hosted side is a fixed monthly cost whether you process one document or a million; the API side scales linearly with every document. There’s a specific volume where the two lines cross:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Item</th>
      <th style="text-align: center">Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">API cost per document</td>
      <td style="text-align: center">(4,000 x $2/M) + (500 x $10/M) = $0.013</td>
    </tr>
    <tr>
      <td style="text-align: center">Self-hosted fixed cost</td>
      <td style="text-align: center">$19,400/mo</td>
    </tr>
    <tr>
      <td style="text-align: center">Breakeven volume</td>
      <td style="text-align: center">$19,400 / (30.44 days/mo x $0.013) is about 49,000 docs/day</td>
    </tr>
  </tbody>
</table>

<p>100,000 documents a day is roughly double that crossover, which is why self-hosting wins by a comfortable margin in this example. Below about 49,000 documents a day, the fixed node costs more than just paying per token, and the API is the right call. That gap is why build-vs-rent stops being a philosophical question once you’re past pilot scale and becomes a straightforward FinOps decision.</p>

<p>Cost isn’t the only lever pushing that decision. Data residency does too: once a workload has to stay inside a specific jurisdiction, routing it through a vendor’s shared multi-tenant infrastructure raises a compliance question that a self-hosted cluster in your own region doesn’t. Thomson Reuters builds this in at the network layer rather than leaving it to contract language: their <a href="https://www.thomsonreuters.com/content/dam/ewp-m/documents/thomsonreuters/en/pdf/reports/thomson-technical-report.pdf">technical report</a> describes a routing mesh that blocks residency-sensitive workloads from ever reaching a disallowed region, so a misconfiguration can’t accidentally send them there either.</p>

<h2 id="what-thomson-reuters-actually-built">What Thomson Reuters actually built</h2>

<p>Thomson Reuters didn’t train from scratch. It didn’t have to. The company spent roughly $40M over two years, mostly on personnel and compute, adapting <strong>Alibaba’s Qwen</strong>, an open-weight model, into an internal checkpoint it calls Snowdon, built jointly with Imperial College London to de-bias and harden it for professional use, then post-trained that on Westlaw and Practical Law content. The final training run itself cost about $450K. On benchmarks, the result is now competitive with frontier models from Anthropic, OpenAI, and Google on legal and general tasks.</p>

<p>A company whose entire pitch is sovereign, trustworthy, compliant AI for the legal profession built its core model on a Chinese open-weight base. That’s not really a contradiction. Open weights are commodity infrastructure now, and what Thomson Reuters actually controls is everything downstream of that checkpoint: the training data, the alignment process, the serving stack, the IP. It does mean sovereignty in this new AI stack is a narrower claim than the marketing implies. Nobody is re-deriving the base model from first principles anymore. The moat was never the weights. It’s what gets poured into them afterward.</p>

<p>The production model powering CoCounsel stays closed, but Thomson Reuters did publish a smaller research variant, <a href="https://huggingface.co/thomsonreuters/Thomson-1.0-Small">Thomson-1.0-Small</a>, as open weights on Hugging Face for academic and non-commercial use. Even the company making the sovereignty argument is routing some of it back out through the open ecosystem it started from.</p>

<h2 id="where-the-real-moat-is">Where the real moat is</h2>

<p>Raw compute and base model weights are commodities now. Anyone can rent GPUs, and anyone can start from an open checkpoint. What Thomson Reuters has that a competitor can’t replicate quickly is West Publishing’s 150-plus years of case law and legal content, the Westlaw and Practical Law platforms built on top of it, plus Checkpoint and the Reuters news archive. <a href="https://www.thomsonreuters.com/en/press-releases/2026/august/thomson-reuters-leverages-its-world-class-data-assets-to-launch-its-own-frontier-model">Thomson Reuters says</a> it trained on less than 10 percent of that content so far, and none of it has to touch a third-party training set.</p>

<p>That’s the actual lesson for anyone doing this at enterprise scale: the defensible asset was never “we have an AI model.” It’s the proprietary corpus and the human feedback loop that goes into specializing it. That’s the same thing that made a company’s core database or ERP defensible a decade ago, just applied to model weights instead of schemas.</p>

<h2 id="the-hybrid-topology-not-an-eitheror">The hybrid topology, not an either/or</h2>

<p>None of this means abandoning frontier APIs. It means routing: a gateway in front of the app layer decides per request whether a task goes to a dedicated, fine-tuned model or out to a frontier API mesh. That’s an architectural recommendation, not a description of what Thomson Reuters has built. Their own infrastructure section documents something narrower: a routing layer that picks among their own self-hosted clusters for failover and data residency, not a classifier deciding sovereign versus frontier per query.</p>

<p>Cloud didn’t kill private infrastructure. It produced hybrid cloud. AI is heading toward the same split: frontier APIs handle unstructured reasoning and the long tail of edge cases, while dedicated models handle the high-volume, deterministic, compliance-sensitive core.</p>

<p>Thomson Reuters is already living this. Their own <a href="https://www.thomsonreuters.com/content/dam/ewp-m/documents/thomsonreuters/en/pdf/reports/thomson-technical-report.pdf">technical report</a> says their self-hosted inference platform has served more than 40 million requests and processed 370 billion tokens since April 2026, and that self-hosting GLM-5.2 saved 19.7 percent versus third-party inference providers. The report names the reason plainly: managed vendor offerings carry a long-term risk of lock-in, with no clear exit strategy if costs rise. And despite building and launching Thomson, <a href="https://thenewstack.io/thomson-reuters-ai-model/">they kept their Anthropic contract running for other workloads</a> rather than cutting over entirely. The point was never to replace the frontier API mesh. It was to stop paying the token toll on the volume that didn’t need it.</p>

<h2 id="what-this-means-if-youre-making-this-call">What this means if you’re making this call</h2>

<ol>
  <li><strong>Audit the workload, not the org.</strong> Split AI usage into deterministic, high-volume tasks (candidates for a dedicated or open-weight model) versus open-ended reasoning (stays on frontier APIs).</li>
  <li><strong>Find your breakeven volume.</strong> Model your actual token spend against a reserved GPU node’s cost. In this post’s example that crossover lands around 49,000 documents a day; below it, APIs win outright. There’s no universal crossover point, yours will depend on your own token profile and hardware pricing, but the fixed-cost-versus-per-token shape is always the same.</li>
  <li><strong>Treat your proprietary corpus as the actual asset.</strong> The fine-tuning data and feedback loop are what’s defensible, not the base weights or the infrastructure.</li>
  <li><strong>Put a gateway between your app and the model.</strong> Abstracting the endpoint is what lets you move workloads between sovereign and frontier without a rewrite later.</li>
</ol>

<p>The benchmark leaderboard chase was never the differentiator. What matters is owning a cost-controlled, domain-specialized inference stack, and knowing exactly which workloads belong on it.</p>]]></content><author><name>Chethan</name></author><category term="tech" /><category term="ai" /><category term="llm" /><category term="enterprise-architecture" /><category term="finops" /><category term="open-weight-models" /><category term="infrastructure" /><summary type="html"><![CDATA[Thomson Reuters built its own LLM instead of renting one. It's the same cost curve enterprise cloud went through a decade ago, just arriving faster.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-08-28-the-ai-repatriation-cycle/featured-cycle.png" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-08-28-the-ai-repatriation-cycle/featured-cycle.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Money Has No Memory: Pruning My Portfolio</title><link href="https://staygeo.com/finance/2026/08/14/money-has-no-memory-pruning-my-portfolio.html" rel="alternate" type="text/html" title="Money Has No Memory: Pruning My Portfolio" /><published>2026-08-14T00:00:00+00:00</published><updated>2026-08-14T00:00:00+00:00</updated><id>https://staygeo.com/finance/2026/08/14/money-has-no-memory-pruning-my-portfolio</id><content type="html" xml:base="https://staygeo.com/finance/2026/08/14/money-has-no-memory-pruning-my-portfolio.html"><![CDATA[<p>I started direct stock investing in 2013. Like every investor, I tried sticking to the basics: buy quality, diversify sensibly, let compounding do the work. My philosophy has been buying stocks of companies making products I use or buy. Occasionally, I also bought them based on what I read or the company’s leadership. I also attempted to spread risk by buying two companies of sectors I had invested in, e.g., two bank stocks instead of one! But just like most portfolios after a few years, mine was no longer a lean, well-oiled engine. A pile of accidental bets had taken over: satellite positions bought on a whim, cyclical laggards I wanted to be rid of, cash scattered across redundant instruments, and demergers I never asked for, like Tata Motors splitting into TMPV and TMCV, or ITC spinning off ITC Hotels, that left me holding miniscule slices of businesses I hadn’t actually chosen to own.</p>

<p>I started the exercise of pruning my own holdings recently, consolidating everything into a focused, high-conviction core. The hard part wasn’t the analysis. The numbers are easy enough to run. What’s hard is dismantling the behavioral traps that kept me holding on to positions that I might think twice before buying today.</p>

<p>Here are the ideas that got me through it.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-08-14-money-has-no-memory-pruning-my-portfolio/featured-collage.png" alt="Diagram showing 18 scattered small-conviction positions on the left pruned down to 10-12 large high-conviction compounders on the right" loading="eager" />
  
    <figcaption>Same capital, fewer, larger bets</figcaption>
  
</figure>

<!--more-->

<h2 id="money-has-no-memory">Money Has No Memory</h2>

<p>The most dangerous price on your screen is the one you paid for the stock.</p>

<p>The market doesn’t know your purchase price, and your capital doesn’t care whether its next 9% comes from the stock that already lost you money or from a completely different business. When I’m evaluating a lagging position now, I ask one question: if I had this exact amount in cash right now, would I buy this stock today?</p>

<p>If the answer is no, holding on to it because I already own it isn’t a strategy. It’s anchoring bias wearing a strategy’s clothes. Selling isn’t admitting defeat. It’s freeing up capital to go where its forward return is actually highest.</p>

<h2 id="the-ghost-of-what-if-it-becomes-the-next-infosys-or-eicher-motors">The Ghost of “What If It Becomes the Next Infosys or Eicher Motors?”</h2>

<p>Right before you hit sell, a familiar thought shows up: what if this turns into the next Eicher Motors, or Infosys, or MRF, trading at ₹1 lakh a share five years from now? What if it rallies right after you swap it for something safer, and the safer one dips 15% the same week?</p>

<p>That’s outcome bias dressed up as caution, and it’s worth naming for what it is before it talks you out of a sale.</p>

<p>A company doesn’t become an Infosys or an Eicher Motors by luck. It takes sustained high return on capital, real pricing power, and decades of reinvestment runway. If the position you’re trimming doesn’t show those traits today, holding it on the chance that it develops them later is a lottery ticket, not an investment, and it dilutes the rest of the portfolio while you wait for the ticket to pay off.</p>

<p>Both stories get repeated because they’re real, not folklore. Infosys listed in 1993, and a series of bonus share issues and a stock split over the following two decades multiplied an early investor’s original shareholding many times over, well before the price itself did the rest of the work. That’s where the “driver of an early Infosys employee became a crorepati” stories come from. Eicher Motors is the more recent version: a stock trading around ₹2 in 2001 crossed ₹32,000 at its 2018 peak, turning a modest bet into crores for whoever held through nearly two decades of a two-wheeler business quietly compounding. Neither happened because someone got lucky and held on. Both companies spent close to twenty years earning high returns on capital before the price caught up.</p>

<p>The regret math also runs the other way from how it feels in the moment. Holding a mediocre business for years on the hope it turns around costs far more, in money and in attention, than missing an occasional bounce right after you sell. And the compounders you’re upgrading into aren’t just offense. A durable, high-quality core protects you on the way down too, when the market turns and the speculative names get hit hardest.</p>

<h2 id="three-exits-lottery-tickets-cyclicals-and-satellites">Three Exits: Lottery Tickets, Cyclicals, and Satellites</h2>

<p>A common assumption is that a cleanup only happens when you’re bleeding red ink. In my case, only one of these three positions was actually sitting in a loss. The other two were profitable exits, upgraded rather than abandoned. Each was addressing a different psychological trap, not a shared one.</p>

<table>
  <thead>
    <tr>
      <th>Category</th>
      <th>The stock</th>
      <th>Realized state</th>
      <th>The rationale I was holding onto</th>
      <th>What I did instead</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>The lottery ticket</td>
      <td>Vodafone Idea</td>
      <td>Loss</td>
      <td><em>It’s only a few rupees a share, what if the turnaround happens and it triples</em></td>
      <td>Exited entirely. The loss offset gains from the two profitable exits below instead of sitting around as unrealized hope.</td>
    </tr>
    <tr>
      <td>The cyclical</td>
      <td>Tata Motors CV</td>
      <td>Profit</td>
      <td><em>Commercial vehicle cycles will turn again, just ride it out</em></td>
      <td>Swapped into ICICI Bank, locking in the gain and trading cyclical earnings for a high-ROE compounder.</td>
    </tr>
    <tr>
      <td>The high-multiple satellite</td>
      <td>Tata Communications</td>
      <td>Profit</td>
      <td><em>Enterprise data and CPaaS are the future</em></td>
      <td>Swapped into Reliance Industries: from a ~45x+ P/E niche B2B play to a diversified conglomerate at ~23x P/E, near a multi-month consolidation level.</td>
    </tr>
  </tbody>
</table>

<p>None of these were calls that the company being trimmed was bad. Each was a call about capital efficiency: money sitting in a speculative hope or a cyclical laggard is fuel the core positions don’t get.</p>

<p>One clarification on that Tata Motors row: I didn’t buy Tata Motors CV directly. It landed in my portfolio when Tata Motors demerged into two separately listed entities, Tata Motors Commercial Vehicles and Tata Motors Passenger Vehicles. I exited the CV allotment for the cyclical reasons above, but I’m still holding, and actually adding to, Tata Motors Passenger Vehicles. That’s a different bet: I believe in its combined ICE-plus-EV lineup, and the sales numbers have backed that up so far. Trimming CV wasn’t a verdict on Tata Motors as a group, just on the cyclical half of it.</p>

<h2 id="the-breakeven-trap">The Breakeven Trap</h2>

<p>Perhaps a middle-class trait, loss aversion runs deep enough that we hate booking a loss far more than we enjoy an equivalent gain. That’s what creates the breakeven trap: the urge to hold a mediocre stock just until it crawls back to zero P&amp;L, so you can exit “without losing anything.” And I have held some of them for 5+ years in this hope while thanking myself that I did not have more than ₹25k stuck in such scrips!</p>

<p>What that reasoning skips over is the price tag on time. Holding a sluggish business for 18 months to recover an 8% dip ties up capital that could have compounded at 12-15% somewhere else. And under capital gains tax rules, realizing a small loss can actually work in your favor by offsetting gains you’ve booked elsewhere. Waiting for breakeven on a thesis that’s already dead doesn’t protect capital. It bleeds opportunity cost, quietly, for as long as you wait.</p>

<h2 id="the-math-how-loss-harvesting-actually-works">The Math: How Loss Harvesting Actually Works</h2>

<p>A big psychological barrier to selling a laggard is the fear of “booking a loss.” But once you understand the tax mechanics, taking a loss on a poor performer stops being a defeat and becomes a deliberate risk-management tool.</p>

<p>Every realized gain and every realized loss in a financial year nets out into a single number, and it’s that net figure your tax rate applies to, not each individual trade.</p>

<h3 id="the-set-off-rules">The Set-Off Rules</h3>

<p>These now sit under the Income Tax Act, 2025, which took effect this tax year and renumbered the provisions that used to live in the old 1961 Act. The mechanics haven’t changed, just the section numbers.</p>

<ul>
  <li>A short-term capital loss (STCL) can offset both short-term capital gains (STCG) and long-term capital gains (LTCG), under Section 108.</li>
  <li>A long-term capital loss (LTCL) can only offset long-term capital gains (LTCG), not short-term gains, also under Section 108.</li>
  <li>If losses exceed gains in a given year, the unabsorbed loss carries forward for up to 8 tax years under Section 111, as long as you file your ITR on time. (These sit where Sections 70 and 74 used to, under the old Act, back when it was 8 assessment years instead.)</li>
</ul>

<h3 id="a-hypothetical-case-short-term">A Hypothetical Case: Short-Term</h3>

<table>
  <thead>
    <tr>
      <th>Position</th>
      <th>Trade Type</th>
      <th>Holding Period</th>
      <th>Realized P&amp;L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Stock A (profitable exit)</td>
      <td>Sold for profit</td>
      <td>&lt; 12 months (STCG)</td>
      <td>+₹50,000</td>
    </tr>
    <tr>
      <td>Stock B (pruned laggard)</td>
      <td>Sold at a loss</td>
      <td>&lt; 12 months (STCL)</td>
      <td>-₹20,000</td>
    </tr>
    <tr>
      <td><strong>Net taxable STCG</strong></td>
      <td> </td>
      <td> </td>
      <td><strong>₹30,000</strong></td>
    </tr>
    <tr>
      <td><strong>Tax owed (20%)</strong></td>
      <td> </td>
      <td> </td>
      <td><strong>₹6,000</strong></td>
    </tr>
  </tbody>
</table>

<p>Without the loss, ₹50,000 taxed at 20% is ₹10,000. With it, the bill drops to ₹6,000. The loss on Stock B saved ₹4,000 in tax, on top of getting a dead position off the books.</p>

<h3 id="the-same-math-long-term">The Same Math, Long-Term</h3>

<p>The rules work the same way for long-term positions, just with LTCG instead of STCG.</p>

<table>
  <thead>
    <tr>
      <th>Position</th>
      <th>Trade Type</th>
      <th>Holding Period</th>
      <th>Realized P&amp;L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Stock C (profitable exit)</td>
      <td>Sold for profit</td>
      <td>&gt; 12 months (LTCG)</td>
      <td>+₹2,00,000</td>
    </tr>
    <tr>
      <td>Stock D (pruned laggard)</td>
      <td>Sold at a loss</td>
      <td>&gt; 12 months (LTCL)</td>
      <td>-₹40,000</td>
    </tr>
    <tr>
      <td><strong>Net taxable LTCG</strong></td>
      <td> </td>
      <td> </td>
      <td><strong>₹1,60,000</strong></td>
    </tr>
    <tr>
      <td><strong>Tax owed (12.5%, after ₹1.25L exemption)</strong></td>
      <td> </td>
      <td> </td>
      <td><strong>₹4,375</strong></td>
    </tr>
  </tbody>
</table>

<p>Listed equity LTCG is taxed at 12.5% (no indexation), with the first ₹1.25 lakh of gains in a financial year exempt. On a ₹1,60,000 net gain, ₹35,000 is taxable, for a bill of ₹4,375. Without harvesting the loss on Stock D, the ₹2,00,000 gain from Stock C alone would have left ₹75,000 taxable after the exemption, for a bill of ₹9,375. The loss saved ₹5,000 in tax.</p>

<h3 id="how-this-actually-played-out">How This Actually Played Out</h3>

<p>Of the three exits above, Vodafone Idea was the only one sitting in a loss, a little over ₹9,000. Tata Motors CV and Tata Communications were both sold at a profit.</p>

<p>Under Section 108, that ~₹9,000 loss was set off directly against the gains from those two profitable exits before any tax was calculated, so I owe tax on the net gain, not the gross. Had the year’s gains not been enough to absorb the loss, the unused balance would simply have carried forward under Section 111 instead of going to waste.</p>

<p>That’s a real case against the breakeven trap. The loss on a dead position isn’t just a write-off, it’s a lever you can pull to reduce what you owe on the winners you’re already holding.</p>

<h2 id="dont-penny-pinch-on-the-order-book">Don’t Penny-Pinch on the Order Book</h2>

<p>When executing a multi-year portfolio upgrade, a classic rookie mistake is fighting the order book over pennies. Trying to save 0.2% on a limit order for a liquid large-cap risks missing the fill entirely if the stock moves in the afternoon session. If the thesis is to hold a high-compounding business for the next three to five years, arguing over ₹5 on the order price misses the point of the trade. When the goal is structural reallocation, certainty of execution matters more than shaving the last bit off the price.</p>

<p>When I ran the swap, I executed both the buy and sell legs directly at market price. The certainty of completion was worth far more than fighting for a few paise, and I could focus on other important things at hand.</p>

<h2 id="the-tax-friction-myth">The Tax Friction Myth</h2>

<p>The other kind of paralysis is tax related. A lot of us freeze at the thought of a 30% slab rate on debt fund gains, or start obsessing over STT and DP charges on every trade. Neither holds up once you look closely.</p>

<p>Micro charges like DP fees and turnover costs are rounding errors on a trade that’s actually worth making. And tax is charged on the gain, not on the principal, so the amount at stake is usually far smaller than it sounds in your head. Paying a small, unavoidable tax to move idle or inefficient cash into something that compounds at equity rates beats letting that capital sit still out of fear of the tax bill.</p>

<h2 id="small-positions-are-a-tax-not-a-hedge">Small Positions Are a Tax, Not a Hedge</h2>

<p>A portfolio with 1-2% allocations scattered across half a dozen speculative stocks or redundant funds looks diversified. It isn’t, it’s just friction. A 1% position doubling barely moves the total portfolio. And the mental cost is real: you still track its quarterly results, check its daily ticks, and remember its tax lots at year-end, for a position too small to matter.</p>

<p>Ten to twelve high-conviction compounders, backed by broad index exposure, gave me cleaner risk management and a lot less to track than the pile of small positions ever did.</p>

<h2 id="why-the-best-holders-werent-paying-attention">Why the Best Holders Weren’t Paying Attention</h2>

<p>The legendary 100-bagger stories, Wipro, MRF, the early Infosys shareholders, share a pattern that rarely gets mentioned. Almost nobody who watched the stock every day held it for twenty years. The people who actually captured the full return were usually the ones holding a physical share certificate in a cupboard, an old family holding nobody actively managed, or an account nobody logged into for a decade.</p>

<p>The reason isn’t complicated once you sit with it. Most multi-baggers spend three to seven years doing nothing while earnings quietly catch up to valuation. Someone watching a screen through years of flat, sideways trading experiences that stretch as failure and sells right before the next leg up. Someone with a paper certificate in a locker never saw those years happen at all, and never got the chance to interrupt the compounding.</p>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>The active investor</th>
      <th>The forgotten certificate</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Stock jumps 50%</td>
      <td>“Lock in the profit,” sells early</td>
      <td>Doesn’t know, still in the locker</td>
    </tr>
    <tr>
      <td>Stock goes flat for years</td>
      <td>“Dead money,” sells out of frustration</td>
      <td>Doesn’t know, still in the locker</td>
    </tr>
    <tr>
      <td>Company does splits and bonus issues</td>
      <td>Reacts to every corporate action</td>
      <td>Unopened mail, ignored</td>
    </tr>
    <tr>
      <td>Twenty years later</td>
      <td>Sold out long before the real move</td>
      <td>Crorepati</td>
    </tr>
  </tbody>
</table>

<p>Physical certificates had another advantage nobody designed on purpose: friction. Selling meant finding the certificate, getting signatures verified, mailing a transfer deed to the registrar, and waiting weeks for a cheque. That friction wasn’t a flaw, it accidentally saved investors from their own worst instincts. A modern demat account removes all of that. A ten-year thesis can be undone in three taps, at 11 AM, on a red day.</p>

<p>Cleaning up a portfolio was never really about finding the next multibagger. It was about cutting the dead weight and letting the assets that are actually working compound without the distraction of the ones that aren’t. The next time I hesitate before hitting sell on a lagging position, I’ll remember that my capital has no memory of what I paid for it. Only of what I do with it next.</p>

<p><em>Update: what I did with it next is in <a href="/finance/2026/10/07/i-set-rules-to-buy-the-dip-then-the-dip-came.html">I Set Rules to Buy the Dip. Then the Dip Came.</a></em></p>

<p><em>Disclaimer: None of this is financial advice. Just the frameworks that got me through my own cleanup.</em></p>]]></content><author><name>Chethan</name></author><category term="finance" /><category term="investing" /><category term="portfolio-management" /><category term="behavioral-finance" /><category term="opportunity-cost" /><category term="anchoring-bias" /><summary type="html"><![CDATA[Four ideas that helped me let go of anchoring bias, breakeven thinking, and dead-weight positions while consolidating my portfolio.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-08-14-money-has-no-memory-pruning-my-portfolio/featured-collage.png" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-08-14-money-has-no-memory-pruning-my-portfolio/featured-collage.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bootstrap Key Vault Secrets via ARM, Not the Firewall</title><link href="https://staygeo.com/tech/2026/08/12/bootstrap-key-vault-secrets-via-arm-not-the-firewall.html" rel="alternate" type="text/html" title="Bootstrap Key Vault Secrets via ARM, Not the Firewall" /><published>2026-08-12T00:00:00+00:00</published><updated>2026-08-12T00:00:00+00:00</updated><id>https://staygeo.com/tech/2026/08/12/bootstrap-key-vault-secrets-via-arm-not-the-firewall</id><content type="html" xml:base="https://staygeo.com/tech/2026/08/12/bootstrap-key-vault-secrets-via-arm-not-the-firewall.html"><![CDATA[<p>A few years ago I worked on a setup where Key Vault sat behind a private endpoint, and the CI/CD agent needed to read and write a couple of secrets on it. The standard fix, the one documentation suggests and seemed obvious was to add the agent’s IP to the vault’s firewall exception list, do your thing, and tear it back down.</p>

<p>It didn’t work reliably. The allowlist update didn’t propagate immediately, so we ended up with a retry loop polling the vault for a specified number of times before it would let the agent in, and even that failed often enough to be a running joke on the team. Every failure meant a manual retrigger and someone context-switching to babysit a pipeline.</p>

<p>Rebuilding a similar setup recently, I went looking for a way to avoid that whole failure class instead of engineering around it, and it turns out Azure already gives you one. It’s just not framed anywhere as the fix for this.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-08-12-bootstrap-key-vault-secrets-via-arm-not-the-firewall/featured-two-planes.png" alt="Diagram showing a CI/CD agent's request to vault.azure.net blocked by the data-plane firewall, while a request to management.azure.com (ARM) reaches Key Vault unobstructed" loading="eager" />
  
    <figcaption>Two APIs guard the same secrets, but only one of them checks the firewall</figcaption>
  
</figure>

<!--more-->

<h2 id="two-planes-one-firewall">Two planes, one firewall</h2>

<p>Key Vault has two APIs sitting in front of the same data:</p>

<p><strong>Data plane</strong>: <code class="language-plaintext highlighter-rouge">{vault}.vault.azure.net</code>. This is what <code class="language-plaintext highlighter-rouge">az keyvault secret show/set</code>, the Key Vault SDKs, and most tutorials use. Network ACLs (firewall rules, private endpoints, “selected networks”) apply here. If your agent’s IP isn’t allowed, it isn’t getting in.</p>

<p><strong>Management plane</strong>: <code class="language-plaintext highlighter-rouge">management.azure.com</code>. This is Azure Resource Manager. ARM/Bicep deployments, and even a plain <code class="language-plaintext highlighter-rouge">az rest</code> call against the right URL, go through here. Network ACLs on the vault don’t apply to this path at all.</p>

<p>Secrets are actually exposed as a real ARM resource type, <code class="language-plaintext highlighter-rouge">Microsoft.KeyVault/vaults/secrets</code>, separate from the data-plane secret object. You can create, read, and update secrets by deploying that resource, no different from deploying a subnet or a storage account. Since ARM itself makes the call server-side, the vault’s firewall never sees a request from your agent’s IP, because there isn’t one.</p>

<p>Microsoft’s own <a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/template-tutorial-use-key-vault">Key Vault template deployment tutorial</a> relies on exactly this, so it’s not some undocumented backdoor. It’s just rarely connected to the “my pipeline can’t reach my locked-down vault” problem, which is almost always answered with self-hosted agents inside the VNet or the flaky IP-allowlist dance instead.</p>

<h2 id="the-pattern">The pattern</h2>

<p>Three touchpoints, none of which hit the data plane.</p>

<p><strong>1. Check if a secret already exists</strong>, via <code class="language-plaintext highlighter-rouge">az rest</code> against the management plane:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">SUB_ID</span><span class="o">=</span><span class="si">$(</span>az account show <span class="nt">--query</span> <span class="nb">id</span> <span class="nt">-o</span> tsv<span class="si">)</span>
<span class="nv">VAULT_URI</span><span class="o">=</span><span class="s2">"https://management.azure.com/subscriptions/</span><span class="k">${</span><span class="nv">SUB_ID</span><span class="k">}</span><span class="s2">/resourceGroups/</span><span class="k">${</span><span class="nv">RG</span><span class="k">}</span><span class="s2">/providers/Microsoft.KeyVault/vaults/</span><span class="k">${</span><span class="nv">VAULT_NAME</span><span class="k">}</span><span class="s2">"</span>

<span class="k">if </span>az rest <span class="nt">--method</span> GET <span class="se">\</span>
     <span class="nt">--url</span> <span class="s2">"</span><span class="k">${</span><span class="nv">VAULT_URI</span><span class="k">}</span><span class="s2">/secrets/</span><span class="k">${</span><span class="nv">SECRET_NAME</span><span class="k">}</span><span class="s2">?api-version=2023-07-01"</span> <span class="se">\</span>
     <span class="nt">--query</span> <span class="nb">id</span> <span class="nt">-o</span> tsv 2&gt;/dev/null | <span class="nb">grep</span> <span class="nt">-q</span> .<span class="p">;</span> <span class="k">then
  </span><span class="nb">echo</span> <span class="s2">"exists, skip bootstrap"</span>
<span class="k">else
  </span><span class="nb">echo</span> <span class="s2">"missing, generate and store"</span>
<span class="k">fi</span>
</code></pre></div></div>

<p><strong>2. Create it</strong>, via an ARM/Bicep deployment of the secret resource, not <code class="language-plaintext highlighter-rouge">az keyvault secret set</code>:</p>

<div class="language-bicep highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">resource</span> <span class="n">secret</span> <span class="s1">'Microsoft.KeyVault/vaults/secrets@2023-07-01'</span> <span class="p">=</span> <span class="pi">{</span>
  <span class="py">name</span><span class="p">:</span> <span class="s1">'</span><span class="si">${</span><span class="n">vaultName</span><span class="si">}</span><span class="s1">/</span><span class="si">${</span><span class="n">secretName</span><span class="si">}</span><span class="s1">'</span>
  <span class="py">properties</span><span class="p">:</span> <span class="pi">{</span>
    <span class="py">value</span><span class="p">:</span> <span class="n">secretValue</span>
  <span class="pi">}</span>
<span class="pi">}</span>
</code></pre></div></div>

<p><strong>3. Consume it</strong>, via an ARM parameter file KV reference, resolved server-side when the dependent resource (VM, SQL, whatever needs the credential) deploys:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"adminPassword"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nl">"reference"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"keyVault"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/subscriptions/.../vaults/{vaultName}"</span><span class="w"> </span><span class="p">},</span><span class="w">
    </span><span class="nl">"secretName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"{secretName}"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>The agent never calls <code class="language-plaintext highlighter-rouge">vault.azure.net</code> at any point in this flow. Bootstrap-once secrets (admin passwords, connection strings generated on first deploy) go in and come out entirely through ARM. Idempotency comes for free, since step 1 makes the whole thing safe to rerun. A secret only gets generated once, and every subsequent run just confirms it’s already there.</p>

<h2 id="the-permission-model-to-plan-around">The permission model to plan around</h2>
<p>This works because ARM’s <code class="language-plaintext highlighter-rouge">Microsoft.KeyVault/vaults/secrets</code> write is authorized by ordinary Azure RBAC control-plane actions, the same kind that lets you deploy a storage account, and not by the vault’s own access policy or data-plane RBAC roles (Key Vault Secrets Officer, Key Vault Secrets User). It’s not the permission you’d instinctively reach for.</p>

<p>A security researcher found a related issue with the built-in <strong>Reader</strong> role in <a href="https://cirriustech.co.uk/blog/azure-vault-recon/">this writeup</a>. Reader carries <code class="language-plaintext highlighter-rouge">*/read</code> actions and no <code class="language-plaintext highlighter-rouge">dataActions</code> at all, yet it still lets you enumerate secret names, versions, and creation dates across every vault in scope through the same management-plane path. Microsoft’s response was that this is by design, since control-plane reads return metadata but never an object’s value.</p>

<p>For this pattern to work, whatever principal runs your pipeline needs Contributor, or a custom role with <code class="language-plaintext highlighter-rouge">Microsoft.KeyVault/vaults/secrets/write</code>, somewhere between the vault and wherever that role is scoped, not a data-plane role. Most deployment pipelines already have Contributor anyway, since they need it to create the VM, storage account, or whatever else the secret feeds into. That same grant doubles as write access to any secret in any vault under that scope, independent of the vault’s own access policy.</p>

<h2 id="where-this-fits">Where this fits</h2>
<p>Not a replacement for a real private-networking story if your threat model needs one. A VNet-joined self-hosted agent with a private endpoint is still the right call for ongoing, high-sensitivity data-plane access. But for the specific, common case of “pipeline needs to bootstrap or read a handful of secrets against a vault with networkDefaultAction: Deny, and I don’t want to run infrastructure just to make that possible,” routing through the control plane sidesteps the entire allowlist-and-pray problem instead of making it slightly less flaky.</p>]]></content><author><name>Chethan</name></author><category term="tech" /><category term="azure" /><category term="key-vault" /><category term="arm" /><category term="bicep" /><category term="ci-cd" /><category term="devops" /><category term="security" /><summary type="html"><![CDATA[Why Key Vault's data plane API keeps hitting the firewall on locked-down vaults, and how routing through ARM sidesteps it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-08-12-bootstrap-key-vault-secrets-via-arm-not-the-firewall/featured-two-planes.png" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-08-12-bootstrap-key-vault-secrets-via-arm-not-the-firewall/featured-two-planes.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Migrating My Old Blog Posts With AI</title><link href="https://staygeo.com/meta/2026/07/24/migrating-my-old-blog-posts-with-ai.html" rel="alternate" type="text/html" title="Migrating My Old Blog Posts With AI" /><published>2026-07-24T00:00:00+00:00</published><updated>2026-07-24T00:00:00+00:00</updated><id>https://staygeo.com/meta/2026/07/24/migrating-my-old-blog-posts-with-ai</id><content type="html" xml:base="https://staygeo.com/meta/2026/07/24/migrating-my-old-blog-posts-with-ai.html"><![CDATA[<p>My About page has quietly pointed to an old Blogger subdomain since I moved here, propping up my real post count. This week I finally brought all of it home.</p>

<p>Years ago, I had moved a handful of posts from WordPress to Blogger when I merged my two blogs, and even that had taken quite some time. Typically, the process is manual, involving copy-paste, post-after-post, loading images, formatting text etc. While export - import options exist, they aren’t infallible, and given that I currently use markdown files it wasn’t an option for me. With the availability of AI, I decided to give it a try. When asked for advice, I was suggested to provide the exported ZIP and it would take care of the rest. It sounded simple, but as it started to work on the migration, I realized that it was going through setting up widgets, some of them that I had used to source content (Zemanta, does anyone remember?!), RSS feeds and what not. I quickly instructed to ignore all that and focus just on the posts and images.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-07-24-migrating-my-old-blog-posts-with-ai/featured-migration.webp" alt="Scattered old browser cards flowing through a sparkling arrow into a single clean, checked-off browser window" loading="eager" />
  
</figure>

<!--more-->

<p>It got further than I expected, and not in a straight line. The first pass - exporting everything from Blogger via Google Takeout, parsing the export, downloading every embedded image, rewriting paths, converting the markup - came together fast in like 15 minutes. Then I started actually reading the converted posts, and that’s where it got interesting. I soon figured out that since the posts were composed with a WYSIWYG editor, there was a lot of <code class="language-plaintext highlighter-rouge">&lt;div&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;br&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;iframe&gt;</code> tag soup and inline styles spread across the files. A handful of posts had simply lost content: an old YouTube embed, a run of tweets, a data table, all silently dropped. Nothing about that failure was loud. The posts looked complete unless you happened to remember what used to be there.</p>

<p>That became the actual shape of the work: convert, build, read, notice something’s off, figure out why, fix it properly instead of patching the symptom, rebuild, repeat. A good chunk of what surfaced turned out to be relics of the old web - Flash-based video players, a defunct Twitter curation tool, CartoDB embeds pointing at subdomains that don’t resolve anymore. Other things very much were fixable, and some of the more interesting bugs only showed up because I went and looked - reading a post, essentially, and catching a sentence that had two paragraphs mashed into it with not even a space between them. Once I flagged one, the pattern rarely stayed contained to a single post: that same broken-paragraph-boundary bug turned up in half a dozen more places once it got scanned for properly instead of fixed one at a time, a stripped-out Twitter widget that had silently killed rich tweet embeds showed up in eleven more posts, and a handful of video embeds had gone missing the exact same way, across posts I hadn’t even looked at yet.</p>

<p>The one that would’ve cost me the most time by hand showed up almost at the end, after I thought the hard part was over. I went back and sorted the imported posts into categories - had AI do that pass too, matching each post’s actual content - a purely cosmetic change, I assumed. It wasn’t. This site’s permalink scheme quietly uses category as a URL prefix, so the moment a post picked up a category, its actual address changed. That silently broke every internal link between old posts that I’d already gone through and carefully fixed earlier in the process - link text still looked right, the posts they pointed to still existed, just at a different address now. Nothing about it would throw an error or fail a build; it would just 404 for a reader clicking through, discovered later, if ever.</p>

<p>I don’t think I’d have finished this without AI, not realistically. Not because any individual step was hard, but because there were ninety-two posts and each one could fail in its own small way, and doing that kind of repetitive judgment call by hand, post after post, is exactly the sort of task I tend to abandon halfway. What made it work wasn’t handing the whole thing over and walking away, though. It was closer to pairing with something fast enough to do the tedious parts at scale, while I stayed in the loop to actually read the output and push back when something looked wrong. The moment I stopped doing that - even briefly - is exactly when a real bug slipped through.</p>

<p>All those old posts live locally now, and my About page can finally stop sending people to a subdomain I don’t control anymore. Best of all, I can look back now and see how my own writing has evolved since then.</p>

<h2 id="if-youre-considering-a-similar-migration">If You’re Considering a Similar Migration</h2>

<p>Mine was Blogger to a Jekyll site on GitHub, but none of this is really specific to that pair. The same shape of problem shows up moving WordPress to Medium, Medium to Ghost, or off any platform where you don’t fully control the export format. A few things I’d tell myself going in:</p>

<ul>
  <li><strong>Silent content loss is the real risk, not visible breakage.</strong> A clean build or a successful import tells you nothing about what got quietly dropped along the way. You have to actually read the output, post by post, not just trust that no errors means nothing’s missing.</li>
  <li><strong>Anything embedding a service you don’t control from the old era is gone for good.</strong> Flash players, defunct widgets, retired APIs. Budget time to remove that dead weight cleanly instead of chasing a fix that doesn’t exist.</li>
  <li><strong>Late structural changes can silently break things you already fixed.</strong> Adding categories, renaming a taxonomy, restructuring folders - any of it can change URLs out from under links you verified earlier. Re-check link integrity after every such change, not just once at the start.</li>
  <li><strong>Link to posts by reference, not by hardcoded URL, if your platform supports it.</strong> Jekyll’s <code class="language-plaintext highlighter-rouge">{% link %}</code> tag (most static site generators have an equivalent) resolves to a post’s actual current URL at build time, instead of one you typed once and hoped stays valid. I learned this after the fact, once the categories change above had already broken every internal link I’d hand-fixed earlier - switching those links to <code class="language-plaintext highlighter-rouge">{% link %}</code> afterward means they’ll survive the next structural change on their own.</li>
  <li><strong>Keep the original export around until you’re genuinely done.</strong> You’ll want to diff against it more than once, usually right when you’re convinced you’re finished.</li>
</ul>

<p>None of this needs to be done alone by hand, and it doesn’t need to be handed off blindly either. What worked for me was staying in the loop - reading the actual output, pushing back when something looked off - while letting the tedious, repetitive parts run at a pace no manual pass could match.</p>]]></content><author><name>Chethan</name></author><category term="meta" /><category term="migration" /><category term="blogger" /><category term="jekyll" /><category term="ai-assisted-development" /><category term="legacy-content" /><summary type="html"><![CDATA[Migrating 92 old Blogger posts into Jekyll with AI, and the quiet failures, dropped embeds and links found by reading it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-07-24-migrating-my-old-blog-posts-with-ai/featured-migration.webp" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-07-24-migrating-my-old-blog-posts-with-ai/featured-migration.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Validity Trap: Telecoms vs. Frugal Users</title><link href="https://staygeo.com/telecom/2026/07/17/the-validity-trap-telecoms-vs-frugal-users.html" rel="alternate" type="text/html" title="The Validity Trap: Telecoms vs. Frugal Users" /><published>2026-07-17T00:00:00+00:00</published><updated>2026-07-17T00:00:00+00:00</updated><id>https://staygeo.com/telecom/2026/07/17/the-validity-trap-telecoms-vs-frugal-users</id><content type="html" xml:base="https://staygeo.com/telecom/2026/07/17/the-validity-trap-telecoms-vs-frugal-users.html"><![CDATA[<p>Everyone shopping for a cheap mobile plan tells themselves the same thing: I do not need data, so why pay for it.</p>

<p>Except that premise is shakier than it sounds. “No data at all” is barely a real option in 2026 anyway. The moment you need to pay someone over UPI or open a banking app outside Wi-Fi range, zero data stops being a lifestyle choice and starts being a problem. Almost nobody actually gets to stay data-free; they just don’t know it yet when they go shopping for a plan.</p>

<p>But once you open your telecom operator’s app to recharge, and you’ll see dozens of plans. It looks like a marketplace. It isn’t. It’s a maze designed to funnel you toward exactly one outcome: the premium unlimited-data annual plan.</p>

<p>So you scroll down and find the answer that seems to be waiting for you: a cheap, voice-only annual plan. Jio offers one at ₹1,748 for 336 days. Airtel’s version is ₹2,249 for 365 days with a token 30GB thrown in for the whole year. It feels like a win. You’ve outsmarted the system.</p>

<p>You haven’t. You’ve just walked into the trap.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-07-17-the-validity-trap-telecoms-vs-frugal-users/featured-collage.png" alt="Bar chart comparing validity of Jio and Airtel prepaid plans: voice-only and premium annual plans reach 365 days, but data packs and modest daily-data plans max out at 30-84 days" loading="eager" />
  
    <figcaption>Priced for a little data, valid for almost none of the year</figcaption>
  
</figure>

<!--more-->

<h2 id="the-trap-a-validity-ceiling-with-no-exceptions">The Trap: A Validity Ceiling With No Exceptions</h2>
<p>Here’s the flaw neither operator advertises: every data add-on pack (1GB, 2GB, 15GB, doesn’t matter) is capped at a maximum validity of 30 days. There is no 90-day pack. No 180-day pack. No way to buy a chunk of data that lasts as long as your annual voice plan does.</p>

<p>This isn’t an oversight. It’s the entire mechanism.</p>

<p>And it has a paper trail. The cheap voice-only plan itself only exists because TRAI forced telcos to offer one: a mandate ordering every operator to sell at least one voice-and-SMS-only voucher, specifically to stop the practice of force-bundling data into every recharge. Telcos complied, technically, and then out-maneuvered the regulator in the same move: they stripped data out of the mandated plan and pushed users toward a separate, expensive data plan instead.</p>

<p>The 30-day cap on data packs came after that, and it wasn’t always there. Data add-ons used to inherit “plan validity”: buy a pack, and it ran for as long as your base plan did, voice or otherwise. Ever since the TRAI-mandated voice-and-SMS voucher forced the frugal plan into existence, operators have been quietly severing that inheritance and tightening the cap further, one data pack at a time. The industry hasn’t restored it; it has only closed more of the gaps. TRAI, for its part, is now pushing for round two (mandating voice-and-SMS-only plans at every validity slab), and telcos are fighting that too.</p>

<p>This isn’t even the first time regulators have had to fight operators over validity math. For years, the default “monthly” plan wasn’t 30 days: it was 28, quietly turning 12 recharges a year into 13. TRAI eventually stepped in and ordered every operator to offer at least one plan, one special tariff voucher, and one combo voucher with a genuine 30-day validity in each category. Operators complied, in the narrowest possible sense: the mandated 30-day option now sits in the app alongside a full menu of 28-day plans, and the 28-day plans remain the default most people still recharge into. Same regulator, same playbook, same result: comply with the letter, keep the workaround as the path of least resistance.</p>

<h2 id="the-math-frugal-costs-more">The Math: Frugal Costs More</h2>
<p>Jio. Take the ₹1,748 voice-only annual plan (336 days). Say you need a modest 15GB a month: nothing greedy, just enough to get by without Wi-Fi. That’s the ₹195/15GB pack. But it only lasts 30 days, so over 336 days you need to buy it roughly 11 times:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  ₹1,748  (voice-only annual plan)
+  ₹2,145  (11 × ₹195 data pack, re-bought every 30 days)
─────────────────────────────────────────────────────────
=  ₹3,893  to get through the year on "just enough" data
</code></pre></div></div>

<p>Jio’s premium annual plan with 2.5GB/day (vastly more data than you asked for) costs ₹3,599.</p>

<p>You paid ₹294 more to deliberately use less data, purely because the validity math was never designed to let you.</p>

<p>Airtel. Same story, different numbers. The ₹2,249/365-day voice plan bundles just 30GB for the entire year, nowhere close to 1GB a week. Burn through that (easy to do) and you’re topping up with data packs priced across the range: ₹161 for 12GB, ₹200 for 30GB, ₹361 for 50GB. It makes no difference which one you pick. Every single one caps out at 28 to 30 days validity. Buy the biggest pack Airtel sells and you still can’t make it stretch two months, let alone the rest of your annual voice plan. Try to cover a modest, consistent monthly need this way over 365 days and you sail straight past Airtel’s own premium annual plan at ₹3,599 for 2GB/day.</p>

<p><strong>Two competitors. Same structure. Same result. That’s not a coincidence. That’s an industry standard.</strong></p>

<p>And it isn’t only the emergency top-up packs that are boxed in. The “reasonable” daily-data plans are too. Jio sells a genuinely modest 1.5GB/day tier:</p>

<ul>
  <li>₹239 for 22 days</li>
  <li>₹299 or ₹329 for 28 days</li>
  <li>₹579 for 56 days</li>
  <li>₹889 for 84 days</li>
</ul>

<p>Four validity tiers, and not one of them goes past 84 days. Airtel’s equivalent 1.5GB/day tier (₹899 for 84 days) tops out the same way.</p>

<p>Here’s the part that looks like a discount and isn’t: the sticker price on the 84-day pack is lower than the annual plan’s, so it’s tempting to read this as the cheaper option. It isn’t. Rebuy the Jio 84-day pack enough times to cover a full year and you’re paying roughly ₹3,863, more than the ₹3,599 premium annual plan, for 1GB/day less data. Do the same math on Airtel and the modest plan runs about ₹3,906 a year against the same ₹3,599 flagship. The “reasonable” tier isn’t reasonably priced. It just isn’t priced for a year, so the comparison never gets made.</p>

<p>There is no annual version of the modest plan on either network. Want a fixed, sane daily quota that runs for a full year? That product doesn’t exist. You’re funneled to either the voice-only-plus-top-up treadmill or the 2GB+/day flagship, and both cost less per year than trying to stay modest.</p>

<h2 id="why-its-arpu-engineering">Why: It’s ARPU Engineering</h2>
<p>Telecom pricing teams don’t lose sleep over this. It’s a deliberate lever on ARPU (Average Revenue Per User), the single metric every quarterly earnings call obsesses over.</p>

<p>Picture the whole catalogue as a sandwich, and the strategy becomes obvious: the bread is there, the filling isn’t. On the bottom, there’s a barebones voice plan, cheap enough to look responsible, that functions as little more than a “keep-your-number-alive” holding pen. Use any real data on it and you’re punished immediately. On top sits a heavy daily-data plan, 1.5 to 2.5GB every single day, engineered to hand light users far more than they need at a price that guarantees healthy margins. In between, where a person who just wants some data reliably (without daily excess or monthly repurchase anxiety) would expect something to exist, there’s nothing. That gap isn’t an accident of product design. It’s the entire strategy. By making the à la carte, pay-for-what-you-use path administratively exhausting (track your usage, remember to recharge every 20-30 days, do it eleven separate times a year), operators bank on a simple behavioral outcome: consumers give up on optimizing and buy the expensive plan “for peace of mind.”</p>

<p>It is, genuinely, brilliant commercial engineering. It is also a calculated elimination of consumer choice, dressed up as a menu of options.</p>

<h2 id="what-actual-choice-would-look-like">What Actual Choice Would Look Like</h2>
<p>The fix is not complicated, which is exactly why its absence is telling. A data add-on whose validity simply matched the base plan’s remaining validity (buy 180GB once, use it across 180 days, at a fair per-GB rate) would let a genuine light user pay for what they use and nothing more.</p>

<p>Until regulators or competitive pressure force the issue, the lesson for consumers is blunt: in Indian telecom today, there is no such thing as a cheap plan for someone who uses “a little” data. There is only cheap-and-punished, or expensive-and-left-alone. The frugal middle has been engineered out of existence, and the receipt is right there in the math.</p>

<p><em>A note on scope: this piece looks only at Jio and Airtel, since together they set the market’s pricing playbook. Vi and BSNL aren’t covered here. BSNL in particular is worth a separate look, since it still undercuts on price.</em></p>]]></content><author><name>Chethan</name></author><category term="telecom" /><category term="telecom" /><category term="TRAI" /><category term="Jio" /><category term="Airtel" /><category term="prepaid-plans" /><category term="tariff" /><category term="consumer-rights" /><summary type="html"><![CDATA[Why Jio and Airtel's voice-only annual plans and 30-day-capped data add-ons cost frugal users more than the premium plan.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-07-17-the-validity-trap-telecoms-vs-frugal-users/featured-collage.png" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-07-17-the-validity-trap-telecoms-vs-frugal-users/featured-collage.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">US Stocks from India in 2026: GIFT City, IBKR, and the Traps In Between</title><link href="https://staygeo.com/finance/2026/06/20/us-stocks-from-india-in-2026-gift-city-ibkr-and-the-traps-in-between.html" rel="alternate" type="text/html" title="US Stocks from India in 2026: GIFT City, IBKR, and the Traps In Between" /><published>2026-06-20T00:00:00+00:00</published><updated>2026-06-20T00:00:00+00:00</updated><id>https://staygeo.com/finance/2026/06/20/us-stocks-from-india-in-2026-gift-city-ibkr-and-the-traps-in-between</id><content type="html" xml:base="https://staygeo.com/finance/2026/06/20/us-stocks-from-india-in-2026-gift-city-ibkr-and-the-traps-in-between.html"><![CDATA[<p>Investing in foreign, particularly US stocks has been in my radar ever since I started earning and got into stock market. Back in 2010s, the process to open a demat account was complicated, more so if it was with an international broker. On top of that, foreign equity investment was treated as debt back then and taxation was not favourable to investors - especially since long term meant holding for three years. I had posted a query in the AIFW Facebook group and I remember getting advice that for smaller ticket sizes foreign holdings won’t offer a huge income boost. With limited surplus in hand, I decided to stick to domestic investments and they have held up reasonably well so far.</p>

<p>However, international investing is something I always wanted to try and with the launch of GIFT City, I learnt that it’s going to be easier! I have been on a wait since then and the interest surged again with the news of Dhan launching US Stocks last week. Soon came the news of other brokers like Zerodha getting the approvals too. Since I don’t have an account with Dhan (I am a huge fan of what Pravin Jadhav aka P J has accomplished there in this short time frame) I started my research about should I wait for Zerodha (my current broker) to launch their offering or get a Dhan account.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-06-20-us-stocks-from-india-in-2026-gift-city-ibkr-and-the-traps-in-between/news-collage.png" alt="News headlines: Dhan launches US stocks via GIFT City on June 12, Zerodha and others get approval on June 16-17" loading="eager" />
  
    <figcaption>The headlines that kicked off my research</figcaption>
  
</figure>

<!--more-->

<p>While researching the charges, I realised there’s more to charges than just the brokerage. Most of us are used to zero brokerage in India from discount brokers and we know that percentage based charges eat into our returns. To an extent I was aware of Forex charges but there’s more to it. One cannot and must not ignore compliance and taxes when it comes to money and the devil lies in the details!</p>

<p>Here’s everything I pieced together, in the order I’d want someone to explain it to me.</p>

<h2 id="what-does-a-10000-monthly-investment-actually-cost">What Does a ₹10,000 Monthly Investment Actually Cost?</h2>

<p>The realistic cost for a ₹10,000 monthly investment sits closer to <strong>₹75 to ₹145 total</strong> per transaction through a broker like Dhan. Here’s the breakdown:</p>

<p><strong>Brokerage and regulatory charges (~₹30)</strong></p>
<ul>
  <li>Dhan brokerage (0.25%): ₹25.00</li>
  <li>IGST (18% on brokerage): ₹4.50</li>
  <li>IFSCA turnover fee (0.005%): ₹0.50</li>
  <li>SEC and FINRA fees: ₹0 on buy (these only apply when you sell — ~₹2.20 on a ₹10,000 sell)</li>
</ul>

<p><strong>Banking and Forex costs (variable)</strong></p>

<p>Dhan waives the platform fund-transfer fee for anything above $100, so there’s no fixed processing penalty. What remains is the <strong>forex markup</strong> on the INR-to-USD conversion. The exact spread isn’t a published flat number — it varies with market conditions and the partner bank. However, the actual number would be shown on the app before hitting confirm.</p>

<p><strong>The bottom line:</strong> brokerage and regulatory fees are a fixed ₹30 per buy. The forex conversion cost on top is the variable part. The ₹200–₹300 per transaction figures you’ll see quoted elsewhere apply to traditional retail bank SWIFT wire transfers, which carry flat fees of ₹500 to ₹1,000 per transaction on top of their own forex markup.</p>

<h2 id="lrs-and-tcs-the-money-leaving-india">LRS and TCS: The Money Leaving India</h2>

<p>Any money sent abroad for investment goes through the RBI’s <strong>Liberalised Remittance Scheme (LRS)</strong>, with a cap of <strong>USD 250,000 per person per financial year</strong>, covering travel, education, gifts, and investments combined.</p>

<p>Cross ₹10 lakh in total remittances in a year and <strong>20% TCS</strong> (tax collected at source) kicks in on the amount above that. Budget 2026 reduced TCS on education and medical to 2% but left investment remittances unchanged at 20%.</p>

<p>The 20% sounds alarming but it’s not a permanent cost — it’s an advance that gets adjusted against your annual tax liability when you file. If you’re owed more back than you owe in tax, it comes back as a refund. The only real pain is that your money is locked up with the government until you file.</p>

<p>Worth noting: <strong>GIFT City doesn’t exempt you from any of this.</strong> The route lowers trading friction and brokerage costs — it doesn’t change your LRS compliance obligations at all.</p>

<h2 id="dividends-and-form-67">Dividends and Form 67</h2>

<p>US dividends are withheld at source. The default for foreigners is 30%. File <strong>Form W-8BEN</strong> with your broker and the India-US treaty drops it to <strong>25%</strong>.</p>

<p>In India, you then declare the dividend income at your slab rate and claim a <strong>Foreign Tax Credit</strong> via <strong>Form 67</strong> to avoid double taxation. One catch: the credit is the lower of US tax paid and Indian tax due, with no carry-forward. So if your income slab is below 25%, the excess withheld is simply gone.</p>

<h2 id="capital-gains">Capital Gains</h2>

<p>The US doesn’t tax non-resident aliens on capital gains — good news. India does, based on holding period:</p>

<ul>
  <li><strong>More than 24 months:</strong> Long-term at a flat <strong>12.5%</strong>, no indexation</li>
  <li><strong>24 months or less:</strong> Short-term at your slab rate</li>
</ul>

<p>Holding foreign assets also means you must file <strong>ITR-2 or ITR-3</strong> — not ITR-1 or ITR-4.</p>

<p>There’s a subtlety here that trips people up: <strong>India calculates your gain in rupees, not dollars.</strong> Both your buy price and sell price get converted to INR at the exchange rate on the respective dates. So if the rupee depreciates significantly between when you bought and when you sold, you could have a taxable gain in India even if you broke even in dollar terms. The forex movement is baked into your cost basis.</p>

<h2 id="schedule-fa-the-declaration-you-cannot-skip">Schedule FA: The Declaration You Cannot Skip</h2>

<p>Every foreign holding — accounts, shares, RSUs, ETFs — must be declared in <strong>Schedule FA</strong> of your tax return. A few things worth knowing: it runs on a <strong>calendar year</strong> (January to December), not the Indian financial year. It’s required even if you earned nothing and sold nothing — it’s a disclosure obligation, not a tax trigger. And ignoring it isn’t a minor slip; it falls under the <strong>Black Money Act</strong> with penalties up to ₹10 lakh per year.</p>

<h2 id="the-estate-tax-trap">The Estate Tax Trap</h2>

<p>This one is genuinely alarming the first time you encounter it.</p>

<p>If you die holding US-situs assets (assets located or deemed to be located in the US) above <strong>USD 60,000</strong> (~₹56.59L at the time of writing), the US government levies an estate tax of up to <strong>40%</strong> on everything above that threshold before assets can be transferred to your legal heirs. US stocks are US-situs assets. US-domiciled ETFs like VOO, SPY, and QQQ are US-situs assets. The Indian broker makes no difference — the IRS looks at the underlying asset.</p>

<p>Two clean solutions exist:</p>

<ol>
  <li><strong>Irish-domiciled UCITS ETFs:</strong> Buy an Irish ETF (which is an Irish corporation that holds the underlying US stocks) instead of a US-listed ETF. You legally own shares in an <em>Irish</em> entity, which means the IRS cannot touch it for estate tax.</li>
  <li><strong>Indian feeder funds:</strong> You own fund units registered in India — not US shares directly — so the exposure is not US-situs and doesn’t even fall under LRS.</li>
</ol>

<h2 id="irish-domiciled-etfs-better-in-two-ways">Irish-Domiciled ETFs: Better in Two Ways</h2>

<p>Irish-domiciled ETFs solve two structural leakages that US-listed ETFs cannot:</p>

<p><strong>1. Estate tax:</strong> As explained above, the Irish domicile completely protects your family from US inheritance tax exposure.</p>

<p><strong>2. Dividend withholding tax:</strong> Ireland has a tax treaty with the US that reduces dividend withholding to <strong>15% at the fund level</strong>, versus the 30% a US-domiciled fund faces. More importantly, most Irish ETFs come in <strong>“Accumulating” versions</strong> (denoted as <em>Acc</em>). Instead of distributing dividends to your account — which creates an immediate tax event in your ITR — the fund automatically reinvests dividends directly into the NAV. Your money compounds tax-deferred until you actually sell.</p>

<p>Popular Irish-domiciled options tracking the S&amp;P 500 include <strong>CSPX</strong> and <strong>VUAA</strong>, both listed on the London Stock Exchange.</p>

<h2 id="but-no-irish-version-for-individual-stocks">But No Irish Version for Individual Stocks</h2>

<p>If you’re thinking about buying individual stocks like NVIDIA, Apple, or Tesla — there is no “Irish-domiciled” version of them. The Irish domicile advantage applies strictly to funds (ETFs and mutual funds).</p>

<p>When you buy a US stock directly, you are buying a direct US-situs asset. Everything discussed above applies fully:</p>

<ul>
  <li>The <strong>$60,000 estate tax threshold</strong> applies to your total direct US stock holdings.</li>
  <li><strong>Dividend withholding is 25%</strong> (with Form W-8BEN filed; 30% without), and every dividend is an immediate tax event — there’s no automatic reinvestment the way an accumulating ETF handles it.</li>
</ul>

<p>A common approach: use Irish-domiciled ETFs like CSPX for your index core (S&amp;P 500 / Nasdaq), and keep direct stock holdings (individual names like NVIDIA) comfortably below the $60,000 threshold so estate tax isn’t a concern.</p>

<h2 id="should-you-wait-for-zerodha-and-others-or-open-dhan-now">Should You Wait for Zerodha and others, or Open Dhan Now?</h2>

<p>Since I already use Zerodha for my domestic portfolio, this was the central question for me. Switching brokers for international stocks later is not a seamless process like transferring domestic shares.</p>

<p>There’s an interesting wrinkle here: both Dhan and Zerodha appear to be using <strong>ViewTrade</strong> as their US-side execution and custody partner. The Dhan AMA on Reddit confirmed that transfers out are possible, but the process and charges depend on which platform you’re moving to. If both platforms share the same underlying custodian, switching may be closer to an administrative re-registration than a full broker-to-broker transfer — but until Dhan publishes a formal transfer process, the exact friction is unconfirmed.</p>

<p>The option that’s clearly painful regardless is liquidating and re-depositing — selling on Dhan triggers a capital gains event on any profit, and you pay the forex conversion markup twice: once converting USD back to INR, and again converting INR back to USD on Zerodha.</p>

<p><strong>The practical conclusion:</strong> If you want to start today, the shared ViewTrade layer makes Dhan a less permanent commitment than it first appears — though until the transfer process is documented, that’s not confirmed. If you’d rather wait a couple of months, Zerodha’s launch may also bring the possibility of routing into Irish UCITS ETFs, which would let you build a tax-optimised structure from day one. That might also unlock some price competition.</p>

<h2 id="what-happens-if-something-goes-wrong">What Happens If Something Goes Wrong?</h2>

<p>This is the question most people don’t ask until they need the answer.</p>

<p>One thing that came up in a Dhan AMA was the regulatory layer behind GIFT City — and it’s worth understanding before you pick any platform. A common assumption is that SEBI oversees this. It doesn’t. GIFT City / IFSC is governed by <strong>IFSCA</strong> (International Financial Services Centres Authority), a separate Indian statutory regulator. Different from SEBI, but still very much an Indian regulator with Indian grievance redressal mechanisms you can actually reach.</p>

<p>Compare that to the older route that apps like INDmoney or Vested use. There, your brokerage relationship sits directly with a US broker-dealer under SEC and FINRA jurisdiction. SIPC protection exists at the US end, which is a genuine safeguard — but if a dispute arises, your recourse is with American regulators. Practically speaking, that’s a difficult conversation to have from India.</p>

<p>The GIFT City route flips that dynamic. Dhan’s IFSC subsidiary (Raise IFSC, an India INX member) sits as an India-regulated entity between you and the US infrastructure. The US-end safeguards don’t disappear — ViewTrade on the execution and custody side is SEC-registered and FINRA/SIPC covered — but you now have an Indian regulatory wrapper on top, with dispute redressal you can pursue locally.</p>

<p>On the GIFT City route you own real shares, not receipts or synthetic instruments. An actual fractional US share is purchased in your name when you buy. Your P&amp;L is the stock moving, not a contract tracking it.</p>

<p>A natural follow-up question is what happens if Dhan itself shuts down. The answer from their own AMA: <strong>client assets are held segregated from the broker’s own assets.</strong> Your shares are not Dhan’s property and not ViewTrade’s property - they are yours. They cannot be used to pay anyone’s creditors and do not disappear if the company winds down. The custody structure (Raise IFSC as broker, ViewTrade as custodian, you as beneficial owner) means the shares exist independently of Dhan’s fate as a business.</p>

<h2 id="what-about-interactive-brokers-ibkr">What About Interactive Brokers (IBKR)?</h2>

<p>IBKR is considered the gold standard for serious long-term global investors. It gives you direct access to the London Stock Exchange and European exchanges, meaning you can freely buy accumulating Irish UCITS ETFs like CSPX or VUAA. It also offers genuine interbank forex rates with a small transparent conversion fee, versus the variable markup embedded in rates from retail brokers, and institutional-grade flat-rate commissions.</p>

<p>One thing worth clarifying first: IBKR does have a SEBI-regulated Indian entity, but that entity is specifically for trading on the NSE. Buying US stocks or Irish ETFs goes through the <strong>international account</strong>, which sits under US regulation (SEC/FINRA/SIPC) with no Indian regulatory wrapper — and needs to be funded via international wire transfer.</p>

<p>That’s where the catch lies. Most major Indian banks — HDFC, ICICI, SBI — charge ₹500 to ₹1,000 as a flat outward remittance fee, plus their forex markup, plus there’s often a correspondent bank fee deducted on the US side before funds reach IBKR. On a ₹10,000 monthly investment, that’s a significant chunk gone before a single share is bought.</p>

<p>The math improves considerably if you pick your bank carefully. If you’re serious about IBKR, it’s worth checking current rates with your specific bank, or considering whether opening a separate account at a low-fee remittance bank makes sense for the purpose. There is also scope for negotiation here - get in touch with your dedicated relationship manager.</p>

<p>What makes IBKR worth the effort for the right investor is <strong>asset access</strong>. The international account opens up the London Stock Exchange and European exchanges, meaning you can buy accumulating Irish UCITS ETFs like CSPX or VUAA directly — the estate-tax-safe, dividend-reinvesting structure the GIFT City route doesn’t currently offer. For building a large, long-term index portfolio with that tax efficiency, IBKR with a low-cost remittance bank is a serious option.</p>

<p>For a ₹10,000 monthly SIP using a standard bank, the GIFT City route still wins on pure friction.</p>

<p><em>Disclaimer: None of this is financial or tax advice. Please do your own research and consult a professional for your specific situation.</em></p>]]></content><author><name>Chethan</name></author><category term="finance" /><category term="investing" /><category term="US-stocks" /><category term="GIFT-City" /><category term="Zerodha" /><category term="Dhan" /><category term="LRS" /><category term="tax" /><category term="ETF" /><category term="IBKR" /><summary type="html"><![CDATA[What US stock investing from India costs in 2026: GIFT City brokers, LRS/TCS, dividend withholding, and the estate tax trap.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-06-20-us-stocks-from-india-in-2026-gift-city-ibkr-and-the-traps-in-between/news-collage.png" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-06-20-us-stocks-from-india-in-2026-gift-city-ibkr-and-the-traps-in-between/news-collage.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What two months between jobs looked like</title><link href="https://staygeo.com/reflections/2026/05/24/what-two-months-between-jobs-looked-like.html" rel="alternate" type="text/html" title="What two months between jobs looked like" /><published>2026-05-24T00:00:00+00:00</published><updated>2026-05-24T00:00:00+00:00</updated><id>https://staygeo.com/reflections/2026/05/24/what-two-months-between-jobs-looked-like</id><content type="html" xml:base="https://staygeo.com/reflections/2026/05/24/what-two-months-between-jobs-looked-like.html"><![CDATA[<p>When I signed off from my first job after college on February 27, 2026, after 14 years and 7 months, I was not prepared to be without an offer. The expectation had been a smooth transition to a new role over a single weekend. However, it became evident during my final few days that the ride might not be smooth, and I had to prepare for a break of at least a few weeks. As a positive-minded person, I calmed myself down by recognizing that a break like this might never come again, and I should make the absolute most of it.</p>

<p>The following week, I sent back my trusted work laptop, a Dell Precision 5560, and switched to my old reliable workhorse: a Dell Optiplex 990 running Ubuntu 24.04. This machine would become my primary companion for learning, tinkering, and job searching.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-05-24-what-two-months-between-jobs-looked-like/20260425_163424.jpg" alt="At Bridgestone Event" loading="eager" />
  
    <figcaption>At Bridgestone Event</figcaption>
  
</figure>

<p>I was clear about one rule: I would not deviate from my daily routine. I set up a dedicated <strong>Growth Spreadsheet</strong> to track my progress on a daily basis - not just in terms of job applications, but focusing heavily on my daily learning, milestones, and technical exploration. I had read about the psychological benefits of documenting every single step, no matter how small, and decided to apply it here. Looking back, I feel incredibly proud of how I spent those weeks. Keeping that ledger helped me maintain the right growth mindset when things felt stagnant.</p>

<p>What started as a simple reset between roles slowly became a volatile mix of experimentation, reflection, physical repairs, interviews, travel, and deep dives into the rapidly evolving AI ecosystem.</p>

<!--more-->

<h2 id="the-plan-learning-ai-and-architecture">The Plan: Learning, AI, and Architecture</h2>

<p>I updated my resume to focus on Solution Architect positions, refreshed my profiles across job portals, and prepared to navigate the open market. I didn’t even own a standalone webcam to face video interviews, but given how powerful smartphone cameras are these days, I started running <em>Iriun Webcam</em> software to make do with what I had.</p>

<p>Let’s talk about the part of a career break that people rarely write about on LinkedIn: <strong>the mental toll of the job hunt.</strong> Going from a 14-year stable tenure directly into the open market is a jarring experience. There are also the quiet, pragmatic realities to face, like logging into investment accounts to pause my monthly SIPs to conserve cash flow while the timeline for a new role remains completely open-ended. Not every day felt productive.</p>

<p>During this period, I went through multiple rounds of rewriting and refining my resume, carefully shaping it to reflect the true scale of my responsibilities and convey my impact as clearly as possible. Once satisfied, I converted it to the clean, developer-centric <em>Jake’s Format</em>, integrated it directly into my website at <a href="/resume/">staygeo.com/resume/</a>, and flipped my LinkedIn status to #OpenToWork. Then came the loop.</p>

<p>There were interviews that went well, and assignments that flopped badly. I submitted a comprehensive Terraform-based assignment for a European recruiter, but then took another raw, remote Terraform assignment for a different role. This one was to be done completely blind: <strong>zero Google searches, zero documentation access, and zero AI assistance.</strong></p>

<p>My performance flopped as expected. It was an incredibly grounding, brilliant reminder of how much modern engineering relies on immediate documentation retrieval and continuous context rather than rote syntax memorization.</p>

<p>The rejections stung more than expected. There was the distinct sting of being ghosted after final rounds, and days where interviewers used my early academic background in Civil Engineering / Remote Sensing &amp; GIS as a convenient excuse to defer technical discussions - completely discounting my subsequent 14 years of hardcore platform and infrastructure experience. Combined with the brutal summer heat wave and minor dehydration, there were days where I simply felt low, uncertain, or completely exhausted.</p>

<p>But during those weeks, community came through. Friends offered referrals, and I found a strange comfort reading Reddit threads of other tech professionals who deliberately took extended gaps between roles to recalibrate, rest, and protect their clarity of thought.</p>

<p>Eventually, the engineering brain’s refusal to turn off pulled my curiosity entirely elsewhere.</p>

<h2 id="the-local-ai-stack--project-kore">The Local AI Stack &amp; Project Kore</h2>

<p>One rabbit hole led to another. I started exploring the mechanics of local AI tooling: Ollama, local models, AI CLIs, and privacy-first setups. Somewhere in the middle of this local environment setup, I decided I wanted to build something tangible. <strong>Project Kore</strong> was born.</p>

<p>The objective was straightforward: build a highly private, local-first personal finance and investment tracker. The immediate bottleneck was data ingestion. Mutual fund and stock data usually come locked inside Consolidated Account Statements (CAS) in PDF format. I spent days figuring out how to parse these financial statements reliably using Python, and quickly realized that PDF parsing is anything but straightforward.</p>

<p>I initially started out utilizing <code class="language-plaintext highlighter-rouge">pdfplumber</code>, but formatting shifts and multi-column spacing issues were incredibly finicky. I ended up switching over to <code class="language-plaintext highlighter-rouge">PyMuPDF</code> to gain better structural control over the layout. Though I came across a few purpose-built parsing tools and APIs like <em>casparser.in</em>, my primary concern remained absolute data privacy - how do you leverage powerful AI capabilities to categorize financial expenses without leaking personally identifiable information (PII) to public cloud endpoints?</p>

<p>I installed OpenCode, downloaded a quantized Qwen model, and attempted to develop the parser script completely offline. The reality check was stark: local model performance on my existing consumer hardware was quite poor.</p>

<p>To get the intelligence I needed without compromising data containment, I began exploring the Gemini CLI alongside local sandboxing techniques. This forced me down a deep rabbit hole of studying modern AI-native workflows: exploring Claude’s documentation extensively, understanding Model Context Protocol (MCP), subagents, hooks, skills, and infrastructure sandboxing. If I was going to navigate the modern engineering landscape effectively, I needed to learn the right design patterns to become “AI+” - an engineer who seamlessly architects solutions around these intelligence platforms.</p>

<p>Fiddling with local inference naturally makes you look closely at the economics of compute hardware, and I quickly realized why the industry is currently so obsessed with GPUs. At one point, I was researching MacBooks, ThinkPads, and local AI rigs costing upwards of ₹1.3L just to get decent VRAM context. As a budget-friendly compromise for a dedicated desktop GPU, Gemini recommended looking at an RTX 3050 (hovering around ₹22k). Ultimately, I postponed the heavy hardware acquisition for other priorities.</p>

<h2 id="domestic-devops-the-physical-layer">Domestic DevOps: The Physical Layer</h2>

<p>The break also gave me an excellent opportunity to tinker with physical hardware around the house which I would have otherwise postponed indefinitely.</p>

<p>After spending years looking at digital metrics and virtual dashboards, there is an immense sense of satisfaction in diagnosing a tangible, physical fault. One morning, I noticed slight melting on the power plug of our submersible water pump. While replacing the plug, I traced the wiring issue further back into the control box and discovered that the internal terminal strip was highly degraded, creating dangerous high resistance. I replaced the entire terminal block, rewired the connections safely, and documented the fix <a href="/projects/2026/03/31/pump-control-repair.html">here</a>.</p>

<p>Next came tackling home maintenance by replacing old roofing sheets and rain gutters - hired Professionals for the job. Later, while cutting through metal scrap with an angle grinder, I accidentally shattered a cutting disc mid-spin. It was a sobering, immediate reminder of the physical hazards of DIY work. Thankfully, with God’s grace no injury occurred.</p>

<figure class="post-figure center">
  <img src="/assets/images/2026-05-24-what-two-months-between-jobs-looked-like/20260420_114836.jpg" alt="Metal rain gutters" loading="lazy" />
  
    <figcaption>Metal rain gutters</figcaption>
  
</figure>

<figure class="post-figure center">
  <img src="/assets/images/2026-05-24-what-two-months-between-jobs-looked-like/20260421_153235.jpg" alt="Shattered cutting disc" loading="lazy" />
  
    <figcaption>Cutting disc shattered mid-spin</figcaption>
  
</figure>

<h2 id="the-intellectual-side-quests">The Intellectual Side-Quests</h2>

<p>With no sprint goals or work items dictating my daily focus, I collected a series of disparate, fascinating intellectual coordinates across Cloud Architecture, System Design, Personal Finance, and GST setup and compliance.</p>

<p>I also got to do things I would normally postpone while working full-time:</p>
<ul>
  <li>Addressed 10th Standard students at Jaycees on the topic of self-confidence and self-belief. <a href="/reflections/2026/03/13/self-confidence.html">Post</a></li>
  <li>Fine-tuned my personal blog’s stylesheets to give it a clean, professional appearance.</li>
  <li>Cleared out years of old, saved bookmarks accumulated on Twitter/X.</li>
  <li>Dismantled a set of broken Creative desktop speakers just to extract the raw magnets for future benchmarking projects.</li>
</ul>

<h2 id="a-scenic-intermission-pune">A Scenic Intermission: Pune</h2>

<p>Right in the middle of the job-hunting stress, a major highlight arrived: I was accepted for the Team-BHP Bridgestone Plant Visit in Pune.</p>

<p>I booked my flights, packed my backpack and spent an incredible day observing industrial manufacturing and automation at scale. Beyond the factory floor, it gave me a brilliant opportunity to travel, clear my head, and meet fantastic people I had previously only known online. My write-up on <a href="https://www.team-bhp.com/forum/indian-car-scene/307354-bridgestone-india-factory-tour-team-bhpians-saturday-25th-april-chakan-5.html#post6126376">Team-BHP</a></p>

<p>Of course, the universe always has a way of balancing things out. Immediately after landing back home, feeling completely refreshed from a flawless trip, I managed to lock my keys directly inside the boot of my Tata Punch. How I managed to get it unlocked is a story for another day!</p>

<h2 id="the-turnaround--next-deployment">The Turnaround &amp; Next Deployment</h2>

<p>The tech market is wildly unpredictable. It feels like absolutely nothing is happening for weeks, and then everything happens concurrently in a single 48-hour cycle.</p>

<p>On the afternoon of April 27, exactly two months to the day after my sign-off, LinkedIn notified me about a message from Kranthi. 20 minutes later, we were on a introductory phone call. Five hours after that, I found myself in a deep interview with the company’s CEO, Dr. Renuka.</p>

<p>We had a great conversation around the complex technical and process challenges faced by modern engineering organizations. The alignment was clear. Two days later, I received an official offer letter from SIENT Technologies. The break officially had an end date.</p>

<h2 id="final-reflections-uninterrupted-curiosity">Final Reflections: Uninterrupted Curiosity</h2>

<p>Oddly enough, those low days, quiet intervals, and chaotic side-quests were incredibly useful. The break gave me something I had not realized I was missing for years: <strong>uninterrupted curiosity.</strong></p>

<ul>
  <li>No sprint boards.</li>
  <li>No production escalations.</li>
  <li>No constant context switching.</li>
</ul>

<p>Just true, uninterrupted time to think, explore, build, read, repair, write, and recalibrate.</p>

<p>I entered the break with lot of uncertainty but I now look back and realize that I was quietly, intentionally preparing for the next phase of it.</p>]]></content><author><name>Chethan</name></author><category term="reflections" /><category term="reflections" /><category term="growth" /><category term="learning" /><category term="career-break" /><summary type="html"><![CDATA[A day by day account of two months between jobs: a growth spreadsheet, a local AI finance tracker, and a new offer.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://staygeo.com/assets/images/2026-05-24-what-two-months-between-jobs-looked-like/20260425_163424.jpg" /><media:content medium="image" url="https://staygeo.com/assets/images/2026-05-24-what-two-months-between-jobs-looked-like/20260425_163424.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>