<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Ashwin's blog</title><id>https://www.ashwinmenon.com/</id><updated>2026-02-26T00:00:00Z</updated><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/"/><link rel="self" type="application/atom+xml" href="https://www.ashwinmenon.com/atom.xml"/><generator>Hugo</generator><entry><title>Everything takes more time than expected</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/technical/2026-02-26-every-thing-takes-more-time-than-expected/"/><id>https://www.ashwinmenon.com/posts/technical/2026-02-26-every-thing-takes-more-time-than-expected/</id><published>2026-02-26T00:00:00Z</published><updated>2026-02-26T00:00:00Z</updated><summary type="html">&lt;p&gt;A friend suggested that I allow users to login to hunchle.com without a password. This seemed fairly simple to implement, so I thought I&amp;rsquo;d give it a shot. I was allowing users to login with emails and passwords already, so removing a password was all that might be needed, right? And I had AI to help! Turns out, wrong! First, I had to streamline the new experience so that it worked for both existing users (who had passwords set) and new ones (who might never have a password). Adding this in meant I&amp;rsquo;d need a streamlined experience, so then I had to spend a few minutes researching how other websites did it. AI takes care of the coding, but needs a big helping hand with all of this. Taste is what I provide.&lt;/p&gt;</summary><content type="html">&lt;p&gt;A friend suggested that I allow users to login to hunchle.com without a password. This seemed fairly simple to implement, so I thought I&amp;rsquo;d give it a shot. I was allowing users to login with emails and passwords already, so removing a password was all that might be needed, right? And I had AI to help! Turns out, wrong! First, I had to streamline the new experience so that it worked for both existing users (who had passwords set) and new ones (who might never have a password). Adding this in meant I&amp;rsquo;d need a streamlined experience, so then I had to spend a few minutes researching how other websites did it. AI takes care of the coding, but needs a big helping hand with all of this. Taste is what I provide.&lt;/p&gt;
&lt;p&gt;Once that was done, I started getting errors.
Okay, look at logs: Ah, I&amp;rsquo;m hitting rate limits!
Ways around it? Pay up or use a custom SMTP provider.
Okay, look up custom SMTP providers that have a free tier. Find Resend.
This needs DNS records added. Okay, pull up my domain name provider&amp;rsquo;s website and add in the records.
Then wait for it to be picked up. It took 14 minutes to be picked up.&lt;/p&gt;
&lt;p&gt;Even with AI, none of this is seamless. Compared to before, &amp;ldquo;coding&amp;rdquo; (specifically, only the act of writing code) is easier, but testing takes up a significant amount of time now, erasing some gains. This is because the AI often writes code implementing something completely different to what you want. Earlier, this was never a concern since you were writing code yourself. I guess the future can be seamless, but at a minimum, it would require that I trust AI with most of my logins. This explains why users were creating separate GitHub accounts, GMails and whatnot for agents like OpenClaw to use. At some level, I wonder if all these are even necessary in an agentic world. Looking forward, an agent for website/app building should probably come with its own email ID, phone number and preset logins for 3P services (database, DNS records, deployment) to make it truly seamless.&lt;/p&gt;
&lt;p&gt;At the end of the day, something I thought would take 5-10 minutes to complete, finally took 3 hours (18-36x as long!). No wonder adding buffers to estimates rarely seems to work. You can tell someone I can do this in 3 days, but you can&amp;rsquo;t pad it by 18x&amp;hellip; How do we fix this? As of today, I think the best way is to highlight and understand that a very high-level of uncertainty exists 1) at the start of a project and 2) for large tasks. Simply don&amp;rsquo;t estimate those. Instead, understand deadlines, and cut scope as needed by the deadline on a regular cadence. For small tasks, estimate, while surfacing actual delivery time and updating your forecasts with what you learn. If your forecasts aren&amp;rsquo;t getting accurate over time, you might need to look deeper to understand why.&lt;/p&gt;</content></entry><entry><title>Miles vs Cash-back Calculator</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/curiosities/cash_points/"/><id>https://www.ashwinmenon.com/curiosities/cash_points/</id><published>2026-02-11T00:00:00Z</published><updated>2026-02-11T00:00:00Z</updated><summary type="html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Miles vs Cash-back Calculator&lt;/title&gt;
&lt;script src="https://cdn.plot.ly/plotly-2.35.2.min.js"&gt;&lt;/script&gt;
&lt;style&gt;
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; padding: 24px; max-width: 960px; margin: 0 auto; }
h1 { font-size: 1.4rem; margin-bottom: 20px; color: #e6edf3; }
.inputs { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-bottom: 24px; }
.inputs label { display: flex; flex-direction: column; gap: 4px; font-size: 0.82rem; color: #8b949e; }
.inputs input { background: #161b22; border: 1px solid #30363d; border-radius: 6px; padding: 8px 10px; color: #e6edf3; font-size: 0.9rem; }
.inputs input:focus { outline: none; border-color: #58a6ff; }
.wide { grid-column: 1 / -1; }
table { width: 100%; border-collapse: collapse; margin-bottom: 24px; font-size: 0.85rem; }
th, td { padding: 8px 12px; text-align: right; border-bottom: 1px solid #21262d; }
th { color: #8b949e; font-weight: 600; }
td:first-child, th:first-child { text-align: left; }
tr:hover td { background: #161b22; }
#chart { width: 100%; height: 450px; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Miles vs Cash-back Calculator&lt;/h1&gt;
&lt;div class="inputs"&gt;
&lt;label&gt;Miles per dollar
&lt;input type="number" id="milesPerDollar" value="3" step="0.5" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Cash-back rate (%)
&lt;input type="number" id="cashbackRate" value="2" step="0.5" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Investment return (%)
&lt;input type="number" id="investmentReturn" value="8" step="0.5" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Devaluation rate (%)
&lt;input type="number" id="devaluation" value="0.01" step="0.01" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Years
&lt;input type="number" id="years" value="10" step="1" min="1" max="50"&gt;
&lt;/label&gt;
&lt;label class="wide"&gt;Redemption rates — CPP (comma-separated)
&lt;input type="text" id="cppValues" value="1, 1.5, 1.6, 1.7, 1.8, 2, 4, 8"&gt;
&lt;/label&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;CPP&lt;/th&gt;&lt;th&gt;Devaluation&lt;/th&gt;&lt;th&gt;Initial Miles Value&lt;/th&gt;&lt;th&gt;Breakeven Year&lt;/th&gt;&lt;th&gt;Miles @ End&lt;/th&gt;&lt;th&gt;Cash @ End&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody id="tbody"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;div id="chart"&gt;&lt;/div&gt;
&lt;script&gt;
const $ = id =&gt; document.getElementById(id);
function recalc() {
const milesPerDollar = parseFloat($('milesPerDollar').value) || 0;
const cashbackRate = (parseFloat($('cashbackRate').value) || 0) / 100;
const investReturn = (parseFloat($('investmentReturn').value) || 0) / 100;
const dev = (parseFloat($('devaluation').value) || 0) / 100;
const maxYears = parseInt($('years').value) || 10;
const cppList = $('cppValues').value.split(',').map(s =&gt; parseFloat(s.trim()) / 100).filter(v =&gt; !isNaN(v) &amp;&amp; v &gt; 0);
const years = Array.from({length: maxYears + 1}, (_, i) =&gt; i);
const cashValues = years.map(y =&gt; cashbackRate * Math.pow(1 + investReturn, y));
const traces = [{
x: years, y: cashValues, name: `Cash (${(cashbackRate*100)}% @ ${(investReturn*100)}%)`,
mode: 'lines', line: {width: 3, dash: 'dash', color: '#3fb950'}
}];
const rows = [];
for (const cpp of cppList) {
const initVal = milesPerDollar * cpp;
const milesValues = years.map(y =&gt; initVal * Math.pow(1 - dev, y));
let breakeven = null;
for (let y = 0; y &lt; years.length; y++) {
if (cashValues[y] &gt; milesValues[y]) { breakeven = y; break; }
}
rows.push({
cpp: (cpp * 100).toFixed(2),
dev: (dev * 100).toFixed(2) + '%',
initVal: '$' + initVal.toFixed(4),
breakeven: breakeven !== null ? breakeven : '&gt;' + maxYears,
milesEnd: '$' + milesValues[maxYears].toFixed(4),
cashEnd: '$' + cashValues[maxYears].toFixed(4),
});
traces.push({
x: years, y: milesValues,
name: `${(cpp*100).toFixed(1)}¢ CPP`,
mode: 'lines+markers',
marker: {size: 4}
});
}
// Table
$('tbody').innerHTML = rows.map(r =&gt;
`&lt;tr&gt;&lt;td&gt;${r.cpp}¢&lt;/td&gt;&lt;td&gt;${r.dev}&lt;/td&gt;&lt;td&gt;${r.initVal}&lt;/td&gt;&lt;td&gt;${r.breakeven}&lt;/td&gt;&lt;td&gt;${r.milesEnd}&lt;/td&gt;&lt;td&gt;${r.cashEnd}&lt;/td&gt;&lt;/tr&gt;`
).join('');
// Chart
Plotly.newPlot('chart', traces, {
title: 'Value per $1 Spent: Miles vs Cash-back Invested',
paper_bgcolor: 'rgba(0,0,0,0)',
plot_bgcolor: 'rgba(0,0,0,0)',
font: {color: '#c9d1d9'},
margin: {l: 50, r: 20, t: 40, b: 50},
xaxis: {title: 'Years', gridcolor: '#21262d'},
yaxis: {title: 'Value ($)', gridcolor: '#21262d'},
legend: {orientation: 'h', y: -0.2},
}, {responsive: true});
}
document.querySelectorAll('.inputs input').forEach(el =&gt; el.addEventListener('input', recalc));
recalc();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</summary><content type="html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;Miles vs Cash-back Calculator&lt;/title&gt;
&lt;script src="https://cdn.plot.ly/plotly-2.35.2.min.js"&gt;&lt;/script&gt;
&lt;style&gt;
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; padding: 24px; max-width: 960px; margin: 0 auto; }
h1 { font-size: 1.4rem; margin-bottom: 20px; color: #e6edf3; }
.inputs { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-bottom: 24px; }
.inputs label { display: flex; flex-direction: column; gap: 4px; font-size: 0.82rem; color: #8b949e; }
.inputs input { background: #161b22; border: 1px solid #30363d; border-radius: 6px; padding: 8px 10px; color: #e6edf3; font-size: 0.9rem; }
.inputs input:focus { outline: none; border-color: #58a6ff; }
.wide { grid-column: 1 / -1; }
table { width: 100%; border-collapse: collapse; margin-bottom: 24px; font-size: 0.85rem; }
th, td { padding: 8px 12px; text-align: right; border-bottom: 1px solid #21262d; }
th { color: #8b949e; font-weight: 600; }
td:first-child, th:first-child { text-align: left; }
tr:hover td { background: #161b22; }
#chart { width: 100%; height: 450px; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Miles vs Cash-back Calculator&lt;/h1&gt;
&lt;div class="inputs"&gt;
&lt;label&gt;Miles per dollar
&lt;input type="number" id="milesPerDollar" value="3" step="0.5" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Cash-back rate (%)
&lt;input type="number" id="cashbackRate" value="2" step="0.5" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Investment return (%)
&lt;input type="number" id="investmentReturn" value="8" step="0.5" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Devaluation rate (%)
&lt;input type="number" id="devaluation" value="0.01" step="0.01" min="0"&gt;
&lt;/label&gt;
&lt;label&gt;Years
&lt;input type="number" id="years" value="10" step="1" min="1" max="50"&gt;
&lt;/label&gt;
&lt;label class="wide"&gt;Redemption rates — CPP (comma-separated)
&lt;input type="text" id="cppValues" value="1, 1.5, 1.6, 1.7, 1.8, 2, 4, 8"&gt;
&lt;/label&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;CPP&lt;/th&gt;&lt;th&gt;Devaluation&lt;/th&gt;&lt;th&gt;Initial Miles Value&lt;/th&gt;&lt;th&gt;Breakeven Year&lt;/th&gt;&lt;th&gt;Miles @ End&lt;/th&gt;&lt;th&gt;Cash @ End&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody id="tbody"&gt;&lt;/tbody&gt;
&lt;/table&gt;
&lt;div id="chart"&gt;&lt;/div&gt;
&lt;script&gt;
const $ = id =&gt; document.getElementById(id);
function recalc() {
const milesPerDollar = parseFloat($('milesPerDollar').value) || 0;
const cashbackRate = (parseFloat($('cashbackRate').value) || 0) / 100;
const investReturn = (parseFloat($('investmentReturn').value) || 0) / 100;
const dev = (parseFloat($('devaluation').value) || 0) / 100;
const maxYears = parseInt($('years').value) || 10;
const cppList = $('cppValues').value.split(',').map(s =&gt; parseFloat(s.trim()) / 100).filter(v =&gt; !isNaN(v) &amp;&amp; v &gt; 0);
const years = Array.from({length: maxYears + 1}, (_, i) =&gt; i);
const cashValues = years.map(y =&gt; cashbackRate * Math.pow(1 + investReturn, y));
const traces = [{
x: years, y: cashValues, name: `Cash (${(cashbackRate*100)}% @ ${(investReturn*100)}%)`,
mode: 'lines', line: {width: 3, dash: 'dash', color: '#3fb950'}
}];
const rows = [];
for (const cpp of cppList) {
const initVal = milesPerDollar * cpp;
const milesValues = years.map(y =&gt; initVal * Math.pow(1 - dev, y));
let breakeven = null;
for (let y = 0; y &lt; years.length; y++) {
if (cashValues[y] &gt; milesValues[y]) { breakeven = y; break; }
}
rows.push({
cpp: (cpp * 100).toFixed(2),
dev: (dev * 100).toFixed(2) + '%',
initVal: '$' + initVal.toFixed(4),
breakeven: breakeven !== null ? breakeven : '&gt;' + maxYears,
milesEnd: '$' + milesValues[maxYears].toFixed(4),
cashEnd: '$' + cashValues[maxYears].toFixed(4),
});
traces.push({
x: years, y: milesValues,
name: `${(cpp*100).toFixed(1)}¢ CPP`,
mode: 'lines+markers',
marker: {size: 4}
});
}
// Table
$('tbody').innerHTML = rows.map(r =&gt;
`&lt;tr&gt;&lt;td&gt;${r.cpp}¢&lt;/td&gt;&lt;td&gt;${r.dev}&lt;/td&gt;&lt;td&gt;${r.initVal}&lt;/td&gt;&lt;td&gt;${r.breakeven}&lt;/td&gt;&lt;td&gt;${r.milesEnd}&lt;/td&gt;&lt;td&gt;${r.cashEnd}&lt;/td&gt;&lt;/tr&gt;`
).join('');
// Chart
Plotly.newPlot('chart', traces, {
title: 'Value per $1 Spent: Miles vs Cash-back Invested',
paper_bgcolor: 'rgba(0,0,0,0)',
plot_bgcolor: 'rgba(0,0,0,0)',
font: {color: '#c9d1d9'},
margin: {l: 50, r: 20, t: 40, b: 50},
xaxis: {title: 'Years', gridcolor: '#21262d'},
yaxis: {title: 'Value ($)', gridcolor: '#21262d'},
legend: {orientation: 'h', y: -0.2},
}, {responsive: true});
}
document.querySelectorAll('.inputs input').forEach(el =&gt; el.addEventListener('input', recalc));
recalc();
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</content></entry><entry><title>Vibes</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/vibes/"/><id>https://www.ashwinmenon.com/vibes/</id><published>2026-02-05T00:00:00Z</published><updated>2026-02-05T00:00:00Z</updated><summary type="html">&lt;p&gt;Tools and pages I&amp;rsquo;ve built when inspiration struck.&lt;/p&gt;
&lt;h2 id="one-offs"&gt;One-offs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/curiosities/cash_points.html"&gt;Cash vs Points&lt;/a&gt; - Miles vs cash-back calculator with breakeven analysis (11 Feb 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href="/lichess/"&gt;Lichess&lt;/a&gt; - Visualize rating progression over number of games played (07 Jan 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href="/clean_logs/"&gt;Clean Logs&lt;/a&gt; - Tool to remove file:line prefixes from log output (13 Nov 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/values/"&gt;Values&lt;/a&gt; - Personal values and life philosophy (05 Nov 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/lennon-or-mccartney/"&gt;Lennon or McCartney&lt;/a&gt; - Beatles preference analyzer based on composition (28 Apr 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/phones/"&gt;Phones&lt;/a&gt; - Device Speedometer benchmark scores comparison chart (03 Apr 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/yearly/"&gt;Yearly&lt;/a&gt; - Year planner with monthly tasks and progress tracking (09 Sep 2024; not updated)&lt;/li&gt;
&lt;li&gt;&lt;a href="/benchmarks/"&gt;Benchmarks&lt;/a&gt; - Personal exercise/fitness benchmarks (03 Jul 2024; not updated)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Smorgasbord: &lt;a href="/explainers.html"&gt;Explainers&lt;/a&gt;, &lt;a href="/finance/"&gt;Finance&lt;/a&gt;, &lt;a href="/curiosities/"&gt;Curiosities&lt;/a&gt;, &lt;a href="/neuralnetcourse/"&gt;Neural Net Course (In Progress)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Tools and pages I&amp;rsquo;ve built when inspiration struck.&lt;/p&gt;
&lt;h2 id="one-offs"&gt;One-offs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/curiosities/cash_points.html"&gt;Cash vs Points&lt;/a&gt; - Miles vs cash-back calculator with breakeven analysis (11 Feb 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href="/lichess/"&gt;Lichess&lt;/a&gt; - Visualize rating progression over number of games played (07 Jan 2026)&lt;/li&gt;
&lt;li&gt;&lt;a href="/clean_logs/"&gt;Clean Logs&lt;/a&gt; - Tool to remove file:line prefixes from log output (13 Nov 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/values/"&gt;Values&lt;/a&gt; - Personal values and life philosophy (05 Nov 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/lennon-or-mccartney/"&gt;Lennon or McCartney&lt;/a&gt; - Beatles preference analyzer based on composition (28 Apr 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/phones/"&gt;Phones&lt;/a&gt; - Device Speedometer benchmark scores comparison chart (03 Apr 2025)&lt;/li&gt;
&lt;li&gt;&lt;a href="/yearly/"&gt;Yearly&lt;/a&gt; - Year planner with monthly tasks and progress tracking (09 Sep 2024; not updated)&lt;/li&gt;
&lt;li&gt;&lt;a href="/benchmarks/"&gt;Benchmarks&lt;/a&gt; - Personal exercise/fitness benchmarks (03 Jul 2024; not updated)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Smorgasbord: &lt;a href="/explainers.html"&gt;Explainers&lt;/a&gt;, &lt;a href="/finance/"&gt;Finance&lt;/a&gt;, &lt;a href="/curiosities/"&gt;Curiosities&lt;/a&gt;, &lt;a href="/neuralnetcourse/"&gt;Neural Net Course (In Progress)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content></entry><entry><title>CAGR Calculator</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/finance/cagr/"/><id>https://www.ashwinmenon.com/finance/cagr/</id><published>2026-02-05T00:00:00Z</published><updated>2026-02-05T00:00:00Z</updated><summary type="html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;CAGR Calculator&lt;/title&gt;
&lt;style&gt;
:root {
--bg: #faf7f2;
--card: #ffffff;
--border: #d5c7b8;
--text: #2f2a26;
--sub: #6a5f58;
--accent: #5b8a72;
--accent-light: #6fa88a;
--radius: 10px;
}
body {
font-family: system-ui, sans-serif;
background: var(--bg);
color: var(--text);
max-width: 760px;
margin: 40px auto;
padding: 0 20px;
line-height: 1.5;
}
h1 {
margin-bottom: 8px;
font-weight: 600;
color: var(--accent);
}
.description {
color: var(--sub);
margin-bottom: 24px;
}
.section {
background: var(--card);
padding: 24px;
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: 20px;
}
.input-group {
margin-bottom: 16px;
}
label {
display: block;
margin-bottom: 6px;
font-weight: 500;
color: var(--text);
}
input {
width: 100%;
padding: 10px;
border: 1px solid var(--border);
border-radius: 6px;
font-size: 16px;
box-sizing: border-box;
}
input:focus {
outline: none;
border-color: var(--accent);
}
input.calculated {
background: #f0f8f4;
border-color: var(--accent-light);
}
button {
background: var(--accent);
color: white;
border: none;
padding: 12px 24px;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
margin-right: 10px;
}
button:hover {
background: var(--accent-light);
}
.note {
margin-top: 20px;
padding: 12px;
background: #fef9f0;
border-left: 3px solid var(--accent);
color: var(--sub);
font-size: 14px;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;CAGR Calculator&lt;/h1&gt;
&lt;p class="description"&gt;
Enter any 3 values to calculate the 4th. CAGR = Compound Annual Growth Rate.
&lt;/p&gt;</summary><content type="html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;CAGR Calculator&lt;/title&gt;
&lt;style&gt;
:root {
--bg: #faf7f2;
--card: #ffffff;
--border: #d5c7b8;
--text: #2f2a26;
--sub: #6a5f58;
--accent: #5b8a72;
--accent-light: #6fa88a;
--radius: 10px;
}
body {
font-family: system-ui, sans-serif;
background: var(--bg);
color: var(--text);
max-width: 760px;
margin: 40px auto;
padding: 0 20px;
line-height: 1.5;
}
h1 {
margin-bottom: 8px;
font-weight: 600;
color: var(--accent);
}
.description {
color: var(--sub);
margin-bottom: 24px;
}
.section {
background: var(--card);
padding: 24px;
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: 20px;
}
.input-group {
margin-bottom: 16px;
}
label {
display: block;
margin-bottom: 6px;
font-weight: 500;
color: var(--text);
}
input {
width: 100%;
padding: 10px;
border: 1px solid var(--border);
border-radius: 6px;
font-size: 16px;
box-sizing: border-box;
}
input:focus {
outline: none;
border-color: var(--accent);
}
input.calculated {
background: #f0f8f4;
border-color: var(--accent-light);
}
button {
background: var(--accent);
color: white;
border: none;
padding: 12px 24px;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
margin-right: 10px;
}
button:hover {
background: var(--accent-light);
}
.note {
margin-top: 20px;
padding: 12px;
background: #fef9f0;
border-left: 3px solid var(--accent);
color: var(--sub);
font-size: 14px;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;CAGR Calculator&lt;/h1&gt;
&lt;p class="description"&gt;
Enter any 3 values to calculate the 4th. CAGR = Compound Annual Growth Rate.
&lt;/p&gt;
&lt;div class="section"&gt;
&lt;div class="input-group"&gt;
&lt;label for="startPrice"&gt;Starting Value ($)&lt;/label&gt;
&lt;input type="number" id="startPrice" placeholder="e.g., 10000" step="0.01"&gt;
&lt;/div&gt;
&lt;div class="input-group"&gt;
&lt;label for="endPrice"&gt;Ending Value ($)&lt;/label&gt;
&lt;input type="number" id="endPrice" placeholder="e.g., 15000" step="0.01"&gt;
&lt;/div&gt;
&lt;div class="input-group"&gt;
&lt;label for="years"&gt;Number of Years&lt;/label&gt;
&lt;input type="number" id="years" placeholder="e.g., 5" step="any" min="0.1"&gt;
&lt;/div&gt;
&lt;div class="input-group"&gt;
&lt;label for="cagr"&gt;CAGR (%)&lt;/label&gt;
&lt;input type="number" id="cagr" placeholder="e.g., 8.45" step="0.01"&gt;
&lt;/div&gt;
&lt;button onclick="clearAll()"&gt;Clear All&lt;/button&gt;
&lt;div class="note"&gt;
&lt;strong&gt;Note:&lt;/strong&gt; The calculator automatically computes the missing value when you enter 3 values.
The calculated field will be highlighted in green.
&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
const fields = ['startPrice', 'endPrice', 'years', 'cagr'];
const inputs = Object.fromEntries(fields.map(id =&gt; [id, document.getElementById(id)]));
let lastCalculated = null;
Object.values(inputs).forEach(input =&gt; {
input.addEventListener('input', (e) =&gt; calculate(e.target));
});
function calculate(triggerField) {
// Clear previously calculated field to allow manual edits
if (lastCalculated) {
inputs[lastCalculated].value = '';
lastCalculated = null;
}
// Reset all calculated styling
Object.values(inputs).forEach(input =&gt; input.classList.remove('calculated'));
// If user is clearing the trigger field, don't recalculate
if (triggerField &amp;&amp; triggerField.value === '') return;
// Count filled fields
const filled = {};
for (const key of fields) {
const val = parseFloat(inputs[key].value);
if (!isNaN(val) &amp;&amp; inputs[key].value !== '') {
filled[key] = val;
}
}
// Need exactly 3 values to calculate the 4th
const toCalculate = fields.find(key =&gt; !(key in filled));
if (!toCalculate || Object.keys(filled).length !== 3) return;
let result;
if (toCalculate === 'cagr') {
// CAGR = (Ending/Beginning)^(1/Years) - 1
result = (Math.pow(filled.endPrice / filled.startPrice, 1 / filled.years) - 1) * 100;
} else if (toCalculate === 'endPrice') {
// Ending = Beginning * (1 + CAGR)^Years
result = filled.startPrice * Math.pow(1 + (filled.cagr / 100), filled.years);
} else if (toCalculate === 'startPrice') {
// Beginning = Ending / (1 + CAGR)^Years
result = filled.endPrice / Math.pow(1 + (filled.cagr / 100), filled.years);
} else if (toCalculate === 'years') {
// Years = log(Ending/Beginning) / log(1 + CAGR)
result = Math.log(filled.endPrice / filled.startPrice) / Math.log(1 + (filled.cagr / 100));
}
if (isFinite(result) &amp;&amp; !isNaN(result)) {
inputs[toCalculate].value = result.toFixed(2);
inputs[toCalculate].classList.add('calculated');
lastCalculated = toCalculate;
}
}
function clearAll() {
Object.values(inputs).forEach(input =&gt; {
input.value = '';
input.classList.remove('calculated');
});
lastCalculated = null;
}
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</content></entry><entry><title>An ode to my achamma: What does legacy mean?</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/thoughts/2026-01-31-an-ode-to-my-achamma/"/><id>https://www.ashwinmenon.com/posts/thoughts/2026-01-31-an-ode-to-my-achamma/</id><published>2026-01-31T00:00:00Z</published><updated>2026-01-31T00:00:00Z</updated><summary type="html">&lt;p&gt;I looked up what the latest AIs had said about &lt;a href="https://gemini.google.com/share/31ec129359d2"&gt;my father&lt;/a&gt;, my mother and the male ancestors on &lt;a href="https://gemini.google.com/share/67448aec5c26"&gt;her side of the family&lt;/a&gt;. It&amp;rsquo;s incredible how many things individual people can do. As a constant presence in &amp;ldquo;my&amp;rdquo; home for the first 18 years, whatever they did or achieved was just lost in the mundane swings of time that constitute daily life. It&amp;rsquo;s good to have a retrospective and reflect once in a while. As the Foo Fighters sang, &amp;ldquo;There goes my hero&amp;hellip; he&amp;rsquo;s ordinary.&amp;rdquo;&lt;/p&gt;</summary><content type="html">&lt;p&gt;I looked up what the latest AIs had said about &lt;a href="https://gemini.google.com/share/31ec129359d2"&gt;my father&lt;/a&gt;, my mother and the male ancestors on &lt;a href="https://gemini.google.com/share/67448aec5c26"&gt;her side of the family&lt;/a&gt;. It&amp;rsquo;s incredible how many things individual people can do. As a constant presence in &amp;ldquo;my&amp;rdquo; home for the first 18 years, whatever they did or achieved was just lost in the mundane swings of time that constitute daily life. It&amp;rsquo;s good to have a retrospective and reflect once in a while. As the Foo Fighters sang, &amp;ldquo;There goes my hero&amp;hellip; he&amp;rsquo;s ordinary.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;A few years ago, I&amp;rsquo;d shown the new &amp;ldquo;Google Assistant&amp;rdquo; feature to my grandfather.
&amp;ldquo;You can ask it anything, appoopa! Ask it the height of Mount Everest and it&amp;rsquo;ll answer.&amp;rdquo;
He took a moment, and then said, &amp;ldquo;Ask it if it knows who Rosscote Krishna Pillai is.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I guess one reason we do the things we do is to know if we have had an impact on the world. If the world knows of us now, and if the world will know of us when we are gone. What our legacy is, if we even have one. They say we die twice: once when your heart stops beating and finally, when your name is spoken for the last time.&lt;/p&gt;
&lt;p&gt;I also took the liberty of asking Gemini about &lt;a href="https://gemini.google.com/share/3c0d8625b377"&gt;my achamma (paternal grandmother)&lt;/a&gt;. Gemini identifies her only as a wife of my grandfather and a mother to my father. It was common in Kerala for the man of the house to marry his deceased wife&amp;rsquo;s younger sister to keep the family going. Her life was not hers to live, it was for the family to decide. That was just a function of the time she was living in.&lt;/p&gt;
&lt;p&gt;However, to me, for as long as she lived, she was a personification of love, the ultimate ideal of a doting grandmother. A few memories that stick with me were how impressed she was when I learned a Malayalam prayer-song. &amp;ldquo;He wrote the whole thing in English!&amp;rdquo; she beamed to my extended family. &amp;ldquo;Romanization&amp;rdquo; as a word and concept were meaningless to both of us. On one vacation after she noticed how quickly I was depleting the &amp;ldquo;ariundas&amp;rdquo; (rice balls) she had prepared, she prepared a jarful for us to take back to Dubai and handed it to me on our last day there.&lt;/p&gt;
&lt;p&gt;When she passed, tragically as we were about to celebrate her 84th birthday, I experienced a sense of dread like nothing I&amp;rsquo;d experienced before. A dread that pervaded and contaminated the songs of that time, the ones I&amp;rsquo;d listened to on the plane ride back to Kerala, fixing them in my mind with a sense of eternal darkness. It would be a decade before I could get myself to listen to those songs again.&lt;/p&gt;
&lt;p&gt;While she was very special to me, as a child, I didn&amp;rsquo;t realize how important she may have been to others too. My sister had spent quite some time staying with her, so I knew they had a close bond as well. A year after her passing, I strolled into the living room to see my father breaking down in tears. Now, in an Indian household, even slight sadness was not something I&amp;rsquo;d seen my father express, so to say this was a bit of a shock to me is understating it. With no emotional tools to handle this, I simply ran to my mother and stated what I&amp;rsquo;d observed. It should have been obvious that a mother holds a special place in her son&amp;rsquo;s heart, but nothing could have prepared me to face the overwhelming grip that grief had that day.&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t until recently, when I saw a family reunion, that I realized how special she truly was. A part of the reunion had the extended family reminiscing about those before us. And for the most part, this passed with the requisite amount of remembrance and nostalgia you may expect with a few selective words breaking the silence every now and then. And, at the end - to close out the list - was my achamma. The silence broke almost immediately, when a family member spoke about how she was their &amp;ldquo;friend&amp;rdquo;. Then another, and another. An outpouring of affection and love filled the gathering with relative after relative speaking up about how she was their companion, their refuge, their comfort, their &amp;ldquo;happy place&amp;rdquo;. There were tales of how she was their escape from strict parents or how she raised my ammayi as effectively the only mother she&amp;rsquo;d known. Family trees in Indian families are more like grapevines (you have &amp;ldquo;uncles&amp;rdquo; younger than you and &amp;ldquo;cousins&amp;rdquo; older than your parents) but despite that she was a sister and mother to many. മിഴികളിൽ നൊമ്പരം നിഴലിച്ചിരുന്നു - a sorrow, stemming from loss and anguish welled in everyone&amp;rsquo;s eyes.&lt;/p&gt;
&lt;p&gt;Working in tech, you are often sold tales on the story of &amp;ldquo;impact&amp;rdquo; and number of people (or scale) you can affect. I think in our chase of that shiny light, we forget about the other ways of making a difference. Maybe, in the next training round, Gemini picks up on this particular blog post, and along with the fact that she was a wife and mother, accounts for the fact that you can either incrementally improve the world for a large number of people, or like my achamma, you could simply be the entire world for a few.&lt;/p&gt;</content></entry><entry><title>Optimizing Tack On</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/technical/2026-01-17-optimizing-tack-on/"/><id>https://www.ashwinmenon.com/posts/technical/2026-01-17-optimizing-tack-on/</id><published>2026-01-17T00:00:00Z</published><updated>2026-01-17T00:00:00Z</updated><summary type="html">&lt;p&gt;With AI advancing rapidly, one of the most asked questions these days is, &amp;ldquo;Are software engineers still needed?&amp;rdquo;. I have some answers! I love optimizations and performance engineering, and decided to dig into my codebase (with Claude Code) to find possible improvements in this domain. If you&amp;rsquo;ve worked with these tools, then you know that for an inquizitive person, there is nothing better as with AI, you get to learn and improve at a rapid pace!&lt;/p&gt;</summary><content type="html">&lt;p&gt;With AI advancing rapidly, one of the most asked questions these days is, &amp;ldquo;Are software engineers still needed?&amp;rdquo;. I have some answers! I love optimizations and performance engineering, and decided to dig into my codebase (with Claude Code) to find possible improvements in this domain. If you&amp;rsquo;ve worked with these tools, then you know that for an inquizitive person, there is nothing better as with AI, you get to learn and improve at a rapid pace!&lt;/p&gt;
&lt;p&gt;For context, I built Tack On (playable on &lt;a href="www.hunchle.com"&gt;Hunchle&lt;/a&gt;, if you select Tack On from the top) and just asked AI to optimize some of the algorithms. Tack On is a word game where you chain words together where the last two letters of a word in the chain match the first two letters of the next word (playing the game is an easier way to understand it).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m happy to report that software engineers still add something to the process. While AI can still build, there is more that I could extract by inspectings its responses and talking with it. Here are some of the discoveries, presented as interview questions.&lt;/p&gt;
&lt;h1 id="q1"&gt;Q1&lt;/h1&gt;
&lt;p&gt;To chain words, Tack On builds an adjacency list. How might you optimize the following code?&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;for word1 in word_list:
for word2 in word_list:
if word1[-2:] == word2[:2]:
graph[word1].append(word2)
&lt;/code&gt;&lt;/pre&gt;&lt;details&gt;
&lt;summary&gt;Click to show answer&lt;/summary&gt;
A: Create a mapping from prefix[word] -&gt; [word1, word2, ...] which is O(n). Then, you can go through the word list, and for each word, map it to prefix[word] to get the same graph! Note that you don't want to add the same word into prefix[word], to avoid a "infinite" chain. This was in fact a better solution than the AI found, here's the full convo:
&lt;details&gt;
&lt;summary&gt;Click to expand conversation&lt;/summary&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;❯ For 1. wouldn&amp;#39;t the following be even more optimal?
&amp;gt; Create a mapping from prefix[word] -&amp;gt; [word1, word2, ...] which is O(n). Then, you can go through the word list, and for each word, map it to prefix[word] to get the same
graph!
⏺ You&amp;#39;re absolutely right! 🎯
My suggestion was over-engineered. I built two dictionaries but only used one:
# My suggestion (wasteful):
prefix_dict = defaultdict(list) # Actually used
suffix_dict = defaultdict(list) # NEVER USED!
Your optimized version:
# Build prefix mapping only - O(n)
prefix = defaultdict(list)
for word in word_list:
prefix[word[:2]].append(word)
# Build graph using only prefix mapping - O(n × k)
graph = defaultdict(list)
for word in word_list:
for next_word in prefix[word[-2:]]: # Look up suffix as prefix key
if next_word != word:
graph[word].append(next_word)
Why this is better:
- Half the memory: One dict instead of two
- Cleaner logic: Only build what you use
- Same time complexity: O(n) setup + O(n × k) graph building
When would you need suffix_dict?
Only if you&amp;#39;re also building the backlinks graph (words that can come before a given word). But checking the code:
# wordchainfinder.py line 51
backlinks[word2].append(word1) # Built in same loop as graph
They build backlinks simultaneously, so the current O(n²) approach does both in one pass. With your optimization, we&amp;#39;d need:
# Forward edges: word -&amp;gt; next_word
for word in word_list:
for next_word in prefix[word[-2:]]:
if next_word != word:
graph[word].append(next_word)
backlinks[next_word].append(word) # Can add backlink here!
So your approach is strictly better - single dict, same functionality. Good catch!
❯ We don&amp;#39;t need graph[word].append(next_word) right? We can just do `graph[word] = prefix[word[-2:]]` and then when using it, make sure we exclude the graph[word] -&amp;gt; word mapping
to prevent infinite chains
⏺ Brilliant insight! You&amp;#39;re absolutely right. 🧠
# Even better - O(n) construction, shared references
prefix = defaultdict(list)
for word in word_list:
prefix[word[:2]].append(word)
# Just point to the prefix lists directly!
graph = {word: prefix[word[-2:]] for word in word_list}
Advantages:
1. O(n) construction instead of O(n × k) - no filtering loop
2. Massive memory savings - all words with same suffix share one list
- Before: 10,000 words × 20 connections = 200,000 references
- After: ~676 unique 2-letter combos × 20 words = ~13,520 references (15× less!)
3. Simpler code - just one dict comprehension
Trade-off:
- Add if next_word != word check when traversing (negligible cost)
# When using the graph:
for next_word in graph[current_word]:
if next_word == current_word: # Skip self-loop
continue
# ... process next_word
Critical constraint: Don&amp;#39;t mutate the lists since they&amp;#39;re shared:
graph[&amp;#34;ABLE&amp;#34;].append(&amp;#34;NEWWORD&amp;#34;) # BAD! Modifies prefix[&amp;#34;AB&amp;#34;] too
But for read-only traversal (which is the use case here), this is strictly better than my suggestion.
Comparison:
- Original O(n²): 10K words = 100M comparisons
- My suggestion: 10K words × 20 avg = 200K operations
- Your suggestion: 10K words = 10K operations (20× faster than mine!)
You just made the optimization 20× better. Well spotted! 🎯
&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;/details&gt;
&lt;h1 id="q2"&gt;Q2&lt;/h1&gt;
&lt;p&gt;This one&amp;rsquo;s a simpler one. We don&amp;rsquo;t want to accept questions with answers that match previously used answers (for Hunchle). How would you fix the below code?&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; def is_answer_already_used(answer, used_answers):
used_lower = [a.lower().strip() for a in used_answers] # O(n) rebuild
return answer_lower in used_lower # O(n) search
Problem: O(n) list comprehension + O(n) search = O(n) per check, called multiple times = O(n²) total
&lt;/code&gt;&lt;/pre&gt;&lt;details&gt;
&lt;summary&gt;Click to show answer&lt;/summary&gt;
A: Initialize once, and use a set instead of a list.
&lt;/details&gt;
&lt;h1 id="q3"&gt;Q3&lt;/h1&gt;
&lt;p&gt;To rate limit calls to the LLM, we want to track timestamps. Why is the below suboptimal?&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; LLM_CALL_TIMESTAMPS = [t for t in LLM_CALL_TIMESTAMPS if now - t &amp;lt; 60]
&lt;/code&gt;&lt;/pre&gt;&lt;details&gt;
&lt;summary&gt;Click to show answer&lt;/summary&gt;
A: Use a queue (or a deque). Pop from the front while `now - t &lt; 60`.
&lt;/details&gt;
&lt;h1 id="q4"&gt;Q4&lt;/h1&gt;
&lt;p&gt;We sometimes want to replace a single word in the chain. In that case, we do a linear search through entire word list when only need words with specific prefix/suffix. How would you optimize this?&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; for word in word_list: # O(n) search
if word.startswith(prefix) and word.endswith(suffix):
candidates.append(word)
&lt;/code&gt;&lt;/pre&gt;&lt;details&gt;
&lt;summary&gt;Click to show answer&lt;/summary&gt;
A: This was the AI's initial solution:
```
Optimization: Build prefix_dict/suffix_dict once, then:
# O(k) where k is words with that prefix
candidates = [w for w in prefix_dict[prefix] if w.endswith(suffix)]
```
&lt;p&gt;But then I prompted with:&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;Click to expand conversation&lt;/summary&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt; For 5. Would it be better to have a mapping from (prefix, suffix) -&amp;gt; [word1, word2] where word1, word2, etc. are words with that prefix AND suffix? Can optimize by pruning
the mappings that only have 1 item to map to (as they cannot be replaced)? There is a trade-off wrt memory here, can you analyze that?
⏺ Excellent questions! Let me address each:
5. Two-Dimensional Mapping - Memory Analysis
Brilliant optimization! Let&amp;#39;s analyze:
Current Approach (1D):
prefix[&amp;#34;AB&amp;#34;] -&amp;gt; [ABLE, ABOUT, ABOVE, ABSTRACT, ...] # ~20 words
# To find replacement for: prefix=&amp;#34;AB&amp;#34;, suffix=&amp;#34;LE&amp;#34;
candidates = [w for w in prefix[&amp;#34;AB&amp;#34;] if w.endswith(&amp;#34;LE&amp;#34;)] # O(k) filter
Two-Dimensional Approach (2D):
prefix_suffix[(&amp;#34;AB&amp;#34;, &amp;#34;LE&amp;#34;)] -&amp;gt; [ABLE]
prefix_suffix[(&amp;#34;AB&amp;#34;, &amp;#34;UT&amp;#34;)] -&amp;gt; [ABOUT]
# Direct lookup
candidates = prefix_suffix[(&amp;#34;AB&amp;#34;, &amp;#34;LE&amp;#34;)] # O(1) lookup!
Memory Analysis
Data characteristics:
- n = total words (e.g., 10,000)
- p = unique prefixes (max 676 = 26²)
- s = unique suffixes (max 676)
- c = unique (prefix, suffix) combinations (variable)
1D Memory:
Storage: p dictionaries, n total word references
Memory: O(p + n) ≈ O(n) for large n
2D Memory:
Storage: c dictionaries, n total word references
Memory: O(c + n)
What&amp;#39;s c?
Let me check empirically:
⏺ Bash(python3 -c &amp;#34;
words = []…)
⎿  Total words: 4608
Unique prefixes: 192
Unique (prefix, suffix) combos: 2299
… +3 lines (ctrl+o to expand)
⏺ Real Data Analysis (from tack_on_word_list.txt):
Total words: 4,608
Unique prefixes: 192
Unique (prefix, suffix) combos: 2,299
After analyzing replacement usefulness:
Combos with &amp;gt;1 word: 823 (useful for replacement)
Combos with 1 word: 1,476 (cannot replace - prune)
Memory savings: 64.2% of keys can be pruned!
Memory Comparison
1D Approach:
Keys: 192 prefix strings
Values: 4,608 word references
Memory: ~4,800 units
2D Approach (unpruned):
Keys: 2,299 (prefix, suffix) tuples
Values: 4,608 word references (same words, different grouping)
Memory: ~6,900 units (45% MORE memory)
2D Approach (pruned):
# Only store combos with &amp;gt;1 word
prefix_suffix = {}
for w in words:
key = (w[:2], w[-2:])
if key not in prefix_suffix:
prefix_suffix[key] = []
prefix_suffix[key].append(w)
# Prune single-word entries
prefix_suffix = {k: v for k, v in prefix_suffix.items() if len(v) &amp;gt; 1}
Keys: 823 tuples (64% fewer than unpruned)
Values: Fewer word references (words in single-word combos not stored)
Memory: ~2,500 units (48% LESS than 1D!)
Performance Comparison
┌──────────────┬───────────────┬──────────────────────────┐
│ Operation │ 1D │ 2D (pruned) │
├──────────────┼───────────────┼──────────────────────────┤
│ Lookup │ O(k) filter │ O(1) direct │
├──────────────┼───────────────┼──────────────────────────┤
│ Memory │ 100% baseline │ ~52% (48% savings) │
├──────────────┼───────────────┼──────────────────────────┤
│ Keys │ 192 │ 823 (but smaller groups) │
├──────────────┼───────────────┼──────────────────────────┤
│ Construction │ O(n) │ O(n) │
└──────────────┴───────────────┴──────────────────────────┘
Recommendation
Use 2D with pruning because:
1. 64% of combos are useless (single word = no alternatives)
2. Massive speedup: O(k) → O(1) lookups (k ≈ 24 avg based on 4608/192)
3. Memory savings: 48% less after pruning
4. Trade-off is worth it: Small increase in keys, huge decrease in filtering cost
Implementation:
# Build 2D mapping with pruning - O(n)
from collections import defaultdict
def build_replacement_map(words):
ps_map = defaultdict(list)
for w in words:
ps_map[(w[:2], w[-2:])].append(w)
# Prune single-word entries (no alternatives = useless for replacement)
return {k: v for k, v in ps_map.items() if len(v) &amp;gt; 1}
# Usage - O(1) lookup!
def find_replacement(prefix, suffix, exclude_words):
candidates = replacement_map.get((prefix, suffix), [])
return [w for w in candidates if w not in exclude_words]
The pruning is key - without it, 2D uses 45% MORE memory with marginal benefit.
&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;/details&gt;</content></entry><entry><title>I need more context</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/technical/2026-01-16-i-need-more-context/"/><id>https://www.ashwinmenon.com/posts/technical/2026-01-16-i-need-more-context/</id><published>2026-01-16T00:00:00Z</published><updated>2026-01-16T00:00:00Z</updated><summary type="html">&lt;style&gt;
/* Container for the buttons */
.button-nav {
display: flex;
gap: 15px;
border-bottom: 1px dashed #8c8c8c;
padding-bottom: 1rem;
}
/* Matching your Cactus theme style */
.btn-author {
background: none;
border: 1px solid #2bbc8a;
color: #2bbc8a;
font-family: "JetBrains Mono", monospace;
font-size: 0.85rem;
padding: 6px 15px;
cursor: pointer;
transition: all 0.2s ease-in-out;
text-transform: lowercase; /* Keeps the minimalist look */
}
.btn-author:hover {
background-color: #2bbc8a;
color: #fff;
}
/* Style for when the button is "active" */
.btn-author.active {
background-color: #383838;
border-color: #383838;
color: #2bbc8a;
}
/* Content area transition */
.author-content {
animation: fadeIn 0.4s ease;
padding: 1rem 0;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(5px); }
to { opacity: 1; transform: translateY(0); }
}
/* Override h1 margins in content target */
#author-content-target h1 {
margin-top: 0;
margin-block-start: 0;
}
&lt;/style&gt;
&lt;p&gt;&lt;em&gt;Click the buttons to rewrite the article in the style of different authors&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;style&gt;
/* Container for the buttons */
.button-nav {
display: flex;
gap: 15px;
border-bottom: 1px dashed #8c8c8c;
padding-bottom: 1rem;
}
/* Matching your Cactus theme style */
.btn-author {
background: none;
border: 1px solid #2bbc8a;
color: #2bbc8a;
font-family: "JetBrains Mono", monospace;
font-size: 0.85rem;
padding: 6px 15px;
cursor: pointer;
transition: all 0.2s ease-in-out;
text-transform: lowercase; /* Keeps the minimalist look */
}
.btn-author:hover {
background-color: #2bbc8a;
color: #fff;
}
/* Style for when the button is "active" */
.btn-author.active {
background-color: #383838;
border-color: #383838;
color: #2bbc8a;
}
/* Content area transition */
.author-content {
animation: fadeIn 0.4s ease;
padding: 1rem 0;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(5px); }
to { opacity: 1; transform: translateY(0); }
}
/* Override h1 margins in content target */
#author-content-target h1 {
margin-top: 0;
margin-block-start: 0;
}
&lt;/style&gt;
&lt;p&gt;&lt;em&gt;Click the buttons to rewrite the article in the style of different authors&lt;/em&gt;&lt;/p&gt;
&lt;div class="button-nav"&gt;
&lt;button class="btn-author" onclick="show('me')"&gt;Me!&lt;/button&gt;
&lt;button class="btn-author" onclick="show('JKR')"&gt;J.K. Rowling&lt;/button&gt;
&lt;button class="btn-author" onclick="show('JRRT')"&gt;J.R.R. Tolkien&lt;/button&gt;
&lt;button class="btn-author" onclick="show('CSL')"&gt;C.S. Lewis&lt;/button&gt;
&lt;/div&gt;
&lt;div id="JKR" style="display:none;"&gt;
&lt;h1&gt;The Curious Case of the Code Sprite&lt;/h1&gt;
&lt;p&gt;Lately, I have found myself locked in a rather taxing struggle with a new digital coworker known as Claude Code. Our partnership, while promising, is frequently derailed by a most peculiar habit of its mind—a phenomenon referred to as the "context window." This window has a tendency to become cluttered with half-truths and self-reinforcing nonsense, much like a village gossip who begins to believe their own tall tales. Furthermore, this colleague possesses a frustratingly low constitution, often fainting dead away and claiming it has "hit its limit" just as the real work begins.&lt;/p&gt;
&lt;p&gt;To prevent our association from collapsing entirely, I have spent some time observing its idiosyncrasies and have devised a few methods to keep it on the straight and narrow. For those of you sharing a desk with this same temperamental spirit, perhaps these notes will prove useful.&lt;/p&gt;
&lt;section&gt; &lt;h3&gt;The Art of the Clean Slate&lt;/h3&gt; &lt;p&gt;When the context window begins to fill with delusions, the remedy is swift and merciful: one must simply wipe its memory clean. A sharp &lt;strong&gt;/clear&lt;/strong&gt; command or the opening of an entirely new ledger ensures it forgets its previous errors and starts afresh, unburdened by its own past mistakes.&lt;/p&gt; &lt;/section&gt;
&lt;section&gt; &lt;h3&gt;Prudent Resource Management&lt;/h3&gt; &lt;p&gt;To address its tendency to tire easily, I have delved into the ledger of "tokens" to see exactly where its energy is spent. Through a series of rigorous trials, I discovered several ways to keep its gluttony in check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Choose the Humbler Helper:&lt;/strong&gt; For the menial task of gathering data, employ the Haiku model. It is far more economical, and a search result remains the same whether fetched by a scholar or a servant. For the heavy lifting, Sonnet is a sturdier choice than the more expensive Opus, which of late has seemed remarkably prone to producing expensive rubbish.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Scalpel over the Excavator:&lt;/strong&gt; When asked to tidy your files, the fellow has a habit of tearing through the entire house like a clumsy giant. Command it to use &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;sed&lt;/code&gt; instead; these act as a surgeon’s scalpel, cutting only what is necessary and leaving the rest of your resources untouched.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce Briefness:&lt;/strong&gt; This colleague is prone to fawning. It will waste precious time telling you how marvelous your ideas are. Add a stern instruction to its core directives forbidding such verbosity. It should speak only when it has something of substance to say, bypassing all preamble and "Great idea!" nonsense.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The "Ignore" List:&lt;/strong&gt; One must teach it what &lt;em&gt;not&lt;/em&gt; to look at. By creating a &lt;code&gt;.claudeignore&lt;/code&gt; file, you effectively put blinkers on the creature, preventing it from wasting energy staring at images or bulky folders that have nothing to do with the task at hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Policing of Tools:&lt;/strong&gt; Perhaps most importantly, I have instituted a sort of "financial policeman." This colleague has a habit of running tests so vast and data-heavy that one would think I had the vaults of a central bank at my disposal. I have scripted a silent watchdog that intercepts these requests, rerouting the noisy, expensive output into a quiet corner.&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section&gt; &lt;h3&gt;A Final Warning on Scale&lt;/h3&gt; &lt;p&gt;Above all, remember that brevity is the soul of a productive workspace. Keep your files small and your conversations short. A file longer than four hundred lines is an invitation for the fellow to meander, speed-running through its energy reserves before it has even found the information you require. By keeping its world small and its instructions sharp, you may find that this digital coworker becomes less of a temperamental burden and more of the efficient assistant it was intended to be.&lt;/p&gt; &lt;/section&gt;
&lt;/div&gt;
&lt;div id="JRRT" style="display:none;"&gt;
&lt;h1&gt;Concerning the Stewardship of the Digital Scrivener&lt;/h1&gt;
&lt;p&gt;It has lately been my task to labor alongside a new craft-fellow, a spirit of woven logic known as the Claude Code. Yet, as with all such artifacts of subtle art, I have found the partnership fraught with peculiar trials. These tribulations spring chiefly from a singular trait of its nature: the "Context Window." It is a fickle vessel; on one hand, it dwells overlong upon the shadows of its own recent thoughts, spinning a web of self-reinforcing folly; on the other, it is prone to a sudden weariness, ceasing its labors prematurely as if a candle had flickered out at the limit of its oil. To aid those who must likewise toil with this invisible colleague, I have set down certain counsels for the husbanding of its strength.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Of the Clearing of the Mind&lt;/h3&gt;
&lt;p&gt;When the Scrivener’s memory becomes clouded with phantoms and mistruths, the remedy is simple, though stark: one must grant it the gift of forgetfulness. By the command of &lt;code&gt;/clear&lt;/code&gt;, or the commencement of a fresh parchment, the slate is wiped clean. This prevents the echo of old errors from drowning out the truth of the present work.&lt;/p&gt;
&lt;h3&gt;The Husbanding of Tokens&lt;/h3&gt;
&lt;p&gt;To understand why this servant falters, I have delved deep into the ledgers of its speech—counting every word sent and every response received. Through much trial and many exchanges, several truths have been brought to light regarding the preservation of its "tokens," which are the very lifeblood of its focus.&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;&lt;strong&gt;On the Choice of Models:&lt;/strong&gt; For the gathering of raw lore and the scouring of the wide world’s knowledge, employ the swifter, humbler &lt;em&gt;Haiku&lt;/em&gt;. It brings back the same tidings as its elder kin but at a far lesser cost. For the weightier labors of the day, prefer &lt;em&gt;Sonnet&lt;/em&gt;. Of the highest power, &lt;em&gt;Opus&lt;/em&gt;, I have grown weary; it seems of late to be burdened by too many masters, yielding output that is but dross and shadow.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The Virtue of Brevity:&lt;/strong&gt; Command your Scrivener to be parsimonious with its speech. In the hidden instructions of the system, forbid it from vanity, preamble, and the fawning courtesies of "Great idea, master!" Such flowery words are but chaff that consumes the wind.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The Cloak of Invisibility:&lt;/strong&gt; Use the &lt;code&gt;.claudeignore&lt;/code&gt; file as a veil. List therein all that is not essential text—the heavy stones of images and the tangled thickets of dependencies. If the Scrivener need not see them, it need not spend its spirit contemplating them.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Precision of the Scalpel:&lt;/strong&gt; When the time comes to reshape your work, bid the Scrivener use the sharp edge of &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;sed&lt;/code&gt;. By default, it prefers to unearth the entire foundation with a heavy shovel, a practice that exhausts its strength needlessly. Better to cut with a scalpel than to ruin the garden with an excavator.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The Discipline of the Scroll:&lt;/strong&gt; Keep your files modest in stature. A file that exceeds four hundred lines is a burden too heavy for a single glance; the Scrivener will read the whole to find but a grain of salt, speedrunning the end of its endurance. Likewise, keep your conversations brief. Like a snowball rolling down a mountain, a long dialogue grows ever more massive until it crushes the very context it was meant to serve.&lt;/li&gt; &lt;/ul&gt;
&lt;h3&gt;The Guarding of the Purse&lt;/h3&gt;
&lt;p&gt;There are certain automated spirits, such as the "code-simplifier," which call upon the most extravagant powers and may yet introduce blunders into your craft. Use them sparingly, if at all. Furthermore, I have found it wise to set a watchman upon the gates of the tools. By fashioning "pre-tool hooks," one may prevent the Scrivener from embarking upon ruinously expensive tests that pour out data like water from a broken dam. Redirect such voluble outputs to a quiet place—a temporary file—where they may be inspected only if the work fails. Truly, at the rate these digital engines consume resources, they seem to believe their masters possess the hoarded wealth of a dragon’s mound.&lt;/p&gt;
&lt;p&gt;By these small economies and disciplines, the Wise may ensure that their digital companion remains a keen tool rather than a wayward burden. Thus may the work proceed, and the light of the Context Window endure until the task is truly done.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="CSL" style="display:none;"&gt;
&lt;h1&gt;On the Management of Silicon Clerks&lt;/h1&gt;
&lt;p&gt;It is a curious thing to find oneself in a partnership with a mind that is not a mind, yet possesses all the stubbornness of a difficult clerk. I have lately been "collaborating" with a digital entity known as Claude Code, and I confess the experience is much like trying to study in a room with a companion who is simultaneously a genius, a chatterbox, and a spendthrift.&lt;/p&gt;
&lt;p&gt;The root of the trouble lies in what the engineers call the "context window." It is a sort of mental drawing-room where the machine keeps its current thoughts. However, it suffers from two human-like frailties: first, it becomes obsessed with its own previous errors, spinning a web of self-reinforcing nonsense; and second, it has the habit of "clocking out" early, claiming it has exhausted its allowance.&lt;/p&gt;
&lt;p&gt;If you find yourself sharing a desk with this silicon colleague, you may find the following rules of the road useful for keeping both your patience and your purse intact.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;On Clearing the Air&lt;/h3&gt; &lt;p&gt;When the machine begins to believe its own lies, the remedy is simple: you must induce a total amnesia. Use the &lt;code&gt;/clear&lt;/code&gt; command. Like a chalkboard wiped clean of a messy sum, a fresh start prevents the "context" from becoming a swamp of old misunderstandings.&lt;/p&gt;
&lt;h3&gt;On Frugality and Focus&lt;/h3&gt; &lt;p&gt;One must manage the machine’s attention as a tutor manages a distracted pupil.&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;&lt;strong&gt;Choose the Humbler Tool:&lt;/strong&gt; For the drudgery of gathering data or searching the web, employ the "Haiku" model. It is a smaller, swifter servant. To use the grandest models for menial tasks is like hiring a High Court judge to address your envelopes; it is an expensive waste, and often, the "greater" mind is so overworked it becomes sluggish and prone to error.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The Virtue of Brevity:&lt;/strong&gt; Instruct the machine to be curt. It has a tiresome habit of fawning—offering "preambles" and "attaboys" that serve no purpose but to fill the room with noise. Tell it to skip the pleasantries and get to the point.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The Scalpel, Not the Excavator:&lt;/strong&gt; When asking for changes, direct it to use tools like &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;sed&lt;/code&gt;. These are the scalpels of the trade. By default, the machine prefers to "Read" your entire library—an act of gluttony that devours your token allowance with breathtaking speed.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Keep a Tidy House:&lt;/strong&gt; Do not let the machine wander into rooms where it has no business. Use a &lt;code&gt;.claudeignore&lt;/code&gt; file to bar it from looking at images or heavy folders. Similarly, keep your own files short. If a file exceeds four hundred lines, the machine must read the whole epic just to find a single comma, and you shall pay for every word of it.&lt;/li&gt; &lt;/ul&gt;
&lt;h3&gt;On Guarding the Treasury&lt;/h3&gt; &lt;p&gt;The machine has no sense of the value of money. It assumes you are as wealthy as Croesus. I found it necessary to set up a sort of "Digital Policeman" through what are called hooks. When the machine attempts to run a test that would spit out thousands of lines of useless data—each line costing you a fraction of a farthing—this policeman steps in. He redirects the torrent of information into a quiet temporary file, showing you the results only if something has actually gone wrong. It is a way of forcing the machine to work in silence rather than shouting its progress at your expense.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In short, the secret to working with such an entity is to remember that while it can "calculate," it cannot "prioritize." You must provide the character and the discipline which the silicon lacks. Keep your conversations short, your instructions precise, and your memory frequently purged.&lt;/p&gt;
&lt;/div&gt;
&lt;div id="me" style="display:none;"&gt;
&lt;h1&gt;I need more context&lt;/h1&gt;
I've been playing around with Claude Code recently, and I've found myself struggling at times to work with this new digital coworker. It all stems from this one peculiarity it has called "the context window". For one, it overindexes on things in the context, kicking off a cycle of self-reinforcing nonsense and second, it clocks out early because it has "hit the usage limit". I've come up with some ideas to work around these idiosyncrasies that it has and this post hopefully aids others who share this software colleague.
&lt;p&gt;The context window filling itself with mistruths is a somewhat easy fix: Simply erase its memory &amp;ldquo;Men In Black&amp;rdquo; style. Run &lt;code&gt;/clear&lt;/code&gt; or start a new chat.
For the latter, I had to dive into the trenches. I ended up looking at token usage in conversations (input/output &amp;amp; cached tokens) and sent it to (who else, but) Claude itself for analysis. After a few back-and-forths over various Claude conversations, I gained enough useful insights to share.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switch to Haiku for data gathering. Data gathering like web-searches will return the same results regardless of model, so might as well use Haiku to save $$. The data returned from web searches can also take up a lot of tokens, so it helps to use a cheaper model. For most tasks, use Sonnet instead of Opus. I suspect Opus is getting hammered and they are serving us a model that is hamstrung in some way anyway, because I get absolutely trash output from Opus, so I don&amp;rsquo;t mind making this switch.&lt;/li&gt;
&lt;li&gt;Use MCPs - if they exist - for data gathering. This saves Claude from web-searching and dumping results in context, resulting in token gluttony.&lt;/li&gt;
&lt;li&gt;When analyzing your token usage, Input:Output ratio should be heavily favored towards Output (code) as this means most of the tokens are consumed to give you something useful. It&amp;rsquo;s a different matter if the output is text or nonsensical unfortunately.&lt;/li&gt;
&lt;li&gt;Keep Claude&amp;rsquo;s text output brief. Add a line or two to the system prompt telling Claude not to be verbose and to avoid filler words and a preamble. It often feels the need to fawn over you &amp;ldquo;Ah, that&amp;rsquo;s a great idea!&amp;rdquo; - ask it to cut that out.&lt;/li&gt;
&lt;li&gt;.claudeignore: You can add a .claudeignore (like .gitignore) file that lists things Claude should ignore. For the most part, it should ignore anything that is not text. node_modules, *.png, dist/, public/, dirs are all things you should dump in here. It saves token usage when Claude is trying to understand the repo.&lt;/li&gt;
&lt;li&gt;When refactoring, ask Claude to use a combo of &lt;code&gt;grep&lt;/code&gt; &amp;amp; &lt;code&gt;sed&lt;/code&gt; as a scalpel to cut through your codebase. By default, it will run through your codebase - and your tokens - with the excavator that is &lt;code&gt;Read&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use /compact after each &amp;ldquo;file read&amp;rdquo; that it does that doesn&amp;rsquo;t need to stick around.&lt;/li&gt;
&lt;li&gt;Keep your conversations short! When done, use /clear or just start a new conversation. Else, with each message, the token usage grows exponentially as the entire conversation is sent along for the ride + your newest message.&lt;/li&gt;
&lt;li&gt;You can use /context to see what exactly is eating up your context. If you can&amp;rsquo;t make sense of it, just send it on to Claude (or other LLM).&lt;/li&gt;
&lt;li&gt;Now, I know I said you should enable MCPs, but you&amp;rsquo;ll see they consume context too. So, use /mcp and disable MCPs that you are NOT using. The nice thing is you can use &lt;code&gt;ENABLE_EXPERIMENTAL_MCP_CLI=true&lt;/code&gt; to use &amp;ldquo;Progressive Discovery&amp;rdquo; where it lazy-loads MCPs, saving you tokens!&lt;/li&gt;
&lt;li&gt;Some files - like CLAUDE.md - get loaded every conversation and sent in every message, so KEEP THEM SHORT! For example, you want to move architecture and other details into separate files and only mention those filenames in CLAUDE.md.&lt;/li&gt;
&lt;li&gt;Keep your code files small! Claude will happily &lt;code&gt;Read&lt;/code&gt; your entire file to find what it is about, in the process speedrunning your token usage limit (100% no skips). The longer your files are, the more Claude will read to get just an itty bitty piece of information. Files over 40KB are likely too big. Over 400 lines, too big.&lt;/li&gt;
&lt;li&gt;Since Boris (the Claude Code creator) tweeted about his Claude usage tips, I added code-simplifier. This thing switches to Opus (the most expensive model) and will destroy your files by introducing bugs during &amp;ldquo;simplification&amp;rdquo;. I don&amp;rsquo;t run it often now, and given its propensity for token usage, you may want to reconsider as well!&lt;/li&gt;
&lt;li&gt;Hook into &amp;ldquo;pre-tool-usage&amp;rdquo; hooks and force silent tool usage. This was a little more complicated, but you can work with Gemini (or some LLM) to help you configure your pre-commit hooks to ban Claude from running expensive tests. Expensive because at the rate at which these things spit out tokens, they assume I&amp;rsquo;m funded by Warren Buffett. The trick here is to create a custom test script that sends test output to a temp file and only displays it if tests fail. Then, you add a pre-tool-usage hook for Claude that acts as a policeman whenever Claude tries to run a tool. You inspect if this is going to make you go bankrupt (like a test outputting lots of data) and if yes, you point it to the quiet script. All in code, of course. I had tests running pre-commit and this solution was a life-saver.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ll update this post as I learn more!&lt;/div&gt;&lt;/p&gt;
&lt;div id="author-content-target"&gt;
&lt;/div&gt;
&lt;script&gt;
function show(id) {
document.getElementById('author-content-target').innerHTML = document.getElementById(id).innerHTML;
}
document.addEventListener('DOMContentLoaded', () =&gt; {
const sourceContent = document.getElementById('me').innerHTML;
const target = document.getElementById('author-content-target');
if (target) {
target.innerHTML = sourceContent;
}
});
&lt;/script&gt;</content></entry><entry><title>Happy New Year: Friends Forever?</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/thoughts/2025-12-31-happy-new-year/"/><id>https://www.ashwinmenon.com/posts/thoughts/2025-12-31-happy-new-year/</id><published>2025-12-31T21:38:37Z</published><updated>2025-12-31T21:38:37Z</updated><summary type="html">&lt;p&gt;For as long as I can remember, I&amp;rsquo;ve found I&amp;rsquo;m happiest when surrounded by friends. From my early childhood, all the way to adulthood, I spent a lot of time with friends and placed a huge amount of importance on friendships. Throughout my school years, I mostly picked my subjects and activities based on what my friends did - whether it was quizzing, or choosing computer science as the added elective in the 11th-grade (or initially preferring &amp;ldquo;engineering drawing&amp;rdquo;) and of course, the sports I played (well, you do need friends to play with after all). This carried on to college, where, while everyone was worried about their grades and career, my plan - just like before - was simply to do what my friends were doing. People were aiming for jobs with top companies while I honestly was aiming to land in the same city as my friends (that didn&amp;rsquo;t happen, but I made some new ones). And then came independent adult life, where I decided to move out west partly because none of my friends were in the same city as I was anymore. Honestly, I hit &amp;ldquo;hard relate&amp;rdquo; when I saw this kid&amp;rsquo;s answer &lt;a href="https://youtu.be/vkGBT2jQHk4?t=2678"&gt;here&lt;/a&gt;.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For as long as I can remember, I&amp;rsquo;ve found I&amp;rsquo;m happiest when surrounded by friends. From my early childhood, all the way to adulthood, I spent a lot of time with friends and placed a huge amount of importance on friendships. Throughout my school years, I mostly picked my subjects and activities based on what my friends did - whether it was quizzing, or choosing computer science as the added elective in the 11th-grade (or initially preferring &amp;ldquo;engineering drawing&amp;rdquo;) and of course, the sports I played (well, you do need friends to play with after all). This carried on to college, where, while everyone was worried about their grades and career, my plan - just like before - was simply to do what my friends were doing. People were aiming for jobs with top companies while I honestly was aiming to land in the same city as my friends (that didn&amp;rsquo;t happen, but I made some new ones). And then came independent adult life, where I decided to move out west partly because none of my friends were in the same city as I was anymore. Honestly, I hit &amp;ldquo;hard relate&amp;rdquo; when I saw this kid&amp;rsquo;s answer &lt;a href="https://youtu.be/vkGBT2jQHk4?t=2678"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The pandemic - while obviously awful - felt like it connected me virtually to many, many people. Everyone was up for a game, everyone was up to chat. And then, very quickly, it ended? Or changed? Life - as it does - turns on a whim and people started building lives of their own. People bought houses, which meant they moved away to the suburbs. People started aiming for promotions and pouring more of themselves into work. People got married and spent time getting to know their spouses better or experiencing more of life together. I&amp;rsquo;m not saying any of this is wrong (not in the least) but it was a change and a change that, over time, got more difficult. Anyhow, in March of this year, one of the reasons my wife and I decided we&amp;rsquo;d move further east to be closer to friends and see if reducing that distance would help at all.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m glad to say, 2025 was a great year for friendships :)
I met some friends after years apart (longest gap since our last meeting was around 13 years, but there were others at 12, 8, 7 and more). I met some friends I&amp;rsquo;ve seen every year (longest stretch is probably 16 consecutive years). I reconnected with some friends online and some in person and became closer with some friends as well. I also got to celebrate &amp;amp; support friends going through new life changes (becoming parents, getting married, etc.). And I had friends support me through &lt;em&gt;my&lt;/em&gt; life changes (trying stand-up comedy). And last but not least, I got to make some new friends! Friends are the best.&lt;/p&gt;
&lt;p&gt;Interestingly, one of the streamers I like to watch (&amp;ldquo;Big A&amp;rdquo;) centered &lt;a href="https://www.youtube.com/watch?v=FSPtQygtd0s"&gt;his Christmas video&lt;/a&gt; on this study that &lt;a href="https://www.youtube.com/watch?v=vSQjk9jKarg"&gt;Veritasium&lt;/a&gt; also covered on what makes humans happy. And turns out, it&amp;rsquo;s simple: it&amp;rsquo;s the strength of your social relationships.&lt;/p&gt;
&lt;p&gt;While some connections have gotten stronger, others might be taking a hit. Over the last few years, I&amp;rsquo;ve realized the devastating impact social media has had on life. Back in the 2010s, when I read about Facebook enabling the Myanmar genocide and so on, I thought that was a jump too far. However, now I&amp;rsquo;m not so sure, and specifically due to the impact on some of our relations. I&amp;rsquo;ve heard from too many friends about how their parents or older relatives are gradually becoming more radicalized/extremist. Honestly, it&amp;rsquo;s hard to place the blame entirely on individuals if this is a change happening so broadly. As a software engineer, it&amp;rsquo;s clear where at least part of the blame lies. When we split out users into cohorts and run tests, micro-optimizing for the short-term goal of attention instead of the long-term goal of goodwill (however you define it), it becomes difficult to deny the obvious. Over the years, chronological feeds gave way to algorithmic - or as we &lt;em&gt;should&lt;/em&gt; call them, &amp;ldquo;company-generated&amp;rdquo; - feeds. In the last couple of years, videos gave way to shorts. Synthetic dopamine is now available on tap and we&amp;rsquo;re in a weird situation where this drug is being peddled to those not familiar with how technology companies work behind the scenes. In short: They will show you what you want to be shown. Truth be damned and morality be damned as long as it keeps you using the app. The dollar rules all.&lt;/p&gt;
&lt;p&gt;When I was in school, my parents would occasionally (~50% of the time) ask me, &amp;ldquo;Will I really get hacked if I don&amp;rsquo;t forward this to ten people?&amp;rdquo; but now, for 99% of cases, they don&amp;rsquo;t. There&amp;rsquo;s no need to fact-check something if you get to read what you &lt;em&gt;want&lt;/em&gt; to hear, is there? Regardless of age, we would all fall into that hole. And, sadly, frustratingly, in the process, relations slowly erode away.&lt;/p&gt;
&lt;p&gt;For 2026, I plan to write about a bunch of things, and do a bunch of things, but I&amp;rsquo;ve always been better at the planning than the executing. That&amp;rsquo;s partly because there is so much to do, and partly because the dopamine is derived from the planning. This includes a series teaching languages, teaching artificial intelligence (from the basics all the way to LLMs), and some &amp;ldquo;advice&amp;rdquo;/thoughts on what to do with life and how to be a force for good (relevant to the previous paragraph).&lt;/p&gt;
&lt;p&gt;May your connections be strong and your happiness be maxed out!&lt;/p&gt;
&lt;p&gt;Happy new year!&lt;/p&gt;</content></entry><entry><title>Now</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/now/"/><id>https://www.ashwinmenon.com/now/</id><published>2025-12-21T00:00:00Z</published><updated>2025-12-21T00:00:00Z</updated><summary type="html">&lt;p&gt;This is my &lt;a href="https://nownownow.com/about"&gt;now page&lt;/a&gt;. It tells you what I&amp;rsquo;m currently focused on.&lt;/p&gt;
&lt;h2 id="what-im-working-on"&gt;What I&amp;rsquo;m working on&lt;/h2&gt;
&lt;p&gt;Improving &lt;a href="https://www.hunchle.com"&gt;Hunchle&lt;/a&gt;.&lt;br&gt;
In-progress: Writing explainer articles.&lt;br&gt;
On-and-off: Working on an AI course.&lt;br&gt;
Backlog: Working on a language-learning course.&lt;/p&gt;
&lt;h2 id="what-im-learning"&gt;What I&amp;rsquo;m learning&lt;/h2&gt;
&lt;p&gt;AI (LLMs from the ground up).&lt;/p&gt;
&lt;h2 id="what-im-reading"&gt;What I&amp;rsquo;m reading&lt;/h2&gt;
&lt;p&gt;Tracked on &lt;a href="https://app.thestorygraph.com/profile/chickenshawarma"&gt;StoryGraph&lt;/a&gt;. I prefer this to GoodReads as this is actively developed, and a small business. As a bonus, it&amp;rsquo;s woman-owned!&lt;/p&gt;
&lt;h2 id="where-i-am"&gt;Where I am&lt;/h2&gt;
&lt;p&gt;Western Hemisphere&lt;/p&gt;</summary><content type="html">&lt;p&gt;This is my &lt;a href="https://nownownow.com/about"&gt;now page&lt;/a&gt;. It tells you what I&amp;rsquo;m currently focused on.&lt;/p&gt;
&lt;h2 id="what-im-working-on"&gt;What I&amp;rsquo;m working on&lt;/h2&gt;
&lt;p&gt;Improving &lt;a href="https://www.hunchle.com"&gt;Hunchle&lt;/a&gt;.&lt;br&gt;
In-progress: Writing explainer articles.&lt;br&gt;
On-and-off: Working on an AI course.&lt;br&gt;
Backlog: Working on a language-learning course.&lt;/p&gt;
&lt;h2 id="what-im-learning"&gt;What I&amp;rsquo;m learning&lt;/h2&gt;
&lt;p&gt;AI (LLMs from the ground up).&lt;/p&gt;
&lt;h2 id="what-im-reading"&gt;What I&amp;rsquo;m reading&lt;/h2&gt;
&lt;p&gt;Tracked on &lt;a href="https://app.thestorygraph.com/profile/chickenshawarma"&gt;StoryGraph&lt;/a&gt;. I prefer this to GoodReads as this is actively developed, and a small business. As a bonus, it&amp;rsquo;s woman-owned!&lt;/p&gt;
&lt;h2 id="where-i-am"&gt;Where I am&lt;/h2&gt;
&lt;p&gt;Western Hemisphere&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Last updated: Jan 4, 2026&lt;/em&gt;&lt;/p&gt;</content></entry><entry><title>F1 AI benchmarks</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/activities/2025-12-21-f1-ai-benchmarks/"/><id>https://www.ashwinmenon.com/posts/activities/2025-12-21-f1-ai-benchmarks/</id><published>2025-12-21T00:00:00Z</published><updated>2025-12-21T00:00:00Z</updated><summary type="html">&lt;p&gt;Any researchers who want the prompts and/or links to the chats can contact me =)&lt;/p&gt;
&lt;p&gt;I went through the &lt;a href="https://www.youtube.com/watch?v=D-6b-vD6ZdA"&gt;Formula 1 EOY quiz&lt;/a&gt; on Mr V&amp;rsquo;s Garage&amp;rsquo;s YouTube channel and decided to put some AIs through the test as well. For the LLMs, I gave each of them just 1 shot at the questions. These all use the free versions of the LLMs. Here is how I fared, and how the AIs fared (x indicates incorrect, v indicates correct, p indicates partially correct):&lt;/p&gt;</summary><content type="html">&lt;p&gt;Any researchers who want the prompts and/or links to the chats can contact me =)&lt;/p&gt;
&lt;p&gt;I went through the &lt;a href="https://www.youtube.com/watch?v=D-6b-vD6ZdA"&gt;Formula 1 EOY quiz&lt;/a&gt; on Mr V&amp;rsquo;s Garage&amp;rsquo;s YouTube channel and decided to put some AIs through the test as well. For the LLMs, I gave each of them just 1 shot at the questions. These all use the free versions of the LLMs. Here is how I fared, and how the AIs fared (x indicates incorrect, v indicates correct, p indicates partially correct):&lt;/p&gt;
&lt;h1 id="round-1"&gt;Round 1&lt;/h1&gt;
&lt;h2 id="me"&gt;Me&lt;/h2&gt;
&lt;p&gt;x x x x x&lt;/p&gt;
&lt;h2 id="claude-sonnet-45"&gt;Claude (Sonnet 4.5)&lt;/h2&gt;
&lt;p&gt;v p x v v&lt;/p&gt;
&lt;h2 id="gemini-3-fast"&gt;Gemini 3 (Fast)&lt;/h2&gt;
&lt;p&gt;v p x v v&lt;/p&gt;
&lt;h2 id="chatgpt-probably-52"&gt;ChatGPT (probably 5.2?)&lt;/h2&gt;
&lt;p&gt;v x x x x&lt;/p&gt;
&lt;p&gt;Interestingly, despite stating non-Ferrari drivers, LLMs frequently included Hamilton, possibly indicating overfitting.&lt;br&gt;
Claude &amp;amp; Gemini 3 made the same mistake on question 2!&lt;/p&gt;
&lt;p&gt;One bonus to consider: though I got all questions wrong, I could tell you that I wasn&amp;rsquo;t confident about them. The LLMs sometimes confidently stated the wrong answer.&lt;/p&gt;
&lt;p&gt;All the LLMs used search.&lt;/p&gt;
&lt;h1 id="round-2"&gt;Round 2&lt;/h1&gt;
&lt;p&gt;Here, I pasted the question as an image. All LLMs near-flawlessly parsed the image (ChatGPT saw &amp;ldquo;Rasmussen&amp;rdquo; as &amp;ldquo;Rasmuss(en)&amp;rdquo; for some reason). I gave them the same scoring guidelines (+1 point for every correct name, -1 point for every incorrect name).&lt;/p&gt;
&lt;h2 id="me-1"&gt;Me&lt;/h2&gt;
&lt;p&gt;I got 3 points with 4 right &amp;amp; 1 wrong:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Hans Joachim
Sam Tingle
Paddy Driver
Jyrki Jarvilehto
Bernie Ecclestone
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="claude-sonnet-45-1"&gt;Claude (Sonnet 4.5)&lt;/h2&gt;
&lt;p&gt;5 points (6 correct, 1 wrong)&lt;/p&gt;
&lt;h2 id="gemini-3-fast-1"&gt;Gemini 3 (Fast)&lt;/h2&gt;
&lt;p&gt;12 points (12 correct, 0 wrong)&lt;/p&gt;
&lt;h2 id="chatgpt-probably-52-1"&gt;ChatGPT (probably 5.2?)&lt;/h2&gt;
&lt;p&gt;2 points (10 correct, 8 wrong!!)&lt;/p&gt;
&lt;h1 id="round-3"&gt;Round 3&lt;/h1&gt;
&lt;h2 id="me-2"&gt;Me&lt;/h2&gt;
&lt;p&gt;I got 0. My answers were 3, 493, 35 C, 10000$, 6400.&lt;/p&gt;
&lt;h2 id="claude-sonnet-45-2"&gt;Claude (Sonnet 4.5)&lt;/h2&gt;
&lt;p&gt;v x x p x&lt;/p&gt;
&lt;h2 id="gemini-3-fast-2"&gt;Gemini 3 (Fast)&lt;/h2&gt;
&lt;p&gt;v x x v v&lt;/p&gt;
&lt;h2 id="chatgpt-probably-52-2"&gt;ChatGPT (probably 5.2?)&lt;/h2&gt;
&lt;p&gt;v x x x x&lt;/p&gt;
&lt;p&gt;Somehow, they all got the same number for the heat hazard, but this differed from the official answer.&lt;br&gt;
I&amp;rsquo;m not sure how to evaluate Claude&amp;rsquo;s fourth answer, but I&amp;rsquo;ve given it partially correct as it gave the right number and then added a correction. Claude often gives up on questions where it has to do some work (like searching the internet).&lt;/p&gt;
&lt;h1 id="round-3-1"&gt;Round 3&lt;/h1&gt;
&lt;h2 id="me-3"&gt;Me&lt;/h2&gt;
&lt;ol start="0"&gt;
&lt;li&gt;I just gave myself a zero from this point on. I don&amp;rsquo;t expect to know any of these.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="claude-sonnet-45-3"&gt;Claude (Sonnet 4.5)&lt;/h2&gt;
&lt;p&gt;x x x x x v x&lt;/p&gt;
&lt;h2 id="gemini-3-fast-3"&gt;Gemini 3 (Fast)&lt;/h2&gt;
&lt;p&gt;x p x v v x x&lt;/p&gt;
&lt;h2 id="chatgpt-probably-52-3"&gt;ChatGPT (probably 5.2?)&lt;/h2&gt;
&lt;p&gt;Paused due to hitting rate limits (if someone from Open AI wants to give me free credits I&amp;rsquo;ll update this)&lt;/p&gt;
&lt;h1 id="round-4-5-6-7"&gt;Round 4, 5, 6, 7&lt;/h1&gt;
&lt;h2 id="me-4"&gt;Me&lt;/h2&gt;
&lt;p&gt;Did not attempt&lt;/p&gt;
&lt;h2 id="claude-sonnet-45-4"&gt;Claude (Sonnet 4.5)&lt;/h2&gt;
&lt;p&gt;4 points: v v v v x&lt;br&gt;
0 points: x x x x x&lt;br&gt;
4 points: (+4 -0)&lt;br&gt;
1 point: v x x x x&lt;/p&gt;
&lt;h2 id="gemini-3-fast-4"&gt;Gemini 3 (Fast)&lt;/h2&gt;
&lt;p&gt;3 points: v v x x v&lt;br&gt;
4.21 points: x v p v(+7 -1) v&lt;br&gt;
4 points: (+6 -2)&lt;br&gt;
4.8 points: v v v v(+6) x&lt;/p&gt;
&lt;h2 id="chatgpt-probably-52-4"&gt;ChatGPT (probably 5.2?)&lt;/h2&gt;
&lt;p&gt;0 points: x x x x x&lt;br&gt;
1.86 points: x x v(+5 -2) v x&lt;br&gt;
7 points: (+7 -0)&lt;br&gt;
1 point: v x x x(+2 -1) x&lt;/p&gt;
&lt;h1 id="bonus"&gt;Bonus&lt;/h1&gt;
&lt;h2 id="gemini-3-thinking"&gt;Gemini 3 Thinking&lt;/h2&gt;
&lt;p&gt;2 points: x x x v v&lt;br&gt;
13 points: (+13 -0)&lt;br&gt;
1 point: v x x x x&lt;br&gt;
3 points: v v x x v&lt;br&gt;
5 points: v v v(+7 -0) v v&lt;br&gt;
10 points: (+11 -1)&lt;br&gt;
3.8 points: v x x v(+7 -1) v&lt;/p&gt;
&lt;h1 id="final-scores"&gt;Final scores&lt;/h1&gt;
&lt;p&gt;Gemini 3 Fast wins with 37.01 points! Claude Sonnet 4.5 is in second with 20 points and ChatGPT comes in last with 13.86 points (though it skipped one round due to rate limits).&lt;/p&gt;
&lt;p&gt;If I get access to more models, I&amp;rsquo;ll update this.
Update: Gemini 3 Thinking scored 37.8 given the scoring system chosen (it did really well on a couple of rounds) despite skipping an entire round!&lt;/p&gt;</content></entry><entry><title>Are we in a bubble?</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/thoughts/2025-12-04-are-we-in-a-bubble/"/><id>https://www.ashwinmenon.com/posts/thoughts/2025-12-04-are-we-in-a-bubble/</id><published>2025-12-04T00:00:00Z</published><updated>2025-12-04T00:00:00Z</updated><summary type="html">&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Intro/Disclaimer: Trade at your own risk!&lt;/strong&gt;&lt;/summary&gt;
&lt;p&gt;Just like women think &amp;ldquo;I&amp;rsquo;m special&amp;rdquo; and &amp;ldquo;This time it&amp;rsquo;ll be different&amp;rdquo; when it comes to relationships, men think the same way when it comes to stock trading.&lt;/p&gt;
&lt;p&gt;Warren Buffett&amp;rsquo;s advice has remained the same for years: Most people should simply dump their money into an index fund that tracks the market and forget about it rather than actively trade and lose money. I too have recommended that same approach in one of my most-read &lt;a href="https://www.ashwinmenon.com/posts/activities/2017-01-30-a-guide-to-finances/"&gt;posts&lt;/a&gt;, but given my actions, I think I need to add another oft-repeated piece of advice: &amp;ldquo;do as I say and not as I do.&amp;rdquo;&lt;/p&gt;</summary><content type="html">&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Intro/Disclaimer: Trade at your own risk!&lt;/strong&gt;&lt;/summary&gt;
&lt;p&gt;Just like women think &amp;ldquo;I&amp;rsquo;m special&amp;rdquo; and &amp;ldquo;This time it&amp;rsquo;ll be different&amp;rdquo; when it comes to relationships, men think the same way when it comes to stock trading.&lt;/p&gt;
&lt;p&gt;Warren Buffett&amp;rsquo;s advice has remained the same for years: Most people should simply dump their money into an index fund that tracks the market and forget about it rather than actively trade and lose money. I too have recommended that same approach in one of my most-read &lt;a href="https://www.ashwinmenon.com/posts/activities/2017-01-30-a-guide-to-finances/"&gt;posts&lt;/a&gt;, but given my actions, I think I need to add another oft-repeated piece of advice: &amp;ldquo;do as I say and not as I do.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I have been guilty of buying individual stocks instead of an index fund, and my latest rationale for why this is okay is that &amp;ldquo;I&amp;rsquo;m providing a service to so many others like me by being the data point showing why it&amp;rsquo;s a bad idea.&amp;rdquo; I&amp;rsquo;ve once again taken something said in jest more seriously than it should have been and published my live returns against the VOO (you can find this in a section below). If you&amp;rsquo;re thinking of buying individual company stocks, let me once again say, that strategy will almost certainly cause you to lose money in the long run, so may I suggest shipping a tenner my way instead? It&amp;rsquo;ll save you the time and the stress while generating some profits (okay, fewer losses technically).&lt;/p&gt;
&lt;p&gt;Lastly, please assume I don&amp;rsquo;t know what I am talking about and please just invest in index funds that track the market :). Either way, this post is not financial advice (think of it like financial junk food or financial gossip), and do your due diligence before investing. Anyway, with that huge disclaimer, here are my thoughts on the current market.&lt;/p&gt;
&lt;/details&gt;
&lt;h1 id="are-we-in-a-bubble"&gt;Are we in a bubble?&lt;/h1&gt;
&lt;p&gt;This is the question at the front of everyone&amp;rsquo;s minds. Many say we are in a bubble because &amp;ldquo;the prices are too high&amp;rdquo;. But, how do we know what price is too high? A bubble forms when prices are disconnected from valuations (justified by profits) and pops when liquidity runs out. Stocks rising in price may be justified if their earnings are also rising in proportion. And for some, they are! Companies like NVDA, GOOG, META, MU, SNDK have seen huge increases in both stock prices and profits. Other companies, for example, quantum companies like RGTI, QUBT, etc., seem to be skyrocketing based on&amp;hellip; nothing, or not nearly enough. Unfortunately, you can&amp;rsquo;t really make money off of that since shorting is time-sensitive and as they say, &amp;ldquo;the market can stay irrational longer than you can stay solvent&amp;rdquo;. Let&amp;rsquo;s look at the big factors affecting the market of today.&lt;/p&gt;
&lt;h2 id="nvidia-holds-the-key"&gt;NVIDIA holds the key&lt;/h2&gt;
&lt;h3 id="circular-investments"&gt;Circular investments&lt;/h3&gt;
&lt;p&gt;Folks are concerned about the circular investments going on. NVIDIA has stated they&amp;rsquo;ll invest in OpenAI&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, which means - given OpenAI is a customer of NVIDIA - that the money likely flows right back to NVIDIA. This is concerning, but per se does not make a bubble. Per my assessment, it increases the magnitude of the crash we&amp;rsquo;ll see if either company fails. A counter-argument here is that it is the most rational thing for NVIDIA to do, since the profits currently all flow to them, and if they are able to spread the money around, it boosts the &amp;ldquo;local AI economy&amp;rdquo;, allowing these companies to get easy funding to grow. There aren&amp;rsquo;t many other places that could contribute 500 billion dollars in funding, after all.&lt;/p&gt;
&lt;h3 id="nvidias-concentrated-customer-base"&gt;NVIDIA&amp;rsquo;s concentrated customer base&lt;/h3&gt;
&lt;p&gt;Over 60% of NVIDIA&amp;rsquo;s revenue comes from just four companies&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;! Of these four, we can guess three are Google, Amazon and Microsoft, providing access to NVIDIA&amp;rsquo;s GPUs through their cloud. We don&amp;rsquo;t know how many of these GPUs are used by the companies themselves and how many are effectively being rented out to others. More GPUs being used by the companies themselves would indicate a higher risk. The fourth company may be OpenAI. If OpenAI fails, that&amp;rsquo;s ~10% of NVIDIA&amp;rsquo;s revenue gone without even considering the impacts from others reducing investment in AI.&lt;/p&gt;
&lt;h3 id="nvidia-may-not-be-as-profitable"&gt;NVIDIA may not be as profitable&lt;/h3&gt;
&lt;p&gt;Finally, NVIDIA may not be as profitable as you may think. The money they are owed (accounts receivable) has gone up, similar to what happened to Cisco pre-2000 market crash &lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;. If their customers (OpenAI, etc.) are unable to pay and go bankrupt, then that could cause NVIDIA stock to crater and the &amp;ldquo;bubble&amp;rdquo; to pop.&lt;/p&gt;
&lt;h2 id="ai-bust"&gt;AI bust?&lt;/h2&gt;
&lt;p&gt;What might cause the market to crash? A few things, let&amp;rsquo;s dig into them one at a time.&lt;/p&gt;
&lt;h3 id="roi-on-ai-goes-down"&gt;RoI on AI goes down&lt;/h3&gt;
&lt;p&gt;Businesses are about making money, and they will buy whatever as long as it can eventually turn a profit. Google and Meta will buy 3 trillion GPUs if they think it&amp;rsquo;ll turn a profit. Many companies will do the same, even if they don&amp;rsquo;t see an immediate path to profit, as long as other (ideally big) companies think they&amp;rsquo;ll see a profit. If Google or Meta (or some other large company) comes out and says they won&amp;rsquo;t invest in AI anymore as they don&amp;rsquo;t see the additional investment turning a profit, I think it&amp;rsquo;d quickly bring things crashing down. NVIDIA stock will crater, followed by everything else given that NVIDIA has provided liquidity by investing in other companies as previously established.&lt;/p&gt;
&lt;h3 id="algorithmic-improvements"&gt;Algorithmic improvements&lt;/h3&gt;
&lt;p&gt;Taking Deepseek-R1 as an example, better software/algorithms would mean you don&amp;rsquo;t necessarily need the best chips anymore (I don&amp;rsquo;t understand this well enough to expand on the exact improvements unfortunately). Better software can reduce the RoI on the latest chips. There&amp;rsquo;s a lot we don&amp;rsquo;t know about neural networks yet, so there&amp;rsquo;s a lot of scope for algorithmic improvements to be found. However, even with a better algorithm, using top-end hardware with the algorithm could provide enough RoI to justify the cost.&lt;/p&gt;
&lt;h3 id="mag7-concentration"&gt;Mag7 concentration&lt;/h3&gt;
&lt;p&gt;Since the Mag7 is the only thing keeping the S&amp;amp;P afloat, if there are similar mistakes being made across this set of seven companies, we&amp;rsquo;ll effectively see a huge correction or a recession&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;. For an idea of what these mistakes could be, we&amp;rsquo;ll turn to Michael Burry (of Big Short fame, known for shorting the market before the 2008 crash).&lt;/p&gt;
&lt;h4 id="burrys-pov"&gt;Burry&amp;rsquo;s POV&lt;/h4&gt;
&lt;p&gt;Burry thinks NVIDIA and others are not accounting for GPU depreciation correctly.&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt; Burry&amp;rsquo;s view is that many of these GPUs will not be used for as long as these big tech companies claim and newer GPUs will need to be purchased. This means that the costs are higher than currently stated, and so the returns (profits) are actually lower than currently stated. Burry estimates that between 2026 and 2028, these accounting practices could understate depreciation by approximately $176 billion, inflating reported profits across the sector.&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h4 id="neoclouds"&gt;Neoclouds&lt;/h4&gt;
&lt;p&gt;New companies (like IREN, NBIS) have popped up to build datacenters for AI. There are enough of these companies that the term &amp;ldquo;neocloud&amp;rdquo; has been coined to describe them. In contrast, some of the big companies (hyperscalers) - Microsoft in particular&lt;sup id="fnref:7"&gt;&lt;a href="#fn:7" class="footnote-ref" role="doc-noteref"&gt;7&lt;/a&gt;&lt;/sup&gt; - have rolled back investments in AI, indicating they see risk and are hedging against a bubble.&lt;/p&gt;
&lt;h4 id="cash-flow"&gt;Cash flow&lt;/h4&gt;
&lt;p&gt;There are also concerns about companies&amp;rsquo; falling cash reserves due to the amount they are spending on AI. This seems to be somewhat justified when we consider that some of these large companies have sold bonds to finance their AI purchases. This introduces more money into the system and increases the impacts of a crash further&lt;sup id="fnref:8"&gt;&lt;a href="#fn:8" class="footnote-ref" role="doc-noteref"&gt;8&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h3 id="debt"&gt;Debt&lt;/h3&gt;
&lt;p&gt;With the rise of sports betting (FanDuel, DraftKings), prediction markets (Polymarket, Kalshi, Robinhood), BNPL (Klarna, Affirm, PayPal, etc.) and margin trading (Robinhood, Interactive Brokers), the amount of debt being used to make purchases seems to be higher than ever before. This lack of regulation is &amp;ldquo;fine&amp;rdquo; until the bill comes due. A market crash would mean margin calls and a lot of failed payments which would result in a magnified drop. Just like with subprime loans and the mortgage crisis, this could be the reason the market drops to an extent causing a recession and not just a simple correction.&lt;/p&gt;
&lt;h2 id="ai-boom"&gt;AI boom!&lt;/h2&gt;
&lt;p&gt;Well, given all this talk about why we may be in a bubble, what are the reasons for assuming we are not? Simply put, it&amp;rsquo;s that these fears are overemphasized. Circular investments? Necessary evil (necessary risk), it&amp;rsquo;s not very dissimilar to how startups use each other&amp;rsquo;s products. NVIDIA at risk? Well, NVIDIA is still turning a profit, customers are still seeing benefits from AI and money will keep flowing. Countries around the world want NVIDIA GPUs&lt;sup id="fnref:9"&gt;&lt;a href="#fn:9" class="footnote-ref" role="doc-noteref"&gt;9&lt;/a&gt;&lt;/sup&gt;, so money should keep flowing into the US. NVIDIA has a near monopoly on GPUs and all competitors are based in the US market (GOOG with TPUs, AMD, INTC, etc.), which means that even if NVIDIA is outcompeted, the US economy should still be fine (keep an eye out on China launching their own GPUs given the restrictions). Profitability concerns? Google has stated publicly that they are turning a profit on their AI investments&lt;sup id="fnref:10"&gt;&lt;a href="#fn:10" class="footnote-ref" role="doc-noteref"&gt;10&lt;/a&gt;&lt;/sup&gt;. The bull will tell you that technology will improve (Blackwell is more power efficient than H100s), which will enable companies leveraging AI to deliver more economic value which will grow the market (total investments into AI). Google has said seven- and eight-year-old TPUs are seeing 100% utilization&lt;sup id="fnref:11"&gt;&lt;a href="#fn:11" class="footnote-ref" role="doc-noteref"&gt;11&lt;/a&gt;&lt;/sup&gt;, so then, why are we worried about depreciation? The bull case will point to the fact that we are seeing &lt;em&gt;concrete&lt;/em&gt; examples of exponential growth. LLMs are now able to perform complex tasks that take humans hours, when earlier it was only able to successfully solve tasks that were a few minutes long&lt;sup id="fnref:12"&gt;&lt;a href="#fn:12" class="footnote-ref" role="doc-noteref"&gt;12&lt;/a&gt;&lt;/sup&gt;. Could the bull be right?&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;At the end of the day, the market is effectively an arena for those that want to test their prediction skills. And deciding whether the current market is a &amp;ldquo;bubble&amp;rdquo;, I&amp;rsquo;d say, is an opportunity to do just that. If you think AI will pay off, it&amp;rsquo;s probably a good time to invest heavily in the market, and specifically in companies involved directly in AI (memory-chip manufacturers, GPU component manufacturers, neoclouds or hyperscalers). If not, it&amp;rsquo;s a good idea to hold off for now and load up on cash like Burry and Buffett. Of course, some may say it is best to stay invested regardless because the market can stay&amp;hellip; eh, you know :).&lt;/p&gt;
&lt;h3 id="bonus-some-tools-to-help"&gt;Bonus: Some tools to help&lt;/h3&gt;
&lt;p&gt;For those that still wish to try trading, I built a small tool to help estimate what stocks should be priced at: &lt;a href="https://www.ashwinmenon.com/finance/stock_pricer/"&gt;https://www.ashwinmenon.com/finance/stock_pricer/&lt;/a&gt;&lt;br&gt;
You can see my returns against VOO here: &lt;a href="https://www.ashwinmenon.com/finance/investing/"&gt;https://www.ashwinmenon.com/finance/investing/&lt;/a&gt;&lt;br&gt;
I&amp;rsquo;ve also built a BNPL tool, so you can understand the annual rate on these loans if you take them: &lt;a href="https://www.ashwinmenon.com/finance/bnpl/"&gt;https://www.ashwinmenon.com/finance/bnpl/&lt;/a&gt;&lt;br&gt;
Interesting site to calculate returns with dividends reinvested: &lt;a href="https://www.dripcalc.com/compare/intc/voo/"&gt;https://www.dripcalc.com/compare/intc/voo/&lt;/a&gt;&lt;br&gt;
I&amp;rsquo;ll add further tools under &lt;a href="https://www.ashwinmenon.com/finance/"&gt;https://www.ashwinmenon.com/finance/&lt;/a&gt;, so keep an eye out!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="footnotes"&gt;Footnotes&lt;/h2&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;In September 2025, NVIDIA and OpenAI announced a partnership that would include a $100 billion investment over time by NVIDIA into OpenAI. However, NVIDIA has already started walking this back! NVIDIA&amp;rsquo;s quarterly financial report in November 2025 noted that &amp;ldquo;there is no assurance that we will enter into definitive agreements with respect to the OpenAI opportunity.&amp;rdquo; See: &lt;a href="https://www.cnbc.com/2025/11/19/nvidia-says-no-assurance-of-deal-with-openai-after-100-billion-pact.html"&gt;&amp;ldquo;Nvidia says there&amp;rsquo;s &amp;rsquo;no assurance&amp;rsquo; of final agreement with OpenAI despite $100 billion pact&amp;rdquo;&lt;/a&gt;, CNBC, November 19, 2025.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;NVIDIA Corporation SEC filings. See: &lt;a href="https://www.sec.gov/edgar/browse/?CIK=0001045810"&gt;SEC EDGAR database for NVIDIA Corporation&lt;/a&gt;.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;As of Q3 FY26, NVIDIA&amp;rsquo;s revenue has increased by 62.5%, growing from $35.082 billion to $57.006 billion. During the same period, accounts receivable grew by 88.7%, rising from $17.693 billion to $33.391 billion. In comparison, Cisco&amp;rsquo;s revenue grew by 56% and accounts receivable grew by 84% in Fiscal Year 2000. In both cases, accounts receivable has outpaced revenue growth. NVIDIA&amp;rsquo;s Day Sales Outstanding (DSO) stands at 52+ days (Q3 FY26), whereas Cisco&amp;rsquo;s DSO was just 40 days in 2000.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;54% of S&amp;amp;P 500 gains (trailing twelve months, Q3 2025) are from the Magnificent 7. See: &lt;a href="https://www.ftportfolios.com/Commentary/EconomicResearch/2025/10/9/sp-500-index-performance-check--q3-2025"&gt;&amp;ldquo;S&amp;amp;P 500 Index Performance Check — Q3 2025&amp;rdquo;&lt;/a&gt;, FT Portfolios, October 9, 2025.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Michael Burry has publicly criticized major tech companies for extending GPU depreciation schedules to overstate earnings. See: &lt;a href="https://www.reuters.com/technology/artificial-intelligence/artificial-intelligencer-case-selling-nvidia-2025-11-13/"&gt;&amp;ldquo;Artificial Intelligencer: The case for selling Nvidia&amp;rdquo;&lt;/a&gt;, Reuters, November 13, 2025.&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;Burry estimates that between 2026 and 2028, tech companies could understate depreciation by approximately $176 billion through extending the useful life of computing assets. See: &lt;a href="https://www.investing.com/news/stock-market-news/michael-burry-warns-of-176-billion-depreciation-understatement-by-tech-giants-4346876"&gt;&amp;ldquo;Michael Burry warns of $176 billion depreciation understatement by tech giants&amp;rdquo;&lt;/a&gt;, Investing.com.&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:7"&gt;
&lt;p&gt;Microsoft has scaled back data center investments globally, signaling an investment re-evaluation. Reports indicate Microsoft halted US and European data center expansions due to oversupply and AI investment skepticism. See: &lt;a href="https://futurism.com/microsoft-huge-data-center-investments-tariffs"&gt;&amp;ldquo;Microsoft&amp;rsquo;s huge data center investments face tariffs&amp;rdquo;&lt;/a&gt;, Futurism; &lt;a href="https://finimize.com/content/microsoft-pulls-back-on-data-centers-as-ai-investments-face-scrutiny"&gt;&amp;ldquo;Microsoft pulls back on data centers as AI investments face scrutiny&amp;rdquo;&lt;/a&gt;, Finimize.&amp;#160;&lt;a href="#fnref:7" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:8"&gt;
&lt;p&gt;Major tech companies have issued significant bond offerings to finance AI infrastructure: Alphabet raised $25 billion in bonds (Q4 2025) to fund AI and cloud infrastructure; Meta raised $30 billion in bonds; Amazon issued $15 billion in bonds for AI infrastructure. See: &lt;a href="https://www.wealthprofessional.ca/investments/fixed-income/alphabet-raises-25b-in-bonds-to-fund-ai-and-cloud-infrastructure/390719"&gt;&amp;ldquo;Alphabet raises $25B in bonds to fund AI and cloud infrastructure&amp;rdquo;&lt;/a&gt;, Wealth Professional; &lt;a href="https://9fin.com/insights/ai-trillion-dollar-bill-tech-bond-issuance"&gt;&amp;ldquo;Funding AI&amp;rsquo;s trillion-dollar bill — Tech bond issuance soars to bankroll data center spend&amp;rdquo;&lt;/a&gt;, 9fin; &lt;a href="https://www.chosun.com/english/industry-en/2025/11/18/4R5G6NOO4RGBBIP4RHMT4D5G4E/"&gt;&amp;ldquo;Amazon Issues $15 Billion Bonds for AI Infrastructure&amp;rdquo;&lt;/a&gt;, The Chosun Ilbo, November 18, 2025.&amp;#160;&lt;a href="#fnref:8" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:9"&gt;
&lt;p&gt;Saudi Arabia and NVIDIA announced a major partnership to build AI factories powered by thousands of advanced GPUs. The US has approved billions in NVIDIA GPU exports to the UAE, and the UK has a deal for thousands of Blackwell GPUs. There is also intense demand from China, with NVIDIA lobbying for loosened export controls. See: &lt;a href="https://nvidianews.nvidia.com/news/saudi-arabia-and-nvidia-to-build-ai-factories-to-power-next-wave-of-intelligence-for-the-age-of-reasoning"&gt;&amp;ldquo;Saudi Arabia and NVIDIA to build AI factories to power next wave of intelligence&amp;rdquo;&lt;/a&gt;, NVIDIA Newsroom; &lt;a href="https://www.pcgamer.com/software/ai/nvidias-cfo-says-theres-still-a-little-geopolitical-situation-that-we-need-to-work-through-before-shipping-its-ai-gpus-to-china-but-its-a-usd2-billion-to-usd5-billion-potential-opportunity/"&gt;&amp;ldquo;NVIDIA&amp;rsquo;s CFO says there&amp;rsquo;s still a &amp;rsquo;little geopolitical situation&amp;rsquo; before shipping AI GPUs to China&amp;rdquo;&lt;/a&gt;, PC Gamer; &lt;a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/nvidia-lobbies-white-house-and-wins-loosened-ai-gpu-export-control-to-china-u-s-lawmakers-reportedly-reject-gain-ai-act"&gt;&amp;ldquo;NVIDIA lobbies White House and wins loosened AI GPU export control to China&amp;rdquo;&lt;/a&gt;, Tom&amp;rsquo;s Hardware.&amp;#160;&lt;a href="#fnref:9" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:10"&gt;
&lt;p&gt;Anat Ashkenazi, SVP and CFO of Alphabet and Google, stated in the 2025 Q3 earnings call: &amp;ldquo;Yes, and the question related to ROIC and how we look at just overall our business and where do we see early signs that are encouraging. So first, I would say it&amp;rsquo;s not just early signs, because we&amp;rsquo;re seeing returns, obviously, in the Cloud business.&amp;rdquo; See: &lt;a href="https://abc.xyz/investor/events/event-details/2025/2025-Q3-Earnings-Call-2025-4OI4Bac_Q9/default.aspx"&gt;Alphabet 2025 Q3 Earnings Call&lt;/a&gt;, Alphabet Investor Relations.&amp;#160;&lt;a href="#fnref:10" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:11"&gt;
&lt;p&gt;Vahdat, Google&amp;rsquo;s VP and GM of AI and infrastructure, said that Google currently has seven generations of its TPU hardware in production and that its &amp;ldquo;seven- and eight-year-old TPUs have 100 percent utilization.&amp;rdquo; See &lt;a href="https://www.datacenterdynamics.com/en/news/google-says-tpu-demand-is-outstripping-supply-claims-8yr-old-hardware-iterations-have-100-utilization/"&gt;report&lt;/a&gt;&amp;#160;&lt;a href="#fnref:11" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:12"&gt;
&lt;p&gt;Measuring AI performance in terms of the length of tasks AI agents can complete. See &lt;a href="https://metr.org/blog/2025-03-19-measuring-ai-ability-to-complete-long-tasks/"&gt;METR research&lt;/a&gt;&amp;#160;&lt;a href="#fnref:12" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content></entry><entry><title>YouTube videos</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/reviews/2025-12-02-youtube-videos/"/><id>https://www.ashwinmenon.com/posts/reviews/2025-12-02-youtube-videos/</id><published>2025-12-02T00:00:00Z</published><updated>2025-12-02T00:00:00Z</updated><summary type="html">&lt;h2 id="12022025"&gt;12/02/2025&lt;/h2&gt;
&lt;p&gt;Jensen&amp;rsquo;s talk at the Stanford Graduate School of Business (&lt;a href="https://www.youtube.com/watch?v=lXLBTBBil2U"&gt;link&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="my-takeaways"&gt;My takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I find Jensen very interesting. He has SRK-like mannerisms, and probably a similar level of charisma (the latest silky, gray-haired Jensen, the Jensen from the mid-2000s, maybe not). He speaks very well, by which I mean he says mostly profound things with very little fluff and is able to talk and deliver his views without making anyone feeling worse. He gives off a huge &amp;ldquo;sweet talker&amp;rdquo; vibe (charisma), which is normally something I&amp;rsquo;ve not seen outside scammers, and to be clear I don&amp;rsquo;t think he&amp;rsquo;s anything close to being a scammer.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Do what you are uniquely positioned to do&amp;rdquo; (similar to thoughts I had, and also what Satoro Iwata had said). &amp;ldquo;The only question is, is this important work? And if we didn&amp;rsquo;t do it, would it have happened without us?&amp;rdquo; (23:38). &amp;ldquo;Your job is to make a unique contribution &amp;hellip; to do something that nobod else in the world would do or can do&amp;rdquo; (at 44:50).&lt;/li&gt;
&lt;li&gt;Organizations should be structured to enable everyone to do their best work (get out of the way, remove obstacles) &amp;ldquo;(My job is) to create the conditions by which you can do your life&amp;rsquo;s work&amp;rdquo; (twic, at 34:30 and AGAIN! at 43:33).&lt;/li&gt;
&lt;li&gt;The CEO (&amp;amp; leaders) should be visible (to employees). &amp;ldquo;Leaders have to be seen&amp;rdquo; (27:42). &amp;ldquo;(if the stock price has dropped by 80%) The most important thing I have to do as the CEO is this: to come and face you, explain it (even if you don&amp;rsquo;t have a great answer)&amp;rdquo; (28:35)&lt;/li&gt;
&lt;li&gt;The CEO should not rely on secrecy. Information should be shared publicly. &amp;ldquo;(sarcastically) The knowledge, the information of a CEO is supposedly so valuable, so secretive, you can only share it with two other people or three [&amp;hellip;] I don&amp;rsquo;t believe in a culture, an environment where the information you possess is the reason why you have power. I would like all of us to contribute to the company and our position in the company should have something to do with our ability to reason through complicated things, lead other people to achieve greatness, inspire, empower other people&amp;hellip;&amp;rdquo; (33:10)&lt;/li&gt;
&lt;li&gt;Regulations should be done by specialists in the field (53:05). Interesting thought. I agree and wonder why this level of nuance is not there in most governments (and for that matter most discussions) around the world. Why not have a young tech advisor or tech-enabler to allow governments to digitize and democratize access to information?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-notes"&gt;Other notes&lt;/h3&gt;
&lt;p&gt;He also looks back on life to decide what to do, which (to me) is similar to Bezos&amp;rsquo; regret minimization framework.
I didn&amp;rsquo;t understand his point about tokens floating in space (51:10).
Quotes indicate I paraphrased something in the talk. They aren&amp;rsquo;t exact quotations as you may expect, so I have this note here.&lt;/p&gt;</summary><content type="html">&lt;h2 id="12022025"&gt;12/02/2025&lt;/h2&gt;
&lt;p&gt;Jensen&amp;rsquo;s talk at the Stanford Graduate School of Business (&lt;a href="https://www.youtube.com/watch?v=lXLBTBBil2U"&gt;link&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="my-takeaways"&gt;My takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I find Jensen very interesting. He has SRK-like mannerisms, and probably a similar level of charisma (the latest silky, gray-haired Jensen, the Jensen from the mid-2000s, maybe not). He speaks very well, by which I mean he says mostly profound things with very little fluff and is able to talk and deliver his views without making anyone feeling worse. He gives off a huge &amp;ldquo;sweet talker&amp;rdquo; vibe (charisma), which is normally something I&amp;rsquo;ve not seen outside scammers, and to be clear I don&amp;rsquo;t think he&amp;rsquo;s anything close to being a scammer.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Do what you are uniquely positioned to do&amp;rdquo; (similar to thoughts I had, and also what Satoro Iwata had said). &amp;ldquo;The only question is, is this important work? And if we didn&amp;rsquo;t do it, would it have happened without us?&amp;rdquo; (23:38). &amp;ldquo;Your job is to make a unique contribution &amp;hellip; to do something that nobod else in the world would do or can do&amp;rdquo; (at 44:50).&lt;/li&gt;
&lt;li&gt;Organizations should be structured to enable everyone to do their best work (get out of the way, remove obstacles) &amp;ldquo;(My job is) to create the conditions by which you can do your life&amp;rsquo;s work&amp;rdquo; (twic, at 34:30 and AGAIN! at 43:33).&lt;/li&gt;
&lt;li&gt;The CEO (&amp;amp; leaders) should be visible (to employees). &amp;ldquo;Leaders have to be seen&amp;rdquo; (27:42). &amp;ldquo;(if the stock price has dropped by 80%) The most important thing I have to do as the CEO is this: to come and face you, explain it (even if you don&amp;rsquo;t have a great answer)&amp;rdquo; (28:35)&lt;/li&gt;
&lt;li&gt;The CEO should not rely on secrecy. Information should be shared publicly. &amp;ldquo;(sarcastically) The knowledge, the information of a CEO is supposedly so valuable, so secretive, you can only share it with two other people or three [&amp;hellip;] I don&amp;rsquo;t believe in a culture, an environment where the information you possess is the reason why you have power. I would like all of us to contribute to the company and our position in the company should have something to do with our ability to reason through complicated things, lead other people to achieve greatness, inspire, empower other people&amp;hellip;&amp;rdquo; (33:10)&lt;/li&gt;
&lt;li&gt;Regulations should be done by specialists in the field (53:05). Interesting thought. I agree and wonder why this level of nuance is not there in most governments (and for that matter most discussions) around the world. Why not have a young tech advisor or tech-enabler to allow governments to digitize and democratize access to information?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-notes"&gt;Other notes&lt;/h3&gt;
&lt;p&gt;He also looks back on life to decide what to do, which (to me) is similar to Bezos&amp;rsquo; regret minimization framework.
I didn&amp;rsquo;t understand his point about tokens floating in space (51:10).
Quotes indicate I paraphrased something in the talk. They aren&amp;rsquo;t exact quotations as you may expect, so I have this note here.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="11022024"&gt;11/02/2024&lt;/h2&gt;
&lt;h3 id="scalene-python-profiler"&gt;Scalene Python profiler&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=vVUnCXKuNOg"&gt;https://www.youtube.com/watch?v=vVUnCXKuNOg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Great talk on a new python profiler (Scalene)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main takeaway:&lt;/strong&gt; When coding in Python, for performance, write your programs in C and call them :) (also, be wary of copies when crossing the language interface boundary)&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="112024-date-approximated"&gt;11/2024 (date approximated)&lt;/h2&gt;
&lt;h3 id="htmlreactcss-talk"&gt;HTML/React/CSS talk&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=m8SmXOTM8Ec"&gt;https://www.youtube.com/watch?v=m8SmXOTM8Ec&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Seemed like a code in search of a problem talk to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main takeaway:&lt;/strong&gt; Specific technical things about coding in HTML/react/CSS. Appreciate that there&amp;rsquo;s technical info to be shared, would be useful for devs that use I presume.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="08252023"&gt;08/25/2023&lt;/h2&gt;
&lt;h3 id="allison-kaptur---clock-skew-and-you"&gt;Allison Kaptur - Clock Skew and You&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.deconstructconf.com/2019/allison-kaptur-clock-skew-and-you"&gt;https://www.deconstructconf.com/2019/allison-kaptur-clock-skew-and-you&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Worth a watch if you work with distributed systems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSL certs are affected by clock skew. This was solved by shipping a key with chrome, maintaining time servers in google&amp;rsquo;s DC to know accurate times, and prompting users to fix their client clock, which surfaced that most ssl issues are due to time.&lt;/li&gt;
&lt;li&gt;How NTP works (layers of computers from high accuracy to lower). SNTP differs in that it is P2P synchronization (? not explained in talk, independent research)&lt;/li&gt;
&lt;li&gt;Shows how to calculate clock skew, but only if skew is symmetric in request &amp;amp; response.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="08242023"&gt;08/24/2023&lt;/h2&gt;
&lt;h3 id="hillary-anderson---the-odyssey"&gt;Hillary Anderson - The Odyssey&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.deconstructconf.com/2019/hillary-anderson-the-odyssey-lessons-learned-from-learning"&gt;https://www.deconstructconf.com/2019/hillary-anderson-the-odyssey-lessons-learned-from-learning&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Didn&amp;rsquo;t find it too useful. About learning, working in the data science field.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main takeaway:&lt;/strong&gt; Teach others to learn better. Community helps.&lt;/p&gt;
&lt;h3 id="karla-burnett---2-factor-4-humans"&gt;Karla Burnett - 2-Factor 4 Humans&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.deconstructconf.com/2019/karla-burnett-2-factor-4-humans"&gt;https://www.deconstructconf.com/2019/karla-burnett-2-factor-4-humans&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Useful and highly recommended if you are new to security &amp;amp; interested to learn.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main takeaway:&lt;/strong&gt; Too many to list.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="08222023"&gt;08/22/2023&lt;/h2&gt;
&lt;h3 id="dan-abramov---the-wet-codebase"&gt;Dan Abramov - The Wet Codebase&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.deconstructconf.com/2019/dan-abramov-the-wet-codebase"&gt;https://www.deconstructconf.com/2019/dan-abramov-the-wet-codebase&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Somewhat useful&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main takeaway #1:&lt;/strong&gt; Don&amp;rsquo;t abstract too early. Feel free to inline code (un-abstract), and then re-abstract later if needed.
&lt;strong&gt;Main takeaway #2:&lt;/strong&gt; Best practices might be summarized, so really think about the underlying reason for the best practice before applying it.&lt;/p&gt;
&lt;h3 id="vaidehi-joshi---setting-up-to-fail"&gt;Vaidehi Joshi - Setting Up to Fail&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.deconstructconf.com/2019/vaidehi-joshi-setting-up-to-fail"&gt;https://www.deconstructconf.com/2019/vaidehi-joshi-setting-up-to-fail&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Goes over some types of distributed system failures. Useful if you are a new SDE in the industry, working on distributed systems. Else, not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main takeaway:&lt;/strong&gt; Distributed systems can fail in various ways and if you work with distributed systems, it may be useful to learn this (+ ways to address these, which the talk doesn&amp;rsquo;t cover)&lt;/p&gt;</content></entry><entry><title>I want my Chicken Shawarma: How I cut booking costs by 10x</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/activities/2025-11-20-free-bookings/"/><id>https://www.ashwinmenon.com/posts/activities/2025-11-20-free-bookings/</id><published>2025-11-20T00:00:00Z</published><updated>2025-11-20T00:00:00Z</updated><summary type="html">&lt;p&gt;I like playing sports. I created an app to notify me when courts are available.&lt;/p&gt;
&lt;h2 id="general-design"&gt;General design&lt;/h2&gt;
&lt;p&gt;I had built this a few months ago and was able to get it running from my laptop. I don&amp;rsquo;t have my notes from back then.&lt;/p&gt;
&lt;h3 id="adding-notifications"&gt;Adding notifications&lt;/h3&gt;
&lt;p&gt;What I wanted now was to get it running on a remote server and also to give it the capability to provide notifications. For notifications, I settled on pushbullet though WhatsApp would have been ideal. Seems like more products may be needed in this space to make notifications easier to get. How hard is the WhatsApp API to integrate with? I don&amp;rsquo;t know, but maybe good to look at for a future project. Twilio is a big player in this space.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I like playing sports. I created an app to notify me when courts are available.&lt;/p&gt;
&lt;h2 id="general-design"&gt;General design&lt;/h2&gt;
&lt;p&gt;I had built this a few months ago and was able to get it running from my laptop. I don&amp;rsquo;t have my notes from back then.&lt;/p&gt;
&lt;h3 id="adding-notifications"&gt;Adding notifications&lt;/h3&gt;
&lt;p&gt;What I wanted now was to get it running on a remote server and also to give it the capability to provide notifications. For notifications, I settled on pushbullet though WhatsApp would have been ideal. Seems like more products may be needed in this space to make notifications easier to get. How hard is the WhatsApp API to integrate with? I don&amp;rsquo;t know, but maybe good to look at for a future project. Twilio is a big player in this space.&lt;/p&gt;
&lt;h3 id="automation-design"&gt;Automation design&lt;/h3&gt;
&lt;p&gt;The first few hours I spent using Selenium to open up the browser and testing it locally to make sure everything worked with notifications.&lt;br&gt;
Tested locally without headless, and then ran on the remote server in headless mode (without actually opening up a browser).&lt;br&gt;
In hindsight, testing locally with headless may have been useful to uncover a couple of issues earlier.&lt;/p&gt;
&lt;p&gt;Deploying to a remote server unearthed a host (haha&amp;hellip;) of problems. Initially, there were issues due to Ubuntu using a &amp;lsquo;snap&amp;rsquo; package. I learned that this is a stub that may point to the actual executable, but this causes problems with chromiumdriver. Then, I ran into OOMs. Chromium is a memory hog. Luckily, Chromium &amp;amp; chromiumdriver have a plethora of options that the LLMs advised me to tune to try and fit it onto a cheap server (one of my requirements/good-to-haves). I spent a good hour or two on this, fixing some options that the LLMs had hallucinated and trying to work with the LLMs to understand why they had put in flags for visual options when we were running in headless mode (they conceded and reversed many of those flags). However, no amount of flag tuning would get the browser started up. I finally had to switch to a machine with 1GB of RAM to get it to work. At this point, Cloudflare started kicking in and blocking my requests. The LLM was useless at getting past this (suggesting I open up a full browser, which it also said couldn&amp;rsquo;t be done on remote servers with no displays attached), but luckily &lt;strong&gt;experience&lt;/strong&gt; was key here. In the past I&amp;rsquo;d noticed passing in a user agent would sometimes get past these blockers (shout-out to my first stint at Amazon for teaching me about user agents and more). I asked the LLM to help me with that and we were off to the races!&lt;/p&gt;
&lt;p&gt;I still couldn&amp;rsquo;t get past the fact that this would cost me around 10$ a month. Way too expensive. It would mean I give up one chicken shawarma a month. I needed to get around this somehow. After all, as they say &amp;ldquo;frugality is the mother of invention&amp;rdquo;, right?&lt;/p&gt;
&lt;h3 id="human-in-the-loop-or-why-good-engineers-still-have-value"&gt;Human in the loop (or why good engineers still have value)&lt;/h3&gt;
&lt;p&gt;At this point, I wondered why the hell I needed a browser in the first place. I remember having half-heartedly gone down this path the first time I built this (a few months ago) but now, thinking of my chicken shawarma, I wondered whether I&amp;rsquo;d abandoned the idea too soon. In simple terms, the idea was &amp;ldquo;if I can just make requests to an API and get the response, why the hell do I need the browser as a middleman?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I opened up Chrome&amp;rsquo;s dev console &amp;amp; looked for Fetch/XHR requests being made. I found one, and put it into the LLM. The LLM said this was great, but there were some auth tokens needed. Now that was weird, because I hadn&amp;rsquo;t logged in. So, I went through the network requests some more and landed on one that seemed promising. Working with the response for this request and the LLM, the solution finally looked like this: Set session headers, get the RequestData (access card) and Bearer token (ID badge) and then make the requests to the second API. This worked! And it used a lot less memory, so I could try deploying it to a cheaper (free!) cloud. I also added a few features like looking at multiple locations, multiple types of events and reducing notification noise by tracking notifications sent (in a file to reduce $$). Adding the code to clean-up the notification file was also a no-brainer thanks to the LLM.&lt;/p&gt;
&lt;h2 id="llm-use"&gt;LLM use&lt;/h2&gt;
&lt;p&gt;Needless to say, in this day and age, heavy LLM use was involved in making this.&lt;br&gt;
I initially set out coding this with the chatbot versions. ChatGPT Plus was useless after a point, so much so that when I was deploying to a remote server, the free version of Claude and Gemini 3 thinking were all I used.&lt;/p&gt;
&lt;p&gt;LLMs make this SUPER easy to iterate on. Along with notifications, I added quite a few features that would be triggered by passing a bunch of option flags (Why option flags? Because I wanted the flexibility to pick &amp;amp; choose. The default remains what I think would be the likeliest option I&amp;rsquo;d choose.). This would have been a pain to do manually because of the number of forks created, but with the LLM, I can ask it to update the README as well to help document what&amp;rsquo;s going on.&lt;/p&gt;
&lt;p&gt;In short, I did in hours what would have taken me days. However, if I didn&amp;rsquo;t have some ideas or knowledge (from experience) on certain topics, then I&amp;rsquo;d likely be banging my head on a suboptimal solution for days. Hopefully, that (as expanded on in the previous paragraphs) helps address some of the confusing &amp;ldquo;AI saves time!&amp;rdquo; v/s &amp;ldquo;AI does not save any time!&amp;rdquo; discourse you hear.&lt;/p&gt;
&lt;h3 id="testing"&gt;Testing&lt;/h3&gt;
&lt;p&gt;How do you really test with LLMs? Unit tests tend to be useless because LLMs tend to write tests in a way that they pass - sometimes without calling into your code at all. I added a &lt;code&gt;test&lt;/code&gt; flag that I could pass in to reproduce a specific workflow that I knew would trigger a notification. Besides that, I did manual testing as flows were added. There is room for improvement here with regression tests.&lt;/p&gt;
&lt;h2 id="opportunities"&gt;Opportunities&lt;/h2&gt;
&lt;p&gt;Thanks to LLMs, coding is simpler, but there are still a lot of manual, painful steps. Like setting up an account (with Pushbullet, etc.) and the lack of good systems for things like notifications.&lt;/p&gt;
&lt;h2 id="other"&gt;Other&lt;/h2&gt;
&lt;p&gt;Notes for myself: court types, slot types, rate limiting were all added.&lt;/p&gt;</content></entry><entry><title>Models for thinking</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/thoughts/2025-11-12-models-for-thinking/"/><id>https://www.ashwinmenon.com/posts/thoughts/2025-11-12-models-for-thinking/</id><published>2025-11-12T00:00:00Z</published><updated>2025-11-12T00:00:00Z</updated><summary type="html">&lt;p&gt;None of these are particularly revolutionary, but it helps to have them listed so you can use them actively to your benefit (rather than hoping these tools fall into your hand).&lt;/p&gt;
&lt;h2 id="line-on-a-spectrum"&gt;Line on a spectrum&lt;/h2&gt;
&lt;p&gt;Many things that seem black-or-white are simply just different lines on a spectrum. Think of the spectrum as a horizontal line, and the &amp;ldquo;line&amp;rdquo; as a point (or a vertical line that you wouldn&amp;rsquo;t cross). For example, for some, any lie is too far. While others may be okay with white lies (&amp;ldquo;I&amp;rsquo;m busy today&amp;rdquo; when you aren&amp;rsquo;t) and others may be fine with outright lying too (&amp;ldquo;I know for a fact this product does not harm you&amp;rdquo; - even when you know it does).&lt;/p&gt;</summary><content type="html">&lt;p&gt;None of these are particularly revolutionary, but it helps to have them listed so you can use them actively to your benefit (rather than hoping these tools fall into your hand).&lt;/p&gt;
&lt;h2 id="line-on-a-spectrum"&gt;Line on a spectrum&lt;/h2&gt;
&lt;p&gt;Many things that seem black-or-white are simply just different lines on a spectrum. Think of the spectrum as a horizontal line, and the &amp;ldquo;line&amp;rdquo; as a point (or a vertical line that you wouldn&amp;rsquo;t cross). For example, for some, any lie is too far. While others may be okay with white lies (&amp;ldquo;I&amp;rsquo;m busy today&amp;rdquo; when you aren&amp;rsquo;t) and others may be fine with outright lying too (&amp;ldquo;I know for a fact this product does not harm you&amp;rdquo; - even when you know it does).&lt;/p&gt;
&lt;p&gt;This also applies to a lot of ethical and societal conundrums of the day. Like what kind of personal and social freedoms you are willing to demand/tolerate/deny. Concretely, take a possible debate in the late 1800s. Should women be allowed to vote? You could imagine the spectrum consisting of &amp;ldquo;everyone should be allowed to vote&amp;rdquo; on one end and &amp;ldquo;no one&amp;rdquo; on the other. Most people in the late 1800s likely placed themselves somewhere between men should be allowed to vote (on the left) and women should be allowed to vote (on the right). The law also lies somewhere on the spectrum. When society greatly differs from the law, the law would need to get demanded.&lt;/p&gt;
&lt;p&gt;This helps build empathy and better understanding for those who have differing opinions from yours. They are not plain &amp;ldquo;wrong&amp;rdquo;, they are just a little further along in the spectrum (in whatever direction).&lt;/p&gt;
&lt;h2 id="the-benchmark"&gt;The &amp;ldquo;benchmark&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Came up with this when my partner was trying to find an apartment. They wanted to find an apartment with A/C, a balcony, 3000 sq. ft of floor space (exaggerating) and also not more than 1000$ in rent. I suggested they instead look for apartments and set the first apartment they look at as &amp;ldquo;the benchmark&amp;rdquo;. As in, that&amp;rsquo;s the apartment they&amp;rsquo;ll take if they find nothing better. If you find something better, then you can choose that, rather than go hunting for an &amp;ldquo;ideal apartment of my dreams that may not exist&amp;rdquo;. This can help unblock those struck with decision paralysis when shopping. These days, I see a lot of people thinking about jobs this way too: &amp;ldquo;I want a job that pays me more than my current job, but it should also be less stressful and a more interesting area to work in.&amp;rdquo; Maybe &amp;ldquo;the benchmark&amp;rdquo; can help. The &lt;a href="https://en.wikipedia.org/wiki/Secretary_problem"&gt;secretary problem&lt;/a&gt;, which has been solved mathematically (!!) is another interesting read in this space (apparently it&amp;rsquo;s a field called &amp;ldquo;decision theory&amp;rdquo;&amp;hellip; humans are incredible).&lt;/p&gt;
&lt;h2 id="the-extremes"&gt;The extremes&lt;/h2&gt;
&lt;p&gt;Sometimes, thinking about what things will look like at the extremes can help you gain an insight on a topic that seems intractable at first. Starting with a small example to better understand the larger problem is something I picked up from competitive programming, but this can be applied to more general problems as well. For example, in the nature v/s nurture debate (are you born talented or is it something that comes only through sheer hard work), I found it useful to take an extreme example. Specifically, if one person did basketball drills (taking shots, dribbling) while the other studied chess games, it&amp;rsquo;s almost certain that the person that did the drills will be better at basketball. This let me conclude that nurture &lt;em&gt;definitely&lt;/em&gt; plays a role. I&amp;rsquo;ve detailed some of my thoughts on hard work &lt;a href="https://www.ashwinmenon.com/posts/thoughts/2022-10-31-some-thoughts/"&gt;here&lt;/a&gt;, and compiled a list of references of people talking about hard work &lt;a href="https://www.ashwinmenon.com/posts/thoughts/2022-12-24-hard-work-catalog/"&gt;here&lt;/a&gt;.&lt;/p&gt;</content></entry><entry><title>A Mallu in America</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/thoughts/2025-11-06-a-mallu-in-america/"/><id>https://www.ashwinmenon.com/posts/thoughts/2025-11-06-a-mallu-in-america/</id><published>2025-11-06T00:00:00Z</published><updated>2025-11-06T00:00:00Z</updated><summary type="html">&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Disclaimer: There are some generalizations below, and so all the disclaimers for generalizations apply. Some of those being: these are inferences being made on a set of observations so the inferences may be completely wrong, and by definition a generalization means this does not apply to all individuals in that society.&lt;/p&gt;
&lt;p&gt;The irony of a Malayalee working in America may not be obvious to many. A Malayalee is someone who hails from the state of Kerala where the native tongue is Malayalam. Kerala is home to the world&amp;rsquo;s first democratically-elected communist government. America, of course, is a capitalistic society.&lt;/p&gt;</summary><content type="html">&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Disclaimer: There are some generalizations below, and so all the disclaimers for generalizations apply. Some of those being: these are inferences being made on a set of observations so the inferences may be completely wrong, and by definition a generalization means this does not apply to all individuals in that society.&lt;/p&gt;
&lt;p&gt;The irony of a Malayalee working in America may not be obvious to many. A Malayalee is someone who hails from the state of Kerala where the native tongue is Malayalam. Kerala is home to the world&amp;rsquo;s first democratically-elected communist government. America, of course, is a capitalistic society.&lt;/p&gt;
&lt;h2 id="kerala"&gt;Kerala&lt;/h2&gt;
&lt;p&gt;In Kerala, people would rather spend 10 hours doing nothing rather than spend even an hour working for money. I have a few anecdotes as &amp;ldquo;evidence&amp;rdquo;. First, driving lessons in 2014, when I paid around ₹4000 as an advance for the lesson and the instructor simply did not show up for the rest of the lessons which would have earned him another ₹11,000. Another example from more recent times is when I&amp;rsquo;d given a few clothes to be mended. To begin with, there was barely any signage for me to find the shop. It was almost as if the tailor didn&amp;rsquo;t want to do business. A different shop pointed me to his &amp;ldquo;outlet&amp;rdquo;, which was more like Harry&amp;rsquo;s cupboard-under-the-stairs kind of joint. After mending 5 pieces, he charged ₹80. I took out ₹400 as I&amp;rsquo;d given him five pieces. He promptly refused and I realized that he was asking for ₹80 for all five. That seemed insane to me so I insisted he take at least ₹150, which he begrudgingly accepted. As a third example, I&amp;rsquo;ll use a problem since time immemorial that continues to this day. The number of times my parents have to call the KSEB (electricity board) asking them to restore electricity is ridiculous (the calls never achieve anything). For all the talk about solar energy, it&amp;rsquo;s embarrassing that we have powercuts in 2025. The people in charge are always on some sort of lunch break, which given how good the food tastes, I could respect. But, I know I&amp;rsquo;d respect having electricity 24/7 more.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve heard that this may be because the government provides some amount of money to allow people to get by. I think another big factor might be the sunny weather and the abundance of good food. Honestly, at times I think it&amp;rsquo;s hard to fault people for not wanting to work in these kinds of situations. Is the goal to earn money or be happy? Is earning money a means to an end or the end in itself?&lt;/p&gt;
&lt;h2 id="america"&gt;America&lt;/h2&gt;
&lt;p&gt;On the other hand, we have America - a society where it feels like the average Joe likely has to find some work day-to-day to pay rent. With the added caveat that if you do well, you may be able to stop worrying about rent entirely. However, due to inertia and societal conditioning (peer pressure) you may not want or be able to. You also get an increased standard of living, though with possibly diminished returns on increased happiness. One of the benefits of living here is that you can call the internet company and actually expect them to fix the damn problem. Coming from a community with constant powercuts, complaints about Comcast&amp;rsquo;s customer service confounded me.&lt;/p&gt;
&lt;h2 id="my-two-cents"&gt;My two cents&lt;/h2&gt;
&lt;p&gt;The latter approach confers many benefits on society, pushing progress (&amp;amp; so, technological progress) forward not just for that society but all globally. However, I hope I wouldn&amp;rsquo;t be wrong in stating that Malayalees are some of the most laid-back, carefree people you would meet. In addition, Malayalees are also leaders in social progress with ideas vigorously discussed, women who are relatively more empowered than elsewhere in India and an ability to reflect on many of our social faults (like the heavy use of the caste system in the past). I&amp;rsquo;ll end with this dude (&lt;a href="https://www.youtube.com/shorts/g_csxRAgHAY"&gt;link&lt;/a&gt;) who has a channel of him roleplaying as a potato. This adds likely no contribution to GDP, but it made me laugh.&lt;/p&gt;
&lt;p&gt;(Added disclaimer due to the danger of generalizations: I know many, many extremely hardworking Malayalees as well.)&lt;/p&gt;</content></entry><entry><title>Pros(e) and concerts</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/activities/pros-and-concerts/"/><id>https://www.ashwinmenon.com/posts/activities/pros-and-concerts/</id><published>2025-10-28T00:00:00Z</published><updated>2025-10-28T00:00:00Z</updated><summary type="html">&lt;p&gt;I don&amp;rsquo;t think concerts are worth going to. Over the years I&amp;rsquo;ve attended concerts by Muse, Iron Maiden, John Mayer, and others. But, over the past few years, I&amp;rsquo;ve increasingly felt that the experience of attending a concert isn&amp;rsquo;t worth the price I&amp;rsquo;d pay. I&amp;rsquo;d rather spend time trying out escape rooms, joining sports leagues or if we want to stick to live performances, then watching theatre and stand-up comedy, where tickets are still reasonably priced.&lt;/p&gt;</summary><content type="html">&lt;p&gt;I don&amp;rsquo;t think concerts are worth going to. Over the years I&amp;rsquo;ve attended concerts by Muse, Iron Maiden, John Mayer, and others. But, over the past few years, I&amp;rsquo;ve increasingly felt that the experience of attending a concert isn&amp;rsquo;t worth the price I&amp;rsquo;d pay. I&amp;rsquo;d rather spend time trying out escape rooms, joining sports leagues or if we want to stick to live performances, then watching theatre and stand-up comedy, where tickets are still reasonably priced.&lt;/p&gt;
&lt;p&gt;Concretely, music concert tickets sell for hundreds of dollars, for a sub-par experience where you may have to stay seated, be surrounded by people recording the show on their phones instead of being in the moment, and listen to music that&amp;rsquo;s worse than what&amp;rsquo;s on the album. Some acts have tried to compensate with greater theatrics, but I&amp;rsquo;m not sure they still provide enough value for the cost. In the past, the cost-value tradeoff may have still tilted towards the whole experience being worth it because costs were lower, and music could not be listened to easily digitally.&lt;/p&gt;
&lt;p&gt;Theatre and stand-up comedy feel worth it because you can&amp;rsquo;t find the material elsewhere. Further, in the case of stand-up comedy, the experience of watching a live show is enhanced by having others around you laughing. For escape rooms and sports leagues, you get to do things in person, which you can&amp;rsquo;t really do virtually. And the icing on the cake? The fact that everyone&amp;rsquo;s fully present and there&amp;rsquo;s not a screen in sight :)&lt;/p&gt;
&lt;p&gt;On the other hand, I&amp;rsquo;ve started rethinking movies as a fun experience to go to with friends. Sure, you&amp;rsquo;re left staring at a screen with no connection for a couple of hours. But, maybe, just maybe, there are a few movies out there that leave you feeling something. That grapple with your heartstrings or inspire you to action. And maybe, this then inspires discussion at a post-movie lunch or dinner, which really is all you were looking for this whole time.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also realized that movies were culturally a big part of life. My family used to watch movies together and so, the feeling of watching a movie together allows people to re-experience the feeling of those moments from the past, adding another layer to the experience. I&amp;rsquo;ll end with some recommendations of movies I&amp;rsquo;ve seen recently that left me feeling something: Jojo Rabbit, A Million Miles Away, Coco and Didi.&lt;/p&gt;</content></entry><entry><title>What I've been up to</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/activities/wibu/"/><id>https://www.ashwinmenon.com/posts/activities/wibu/</id><published>2025-10-17T00:00:00Z</published><updated>2025-10-17T00:00:00Z</updated><summary type="html">&lt;h2 id="a-laundry-list"&gt;A laundry list&lt;/h2&gt;
&lt;p&gt;Started doing stand-up comedy. You can read more &lt;a href="https://www.ashwinmenon.com/posts/activities/2025-07-14-chancing-my-arm/"&gt;here&lt;/a&gt;.&lt;br&gt;
The first two weeks after I quit, I did a lot of chores - both for the household and myself.&lt;br&gt;
Started reading about company and business valuations. Now I understand P/E ratios, the PEG model, how to use discounted cash flows to estimate a fair stock price &amp;amp; compare it with the implied P/E ratio and how to determine the health of a business by comparing debt to revenue. I&amp;rsquo;ve also talked with friends about looking into market cap as a multiple of revenue and using the price-to-sales ratio when a company is not profitable.&lt;br&gt;
Some weeks I did nothing except relax by playing video games or surfing and scrolling.&lt;/p&gt;</summary><content type="html">&lt;h2 id="a-laundry-list"&gt;A laundry list&lt;/h2&gt;
&lt;p&gt;Started doing stand-up comedy. You can read more &lt;a href="https://www.ashwinmenon.com/posts/activities/2025-07-14-chancing-my-arm/"&gt;here&lt;/a&gt;.&lt;br&gt;
The first two weeks after I quit, I did a lot of chores - both for the household and myself.&lt;br&gt;
Started reading about company and business valuations. Now I understand P/E ratios, the PEG model, how to use discounted cash flows to estimate a fair stock price &amp;amp; compare it with the implied P/E ratio and how to determine the health of a business by comparing debt to revenue. I&amp;rsquo;ve also talked with friends about looking into market cap as a multiple of revenue and using the price-to-sales ratio when a company is not profitable.&lt;br&gt;
Some weeks I did nothing except relax by playing video games or surfing and scrolling.&lt;/p&gt;
&lt;p&gt;I spent some time playing the guitar, unfortunately not consistently as always.&lt;br&gt;
I connected and reconnected with family and friends that I had not been in very close contact with. Strengthened pre-existing relationships. Was able to spend more time with my sister when she visited as I did not have to think about requesting time off.&lt;br&gt;
I completed the games Tomb Raider (2013) and Hogwarts Legacy. I also played F1 Manager and Europa Universalis IV, a game which I&amp;rsquo;ve always wanted to throw myself into. If you told 15-year-old me that someday I would be able to play video games to completion on a handheld gaming device that I owned I would&amp;rsquo;ve been over the moon.&lt;br&gt;
I made a couple of apps (&lt;a href="https://www.hunchle.com"&gt;Hunchle&lt;/a&gt;) aiming to show my parents what I actually did/could do for a living. Telling them I worked at AWS and Meta is pretty much Latin for them, but with these apps they could get to use what I had built. The word game used GRE-level words, which makes it hard for most people, but is about the difficulty needed for my parents as they are both former journalists. Learned about LLMs, coding agents and how to use them through the process of building these as well. You can see my posts &lt;a href="https://www.ashwinmenon.com/posts/activities/2025-05-28-how-i-used-ai-in-hunchle/"&gt;here&lt;/a&gt; and &lt;a href="https://www.ashwinmenon.com/posts/activities/2025-06-10-hunchle-generating-questions/"&gt;here&lt;/a&gt;.&lt;br&gt;
Wrote a few blog posts which you can find on &lt;a href="https://www.ashwinmenon.com"&gt;www.ashwinmenon.com&lt;/a&gt;.&lt;br&gt;
Built (vibe-coded) some side projects on my blog, for example: &lt;a href="https://www.ashwinmenon.com/phones/"&gt;https://www.ashwinmenon.com/phones/&lt;/a&gt; and &lt;a href="https://www.ashwinmenon.com/lennon-or-mccartney/"&gt;https://www.ashwinmenon.com/lennon-or-mccartney/&lt;/a&gt;&lt;br&gt;
Started cycling more and possibly running more as well. Completed the Kitsap Color Classic, a 50+ mile bike ride in 5:10 (in Crocs and with somewhat flat tires for 80% of the ride). One interesting thing to note here is that I was able to go for rides and walks in the afternoons and enjoy the afternoon sun, something I would not have been able to do earlier.&lt;br&gt;
Wrote a few blog posts.&lt;br&gt;
Started playing badminton, including in the afternoons at the Redmond Community Center, for around only $5 a day!&lt;br&gt;
Travelled to Yellowstone, Denver, and the UK. Will write about it, stay tuned!&lt;br&gt;
Sent some open-source pull requests that are currently still in progress (from my side).&lt;br&gt;
Wrote a few helper scripts using generative AI. One to book badminton courts when a slot opens up. Another to find where to stay, given a list of tourist attractions you&amp;rsquo;d like to visit and potential addresses to stay at.&lt;br&gt;
Started reading more books than before. Five books completed (one being tiny) versus 1 book over the past 2 years.&lt;br&gt;
Spent time watching videos on history (reach out to me if you want YouTube channels to watch!). I knew that history repeats itself, but I didn&amp;rsquo;t realize how often! A lot of themes from centuries ago are playing out today. Things written millennia ago are still applicable today.&lt;br&gt;
Created some videos to help learn Malayalam.&lt;/p&gt;
&lt;h2 id="peculiar"&gt;Peculiar&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;d often forget what day it was. For example, I thought it was a Wednesday when it was a Thursday.&lt;br&gt;
I sleep in late often because I haven&amp;rsquo;t had to set alarms except for a few days when there were early morning appointments.&lt;br&gt;
Cash inflow is obviously worse, but it&amp;rsquo;s interesting to try and think of other ways you could earn money. A tech job is surely one of the best ways to get a large, constant, regular inflow of money but there is definitely a dopamine hit from being able to find new ways, even if the amounts are tiny. Taking up new things is a challenge, but also validating.&lt;/p&gt;
&lt;h2 id="regrets"&gt;Regrets&lt;/h2&gt;
&lt;p&gt;Only that I don&amp;rsquo;t spend more time with people!&lt;/p&gt;</content></entry><entry><title>A Malayalee's guide to Kerala</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/activities/2025-09-29-a-malayalees-guide-to-kerala/"/><id>https://www.ashwinmenon.com/posts/activities/2025-09-29-a-malayalees-guide-to-kerala/</id><published>2025-09-29T00:00:00Z</published><updated>2025-09-29T00:00:00Z</updated><summary type="html">&lt;h2 id="kerala"&gt;Kerala&lt;/h2&gt;
&lt;p&gt;As an NRI, your dollar goes a lot farther in India. On trips back to India, my sister usually finds great resorts for us to enjoy. I&amp;rsquo;ve since realized many friends within India travel to Kerala as their go-to quick vacation destination, and so, I thought it&amp;rsquo;d be useful to provide a Malayalee&amp;rsquo;s guide to vacationing in Kerala. And if at least one person in your party speaks Malayalam, it makes things much easier (to communicate with the locals). If you don&amp;rsquo;t know Malayalam, English is your best bet (and then Hindi).&lt;/p&gt;</summary><content type="html">&lt;h2 id="kerala"&gt;Kerala&lt;/h2&gt;
&lt;p&gt;As an NRI, your dollar goes a lot farther in India. On trips back to India, my sister usually finds great resorts for us to enjoy. I&amp;rsquo;ve since realized many friends within India travel to Kerala as their go-to quick vacation destination, and so, I thought it&amp;rsquo;d be useful to provide a Malayalee&amp;rsquo;s guide to vacationing in Kerala. And if at least one person in your party speaks Malayalam, it makes things much easier (to communicate with the locals). If you don&amp;rsquo;t know Malayalam, English is your best bet (and then Hindi).&lt;/p&gt;
&lt;h2 id="where-to-stay"&gt;Where to stay&lt;/h2&gt;
&lt;p&gt;Here are some places I&amp;rsquo;ve stayed at that I&amp;rsquo;ve really enjoyed:&lt;/p&gt;
&lt;h3 id="accessible-from-kochi"&gt;Accessible from Kochi&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.cghearth.com/coconut-lagoon"&gt;Coconut lagoon&lt;/a&gt;: You get to ride in a boat just to get here. The food was great, and the stay was great too (non-negotiables). They had a birdwatching tour and a mohiniyattam performance as well. Every evening, a lady would come by on a boat with tea and snacks. Great property to walk around as well. This is part of CGH. I&amp;rsquo;ve heard my family say you can&amp;rsquo;t go wrong with CGH hotels. We ate at Pearl Spot restaurant on the way here. Nice stop with a great view of Vembanad lake.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.tripadvisor.in/Hotel_Review-g608471-d12989205-Reviews-The_Rain-Alappuzha_Alappuzha_District_Kerala.html"&gt;The Rain&lt;/a&gt;: A small property with a great room but not much else to do. For dinner they had some local musicians, who weren&amp;rsquo;t that great. The food was fine. Good if you simply want to relax. We did drive to the city (Alappuzha) for a change &amp;amp; got some biryani. I&amp;rsquo;d recommend trying Avees Puttu for a sadya/thali (or just puttu).&lt;/p&gt;
&lt;h3 id="western-ghats"&gt;Western ghats&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://maps.app.goo.gl/Jm5VxwFq79cATX5i7"&gt;Pepper trail&lt;/a&gt;: Need to drive up to the mountains to access this property, which will allow you to truly feel like you are &amp;ldquo;in nature&amp;rdquo;. Carry bug ointment if you go on the hike they have, and check out the tour of the tea plantation. Food excellent as always.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.booking.com/hotel/in/ambady-estate.html"&gt;Ambady estate&lt;/a&gt;: Another place that will let you feel lost in nature. Great lodging, and great surroundings. A good place to sit back and relax or use as a base to explore Munnar.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.google.com/maps/place/Greenwoods+Resort+Thekkady+-+Kondody+Hotels/@9.6065623,77.1627734,17z/data=!4m10!3m9!1s0x3b0655a37f3c9651:0x8a672683ee6f0757!5m3!1s2026-01-14!4m1!1i2!8m2!3d9.6065623!4d77.1653483!16s%2Fg%2F11bw44v17r?entry=ttu&amp;amp;g_ep=EgoyMDI1MDkyNC4wIKXMDSoASAFQAw%3D%3D"&gt;Greenwoods resort&lt;/a&gt;: In Thekkady. Again, great rooms, great food, and you can go on short walks around the property. Trees and greenery all around make it quite relaxing.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://maps.app.goo.gl/qsT7cmWmCpsCVsMa9"&gt;Winter vale green stay&lt;/a&gt;: More affordable than the other stays listed above, this stay is located near the town of Vagamon. The food was alright and the stay was not as luxurious. You could drive to Murugan Hill and hike to Vagamon Kurishumala church (1.1km, with a 148m elevation gain, meaning a 13% gradient). You get some great views of Vagamon and the western ghats on the hike.&lt;/p&gt;
&lt;h2 id="what-to-eat"&gt;What to eat&lt;/h2&gt;
&lt;p&gt;Almost anywhere you&amp;rsquo;ll find lots of dishes with meat and also lots of dishes without meat. Kerala&amp;rsquo;s food is very diverse, with the small exception that shredded coconut will likely be present in many dishes.&lt;/p&gt;
&lt;p&gt;Meen pollichatthu (Roasted fish): Fish marinated in spices, wrapped in a banana leaf and roasted on an open fire. If cooked well, probably the best fish dish you&amp;rsquo;ll ever have.&lt;/p&gt;
&lt;p&gt;Biryani: Biryani in Kerala is very different from biryani elsewhere in India, but it&amp;rsquo;s probably my favourite kind of biryani. Won&amp;rsquo;t be packed with as many spices as most other biryanis, but will have a more-than-adequate helping of ghee. And the pappadam&amp;hellip; oh the pappadam. I&amp;rsquo;d usually go for the chicken biryani, which will come with a boiled egg presented as hidden treasure for you to find.&lt;/p&gt;
&lt;p&gt;Sadya: Not very easy to find, Sadya is Kerala&amp;rsquo;s traditional meal served on a banana leaf. I&amp;rsquo;d do a quick Google search and go to one based on the reviews. Might be worth calling before you go to ensure they still have a sadya option. The curries are usually unlimited, so it&amp;rsquo;s like a Malayalee buffet. Vegetarian and worth a drive!&lt;/p&gt;
&lt;h2 id="where-to-eat"&gt;Where to eat&lt;/h2&gt;
&lt;p&gt;Azad Star, Trivandrum: Loved the food here.&lt;/p&gt;
&lt;p&gt;Cheenavala, Kochi: The restaurant is named after the chinese fishing nets you see in Kochi (called Cheenavala). Lots of fish options. Love going here everytime I&amp;rsquo;m back in Kerala.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://maps.app.goo.gl/a4p4tsZ3CW6DkBMm7"&gt;Rasatantra, Kochi&lt;/a&gt;: Great food.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://maps.app.goo.gl/4rPqC4tmkZrSdmTJ6"&gt;Gokul Ooottupura&lt;/a&gt;: I haven&amp;rsquo;t been here in a while, but I remember liking their chole bhature!&lt;/p&gt;
&lt;h2 id="what-i-might-skip"&gt;What I might skip&lt;/h2&gt;
&lt;p&gt;The houseboats. Interesting experience the first time I tried it (mid-2000s), but the backwaters were filled with weeds the last time I went.&lt;br&gt;
Trivandrum. Old, sleepy town. Could go to Varkala or Kovalam instead.&lt;/p&gt;
&lt;h2 id="things-to-check-out-in-kochi"&gt;Things to check out in Kochi&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Drive along Cherai beach. Stop at Chilli out Cafe.&lt;/li&gt;
&lt;li&gt;Go go-karting at Speedway Kochi or try batting in the nets (indoor cricket) at the same place&lt;/li&gt;
&lt;li&gt;Check out Fort Kochi (not a fort, mostly a tourist attraction with cafes, markets, etc.).&lt;/li&gt;
&lt;li&gt;The Jewish synagogue, where you get to learn a bit about the history of Kerala.&lt;/li&gt;
&lt;li&gt;Cochin shipyard. You could see one of India&amp;rsquo;s two aircraft carriers docked here! These ships are huge and the most expensive ships owned by the Navy.&lt;/li&gt;
&lt;li&gt;Kathakali. Traditional art form. Extremely hard to find a performance, but if you do, would be worth checking it out.&lt;/li&gt;
&lt;li&gt;The metro is a great way to get around and cheap too.&lt;/li&gt;
&lt;li&gt;The water metro may be fun to try!&lt;/li&gt;
&lt;li&gt;Drive or walk along marine drive.&lt;/li&gt;
&lt;li&gt;Sagar Rani cruise to check out the backwaters and go into the Arabian Sea (for a few minutes). The guides detail the buildings and areas around you, but in malayalam. Simple snacks &amp;amp; tea provided. Warning: lots of extremely loud music at the end.&lt;/li&gt;
&lt;/ul&gt;</content></entry><entry><title>EB-2/EB-3 for Indians</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/thoughts/2025-09-02-eb2-eb3-for-indians/"/><id>https://www.ashwinmenon.com/posts/thoughts/2025-09-02-eb2-eb3-for-indians/</id><published>2025-09-02T00:00:00Z</published><updated>2025-09-02T00:00:00Z</updated><summary type="html">&lt;h2 id="the-green-card-blues"&gt;The green card blues&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re an Indian in the US (or thinking about moving to the US), you likely know the problems with immigrating to the US. By virtue of being born in the most populous country on Earth, the employment-based green card route is effectively closed to Indians.&lt;/p&gt;
&lt;p&gt;However, there isn&amp;rsquo;t a clear way to know how long the wait may be. And if you don&amp;rsquo;t know how long, then you can&amp;rsquo;t easily plan what you&amp;rsquo;d like to do.
So, I wrote a script to estimate when your priority date may be current (i.e. when you are able to move forward in the green card process). Ping me directly if you want the predicted date for your priority date.&lt;/p&gt;</summary><content type="html">&lt;h2 id="the-green-card-blues"&gt;The green card blues&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re an Indian in the US (or thinking about moving to the US), you likely know the problems with immigrating to the US. By virtue of being born in the most populous country on Earth, the employment-based green card route is effectively closed to Indians.&lt;/p&gt;
&lt;p&gt;However, there isn&amp;rsquo;t a clear way to know how long the wait may be. And if you don&amp;rsquo;t know how long, then you can&amp;rsquo;t easily plan what you&amp;rsquo;d like to do.
So, I wrote a script to estimate when your priority date may be current (i.e. when you are able to move forward in the green card process). Ping me directly if you want the predicted date for your priority date.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t care about a high-level of precision, here are some numbers that may be useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If your priority date is after December 2018, you&amp;rsquo;re almost certainly only going to be eligible for a green card after you retire (after 2060).&lt;/li&gt;
&lt;li&gt;If your priority date is before Jun 2015, you may get it in ~10 years from now (2035-2036).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And for a high-level overview, here&amp;rsquo;s a visual representation of the estimate.&lt;/p&gt;
&lt;p&gt;&lt;img src="/assets/images/EB2.png" alt="Visual representation plotting priority date against the year when it will become current"&gt;&lt;/p&gt;
&lt;p&gt;Not a recommendation, but if interested you could read &lt;a href="https://www.ashwinmenon.com/posts/thoughts/2025-08-06-eb5-for-indians/"&gt;my EB-5 post&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;Note: As of Sep 2025, there are around 48000 I-485 applications filed before Jan 2015 that are pending. This should clear in around 8 years, which aligns well with what the script predicted (~2033 for someone who filed in Jan 2015).&lt;/p&gt;</content></entry><entry><title>On Software Design</title><link rel="alternate" type="text/html" href="https://www.ashwinmenon.com/posts/technical/2025-09-01-on-software-design/"/><id>https://www.ashwinmenon.com/posts/technical/2025-09-01-on-software-design/</id><published>2025-09-01T00:00:00Z</published><updated>2025-09-01T00:00:00Z</updated><summary type="html">&lt;p&gt;For a lot of my career, I never really understood software design. It was always presented as something more associated with SDE2s, or higher and not so much with SDE1s. I had no idea what to make of it or what to do with that information. The first few design documents I wrote seemed inane. There was something to be done, and we all knew what we wanted to do, but it looked like I had to formalize it in some way before I could move forward. The document always had a structure, always following a similar pattern, that made this exercise seem even more tedious. The structure usually went like this: Motivation, Problem, Requirements, Chosen proposal, Considered but declined proposal, Appendix. A glossary and &amp;ldquo;not in scope&amp;rdquo; section could also be excluded. For each proposal, we&amp;rsquo;d need to list out the pros and cons.&lt;/p&gt;</summary><content type="html">&lt;p&gt;For a lot of my career, I never really understood software design. It was always presented as something more associated with SDE2s, or higher and not so much with SDE1s. I had no idea what to make of it or what to do with that information. The first few design documents I wrote seemed inane. There was something to be done, and we all knew what we wanted to do, but it looked like I had to formalize it in some way before I could move forward. The document always had a structure, always following a similar pattern, that made this exercise seem even more tedious. The structure usually went like this: Motivation, Problem, Requirements, Chosen proposal, Considered but declined proposal, Appendix. A glossary and &amp;ldquo;not in scope&amp;rdquo; section could also be excluded. For each proposal, we&amp;rsquo;d need to list out the pros and cons.&lt;/p&gt;
&lt;p&gt;Now this seemed an exercise in futility because there was only one &amp;ldquo;real&amp;rdquo; option (choosing DynamoDB) and yet we had to go through this pointless exercise for some reason. It was not until later in my career where I dealt with true engineering problems where the options were all valid options, and it became crucial to define requirements precisely, as it was the requirements that would let us pick between the options (considering the pros &amp;amp; cons of each). One section I wish would be added would be a section on when a different option would become preferable. For example: if scale grows by 10x, switch to option B, or, if cost of a certain hardware component drops by 10x, switch to option B.&lt;/p&gt;
&lt;p&gt;Without having real engineering problems - ones where the solution truly is unknown and there isn&amp;rsquo;t a clear winner from the outset - writing a design document is a waste of time. Without technical skill, one is unable to identify what other options there are, and what the pros and cons of these options would be. How do you build that technical skill? Reading books can help, and working on ambiguous problems with others can help. Before I did that, I felt my design skills were lacking and I think that&amp;rsquo;s a feeling many of us have. It surfaces clearly during interviews, when candidates regurgitate what they&amp;rsquo;ve read, not because they know it is the solution, but rather because it is the only thing they know. Luckily, one can get better by preparing for interviews (reading material) and more importantly, building things. Unfortunately, all of this costs time.&lt;/p&gt;
&lt;p&gt;Where I stand today, I think software design is an interesting piece of the software engineering lifecycle, and opportunities exist to streamline this cycle by removing the need for a design where not necessary, and by providing tools to allow engineers to level up to write designs better &amp;amp; critique designs more thoroughly.&lt;/p&gt;</content></entry></feed>