📖 The Global Indian Investor

Learn how to build a globally diversified portfolio from India. 8 of 12 chapters are live, covering LRS, FX, global indexes, Irish ETFs, and selecting a broker.


1 Portfolio — Snapshot

This report uses prices as on end of August 28.

Portfolio StrategyGlobal Multi-Asset Passive Investing using
Indian Mutual Funds & Irish ETFs
Equity AllocationTarget (2026-27)
85.00%
(unchanged)
Current
82.77%
83.05%
India
43.30%
44.39%
US
39.47%
38.66%
1 PortfolioXIRR
18.76%
19.00%
Drift
2.24%
1.94%
New Investment
2.02%
1.61%
Rebalancing MethodPerpetual Rebalancing

Portfolio XIRR eased further from 19.00% to 18.76%, tracking a softer month for the Nasdaq 100 (34.51% → 33.72%). Nifty 50 XIRR decreased (5.39% → 4.10%) and remains the primary laggard. Gold remains the standout, its XIRR rising to 38.22% and its growth-share jumping to 23.75% (from 21.69%) — the biggest capital-efficiency multiple in the portfolio.

1 Portfolio — Performance & Drift

Following is the state of the 1 Portfolio, before this month’s investment. Data is compared to the previous State of the 1 Portfolio (August 2026) report, which was likewise published pre-investment — so this is a like-for-like comparison.

Asset ClassAgeXIRRGrowth ShareCurrent Allocation
(Aug 28 EOD)
Target Allocation
(for TY 2026-27)
Drift
Nasdaq 1004y 2m33.72%
34.51%
55.02%
55.33%
39.47%
38.66%
40.00%-0.53%
-1.34%
Nifty 504y 2m4.10%
5.39%
5.46%
7.17%
19.18%
19.95%
20.00%-0.82%
-0.05%
Next 501y 2m27.26%
32.45%
4.60%
4.87%
9.61%
9.87%
10.00%-0.39%
-0.13%
Midcap 1501y 2m24.79%
26.25%
4.29%
4.06%
9.72%
9.71%
10.00%-0.28%
-0.29%
Smallcap 2501y 2m42.61%
47.08%
3.27%
3.20%
4.79%
4.86%
5.00%-0.21%
-0.14%
Debt4y 2m7.61%
7.79%
3.61%
3.68%
5.78%
5.91%
5.00%+0.78%
+0.91%
Gold4y 2m38.22%
36.02%
23.75%
21.69%
11.46%
11.04%
10.00%+1.46%
+1.04%
Total18.76%
19.00%
100.00%100.00%100.00%+2.24%
+1.94%

Definitions

  • Asset Class: Underlying asset class within the 1 Portfolio.
  • XIRR: Annualized return generated by investments in the asset class.
  • Growth Share: Percentage of total portfolio gains contributed by the asset class.
  • Current Allocation: Current percentage of portfolio market value allocated to the asset class.
  • Target Allocation: Desired long-term allocation for the asset class.
  • Drift: Difference between current allocation and target allocation (positive = overweight, negative = underweight).
  • Total Drift: Calculated as the sum of positive deviations from target allocations. A higher drift indicates the portfolio is further away from its target allocation. Conceptually, it represents the minimum percentage of portfolio value that would need to be shifted between asset classes to reach the target allocation precisely (ignoring taxes, transaction costs, and other practical constraints).
  • Capital-Efficiency Multiple: Growth Share ÷ Current Allocation. A ratio above 1 means the asset is contributing more to portfolio growth than its size alone would suggest.
{
  "title": [
    { "text": "1 Portfolio Performance", "left": "center", "top": 0, "textStyle": { "color": "#2c3e50", "fontSize": 16, "fontWeight": 600 } },
    { "text": "Market Value", "left": "center", "top": "37%", "textStyle": { "fontSize": 15, "fontWeight": 600, "color": "#444" } },
    { "text": "Growth Share", "left": "center", "top": "57%", "textStyle": { "fontSize": 15, "fontWeight": 600, "color": "#444" } }
  ],
  "tooltip": { "trigger": "item" },
  "color": ["#2563EB", "#F97316", "#F59E0B", "#10B981", "#047857", "#64748B", "#D4AF37"],
  "legend": {
    "bottom": 0, "left": "center", "orient": "horizontal",
    "data": ["Nasdaq 100", "Nifty 50", "Next 50", "Midcap 150", "Smallcap 250", "Debt", "Gold"]
  },
  "series": [
    {
      "name": "Growth Contribution",
      "type": "pie",
      "radius": ["36%", "58%"],
      "center": ["50%", "52%"],
      "startAngle": 180,
      "clockwise": false,
      "label": { "show": true, "position": "outside", "formatter": "{b} ({c}%)" },
      "data": [
        { "name": "Nasdaq 100", "value": 55.02 },
        { "name": "Nifty 50", "value": 5.46 },
        { "name": "Next 50", "value": 4.60 },
        { "name": "Midcap 150", "value": 4.29 },
        { "name": "Smallcap 250", "value": 3.27 },
        { "name": "Debt", "value": 3.61 },
        { "name": "Gold", "value": 23.75 },
        { "name": "__placeholder__", "value": 99.99, "itemStyle": { "color": "transparent" }, "label": { "show": false }, "tooltip": { "show": false }, "labelLine": { "show": false } }
      ]
    },
    {
      "name": "Market Value Allocation",
      "type": "pie",
      "radius": ["36%", "58%"],
      "center": ["50%", "48%"],
      "startAngle": 180,
      "clockwise": true,
      "label": { "show": true, "position": "outside", "formatter": "{b} ({c}%)" },
      "data": [
        { "name": "Nasdaq 100", "value": 39.47 },
        { "name": "Nifty 50", "value": 19.18 },
        { "name": "Next 50", "value": 9.61 },
        { "name": "Midcap 150", "value": 9.72 },
        { "name": "Smallcap 250", "value": 4.79 },
        { "name": "Debt", "value": 5.78 },
        { "name": "Gold", "value": 11.46 },
        { "name": "__placeholder__", "value": 100.00, "itemStyle": { "color": "transparent" }, "label": { "show": false }, "tooltip": { "show": false }, "labelLine": { "show": false } }
      ]
    }
  ],
"toolbox": {
  "show": true,
  "feature": {
    "saveAsImage": {
      "title": "Download Chart",
      "show": true
    }
  }
}
}
{
  "title": { "text": "1 Portfolio Drift", "left": "center", "top": 0, "textStyle": { "color": "#2c3e50", "fontSize": 16, "fontWeight": 600 } },
  "tooltip": { "trigger": "axis", "axisPointer": { "type": "shadow" } },
  "grid": { "left": "15%", "right": "15%", "bottom": "10%", "top": "16%", "containLabel": true },
  "xAxis": { "type": "value", "name": "Drift %", "nameLocation": "middle", "nameGap": 30 },
  "yAxis": { "type": "category", "data": ["Gold", "Debt", "Smallcap 250", "Midcap 150", "Next 50", "Nifty 50", "Nasdaq 100"] },
  "series": [
    {
      "name": "Drift",
      "type": "bar",
      "label": { "show": true, "formatter": "{c}%" },
      "data": [
        { "value": 1.46, "itemStyle": { "color": "#D4AF37" }, "label": { "position": "left" } },
        { "value": 0.78, "itemStyle": { "color": "#64748B" }, "label": { "position": "left" } },
        { "value": -0.21, "itemStyle": { "color": "#047857" }, "label": { "position": "right" } },
        { "value": -0.28, "itemStyle": { "color": "#10B981" }, "label": { "position": "right" } },
        { "value": -0.39, "itemStyle": { "color": "#F59E0B" }, "label": { "position": "right" } },
        { "value": -0.82, "itemStyle": { "color": "#F97316" }, "label": { "position": "right" } },
        { "value": -0.53, "itemStyle": { "color": "#2563EB" }, "label": { "position": "right" } }
      ]
    }
  ],
"toolbox": {
  "show": true,
  "feature": {
    "saveAsImage": {
      "title": "Download Chart",
      "show": true
    }
  }
}
}

Performance & Drift Observations

  • Nasdaq 100 Recovers: After a heavy 85% allocation top-up last month, Nasdaq 100’s drift improved substantially from -1.34% to -0.53%. Its XIRR eased slightly (34.51% → 33.72%), but the capital injection last month successfully bridged most of its underweight gap.
  • Gold Continues to Shine: Gold’s XIRR rose further to 38.22% (from 36.02%) and its growth-share contribution jumped to 23.75% (from 21.69%) — remaining the most capital-efficient asset in the portfolio. Its drift widened further into overweight territory, from +1.04% to +1.46%.
  • Domestic Equity Broadly Weakened: Nifty 50, Next 50, and Midcap 150 all saw their XIRR decline. Nifty 50’s drift, in particular, widened significantly from -0.05% to -0.82%, making it the most underweight asset class this month.
  • Total Drift Rose: Total portfolio drift increased from 1.94% to 2.24%, driven primarily by the widening drift in domestic equities and Gold’s continued outperformance pushing it further overweight.

In a global multi asset portfolio, performance leadership rotates continuously. The objective is not to predict the next winner, but to systematically direct new capital toward assets that have become underweight relative to their target allocation.

Drift Correction aka Monthly Investment

The table below consolidates the pre-investment state (Aug 28 EOD prices), the monthly investment allocation, and the planned post-investment state:

Asset ClassCurrentPre DriftNew InvestPost InvestPost DriftTarget
Nasdaq 10039.47%-0.53%46.25%39.60%-0.40%40.00%
Nifty 5019.18%-0.82%40.53%19.60%-0.40%20.00%
Next 509.61%-0.39%9.30%9.60%-0.40%10.00%
Midcap 1509.72%-0.28%3.92%9.60%-0.40%10.00%
Smallcap 2504.79%-0.21%0.00%4.70%-0.30%5.00%
Debt5.78%+0.78%0.00%5.66%+0.66%5.00%
Gold11.46%+1.46%0.00%11.24%+1.24%10.00%
Total100.00%2.24%100.00%100.00%1.90%100.00%

A new allocation of 2.02% of the pre-investment portfolio was planned to result in a drift correction of 0.34% (from 2.24% to 1.90%).

Definitions

  • Asset Class: Underlying asset class part of the 1 Portfolio
  • Current: Portfolio allocation before new investment (as of Aug 28 EOD)
  • Pre Drift: Deviation from target at plan time (sum of positive values = total drift)
  • New Invest: Percentage of this month’s investment directed to each asset class
  • Post Invest: Estimated allocation after the investment
  • Post Drift: Estimated drift after investment
  • Target: Target allocation for the asset class
  • Total Drift: Drift is calculated as the sum of positive deviations from target allocations

This chart shows how this month’s new investment moves each asset’s drift closer to — or, for Debt and Gold, further from — its target line.

{
    "height": "700px",
    "title": { "text": "Drift Correction aka Monthly Investment", "left": "center" },
    "tooltip": { "trigger": "axis", "axisPointer": { "type": "shadow" } },
    "legend": {
        "data": ["Pre Drift", "Post Drift", "Improvement", "Improvement (Evaporated)", "Worsening", "New Water Level"],
        "bottom": 0
    },
    "toolbox": {
        "show": true,
        "feature": {
            "saveAsImage": {
                "title": "Download Chart",
                "show": true
            }
        }
    },
    "grid": { "left": "3%", "right": "4%", "bottom": "15%", "containLabel": true },
    "xAxis": {
        "type": "category",
        "data": ["Nasdaq 100", "Nifty 50", "Next 50", "Midcap 150", "Smallcap 250", "Debt", "Gold"],
        "axisLabel": { "interval": 0, "rotate": 30 }
    },
    "yAxis": {
        "type": "value",
        "name": "Drift (%)",
        "min": -1.5,
        "max": 1.5,
        "axisLabel": { "formatter": "{value}%" }
    },
    "series": [
        { "name": "Pre Drift", "type": "bar", "data": [], "itemStyle": { "color": "#3b82f6" } },
        { "name": "Post Drift", "type": "bar", "data": [], "itemStyle": { "color": "#1e40af" } },
        { "name": "Improvement", "type": "bar", "data": [], "itemStyle": { "color": "#22c55e" } },
        { "name": "Improvement (Evaporated)", "type": "bar", "data": [], "itemStyle": { "color": "#22c55e", "opacity": 0.4, "decal": { "symbol": "rect", "color": "rgba(0,0,0,0.2)", "dashArrayX": [1, 0], "dashArrayY": [2, 4], "rotation": 0.785 } } },
        { "name": "Worsening", "type": "bar", "data": [], "itemStyle": { "color": "#ef4444", "opacity": 0.4, "decal": { "symbol": "rect", "color": "rgba(0,0,0,0.2)", "dashArrayX": [1, 0], "dashArrayY": [2, 4], "rotation": 0.785 } } },
        {
            "name": "New Water Level",
            "type": "line",
            "data": [],
            "itemStyle": { "color": "#1e40af" },
            "lineStyle": { "type": "dashed", "color": "#1e40af", "width": 2 },
            "markLine": {
                "symbol": "none",
                "silent": true,
                "label": { "show": false },
                "lineStyle": { "type": "dashed", "color": "#1e40af", "width": 2 },
                "data": [
                    { "yAxis": -0.40 }
                ]
            }
        },
        {
            "name": "Empty",
            "type": "bar",
            "barWidth": "70%",
            "stack": "main",
            "data": [-0.40, -0.40, -0.39, -0.28, -0.21, 0, 0],
            "itemStyle": { "color": "transparent" },
            "tooltip": { "show": false }
        },
        {
            "name": "Neg Delta",
            "type": "bar",
            "barWidth": "70%",
            "stack": "main",
            "data": [
                { "value": -0.13, "itemStyle": { "color": "#22c55e" } },
                { "value": -0.42, "itemStyle": { "color": "#22c55e" } },
                { "value": -0.01, "itemStyle": { "color": "#ef4444", "opacity": 0.4, "decal": { "symbol": "rect", "color": "rgba(0,0,0,0.2)", "dashArrayX": [1, 0], "dashArrayY": [2, 4], "rotation": 0.785 } } },
                { "value": -0.12, "itemStyle": { "color": "#ef4444", "opacity": 0.4, "decal": { "symbol": "rect", "color": "rgba(0,0,0,0.2)", "dashArrayX": [1, 0], "dashArrayY": [2, 4], "rotation": 0.785 } } },
                { "value": -0.09, "itemStyle": { "color": "#ef4444", "opacity": 0.4, "decal": { "symbol": "rect", "color": "rgba(0,0,0,0.2)", "dashArrayX": [1, 0], "dashArrayY": [2, 4], "rotation": 0.785 } } },
                0, 0
            ],
            "tooltip": { "show": false }
        },
        {
            "name": "Neg Base",
            "type": "bar",
            "barWidth": "70%",
            "stack": "main",
            "data": [
                { "value": -0.97, "itemStyle": { "color": "#3b82f6" } },
                { "value": -0.68, "itemStyle": { "color": "#3b82f6" } },
                { "value": -1.10, "itemStyle": { "color": "#1e40af" } },
                { "value": -1.10, "itemStyle": { "color": "#1e40af" } },
                { "value": -1.20, "itemStyle": { "color": "#1e40af" } },
                { "value": -1.50, "itemStyle": { "color": "#1e40af" } },
                { "value": -1.50, "itemStyle": { "color": "#1e40af" } }
            ],
            "tooltip": { "show": false }
        },
        {
            "name": "Pos Base",
            "type": "bar",
            "barWidth": "70%",
            "stack": "main",
            "data": [
                0, 0, 0, 0, 0,
                { "value": 0.66, "itemStyle": { "color": "#1e40af" } },
                { "value": 1.24, "itemStyle": { "color": "#1e40af" } }
            ],
            "tooltip": { "show": false }
        },
        {
            "name": "Pos Delta",
            "type": "bar",
            "barWidth": "70%",
            "stack": "main",
            "data": [
                0, 0, 0, 0, 0,
                { "value": 0.12, "itemStyle": { "color": "#22c55e", "opacity": 0.4, "decal": { "symbol": "rect", "color": "rgba(0,0,0,0.2)", "dashArrayX": [1, 0], "dashArrayY": [2, 4], "rotation": 0.785 } } },
                { "value": 0.22, "itemStyle": { "color": "#22c55e", "opacity": 0.4, "decal": { "symbol": "rect", "color": "rgba(0,0,0,0.2)", "dashArrayX": [1, 0], "dashArrayY": [2, 4], "rotation": 0.785 } } }
            ],
            "tooltip": { "show": false }
        },
        {
            "name": "Pre Drift",
            "type": "line",
            "data": [-0.53, -0.82, -0.39, -0.28, -0.21, 0.78, 1.46],
            "itemStyle": { "color": "#3b82f6" },
            "lineStyle": { "opacity": 0 },
            "symbol": "none"
        },
        {
            "name": "Post Drift",
            "type": "line",
            "data": [-0.40, -0.40, -0.40, -0.40, -0.30, 0.66, 1.24],
            "itemStyle": { "color": "#1e40af" },
            "lineStyle": { "opacity": 0 },
            "symbol": "none"
        },
        {
            "name": "Improvement",
            "type": "line",
            "data": [0.13, 0.42, "-", "-", "-", 0.12, 0.22],
            "itemStyle": { "color": "#22c55e" },
            "lineStyle": { "opacity": 0 },
            "symbol": "none"
        },
        {
            "name": "Worsening",
            "type": "line",
            "data": ["-", "-", 0.01, 0.12, 0.09, "-", "-"],
            "itemStyle": { "color": "#ef4444" },
            "lineStyle": { "opacity": 0 },
            "symbol": "none"
        }
    ]
}

The new water level is computed using the Forward Water-Filling approach. Capital is distributed across underweight assets to raise their drift up to this line. This month, the allocation was sufficient to bring four of the five equity sleeves up to a unified water level (-0.40%), aligning their relative drift exactly.

  • Moving towards 0 is improvement and moving away from 0 is worsening.
  • Passive Dilution, for Debt and Gold, isn’t new capital correcting the overweight — it’s the natural dilution of their share as the rest of the portfolio grows, since they received zero new investment this cycle.
  • Post Drift = Pre Drift + Improvement for Nasdaq 100 and Nifty 50
  • Pre Drift = Post Drift + Passive Dilution for Debt and Gold
  • Pre Drift = Post Drift + Worsening for Next 50, Midcap 150 and Smallcap 250

Allocation Key Observations

It is deeply satisfying to see four out of the five equity assets perfectly leveled to a -0.40% drift. Smallcap is currently less underweight than this water level. With no fresh capital allocated to it, subsequent portfolio growth will gradually dilute its allocation, allowing its drift to widen and align with the rest over the next few cycles.

Nasdaq 100 & Nifty 50

Nasdaq 100 (46.25%) and Nifty 50 (40.53%) received the bulk of the new investment, as they were the most underweight asset classes. Even though they received similar absolute amounts of new capital, Nifty’s drift closed much faster; Nasdaq’s massive 40% target size consumes twice as much capital just to tread water as the portfolio grows. This brought their post-investment drift to the new water level of -0.40%.

Next 50 & Midcap 150

Next 50 (9.30%) and Midcap 150 (3.92%) received smaller allocations to keep them at the water level.

Smallcap 250

Receiving zero allocation this month, the drift for Smallcap 250 passively widened from -0.21% to -0.30% purely through portfolio dilution.

Thanks to the even-drift optimization (water-filling) approach I recently adopted, no fresh capital is being directed into Smallcap 250. It is intentionally being starved of new capital so that passive dilution can pull its drift down to the common -0.40% water level.

Debt & Gold

Debt and Gold received zero — both remain overweight. With no fresh capital directed to them, their share is gradually diluted as the portfolio grows: Debt’s drift eases from +0.78% to +0.66%, Gold’s from +1.46% to +1.24%.

I sometimes view Gold’s growing overweight as an informal signal of rising global uncertainty—though its performance is influenced by many factors beyond geopolitics, including real yields, currency movement, and central-bank buying.

Investment Stack

ToolRegionTypePurpose
MF CentralIndiaExecutionExecution of Buy/Sell for Indian Mutual Funds directly with KRA agencies (no third party).
CAMS OnlineIndiaReportingGenerating the combined reporting (CAS) which is imported into RealValue Portfolio.
Interactive Brokers (IBKR)InternationalExecution & ReportingExecution and data source for Irish ETF tracking.
Read The Global Indian Investor Chapter 6: What to Buy - Irish ETFs vs US ETFs
BHIM + ICICI BankInternationalExecutionSending money from Indian bank account to US broker account (INR to USD) in an efficient way using FX Retail and Bharat Connect Forex.
Read FX Retail via Bharat Connect - Private Bank Speed at Public Bank Rates (A Live Transaction Walkthrough)
RealValue FX EngineInternationalPlanning & TrackingComputing the USD that we can send based on the allocated INR.
RealValue PortfolioAllTrackingBrowser-only tool built for tracking goals and asset classes, and computing the portfolio’s XIRR. Your data stays with you! Supports importing data from Indian Mutual Funds & IBKR.
RealValue Family SIP AllocatorAllPlanningUsed for dynamic monthly investment planning and drift correction allocation.
Implements BUY Engine of The Perpetual Rebalancing Framework.

Reflections

What went well

  • Investment Day = Salary Day and Salary Day + 1: Planning took place on the morning of Aug 31. Domestic trades were executed that same day, followed by international execution on Sep 1. Although time constraints split the process across two days, the execution was smooth overall.
  • Form 122 Applied: Submitted Form 122 (previously Form 12BAA) to adjust TCS against salary TDS, and it was successfully applied by the payroll processing team. I had initially missed following up, but luckily remembered to do so just a few days before the payroll processing!

What I need to improve

  • Brokerage costs doubled compared to previous months, primarily due to how IBKR routes the order. While I’ve made peace with this for now, it’s worth investigating whether switching from EBS (SIX Swiss Exchange) to LSE-listed Nasdaq 100 ETFs could help minimize these fees in the future.
  • Cash Drag from EMI Miscalculation: I held cash in reserve anticipating the first EMI kickoff for the recent laptop purchase. However, because the EMI conversion and the actual first billing cycle don’t hit until the next cycle, I needlessly kept cash sitting idle in my bank account. Being new to using EMIs, I misjudged the timeline—a minor cashflow inefficiency I’ll know how to avoid next time.

FX remittance route debacle

Result: BHIM → Bharat Connect → FX Retail → ICICI → IBKR worked successfully.

Ideally, I would have completed the Nasdaq 100 investment on Aug 31. However, since last month’s investment was delayed by almost 13 days, I carefully weighed my options:

  1. ICICI via BHIM – Previously failed and locked funds in an 11-day lien.
  2. ICICI via Cred – Discovered my ICICI account wasn’t linked to Cred UPI.
  3. HDFC via BHIM – Similarly, this account wasn’t linked to BHIM UPI (and didn’t show up on Cred either).
  4. HDFC via FX Retail Web – This route incurs a higher markup, jumping from 20p/USD (via BHIM/Cred) to a negotiated rate of 50p/USD.
  5. Bank of Baroda – Carries a Foreign Bank Charge (FBC).

Hoping to execute on Aug 31, I moved funds to ICICI assuming I could use Option 2, but the market cutoff passed before I could proceed. The next day, when I tried to use it, I discovered the UPI linking issue. As a backup option, I then emailed HDFC to set limits for Option 4, but they required funds to be parked in the account first—a needless cash shuffle I prefer to avoid.

In the end, I flipped a coin and took a leap of faith on Option 1 (ICICI via BHIM). It worked flawlessly! The funds reached IBKR the same day, allowing me to complete the investment.

I am now concluding my FX optimization journey and settling on ICICI via BHIM. Thanks to last month’s debacle, I finally have the direct contact details of the escalation team who can resolve any future glitches. I get the best of all worlds: fast remittance (using the correct SWIFT fields), clean PDF documentation, and the convenience of routing all domestic and international investments via the same account.

Learning

  • TCS Deduction: It remains unclear whether PAN-level TCS tracking across different banks is handled by a centralized system or relies purely on manual customer declarations. When I switched banks this month, I was assured over the phone that my previous LRS remittance from another bank would be automatically adjusted. It wasn’t, resulting in ICICI under-deducting TCS for this cycle. I had to email them after the fact to manually deduct the differential 20% to keep my Form 26AS clean. In hindsight, it is better to proactively declare these things earlier—I should have declared this over email the moment the previous transaction was completed. This highlights yet another hidden benefit of settling on a single bank—it completely avoids cross-bank TCS sync failures.

Building in Public

New Content & Resources

TitleSummary
The Global Indian Investor - Chapter 8: Selecting the BrokerPublished Chapter 8 of my book, covering how to choose the right international broker for investing from India.
India is just 3% of the world market: Why I invest globally (Video)A companion video discussing why we should look beyond India for building wealth.

Software

GitHubDetails
Hugo ContinuumThe custom Hugo theme powering this website has now been properly extracted and published as a standalone open-source theme.
Sakthi Priyan H websiteAdded a Start Here page for new visitors, revamped the Building Wealth home page, and rolled out site-wide search. Also shipped initial support for Dark Mode (though some embedded images and tools still need first-class dark mode refinement).
XfinaParse financial statements entirely in your browser with Rust/Wasm. Fast, private, zero-setup, and without uploading your files to any server. Shipped as a Rust core to crates.io, npm, and PyPI, and also available as a CLI and an independent web interface.
Update: Added support for Axis Bank credit card statements.
XfinginePure computation engines for personal finance planning — inflation-adjusted EMI schedules and more. Shipped as a Rust core to crates.io, npm, and PyPI, it is designed to power both the existing sakthipriyan.com tools and the upcoming xsteer.in.
Note: Just starting on this project; not yet available for usage.
XsteerYour statements in. A month’s money to-do list out. An open-source, privacy-first cashflow planner built on Xfina & Xfingine to codify my complex, Google Sheets-based personal finance OS into a structured web application.
Note: Just starting on this project; not yet available for usage.

Transparency Note

This portfolio reflects my personal investment strategy and risk tolerance. It is not investment advice. All returns, allocations, and XIRR figures — including for international assets like Nasdaq 100 — are tracked and computed in INR, so currency movement is baked into the numbers rather than shown separately.