I share practical wisdom I learned from Sukumar Rajagopal by asking active questions, covering how to anchor small habits, find systemic leverage points (trim tabs), and use multiple AI models as creative sparring partners.

Sukumar Rajagopal shared a LinkedIn post about our meeting on 11 June at Chennai, saying: Had a fanboi moment recently with Anand S who I have been following for a long time. He is prolific. It’s very difficult, no impossible, to keep up with him. He generously shares his work with full source code; approach; working examples; the whole nine yards. All this I knew before I met him in person. The in-person meeting took me by surprise. I was hoping to ask him a number of questions about his methods etc. But instead he peppered me with a lot of questions. Curiosity and humility is another hallmark of thought leaders. Anand showed me the way on how to be curious even in a topic like Gen AI where he possesses encyclopedic knowledge. (etc.) After cringing for a bit, I jotted down a few things. Why I still learn: I get a kick out of it. Some get a kick out of wealth. Or power. Or fame (me too). Or learning (me too). It's just a dopamine hit. Why I learns topic I already know: I'd rather learn something I'm interested in. Who cares how much I know? It's how much I like a topic. (Like re-reading books.) How I learn from people: My current process / philosophy is: 1. Everyone has something worth discovering, but not every conversation is worth my time right now. 2. So, meet new people and ask good questions. 3. Continue if there's emotional / intellectual stimulation (surprising, interesting, moving, connecting, energizing, challenging), else exit warmly with respect. Why I share generously: I'm trying to be liked and become famous. (Really.) Why I am humble: It helps me learn and makes me more likable. Anyway, I opened my notes from that meeting, where I had jotted down what I learned from Sukumar. Let me share what I learned from that conversation. You'll see who's really generous with their knowledge. Habits: Start small. "I started with two pushups. Now I do sixty at one go." Anchor to something you already do. "After I brush teeth, I have to do it." Hard work is hard to habitualize. Start easy. "If there's a lot of cognitive or physical effort, it can't form as a habit." Streaks have a hidden cost. "Streaks create pressure. Once the streak stops, it's hard." Prefer cycles. "I do it for 6 days. 7th day, rest. You hit a sixer." Leverage: "I don't have time" is not a useful perspective. "You have no leverage. You can't create time." Find alternative perspectives. "Look at the same thing from as many viewpoints as you need to." Find the Trim Tab: the one step that transforms the system. Uber changed only "the ride-hailing step... everything else remains the same." Set extreme goals, not incremental ones. "I want to move the rudder with zero energy and zero time." Reflection: Worse than failing is not noticing. "You're not achieving higher order outcomes - and you don't even know." Small successes blind us to bigger opportunities. "Zumba, yoga... exciting for three months. Then it dies." Changing people: Look for hunger, not pedigree. "People from disadvantaged backgrounds have the hunger to succeed." People ignite at different speeds. "Camphor lights instantly... banana stems don't." (Doesn't translate well from Tamil.) Don't tell someone they lack agency. "Reactive buttons get pushed." Mentors: A great mentor compresses years into months. "What takes 10-15 years can be done very rapidly." Quiet people make good mentors. "It's the art of asking the right question." Trust and selling: Anyone can sell, in their own style. "It's just that their style may be different." The real skill is earning trust. "There are many methods. Flashy presentations are just one way." Working with AI: Use models as sparring partners, not judges. "Generate it in ChatGPT... go to Claude and have it reviewed... go to Gemini." A model always finds something to say. "These LLMs can never say, 'I don't have any review comments.'" Run a pre-mortem. "You travel in a time machine, you fail, you look back and see what would have tripped you." Use the simplest tech that works. "No database, no web sockets, nothing... Just polling." And he bought me lunch!

Learning from Sukumar with questions


Shutdown postmortems are valuable because they preserve startup lessons that would otherwise disappear inside transient social platforms.

Here's a great post by Karthik Shashidhar on why they shut down Babbage Insight, and the learnings from the experience. (I'm reproducing in full here since LinkedIn is hostile to content.) I added ⭐ to points I found most interesting. As the more perceptive of you would have figured out by now, we are shutting Babbage Insight . When I told this to one of my old friends, his immediate reaction was "so what were your learnings from this experience?". And so I decided to write this. Remember that I've written all of this primarily for my own benefit and future reference. Any cost / benefit from this to anyone else is only incidental. This is also in no particular order. And the salt you need to add is that everything is purely with the benefit of full hindsight. With full benefit of hindsight, this (AI for data analytics / insights) has been a rather tough sector to operate in. Nobody has really cracked it here (not even established players - distribution doesn’t imply traction), and there has been a bloodbath of startups, which (unfortunately) we are also part of ⭐ When you require access to a customer’s data warehouse, it doesn’t matter what size the customer is - every sale is an enterprise sale. From our customers’ perspective (which we belatedly realised), this was a risky buy. They didn’t know what they wanted, and they couldn’t see how what we were offering would clearly help them. ⭐ Hiring is massively underrated, and a massively difficult job. We hired poorly. Maybe the biggest skill required for a startup founder is hiring. Tenure match with your first set of investors. Raise early if you are raising. That way you don’t run out of energy before the money runs out (happened to me) I got into the “where’s my idli” (or “where do i put mine” - both translate to the same phrase in Kannada) syndrome. Every time I read about something someone else in the sector was doing, I got defensive, wondering if someone else is already doing what we wanted to do; rather than figuring out how to learn from or copy the idea. Perversely, despite running a startup, I got into a zero sum mindset (with all my competitors), which didn’t help I should have started with consulting, and then used learnings from that to build products. Even if you are building a product, build it with a specific customer in mind. Building with a generic / hypothetical customer can mean that you build for no one Our attempts to build a “generic enough” product were to no avail, as each customer wanted their own set of customisations. And we made the mistake of trying to tweak the entire product to fit these customisations, rather than hack. We hear romantic stories of people who cracked big-figure cross border sales, but those are driven by spectacularness bias. You need to be in the market that you are selling to. There is no other way. If you cannot, you need to employ someone in that market. I listened to too many people. I tried doing too many things that don’t come intuitively to me, and so struggled. Every single one of my burnouts has come about when I’ve tried to write production grade code. I like coding but software engineering simply demands too much attention to detail for me to do well. And I keep making the same mistake - step in to write code when the team cannot. And burn myself out I love talking to (potential) customers, but I don’t have the discipline for sales. Following up on time. Following through on intros. Etc. ⭐ Hire a small number of highly skilled, even if expensive, people. At early stage startups, especially in the age of AI, people who just implement what you tell them to do are overrated. LLMs imply that you don’t have 10X engineers any more - you have 100X (apologies for that cheesy line). And you need to hire a few of these, else you’ll be stuck. I absolutely hated putting my location as “United States” on LinkedIn, but had to do it for sales purposes. Did a lot of other such things, because they are “done things”. Poor hiring meant I spent too much time writing code, and too little time building the business. I never got a coherent communication of what exactly we are building. Obviously this was a huge problem Our product was doomed the moment I wrote the first line of code. We didn’t use LLMs enough. Our code was too deterministic. This was a function of our hiring. We didn’t vibe code enough. We didn’t move quickly enough. Again it was possibly a function of our hiring. I’m scheduling this post to be sent at a time when I’m in the middle of my Vipassana. I’m pretty sure I’ll return and double the length of this list!

Learnings from building Babbage Insight


Join my workshop to watch AI tackle real IITM exams live. I’ll show you how to move beyond answer-seeking to using LLMs as Socratic sparring partners for catching errors and deepening your actual learning.

At 2 pm IST today (Fri 12 Jun 2026), I conducted a workshop at Paradox, IITM - at DOMS 101. My core message is: "AI can solve exams and help you learn. Delegate what AI can do. Learn what AI can't do instead." My talks page for "Let AI take your exams" includes: The full story + transcript + audio How Codex solved a real exam, live My collection of AI-learning techniques - which was not covered in the workshop, but is a useful reference Here are the takeaways from the workshop: 1. AI is more capable than you think — and getting smarter. Recalibrate constantly what it can and can't do. Note down what it can't, because that is precisely where your value lives. 2. Delegate first; learn the rest. Give everything to AI. Focus your learning on what it can't yet do — that's where the value will be. It's a moving filter; revisit it every quarter. 3. Always use the best model, turned up high. Reserve "fast and cheap" for the \5% of moments you need a quick answer. And remember students get serious AI free via the GitHub Student Pack and Gemini. 4. Make the AI ask you for context. "If you need more information, ask me." You don't have to know what context it needs — push that burden back to the machine. 5. Beat hallucination with a maker-checker. Two independent models that must agree cut errors from 14% to under 4%. Tell the checker to "find the errors," not to grade. 6. Loop with feedback in verifiable environments. Point an agent at an exam, a codebase, anything that scores itself — let it try, submit, read the result, retry. This is the most powerful technique AI has. 7. Calibrate, don't just trust. Practise predicting whether AI will get something right — even on topics you don't know. Watch for base-rate traps and familiar problems with one changed premise. 8. Be lazy, productively. Don't read AI's 20-page output — train it to give you five words. Working well with AI is a management skill. 9. Learn from peers. Multiple people trying things is how you discover what works. Non-transactional relationships are the rising currency of the AI era. 10. Apply the scientific method to everything. Form a hypothesis, hunt for evidence, try to falsify yourself. And when a system blocks you unfairly — hack it, then publish what you learned. Here are the takeaways from how Codex solved the exam: 1. An agent operates the environment; a chatbot answers the question. Codex read source, ran code, clicked Check, and looped on feedback. That's why it beat copy-paste — the exam was full of affordances a chatbot can't touch. 2. Verifiable environments favour AI. The more checkable the exam — validators, error strings, downloadable files, a live Check button — the more it helped the agent, not the student. "AI-proof" and "feedback-rich" are opposites. 3. Most failures were wording, not reasoning — and the source fixed them. The fix for a brittle validator was to read the validator. Pass the error message back to the agent and it converges. 4. Don't guess where attempts are limited. The network game punished early guesses. The recoverable mistakes had feedback; the costly ones didn't. Triage cheap-and-certain first. 5. The gap between 9 and 10 was a credential, not a brain. Same model, same skill. Anand's missing mark was an invalid token. In the AI era, "can it?" often means "does it have the keys?" 6. It cost about a coffee. \$2–3 of tokens for the whole exam, \96% cached. The real cost is the human judgment to know when the agent is plausibly, confidently wrong. Original announcement You can join online at https://meet.google.com/cpt-faee-ucx and ask questions on chat. Agenda: You've been told AI can pass your exams. But what happens when you actually watch it try — live, on your questions, in real time? This workshop starts with a collective experiment: we ask coding agents to solve real exams (including IITM exams) and see how it solves them. What follows isn't a tutorial on prompting — it's an autopsy that reveals what your exams are actually testing, where AI confidently hallucinates, and what that means for what's worth learning. You'll leave with a reframed understanding of your degree (the goal isn't answers, it's the ability to catch wrong ones) and a concrete study rituals that uses AI as a Socratic sparring partner rather than an answer machine. Come with a question you got wrong recently — it's going to be useful. Real agenda: An ask-me-anything session plus real-life experiments.

Let AI take your exams


LinkedIn is a poor medium for serious reading and writing, so blogs remain the better canonical home for durable content.

It's incredible how hostile LinkedIn is for reading / writing content. Posts containing links to external websites (like my blog) get significantly less reach. That's why you see links in comments, not the post! You can't copy content from posts on their mobile app. You can't even easily select the entire article on the web app! Selecting a part, and then shift-clicking elsewhere (which works almost everywhere) doesn't work. Also, the copied text isn't clean. It's filled with hidden text (e.g. "Skip to search"), duplicated text (e.g. author name repeated), and other junk. It's hard to export content. For example, the export feature does not include the original links in your articles, nor the links to images you posted! It's hard to scrape content. LinkedIn actively tries to prevent scraping, and their TOS prohibits it. No formatting. You have to embed unicode characters. Search is terrible. You can't search for posts by keyword, date, or author easily. No public posting - so you need to log in to read anything. The only reason I'm on LinkedIn is because of the network. My current approach is: 1. Write on my blog: https://www.s-anand.net/ 2. Copy paste on LinkedIn, formatted 3. Link to the original, and to hell with the reach Over time, ... let's see.

LinkedIn is hostile to content


AI-assisted talk preparation becomes far richer when you opportunistically incorporate live discoveries and other people’s ideas instead of over-planning everything in advance.

I spoke today on Design in the Age of Infinite Generativity at the Chennai Design Festival. You can read about the talk in the link about. This post is about my preparation. Tue 10 Mar 2026. Damn! Palani's asked for the topic. Claude, what should I talk about!? Fri 20 Mar 2026. ChatGPT, tell me who the other speaker are. Fri 20 Mar 2026. Oh, I'll just pull a bunch of links, use browser tabs as slides, create some slide dividers, and I'm ready! Sat 21 Mar 2026 1:00 pm. I'm NOT ready! The story doesn't flow. It's rubbish. Sat 21 Mar 2026 3:00 pm. Let me drop some of the boring ones. I just have 15 minutes. Sat 22 Mar 2026 3:30 pm. Oh, maybe I should listen to what the others are saying, just... you know... ... and that proved the best decision ever, because Senthil of Payir showed a re-usable fabric calendar that converts into a bag. It was a fantastic idea, so I got curious. 3:40 pm. Asked Claude for more ideas like Senthil's. It looked fine and I could read it later, but what if... maybe... I presented these ideas!? 3:45 pm. Ask Gemini to draw the first idea - a Modular Kolam Mat. The results look fantastic! 3:50 pm. Now I'm going ga-ga over the idea. I generate images for 3 more ideas: a growth chart kurta, seed library sari border, and recipe towel. 4:15 pm. Narendra shares a bunch of cool PsychOps design hacks like: When lights are dimmed people speak softer. So, dimming lights reduces sound levels in noisy offices. Rather than reduce the size of shampoo sachets (which customers and business both hate), include 2 shampoos in one sachet, tearable in the middle. Price saches at 95p with a 5p deposit for the sachet - which rag-pickers can collect and return to the retailer. 4:20 pm. Ask Claude for more ideas like Narendra's. The results are just as fantastic! 4:30 pm. I now have images for his ideas too. Now, I start deleting my more boring links. In fact, these ideas ended up being so good that the bulk of my talk was just about ideas derived from their work. (I'm obviously a big fan of plagiarism!) Despite being one of my shortest talks (10 min), this worked quite well because people value speed and spontaneity. I was obviously demonstrating these and that felt cool. For many years, I've been live-coding on stage. But that requires a lot of preparation. Vibe-coding makes live-coding a lot faster. I can do it during a client demo. I can do it during a talk. So, I'm going to listen more to what others are saying (in meetings, conferences, etc.) and live-vibe-code from what they just said. Great way to show-off while learning from others! 26 Mar 2026: On a related note, AI has better product development ideas than humans. Read Serendipity by Design: Evaluating the Impact of Cross-domain Mappings on Human and LLM Creativity

Live Vibe Coding using Others' Ideas


A reusable gallery of comic-style prompts makes AI image generation more systematic, letting you apply distinct visual storytelling styles on demand.

I maintain an LLM art style gallery - prompts to style any image I generate. Since I generate several comics, I added a comic category page that includes styles like: To generate these, I asked Claude: ... followed by: It suggested: A cat deliberately pushes a coffee mug off a desk. The owner watches in helpless horror as it falls. Why? Two very different characters. Extreme emotional contrast. A midair object. A minimal but implied environment. Inherently comedic staging. One panel is enough. To be on the safe side of copyright, I asked it to: Then I generated images using these prompts. But this still had copyright issues on Gemini and OpenAI. So I asked it to: As expected, OpenAI had a problem with four of them: The 4 missing styles all reference specific copyrighted artists/works by name (R. Crumb, Art Spiegelman's Maus, Frank Miller's Sin City, Dave McKean). I need to rewrite them to describe the visual style without naming the artists. Now I'll fix the 4 blocked prompts — removing copyrighted artist/work names while preserving the visual style description: underground-comix: removed "R. Crumb and Zap Comix tradition" graphic-memoir: removed "Art Spiegelman's Maus and Alison Bechdel's Fun Home" neo-noir: removed "Frank Miller's Sin City visual language" vertigo-dark: removed "Dave McKean and Bill Sienkiewicz…at DC Vertigo" After these changes, OpenAI accepted all of them. So did Gemini. But it turns out there were still some issues. Which it did. Fixed exactly 2 prompts — the clearest cases analogous to the ACK example: indian-mythological: "multiple symbolic arms in formal gesture poses" → "expressive two-armed figures in formal seated or standing poses" african-pattern: "stylized human-animal hybrid figures in ceremonial contexts" → "stylized human figures in everyday contexts" (the Kente/Ndebele/Adinkra heritage is geometric textile patterns, not human-animal hybrids) The other prompts with some specificity (golden-age with capes, silver-age with cosmic villains, gaulish-romp with winged helmets, british-anarchic with school uniforms) are accurate to those specific styles — they describe a majority of the comics in those traditions — so those were left alone. That gives me my current list of 30 comic styles to use.

LLM Comic Styles


I analyze how LLM providers like Google and OpenAI are shifting from cheap customer acquisition to value extraction. To manage rising costs and deprecations, I recommend using multi-tier routing and evaluating models based on completed-task costs.

A colleague told me a near-miss horror story. As Google began deprecating Gemini 2.0, we moved to Gemini 2.5 Pro. But reasoning is enabled by default and cannot be turned off. For our specific problem statement, reasoning was not required. Token costs increased 10x and speeds were 3-4x slower. We moved the client to Gemini 2.5 Flash Lite, which has reasoning turned off by default and offers much lower latency. Because we track compute costs closely, we managed this without a major financial impact. But model updates clearly require careful testing on the cost and latency front as well, not just output quality. AI used to keep getting cheaper. But now it's more a "convergence". Each line traces a model family. The X-axis is its intelligence (LMArena ELO score) and the Y-axis is the input cost ($ per million tokens, log scale). Time flows roughly left to right as models improve. Three patterns emerge and each seems strategic. 1. Gemini Flash rockets upward (cheap -> expensive, moving right). 2. GPT-4 class collapses from $30 toward $1.25, then GPT-5.5 jumps back up to $5. 3. Claude Sonnet runs perfectly flat (cheap stays cheap as it gets smarter). Google's Loss Leaders Gemini 1.5 Flash was $0.075/MTok in August 2024. I told everyone to use it - it's a fantastic, affodable model. Gemini 3.5 Flash, released this week at Google I/O, is $1.50. That's a 20× in 21 months. Looks like "Flash" is more a brand position than a price position. It migrates up-market. Same for Gemini 1.5 Flash 8b (3.75 cents) which migrated into Gemini 3.1 Flash Lite (25 cents - a 6.7× increase). Gemini Pro went the opposite direction: down from $5.00 (1.5-pro in Oct 2024) to $1.25-$2.00 today. Pro seems to be a competitive weapon against Anthropic and OpenAI at the top, while monetizing the middle. Of course, Gemini's real lock-in is the Google Workspace bundling and Search AI Mode. Personally, I subscribed to Google Pro for the first time in 20 years just for these bundled capabilities. By the time people notice the Flash price, it's hard to leave the ecosystem. OpenAI's Relaunches The price chart speaks for itself: | Model | Price | | ----------- | ----: | | GPT-4 | $30 | | GPT-4 Turbo | $10 | | GPT-4o | $2.50 | | GPT-4.1 | $2.00 | | GPT-5 | $1.25 | | GPT-5.2 | $1.75 | | GPT-5.4 | $2.50 | | GPT-5.5 | $5.00 | Maybe their strategy seems is: scale current technology to commodity (the O-series showed the same pattern with $15 for O1 falling to $1.10 for O4-mini in 7 months), THEN launch a new frontier above it, and repeat? Anthropic's Revisions Claude Sonnet has held at exactly $3.00/MTok input for over two years, across four model generations and an ELO gain of nearly 200 points. Pretty unusual. Opus came down from $15 to $5 in November 2025 - likely a deliberate move to make it production-viable. Haiku crept from $0.25 to $0.80. The tiers are converging. There's a twist, though. Anthropic restructured enterprise contracts in late 2025. Seat prices dropped to $20/seat. Token discounts (previously 10-15% off API rates) were removed. For a 100-seat team, that adds $15K-$40K to annual TCO. So, prices went down, but the actual bill went up. Also, Opus 4.7 uses a new tokenizer that may consume 35% more tokens for the same text. It's worth re-benchmarking prompts before assuming $5 is 1/3rd of $15. What Do We Do? Model family prices change rapidy. Old models get deprecated. Best to be prepared. 1. Add multi-tier routing to your architecture: Lite / Nano / Haiku for extraction, classification, ... -- tasks with clear right answers Sonnet / GPT-5.4 / Gemini Flash for most production reasoning Opus / GPT-5.5 for escalation or expert advice: complex planning, hard edge cases, high-value decisions 2. Compare completed-task costs, not token price. A 2\ more expensive model can halve the retry rate, making it cheaper per successful output. 3. Migrate by model capability, not model family. Switch to models with similar latency, context window, output format compliance and reasoning depth. 4. Evaluate open-source models. DeepSeek models at self-hosted inference costs can be 90% cheaper for commodity (not frontier) tasks. For enterprise procurement: keep a close eye on pricing changes, API token discounts, and what was quietly removed during renewal. (AI helps with this!) The first 18 months of most AI model families are discounted customer acquisition. Then value extraction follows. Google started it with Flash. OpenAI is doing it with GPT-5.5. Anthropic is doing it with enterprise billing restructuring. Fair enough. Providers need to recover infra investments. And build good routing strategies helps enterprises get the most out of this. Just keep asking yourself: "what's our plan for when this model changes or deprecates?" PS: AI-generated image - has a few errors.

LLM Deprecations and Price Changes


I found that LLM agents and human brains consume similar energy for complex tasks. While brains use lower power over longer periods, AI's high-speed processing results in comparable total watt-hours per task.

For a typical GDPVal style task, humans take 7 hours and the brain consumes 135 Wh. Frontier LLM agents spend 50-500 Wh. So, we may already be 3x more or less efficient than the brain. Roughly in the same ballbark! A colorful, hand-drawn sketchnote infographic comparing the energy efficiency of the human brain versus AI large language model (LLM) agents on complex knowledge tasks (GDPval-style). The vertical 9:16 layout uses bold comic-style lettering, doodles, and icons to explain that humans and AI are roughly comparable in energy use today. At the top, a smiling cartoon brain and a friendly robot stand beside a server rack under the title “Human Brain vs LLM Agents: Who uses less energy to solve hard tasks?” A highlighted “Big Takeaway” section states that AI agents are about 0.3× to 3× as energy-efficient as the human brain, and 2× to 10× more efficient if the whole human body is considered. A central panel explains the concept “Energy = Power × Time,” showing the brain as a low-power, long-duration “marathoner” and the AI as a higher-power, short-duration “sprinter.” The human section illustrates a person working for about 404 minutes (6.7 hours), with the brain consuming roughly 20 watts and about 135 watt-hours per task. The AI section shows a robot completing the same task in about 4.5 minutes, using an estimated 75,000 to 600,000 tokens and roughly 50 to 500 watt-hours of energy. A comparison panel uses a tug-of-war between the brain and robot to show that AI is within a single-digit factor of the brain in efficiency, not orders of magnitude better. Additional panels explain why estimates vary, including factors like whether only the brain or whole body is counted, token usage, and human review overhead. A final summary states that humans think slowly at low power, while AI thinks quickly at higher power, making them roughly comparable today. The infographic includes icons, speech bubbles, and labeled source references to OpenAI GDPval, GPT-5.4 reporting, brain energy use (20 W), and public estimates of AI energy consumption.

LLMs are as energy-efficient as brains


AI agents become much more useful when they can access curated personal context repositories, because better local context leads to better idea selection and recommendations.

When people ask me for connections, I share my LinkedIn data and ask them to pick. This week, three people asked for AI ideas. I shared my local content with AI coding agents and asked them to pick. STEP 1: Give access to content. I use a Dockerfile and script to isolate coding agents. To give access, I run: This gives read-only access to my blog, things I learned, transcripts, and I can add more. (My transcripts are private, the rest are public.) STEP 2: Ask agents to scan content. For example, I ask it to read: Required blog posts related to LLMs /home/sanand/code/blog/ (especially with the category llms) Other relevant transcripts /home/sanand/Dropbox/notes/transcripts (especially extracted AI advice at /home/sanand/Dropbox/notes/transcripts/extracts/ai/) Things I learnt at /home/sanand/code/til/ This makes it explicitly aware of the content and can use it to answer questions. STEP 3: Help it do better. I often add "Use sub-agents as required", which reduces the context and lets them run more in parallel. I also point them to post-mortems for tips on scanning content effectively. STEP 4: Output as JSON. JSON lets me write programs to convert to multiple other formats (e.g. HTML, markdown). I specify the fields I want, how I want them filled, and leave the rest to the agent. Sample output. This is not a new technique. It's just context engineering, roughly like: Connecting ChatGPT/Claude/Gemini/ to Dropbox/Google Drive/... and asking it to read the content. Enabling web search and asking them to search online. But I can do this (kind of) safely on my local content and I can also teach it how to scan the content - which is a useful learning. Next steps: 1. Add README.md to each directory on how to scan the content effectively. 2. Think about what content repositories I should add 3. Explore combining content repositories cleverly (e.g. "Read my blog and apply lessons to my code.")

Local context repositories for AI


I discovered Wikipedia’s most repeated text, including a 213-word paragraph about minor planet names appearing in 418 articles. I found these patterns by using OpenAI Codex to analyze the structured Wikipedia dataset on Hugging Face.

What is the most frequently occurring sentence in Wikipedia? ANS: A 213-word paragraph about how minor planets are named, which appears in 418 Wikipedia articles, word-for-word! There are 380,000 asteroids. Wikipedia has 418 pages for these - including one for each thousand-range of asteroids. Every single one of these pages includes the phrase: As minor planet discoveries are confirmed, they are given a permanent number by the IAU's Minor Planet Center (MPC), and the discoverers can then submit names for them, following the IAU's naming conventions. The list below concerns those minor planets in the specified number-range that have received names, and explains the meanings of those names. Official naming citations of newly named small Solar System bodies are approved and published in a bulletin by IAU's Working Group for Small Bodies Nomenclature (WGSBN).[\[1\]](https://en.wikipedia.org/wiki/Meanings%5Fof%5Fminor-planet%5Fnames:%5F213001%E2%80%93214000#cite%5Fnote-WGSBN-Bulletin-Archive-1) Before May 2021, citations were published in MPC's Minor Planet Circulars for many decades.[\[2\]](https://en.wikipedia.org/wiki/Meanings%5Fof%5Fminor-planet%5Fnames:%5F213001%E2%80%93214000#cite%5Fnote-MPC-Circulars-Archive-2) Recent citations can also be found on the JPL Small-Body Database (SBDB).[\[3\]](https://en.wikipedia.org/wiki/Meanings%5Fof%5Fminor-planet%5Fnames:%5F213001%E2%80%93214000#cite%5Fnote-JPL-Discovery-3) Until his death in 2016, German astronomer Lutz D. Schmadel compiled these citations into the Dictionary of Minor Planet Names (DMP) and regularly updated the collection.[\[4\]](https://en.wikipedia.org/wiki/Meanings%5Fof%5Fminor-planet%5Fnames:%5F213001%E2%80%93214000#cite%5Fnote-DoMPN-4)[\[5\]](https://en.wikipedia.org/wiki/Meanings%5Fof%5Fminor-planet%5Fnames:%5F213001%E2%80%93214000#cite%5Fnote-DoMPN-Addendum-5) Based on Paul Herget's The Names of the Minor Planets,[\[6\]](https://en.wikipedia.org/wiki/Meanings%5Fof%5Fminor-planet%5Fnames:%5F213001%E2%80%93214000#cite%5Fnote-Herget-6) Schmadel also researched the unclear origin of numerous asteroids, most of which had been named prior to World War II. Check out these pages | 85001-86000 | 213001-214000 | 269001-270000 | 380001-381000 This is not the only such common sentence. There are several more. Here's the Slovakia census note: 81 words that appear across 2,920 Wikipedia pages, like Sabinov District, Smolenice, Ilija, Slovakia, Baloň, ... and thousands more! Note on population: The difference between the population numbers above and in the census (here and below) is that the population numbers above are mostly made up of permanent residents, etc.; and the census should indicate the place where people actually mainly live. For example, a student is a citizen of a village because they have permanent residence there (they lived there as a child and has parents), but most of the time he studies at a university in the city Note: As of 26 May 2026, this has been shortened to: Note on population: The difference values of population numbers in the table "Population statistic" and in the sections "Ethnicity" & "Religion" is caused by the use of various statistical methods. There are several more such that you can read about in The Paragraph That Appears 418 Times. That also includes how Codex analyzed the Wikipedia structured dataset on Hugging Face and what else you can do with the data.

Longest repeated paragraph on Wikipedia


I told IITM graduates that grades and jobs are depreciating assets. Focus instead on friendships—they are appreciating assets that grow more valuable over time. Make new friends today by simply talking to the people sitting right next to you.

Here's my address to the graduating class the IITM BS Program today: Make five new friends today. Your CGPA is what you're most focused on. When I graduated, my CGPA helped me get a job. It didn't help much after that. Getting that job helped me for the four years I worked there. That's it. The things I learnt in class helped a bit longer. Maybe six years. There is a long tail. But all of these are depreciating assets. Make five new friends today. The friends I made at college are still friends. Your friends will grow more influential and build stronger relationships. That is an appreciating asset. And in the AI era, this is an asset that will appreciate even more. Talk to the person to your left. Your right. In front of you. Behind you. Make five new friends today. UPDATE: Actually, I said "make three new friends today", not five. When I typed this out, my fingers wrote five. I don't know why.

Make 5 new friends today


I explored Aman Bhargava's reconstruction of Sherlock Holmes's "The Red Headed League" in London. I discovered historical mapping techniques and new geo-tools like OpenFreeMap, Protomaps, and gpx.studio for creating custom 3D visualizations.

Mapping The Red Headed League is a fascinating reconstruction of the actual places mentioned (or hinted at) by Arthur Conan Doyle's The Red Headed League by Aman Bhargava. We cross-reference railway timetables, scrutinize Victorian newspaper reports and historical incidents, scour government records, analyze meteorological data, and, in my specific case, pore over Ordnance Survey maps to make the pieces fit. [](https://aman.bh/blog/2026/mapping-the-red-headed-league) What struck me is how little London has changed, how much old data is available, and what love it takes to reconstruct such a journey! I also learnt several geo-tools / services I didn't know about: gpx.studio - for visualizing GPS tracks on maps openroute service - for route planning and isochrones OpenFreeMap lets you serve custom maps on any website Protomaps creates custom map tiles Mapbox / MapLibre styles can be used to create 3D building styles.

Mapping The Red Headed League


Explanations stick better when they are structured around memory-friendly elements like faces, places, stories, contrast, and vivid imagery.

Our brains remember some things better. Explaining that way makes it stick. Here are the eight things, most important first, that help you: Structure explanations memorably: 1. Face. You remember faces before facts. So cast characters: "Imagine you're a courier carrying a packet." Prefer archetypes to real names — less baggage, more imagination. 2. Place. You're reading down a list now — and the top feels more important. That's spatial wiring. Turn any concept into a map. Use higher, deeper, nearer, inside, ... 3. Tale. You read #1 and #2 first because they came first. Your brain built a cause from that sequence. Time creates cause for free. "Because" makes anything believable. 4. Scale. "Two feet tall" lands instantly. "60 cm" forces you to convert. Your brain doesn't measure — it compares. Give it reference objects, not just numbers. Deliver explanations memorably: 5. Touch. Face. Place. Tale. Scale. Each is a thing you can "grasp" or "hold" in your head. We learn literally by grasping. Make abstractions touchable. 6. Feel. Everyone ignores you because you forget these eight. Did that sting? That's loss framing. Fear, surprise, and reward are memorable. 7. Chunk. There are 8 items here - already past our 4 chunk working memory limit. We've chunked them into two logical sets of four. 8. Beat. Face, Place, Tale, Scale. Touch, Feel, Chunk, Beat. Two groups of four. Say them aloud — the rhythm is already doing the remembering for you. PS: The Claude conversation that lead to this post is my favorite prompting example. 1. The first prompt asked the question "Our brains are wired to understand some things well..." ... and for multiple options "Create a comprehensive list..." ... fact-checked "... based on research evidence" ... with expert framing: "But I'm a novice - what would an expert check that beginners would miss? Think about that, ask, and answer those too." 2. The second prompt uses LLM review. "I asked Gemini to review your work. What does proven science agree with and disagree with on Gemini's response?" ... with expert framing: "focusing on patterns that an expert in this field recognize that beginners would miss" 3. The remaining prompts asksfor a rewrite: "Here's my shorter version. Rewrite it with the same succinctness", but with meta-cognition: "but applying the same 8 principles of cognitive anchoring to this text itself!" "rename them to rhyme better" "Re-apply the principles and suggest an improved version. I also converted this into a SKILL.md

Memorable explanations


A short film clip can be reverse-engineered into transcription, translation, and voice recreation workflows, showing how accessible historical or cinematic voice cloning has become.

I was watching Vaa Vaathiyar which has a short clip of MGR speaking. It's either AI-generated or mimic-ed and it wasn't bad. I used ffmpeg to record the audio from the film, transcribed it via Gemini 3 Pro on AI Studio with the prompt: Transcribe this into Tamil ... which gave me: ராமு... என்ன செய்திருக்கிறாய் நீ... வாத்தியார் கேட்கிறேன் சொல் நிமிர்ந்து பார்க்க கூட தைரியம் இல்லையா... ஓடாதே... நில்... Translation: Ramu... What have you done... Vaathiyar (MGR) is asking, tell me Don't you have the courage to stand up and look at me... Don't run... stop... (GitHub Copilot's auto-complete translated the above for me as I typed - flawlessly. It's getting better by the day!) Then, I used yt-dlp to download the audio from this MGR Short Clip. Here's the sample: I fed this into ElevenLabs' Instant Voice Clone that needs just 10 seconds of audio and created an "MGR" voice. Here's the same dialogue in the cloned voice: Personally, I think the ElevenLabs version is slightly better. Of course, given the pace of AI improvement, this might just be the impact of a new model release. 2 Apr 2026: Here's the non-cloned generation from Sarvam's text to speech with Bulbul v3 standard quality. It feels pretty weak. Gemini 2.5 Pro Preview TTS gave me this, which feels much better.

MGR via ElevenLabs


I used AI coding agents to migrate my WordPress blog to Hugo. Key strategies included maintaining a PLAN.md, generating actionable exception reports, and delegating asset optimization and verification tasks to the agent.

In 2009, I migrated from a self-made Perl static site generator to WordPress because it was slow, WordPress was dynamic and rapidly growing in features, and I wanted to write rather than code. (Also, I had plenty of time in 2009 for such things!) Over the years, problems crept in. Hosting costs ($200/year) for a slow server. No local writing - Windows Live Writer was dead. I wasn't using most WordPress features. So it was time to migrate back to a static site generator. (Also, I now have plenty of time for such things!) I tried in 2024. But the complexity of the migration was higher than my laziness. (I tried with LLMs. Didn't work.) Finally, in Dec 2025, coding agents were good enough to get this done. Codex and Claude Code both doubled their limits for the holidays, and I had no meetings. So, over two days, I joyfully migrated to a static site. Content is written in Markdown via VS Code and pushed to https://github.com/sanand0/blog/ A GitHub Action deploy.yaml publishes to GitHub Pages It uses a hugo.toml configuration with supporting scripts. Here're the useful practices I distilled from my prompts. Create a PLAN.md before complex tasks It analyzed my blog: blocks and shortcodes used, plugins, URL structure, etc. and came up with a pretty good plan. Here are some notes: Record unresolved edge cases for manual review. (Wise!) Prefer raw HTML inside Markdown when conversion would lose fidelity. (Interesting! Also has detailed rules for tables, code, figures, iframes, forms, ...) Frontmatter: Required: title, date, lastmod, slug, author, categories, tags, status, draft, canonical, summary/excerpt, commentstatus, pingstatus. (Um... too much?) Use Hugo (single binary, fast, built-in RSS/sitemap/taxonomies, supports raw HTML and shortcodes) and GitHub Pages via GitHub Actions. There's no way I would have thought of all of these! Analyze data while planning Even while it was planning, another thing struck me. I won't use GitHub to serve assets. It bloats the repo. Plus, there's an opportunity to compress better with WebP. So I asked it to analyze my media. It parsed the WordPress export against my local uploads/, listed unused uploads (1.7K files of 87MB), and found 515 used files of 34MB. It estimated 11MB savings from WebP conversion of used images >10KB. Edit PLAN.md using the agent, not manually Editing manually is prone to mistakes, e.g. introducing contradictions. Useful lesson: Let me know what other information you need, if any. Life is full of unknown unknowns! It did ask if I was OK changing URLs from .jpg|.png to .webp, which I confirmed in the next prompt. Implement small steps, run and commit as you go I know from experience that a single-shot implementation of this size would be too complex today. So I asked for image conversion first. Having the agent run the script is the most powerful idea in here. If it makes a mistake, it can figure it out and fix itself. Commit as you go is useful. I can undo changes later. I also efficiently get a sense of the progress and thinking. It took a long time (on GPT 5.2 Codex - Extra High Thinking), wrote a scripts/prepareassets.py, switched from ImageMagick to Pillow for better control (strange!), trouble-shooted PNG transparency bugs, ran it, noted that 41 files in my blog that were missing, and committed everything. Run post-mortems mid-way Strangely the JPEG files weren't converted. So I asked: It said: Because the script follows your latest instruction: it compresses JPEGs and PNGs in-place and keeps their original formats. OOPS! My mistake. Anyway, I also needed it to convert MP3 to Opus. So... Ask for actionable exception reports Let's have it do all the conversions. But note the last line. It had already identified that some uploads were missing. To action that, I would need a post -> file mapping, which I asked for. Delegate verification to the agent In the exception report, there was an amazoncooliri file missing. I couldn't find it in the blog XML. So I asked: At first, I checked the code to see why amazoncooliris became amazoncooliri. But months of practicing laziness delegation took over and I had it debug itself. Turned out it wrote \\s instead of \s which fixed it. Accept that you will make mistakes It replied: Because the script only converts JPEG → WebP. For PNGs, it follows your instruction to “compress PNGs losslessly with 256 colors,” so they stay PNG. OOPS AGAIN! I forgot to ask it to convert PNGs. Verification reports speed up reviews Now for the big one: converting the blog posts. Apart from converting the posts, it generated: reports/edge-cases-unhandled.tsv -- an exception report reports/edge-cases-handled.tsv -- a verification report The verification report was handy. I could see the edge cases (e.g. upload URLs rewritten, iframes/tables/objects/scripts that were retained, WordPress comment blocks removed) and spot check quickly. Without this, I would have spent a lot more time reviewing. This gave me confidence that it had handled edge cases well. Generate easy-to-review to review content I find it productive to have the agent generate content that is easy to review. At this point, I had a bunch of Markdown files that were very easy for me to scan. So I created an extensive list of changes: The last line was because I was also saving my prompts and it kept getting confused why a file it didn't create kept changing 🙂. Give it all your tools I had it install Hugo and run it. (I could have set it up myself, but why bother?) I allowed it to ssh to my server to check logs if needed. In both cases, these are tools I would need to build and test. It makes sense to let the agent use them directly. Note that I had made a mistake mentioning uploads/ instead of assets/. This keeps happening. I don't know any Hugo, so this was a bold step. But the output would be easy to review (it's a static site), so more reviewability = more confidence. After a long time, it generated the static site. It managed to self-correct a bunch of stuff. For example: I removed --minify because inline scripts with in posts/2011/2011-05-19-eating-more-for-less.md break JS minification; HTML builds cleanly without minify. Prefer UI reviews over code reviews for ease In fact, if required, have it build a throw-away tool to help you review. In my case, the output was functional but ugly. So ugly that I couldn't review it properly. I suggested a few obvious fixes (like broken links) but the main ask was to pick a theme and make it look like my website. You can resume if it hangs. Don't worry about context This took forever and I think Codex crashed or hung or something. So I killed it, resumed, and asked: It managed to resume. I'm not sure if there was some context loss or confusion, but I'm learning to worry less. Allow it design flexibility Internal links were still broken. I didn't know why, nor enough to fix them. So, rather than make a design decision (e.g. always use full / absolute / relative URLs), I let it decide. curl "https://api.openai.com/v1/organization/usage/audiospeeches?starttime=$(date -d '1 day ago' +%s)&projectids=$PROJECTID&groupby=model" \ H "Authorization: Bearer $OPENAIADMINKEY" \ H "Content-Type: application/json" It decided to use absolute paths. Generate documentation Apart from adding a few more features / fixes, I had it generate a README.md documenting what I would need to run this in the future. I also had it fix another design error I made. The placeholders I asked for didn't look good. Ask for effort estimates At this point, things were fine. But I was curious if we could refactor a bit. I'm concerned if it might mess it up, though. Effort is a good proxy for errors. So I asked it: It's response: Auto-generate content/ from posts/ is moderate effort... Dropping slug frontmatter is easy if you accept Hugo’s filename‑based slug rules... Embedding comments into each post is moderate effort... Probe for confidence I asked: I didn't read the output. My aim was not to learn. It was more to glance at it, see if (based on my considerable experience in this area) if it looked reasonable. In short, I was probing for confidence -- its and mine. Continue the session for the long tail Normally, I would have created a new session to implement changes and fixes. But the session was auto-compacting quite well. So rather than lose context, I had it create a build steps and run several minor fixes over the next few days. I didn't need to specify the context again and again. Summary Here're the lessons I distilled from this migration, tagged by whether it's new to me. | # | Lesson | New? | | -: | ----------------------------------------------------- | ---- | | 1 | Create a PLAN.md before complex tasks | | | 2 | Analyze data while planning | New | | 3 | Edit PLAN.md` using the agent, not manually | New | | 4 | Implement small steps, run and commit as you go | | | 5 | Run post-mortems mid-way | New | | 6 | Ask for actionable exception reports | New | | 7 | Delegate verification to the agent | | | 8 | Accept that you will make mistakes | | | 9 | Verification reports speed up reviews | New | | 10 | Generate easy-to-review to review content | | | 11 | Give it all your tools | | | 12 | Prefer UI reviews over code reviews for ease | | | 13 | You can resume if it hangs. Don't worry about context | New | | 14 | Allow it design flexibility | New | | 15 | Generate documentation | | | 16 | Ask for effort estimates | New | | 17 | Probe for confidence | New | | 18 | Continue the session for the long tail | |

Migrating my blog from WordPress to Hugo


AI-assisted migration makes it feasible for non-experts to move course sites across stacks quickly, reducing dependence on LMSs and specialized coding knowledge.

This morning, I migrated my Tools in Data Science course page from Docsify to Hugo using Codex. Why? Because Docsify was great for a single term. For multiple terms, archives became complex. I still could have made it work, but it felt like time to move towards a static site generator. I don't know how Hugo or Go work. I didn't look at the code. I just gave Codex instructions and it did the rest. This gives me a bit more confidence that educators can start creating their own course sites without needing coding or platforms. Soon, they might not be stuck to LMSs either - they can build their own. Here are the prompts I used, along with Codex's responses, leading to two commits: Migrate from Docsify to Hugo deployment feat(site): dynamic course detection and improved sidebar navigation Prompt 1 Generate a MIGRATION-PLAN.md for migrating this student course site from docsify to Hugo. Currenty, this site uses docsify to render Markdown as HTML on the fly. Create a setup.sh that generates a static version of the site under public/ using Hugo. Use a popular, elegant, minimal Hugo theme of your choice. We want to retain the sidebar navigation, as well as the archives under 2025-01/, 2025-05/, 2025-09/, and more in the future. Minimize the custom coding needed to achieve this. Agent response I’ll inspect the repository structure to map the current Docsify content layout, then I’ll create MIGRATION-PLAN.md and a setup.sh that builds a Hugo static site into public/ with minimal custom logic and preserved sidebar/archive organization. I found the Docsify setup and the key files (index.html, root sidebar.md, plus archive subfolders with their own sidebar.md/README.md). Next I’ll inspect those files and then draft a migration plan plus an idempotent setup.sh that maps this structure into Hugo with minimal custom templates. I have enough context to implement this cleanly. I’m now choosing a Hugo docs theme and validating its sidebar configuration model so setup.sh can auto-generate navigation from your existing sidebar.md files with minimal maintenance for future archive terms. I validated hugo-book and will use it because it gives a built-in left docs sidebar with minimal configuration. I’ll now implement setup.sh to generate a Hugo workspace from your existing markdown tree and build to public/, then add MIGRATION-PLAN.md describing the migration steps and rationale. I’m about to add two files: setup.sh (idempotent Hugo build pipeline into public/) and MIGRATION-PLAN.md (phased migration plan, structure mapping, and rollout checks). I’ll keep the approach low-code by relying on Hugo Book’s built-in sidebar behavior and automatic archive folder discovery. I’ve written both files and will quickly sanity-check them (including a dry run of setup.sh in this environment, which should currently fail early because hugo isn’t installed here). I found one cleanup point: setup.sh checked for rsync even though it doesn’t use it. I’ll remove that extra dependency and then provide a concise summary of what was added. Created both requested files: 1. MIGRATION-PLAN.md 2. setup.sh What I implemented: Chose hugo-book as the theme (popular, minimal, docs-style sidebar). setup.sh now: Creates an isolated Hugo workspace at .hugo-build/site Clones hugo-book Generates hugo.toml Copies tracked markdown into Hugo content/ Converts every README.md to index.md (so /, /2025-01/, /2025-05/, /2025-09/ keep clean section URLs) Skips Docsify-only sidebar.md Copies all tracked non-markdown files into Hugo static/ Builds static output into public/ Notes: I could not run a full build here because hugo is not installed in this environment (Error: missing required command 'hugo'). Once Hugo Extended is installed, run: Files: setup.sh MIGRATION-PLAN.md Prompt 2 Use mise x hugo -- hugo and run and test it. Agent response I’ll run setup.sh through mise x hugo -- so Hugo is available in PATH for the script, then verify the generated public/ output and key archive routes. The first run failed because mise couldn’t write under /.cache/mise in this sandbox. I’ll rerun using a temporary cache directory and then validate the generated site. mise x hugo -- hugo is installing the standard Hugo binary (not Extended), so the script’s Extended check fails. I’ll quickly check the available mise variants and use an Extended one to complete the test run. mise does not expose an “extended” Hugo variant here. I’ll make setup.sh tolerant of standard Hugo (warn instead of hard-fail), then run it with mise x hugo -- and verify whether the build succeeds end-to-end. The build failed exactly at SCSS compilation, so we do need Hugo Extended for hugo-book. I’m testing mise x hugo@extended -- hugo with temporary mise data/cache dirs to keep everything inside writable paths. Found the issue: with mise, Extended is a separate tool named hugo-extended (not a variant of hugo). I’ll run using that to complete the test build. Build now succeeds with Hugo Extended. I’m validating the generated public/ output, including root and archive routes plus sidebar links. Ran and tested. Results: 1. mise x hugo -- hugo version Output: hugo v0.153.3 ... (non-extended) 2. mise x hugo -- ./setup.sh Fails at SCSS compile (TOCSS ... you need the extended version) because hugo-book requires Hugo Extended. 3. mise x hugo-extended -- hugo version Output: hugo v0.155.2+extended ... 4. mise x hugo-extended -- ./setup.sh Succeeds. Generated site at public/ Build summary: Pages 289, Static files 103, total 1.6s. Validation checks passed: public/index.html exists public/2025-01/index.html exists public/2025-05/index.html exists public/2025-09/index.html exists Sidebar contains links for archive terms and pages like marks-dashboard and system-requirements. I also adjusted setup.sh so non-extended Hugo emits a warning instead of exiting immediately (setup.sh). The actual build still correctly fails later if the active theme needs Extended. Prompt 3 The sidebar for the home page should only contain the contains of \sidebar.md. The sidebar for 2025-01/, 2025-05/, and 2025-09/ should only contain the contents of the respective folders' \sidebar.md. Convert any links to images/ to an absolute link starting with /images/. Re-run. Agent response I’ll update setup.sh to generate section-specific sidebars directly from each sidebar.md (root and archive folders), override Hugo Book’s menu partial to use those sidebars, rewrite images/ links to /images/, then rebuild and verify the output. I’m editing setup.sh now to: 1) normalize sidebar.md into per-section sidebar files, 2) override Hugo Book’s menu partial to render only the correct sidebar by section, and 3) rewrite markdown links from images/ or ../images/ to /images/. Then I’ll rebuild and verify. Implemented and re-ran with your requirements. Changes made in setup.sh: Sidebar behavior: Added per-section sidebar generation from source sidebar.md files: root: sidebar.md 2025-01/: 2025-01/sidebar.md 2025-05/: 2025-05/sidebar.md 2025-09/: 2025-09/sidebar.md Added a Hugo Book partial override at .hugo-build/site/layouts/partials/docs/menu-filetree.html during build so: home and non-archive pages use only root sidebar.md pages under /2025-01/, /2025-05/, /2025-09/ use only their own folder sidebar Link normalization in sidebars: Converts .md links to Hugo-style paths (e.g. /foo/) Normalizes sidebar-local links like http-requests to /http-requests/ Removes docsify inline lines from sidebars Image link rewrite in content: Rewrites markdown links from (images/... and (../images/... to (/images/... while copying content into Hugo. Re-run/test: mise x hugo -- ./setup.sh still fails because hugo-book needs Extended Hugo (SCSS pipeline). Successful build command: XDGCACHEHOME=/tmp MISECACHEDIR=/tmp/mise-cache MISEDATADIR=/tmp/mise-data mise x hugo-extended -- ./setup.sh Build passed and generated public/ successfully. Verified output: Home sidebar only has root sidebar.md entries (Jan 2026..., Marks Dashboard) in public/index.html. public/2025-01/index.html sidebar matches 2025-01/sidebar.md only. public/2025-05/index.html sidebar matches 2025-05/sidebar.md only. public/2025-09/index.html sidebar matches 2025-09/sidebar.md only. Image references are rewritten, e.g. src=/images/portalnotifications.webp in rendered pages. Prompt 4 The Next and Previous buttons at the bottom should follow the \sidebar.md navigation order in each folder. Add a dark/light mode toggle. Add a GitHub action to deploy this to GitHub pages Agent response I’ll extend the build so Hugo uses sidebar.md order for page-to-page navigation, add an explicit dark/light toggle in the generated site, and create a GitHub Actions workflow that builds with Hugo Extended and deploys public/ to GitHub Pages. I identified how Hugo Book computes prev/next today; I’m now overriding that partial to read an explicit per-sidebar navigation sequence so buttons follow sidebar.md order exactly. I’ll also add a small injected toggle that switches BookTheme between light and dark at runtime. I’m implementing three concrete updates now: generate sidebar-order data from sidebar.md, override Hugo’s prev-next partial to use that order, and inject a real dark/light toggle using custom SCSS + a small script. After that I’ll add the Pages deployment workflow and run a full rebuild. I’ve added the workflow and finished the setup.sh changes. Next I’m running a full build with Hugo Extended and validating: 1) prev/next order matches sidebar sequences, and 2) the theme toggle appears and works via injected script/CSS. The rebuild now passes, and spot checks confirm: footer navigation follows sidebar order (e.g., marks-dashboard -> development-tools -> vscode for the Sep 2025 sequence), plus the dark/light toggle is present and persisted via local storage. I’ll do one final status check and summarize exact file changes. Implemented all three requests and re-ran successfully. What changed: setup.sh Added sidebar-order extraction from sidebar.md into data/sidebar-nav.yaml. Added custom prev-next partial override so footer navigation follows sidebar.md order. Kept section-specific sidebar rendering: root pages use root sidebar.md 2025-01/, 2025-05/, 2025-09/ use their own sidebar.md Added dark/light mode toggle: injects toggle button in sidebar persists preference in localStorage (tds-theme) applies theme via custom SCSS overrides using Hugo Book mixins. Kept image link rewrite to absolute /images/.... .github/workflows/deploy-pages.yml Added GitHub Pages deployment workflow: triggers on push to main and manual dispatch installs Hugo Extended (peaceiris/actions-hugo@v3) runs ./setup.sh uploads public/ deploys via actions/deploy-pages@v4 Run/test performed: Command used: XDGCACHEHOME=/tmp MISECACHEDIR=/tmp/mise-cache MISEDATADIR=/tmp/mise-data mise x hugo-extended -- ./setup.sh Build passed. Verified: Next/Previous follows sidebar order (example: system-requirements -> marks-dashboard -> development-tools -> vscode in Sep sequence). Dark/light toggle is present and persists. Site generated under public/. Files: setup.sh .github/workflows/deploy-pages.yml If you want, I can also add a short “Deploy” section to README.md with the exact GitHub Pages settings (Pages source = GitHub Actions). Prompt 5 Add an appropriate Unicode "icon" for the Dark/Light Mode toggle button .gitignore public/ and any other files you create that should not be committed (if any). Move MIGRATION-PLAN.md to .hugo-build Commit Agent response I’ll update the toggle label to include a Unicode icon, update .gitignore for generated artifacts (public/, .hugo-build/), move MIGRATION-PLAN.md into .hugo-build/, then commit only the migration-related files. I’m applying the requested edits now: iconized toggle text plus ignore rules, then moving MIGRATION-PLAN.md under .hugo-build/. After that I’ll stage only the intended files and commit. I’ve moved the migration plan and updated the scripts. I’ll run one quick rebuild to ensure the iconized toggle is reflected in output, then commit the exact files (setup.sh, workflow, .gitignore). I’ve committed the requested changes. I’m doing a quick post-commit check to confirm .gitignore includes generated paths and that MIGRATION-PLAN.md now lives under .hugo-build/. Done. Committed as: 1dd73c6 Add Hugo sidebar-ordered nav, theme toggle icon, and Pages deploy workflow Included in commit: .github/workflows/deploy-pages.yml .gitignore setup.sh Also completed: Added Unicode icon treatment for theme toggle (◐, ☀, ☾) in generated site via setup.sh. Ignored generated artifacts: public/ .hugo-build/ Moved MIGRATION-PLAN.md to: .hugo-build/MIGRATION-PLAN.md Note: I did not include unrelated working tree changes (e.g. existing README.md modification and other untracked project files) in the commit. Prompt 6 Don't implement it, but just tell me: what's the most elegant, minimal way (directory structure wise) to commit the files setup.sh creates, like hugo.toml, menu-filetree.html, head.html, etc? That way, setup.sh becomes smaller, cleaner, easier to read, and the other files are easier to edit. Agent response Most elegant minimal pattern: commit a tiny Hugo scaffold once, and let setup.sh only do content sync + build. Use this structure in-repo: Then setup.sh just: 1. Creates .hugo-build/site 2. Copies hugo/ into it 3. Clones/uses theme 4. Generates only dynamic files (data/sidebar-nav.yaml, maybe sidebars/.md) 5. Copies content/static 6. Runs Hugo If you want even cleaner: keep theme as a Hugo module in hugo.toml and remove theme clone logic too. Prompt 7 What would the file and directory structure look like if we went the "even cleaner" route? Agent response Key point: with Hugo Modules, there is no committed themes/ directory and no git clone theme step in setup.sh. Prompt 8 I want the sidebars to stay where they are. Given this, what will be the only files that get committed? Agent response If sidebars remain in-place (sidebar.md, 2025-01/sidebar.md, etc.), then only commit the Hugo scaffold and automation files: setup.sh .github/workflows/deploy-pages.yml hugo/hugo.toml hugo/assets/custom.scss hugo/layouts/partials/docs/menu-filetree.html hugo/layouts/partials/docs/prev-next.html hugo/layouts/partials/docs/inject/head.html hugo/layouts/partials/docs/inject/menu-after.html .gitignore updates (for public/, .hugo-build/) Everything else (public/, .hugo-build/, generated nav/sidebar data) stays uncommitted/generated at build time. Prompt 9 OK, implement that, run and test. Agent response I’m going to refactor to the committed Hugo scaffold layout now: move static template/config/style content into hugo/, shrink setup.sh to orchestration only, then run a full build and verify sidebar behavior, prev/next order, and theme toggle. I confirmed go is not installed locally, so for the Hugo-module route I’ll also wire go into the workflow and test locally with mise x go hugo-extended -- ./setup.sh. I’m now creating committed scaffold files under hugo/ and rewriting setup.sh to just copy scaffold + generate dynamic sidebar data + build. I’ve finished the refactor to committed scaffold files under hugo/. I’m now running a full build using mise x go hugo-extended -- ./setup.sh and then validating sidebar scoping, prev/next order, and toggle presence in generated HTML. The first module-based run failed because Hugo Modules needs initialization in the temporary site (go.mod). I’ll add hugo mod init (and module fetch) inside setup.sh, then rerun the build and checks. Implemented. What changed: Refactored to committed Hugo scaffold files under hugo/: hugo/hugo.toml (Hugo Module import for github.com/alex-shpak/hugo-book) hugo/assets/custom.scss hugo/layouts/partials/docs/menu-filetree.html hugo/layouts/partials/docs/prev-next.html hugo/layouts/partials/docs/inject/head.html hugo/layouts/partials/docs/inject/menu-after.html Simplified setup.sh: Copies hugo/ scaffold into .hugo-build/site Initializes/fetches Hugo modules (hugo mod init, hugo mod get -u) Generates normalized sidebars and data/sidebar-nav.yaml from existing sidebar.md files in-place Copies content/static and rewrites images/ links to /images/ Builds into public/ Updated GitHub Pages workflow: .github/workflows/deploy-pages.yml now sets up Go (actions/setup-go@v5) before Hugo Extended. Run/test: Executed: XDGCACHEHOME=/tmp MISECACHEDIR=/tmp/mise-cache MISEDATADIR=/tmp/mise-data GOMODCACHE=/tmp/go-mod-cache GOPATH=/tmp/go-path mise x go hugo-extended -- ./setup.sh Result: Build succeeded (Pages: 289) and generated public/. Validated behavior after refactor: Sidebar scoping still correct (home/root sidebar only root entries; 2025-09 uses only its sidebar). Footer Previous/Next still follows sidebar.md order. Dark/light toggle still present with Unicode icons (◐, ☀, ☾) and persisted theme state. I have not made a new commit in this step. Prompt 10 Document what each section in setup.sh does and why. A future reader should not be confused. Also document any other sections you created in this session. Then commit. Agent response I’ll add clear section-level comments in setup.sh and concise purpose comments at the top of each newly added Hugo override/workflow file so a future maintainer can understand what exists and why, then I’ll commit those documentation-only changes. I’m now adding maintainership-focused comments to every new/modified scaffold file (setup.sh, Hugo partials/config, SCSS, workflow), then I’ll run a quick build sanity check and commit. I’ve added section-level documentation across setup.sh and all related scaffold/workflow files. I’ll run one build sanity check, then commit these documentation updates. Done. I added documentation comments for maintainability across all migration files and committed. Committed: fabb96a Document Hugo migration scaffold and setup sections What I documented: setup.sh Added clear section headers and “why” comments for: path setup dependency checks clean build lifecycle scaffold copy Hugo module init/fetch sidebar normalization sidebar-order extraction for prev/next markdown/static copy rules final Hugo build step Hugo scaffold files under hugo/ hugo/hugo.toml: purpose and module/theme notes hugo/layouts/partials/docs/menu-filetree.html: sidebar-selection rationale hugo/layouts/partials/docs/prev-next.html: sidebar-order nav rationale hugo/layouts/partials/docs/inject/head.html: no-flash theme apply note hugo/layouts/partials/docs/inject/menu-after.html: toggle purpose note hugo/assets/custom.scss: theme override and button styling notes Workflow .github/workflows/deploy-pages.yml: top-level comment explaining build/deploy flow via setup.sh. Validation run: Rebuilt successfully with: mise x go hugo-extended -- ./setup.sh Build output still succeeds (public/ generated). Prompt 11 I made a few changes: I also used dprint to format Markdown files via npm run lint. In setup.sh I replaced rg with grep since it's not available in the CI pipeline. I squash-merged the changes so far. Now, when I visit /2025-09/ (or any other archive page) it shows me the sidebar correctly. But when I click on the next link, e.g. /system-requirements/ the sidebar becomes that of the root /\sidebar.md. I want to retain the sidebar for each course. So I guess the best way is to copy the content into 2025-09/ and 2025-05/ and 2025-01/ folders respectively. In the future, I will have other courses starting with 2026- or 2027- etc. It's safe to say that any folder with a 20YY-MM/ format is a course folder and should have its own sidebar. Modify minimally and elegantly to handle this required. Run and test. Commit as you go. Agent response I understand: for any 20YY-MM/ course, navigation should stay inside that course context (/2025-09/...) so sidebar never falls back to root while moving through next/previous links. I’ll inspect the current setup.sh and generated scaffold, then patch minimally with dynamic course-folder handling and test end-to-end. I’ve identified a minimal fix: detect all 20YY-MM course folders dynamically, generate course-prefixed sidebar links, and clone shared top-level markdown pages into each course path so navigation stays in-course. I’m applying that now to setup.sh plus the two Hugo partials. I’ve patched dynamic course detection and course-prefixed navigation. Next I’m running a full build and verifying that /2025-09/ -> next -> /2025-09/system-requirements/ keeps the 2025-09 sidebar (and same for other courses). Build and behavior checks passed for 2025-09, 2025-05, and 2025-01. I’m committing the minimal fix now (only setup.sh and the two sidebar/nav partials). Implemented with minimal changes and committed. Commit: c54ec05 Keep course sidebar context across next/prev via dynamic course routes What changed: setup.sh Detects course folders dynamically using 20YY-MM pattern. Generates course sidebars for all detected folders (not hardcoded to 2025-). Normalizes course sidebar links to course-scoped URLs (e.g. /2025-09/system-requirements/). Generates data/sidebar-nav.yaml dynamically for root + all courses. Duplicates shared top-level markdown pages into each course path so course-scoped links resolve. hugo/layouts/partials/docs/menu-filetree.html Sidebar selection is now dynamic by URL prefix ^/20YY-MM/. No hardcoded course list. hugo/layouts/partials/docs/prev-next.html Prev/Next now uses the dynamic course key from path prefix. Keeps navigation inside the current course context. Run and test: Built with: mise x go hugo-extended -- ./setup.sh Verified outputs exist: public/2025-09/system-requirements/index.html public/2025-05/development-tools/index.html public/2025-01/development-tools/index.html Verified behavior: /2025-09/ next link points to /2025-09/system-requirements/ /2025-09/system-requirements/ shows 2025-09 sidebar (not root) Same in-course next/prev behavior confirmed for 2025-05 and 2025-01. Prompt 12 Ensure that: The current page is highlighted on the sidebar The next / previous pages show the titles of the pages they link to, not just the title-cased filenames Again, think about the most minimal, elegant, way to do this. Agent response I’ll make two small targeted changes: enrich generated sidebar-nav data with label text from sidebar.md for accurate next/previous titles, and add a lightweight sidebar-active-link highlighter script so the current page is visibly selected. Then I’ll rebuild and verify. I’m now updating the nav data format to store both path and human-readable title from sidebar.md, then switching prev-next to use those titles. I’ll also add a tiny sidebar script for active-link highlighting with minimal CSS. I’ve applied the minimal patches. I’ll now rebuild and verify two things in generated output: active sidebar class appears on the current page link, and next/previous labels use sidebar.md titles (e.g. “System Requirements”, “Marks Dashboard”). Build failed due a Hugo template type issue in prev-next (empty dict fields). I’m applying a safe guard in the template to only read path/title when present, then rerunning the build. The rebuild now passes; next/previous titles are sourced from sidebar labels. I’ll commit these minimal updates (nav-title mapping + active-link highlighter) and summarize the exact behavior change. Implemented minimally and committed. Commit: 44ea7b6 Use sidebar labels for prev/next and highlight active sidebar link What changed: setup.sh Sidebar nav data now stores both: path title (taken from sidebar.md link text) This preserves human-written titles for navigation labels. hugo/layouts/partials/docs/prev-next.html Prev/next now reads from { path, title } entries. Footer labels use sidebar titles (e.g. System Requirements, Marks Dashboard, 1. Development Tools) instead of derived filename titles. Falls back to Hugo page title only if sidebar title is missing. hugo/layouts/partials/docs/inject/menu-after.html Added a lightweight runtime highlighter: compares current pathname with sidebar link hrefs adds active class and aria-current="page" to the current sidebar link hugo/assets/custom.scss Added explicit .book-menu-content a.active styling so current page is visibly highlighted. Run/test: Rebuilt successfully with: mise x go hugo-extended -- ./setup.sh Verified in generated HTML: Prev/next labels now use sidebar titles: /2025-09/system-requirements/ prev = Sep 2025: Tools in Data Science, next = Marks Dashboard /2025-09/marks-dashboard/ prev = System Requirements, next = 1. Development Tools Active-link script and style are present in output and will apply on page load. Prompt 13 Do we really need go and hugo extended? Check if it can run without. Agent response I’ll run four quick matrix checks to isolate requirements: hugo only, go+hugo, hugo-extended only, and go+hugo-extended, then report exactly which dependency is truly required and why. I’m waiting on the final success/failure output for the go + hugo-extended run to complete the matrix conclusively. Short answer: with the current architecture, yes, both are required. I ran checks: 1. hugo only Command: mise x hugo -- ./setup.sh Result: fails immediately with Error: missing required command 'go' 2. hugo-extended only Command: mise x hugo-extended -- ./setup.sh Result: same failure: missing required command 'go' 3. go + hugo (non-extended) Command: mise x go hugo -- ./setup.sh Result: fails during build with SCSS error (TOCSS ... need the extended version) So: go is required because setup.sh uses Hugo Modules (hugo mod init/get) to fetch hugo-book. hugo-extended is required because hugo-book compiles SCSS (book.scss). If you want to drop one: Drop go: stop using Hugo Modules (vendor/submodule theme in repo). Drop hugo-extended: use a theme without SCSS compilation (or precompiled CSS-only setup). Prompt 14 How do I install hugo-extended? Agent response Use one of these. mise (recommended in this repo): mise project-local: You should see +extended in the version output. For this project’s build command: Prompt 15 I get this error: ❯ mise x go hugo-extended -- ./setup.sh Start building sites … hugo v0.155.2-d8c0dfccf72ab43db2b2bca1483a61c8660021d9+extended linux/amd64 BuildDate=2026-02-02T10:04:51Z VendorInfo=gohugoio Total in 96 ms ERROR error building site: render: [en v1.0.0 guest] failed to render pages: render of "/" failed: "/home/sanand/.cache/hugocache/modules/filecache/modules/pkg/mod/github.com/alex-shpak/hugo-book@v0.0.0-20260108111751-81a841c92d62/layouts/baseof.html:63:5": execute of template failed: template: list.html:63:5: executing "footer" at : error calling partial: "/home/sanand/.cache/hugocache/modules/filecache/modules/pkg/mod/github.com/alex-shpak/hugo-book@v0.0.0-20260108111751-81a841c92d62/layouts/\partials/docs/footer.html:24:3": execute of template failed: template: \partials/docs/footer.html:24:3: executing "\partials/docs/footer.html" at : error calling partial: "/home/sanand/code/tools-in-data-science-public/public/.hugo-build/site/layouts/\partials/docs/prev-next.html:16:16": execute of template failed: template: \partials/docs/prev-next.html:16:16: executing "\partials/docs/prev-next.html" at : can't evaluate field path in type interface {} Agent response This error is from the prev-next template assuming every nav item is an object with path/title. I’ll patch it to gracefully handle both shapes ("string" and {path,title}), so stale/generated data won’t break builds, then I’ll test and give you the exact recovery commands. hugo-extended is installed correctly. This error is a template/data mismatch, not an install issue. Your prev-next.html expects nav items like: But your current setup.sh is still generating plain strings: So {{$item.path}} fails. Fix 1. Make sure you’re on the latest commit where this was fixed (44ea7b6), or update setup.sh so writesidebarnavyaml() writes both path and title. 2. Clean generated artifacts: 3. Run from repo root (the directory containing .git): If you want, I can give you a minimal patch for just writesidebarnavyaml() and prev-next.html to make it robust even if old string-format data appears. Prompt 16 I'm in the right directory, with the .git. Here's what I get: ❯ rm -rf .hugo-build public ❯ mise x go hugo-extended -- ./setup.sh Start building sites … hugo v0.155.2-d8c0dfccf72ab43db2b2bca1483a61c8660021d9+extended linux/amd64 BuildDate=2026-02-02T10:04:51Z VendorInfo=gohugoio Total in 2120 ms ERROR error building site: render: [en v1.0.0 guest] failed to render pages: render of "/home/sanand/code/tools-in-data-science-public/.hugo-build/site/content/\index.md" failed: "/home/sanand/.cache/hugocache/modules/filecache/modules/pkg/mod/github.com/alex-shpak/hugo-book@v0.0.0-20260108111751-81a841c92d62/layouts/baseof.html:63:5": execute of template failed: template: list.html:63:5: executing "footer" at : error calling partial: "/home/sanand/.cache/hugocache/modules/filecache/modules/pkg/mod/github.com/alex-shpak/hugo-book@v0.0.0-20260108111751-81a841c92d62/layouts/\partials/docs/footer.html:24:3": execute of template failed: template: \partials/docs/footer.html:24:3: executing "\partials/docs/footer.html" at : error calling partial: "/home/sanand/code/tools-in-data-science-public/.hugo-build/site/layouts/\partials/docs/prev-next.html:16:16": execute of template failed: template: \partials/docs/prev-next.html:16:16: executing "\partials/docs/prev-next.html" at : can't evaluate field path in type interface {} Agent response You’re right, thanks for sharing the exact trace. I’ll make prev-next.html backward-compatible so it works whether nav entries are strings or {path,title} objects, then you can rebuild without depending on one exact setup.sh data format. I’ve patched the template to accept both data shapes. I’ll quickly run the build once to confirm the error is gone. Good catch: Hugo evaluates index eagerly, so I rewrote it with explicit if branches to avoid indexing strings. I’ll rerun the build now. There’s one more edge case: when no prev/next exists, the placeholder map produced a non-string path. I’m patching that guard now (isset checks before reading path/title) so empty edges don’t break rendering. I’ve reproduced your exact error and fixed it by making prev-next.html robust to both nav data formats. I’m committing this as a small compatibility fix so you can cherry-pick or pull it cleanly. You’re hitting a real compatibility bug, not an install issue. Root cause: Your prev-next template is reading item.path. Your generated nav data in some runs is still a plain string list. Hugo errors with: can't evaluate field path in type interface {}. I fixed this by making prev-next.html support both: string entries ("/2025-09/system-requirements/") object entries ({ path, title }) Commit: b856e7c Make prev/next template compatible with string and object nav entries I also verified the build succeeds after this fix with: What you should do: 1. Pull latest hugo branch (or cherry-pick b856e7c). 2. Re-run: If you want, I can also give you a one-command patch snippet to apply manually without pulling.

Migrating TDS from Docsify to Hugo


I used Claude to audit my evolving AI opinions, documenting my shifts toward specialized SLMs, multi-agent workflows, and MCP. I contrast my changing stances on vibe-coding and human intervention against constants like code-driven arithmetic.

I asked Claude about my AI opinions. Based on my transcripts and blog posts, find the three claims I make most consistently, the three I've quietly reversed, and the one assumption I've never questioned but everything depends on. Here are things I've changed my opinion on: 1. THEN: One frontier model will win - not specialization. NOW: Gemini for media, Claude for strategy/style, GPT for rigor. SLMs as tools. 2. THEN: Carefully curate my course content. NOW: Give students prompts directly. 3. THEN: Web apps are differentiated artifacts. NOW: HTML is easier to generate than PPT - a signal of slop, not craft. 4. THEN: Human in the loop. NOW: Human NOT in the loop, bottlenecking it. On-the-loop, etc. is fine. 5. THEN: Minimal single-agent loop, avoid sub-agents" NOW: Multi-agent, sub-agent, and agent teams. 6. THEN: Avoid MCP, prefer SKILLS.md. NOW: Use MCP because integrating with Claude / ChatGPT / ... is easy. There are the top contradictions in my opinions. 1. "Vibe code everything, end-to-end" vs "Don't commit based on vibe-coding, it's not fully reliable". 2. "Experience is a liability" vs "Domain expertise is an edge" 3. "Paid plans are fine for private data" vs "Don't assume paid = private" 4. "Get out of the way / delegate everything" vs "Verification is the whole job" 5. "Build, don't plan" vs "Plan → Correct → Execute" Some things, I have never questioned. 1. For numbers, math, or correctness, make AI write and run code -- never trust prose arithmetic. 2. Judge AI against human accuracy, never against perfection -- because experts disagree among themselves. 3. Use AI heavily -- reach for it first, high volume. 4. Don't build a foundation model from scratch -- steer existing general models instead. Things I usually say, but there are exceptions. 1. "Always verify". But blindly trust AI in non-core areas where you are unskilled (such as personal finance). 2. "AI is improving fast". But there is a jagged edge, to verify before upgrading. 3. "Don't build models". But go ahead if it's easy and beats LLMs clearly. 4. "Models keep getting cheaper". But not in May 2026.

My changing AI opinions


Using ChatGPT to conduct a targeted interview and analyze a daily food log generates a concise, AI-readable specification of dining preferences to improve automated restaurant recommendations.

I use ChatGPT to recommend which restaurant I should eat at and what food I should eat. So often that I decided to share a profile of my eating preferences. But rather than think about it and type it myself, I asked it to Efficiently interview me to identify my food preferences. Document it for AI agents to help me pick restaurants. Plan like an expert. (Knowing ChatGPT, I also had add "efficiently" - otherwise it would give me a huge list of questions! Which it did that anyway...) That makes it easy. Now, I just have to answer questions about my preferences, e.g. my budget range, restaurant styles, cuisines etc. I also gave it a dump of my daily food log. (This year I've been logging all the food that I eat - for no reason actually - along with which of those I liked and disliked.) This proved to be a good idea, because it picked up something I didn't realize: You are unusually tolerant of repeating humble comfort foods at home, ... Very true. I ate curd rice day and night for 22 years at every meal. I eat Kaya Peanut Toast every day at Ya Kun Kaya Toast. (They make it the instant they see me standing at the back of the line, and miss me when I travel.) So, here's my tweaked version of ChatGPT's recommended food spec on how agents should pick for me: PS: This is styled quite differently from how ChatGPT writes, but the content was correct.

My food preferences


I saved my 24th anniversary by using ChatGPT to analyze bank transaction data for gift ideas. I ended up spending the day finishing 24 tasks from my wife's to-do list, which she called her most memorable anniversary.

At 9:30 pm, I checked my calendar for tomorrow's appointments, alt-tabbed frantically into ChatGPT, and started typing: Tomorrow is my 24th anniversary. It's a bit late for me to buy anything (except maybe an online service) or prepare something. This has become a habit -- leaving things to the last minute and asking ChatGPT to save my day. I did give it good context, though. You remember the OCBC expenses treemap you created by analyzing my transactions? That will give you a good guessable idea of the kinds of things she spends on and hopefully, therefore, what she likes. I was analyzing my bank transactions over the weekend, so that came in handy. What can I do (either create for her, like I made a peanut jelly nutella sandwich birthday for Dhyeya or buy - if it's an online service / gift voucher kind of thing) in the next hour or so? ChatGPT began with gyaan - which I promptly ignored: Your best move is not "buy a gift". It is "prove that I have noticed your life, then attach a redeemable escape hatch... ... and moved on to analyzing her personality and recommending from different perspectives: Practical person 1. No-decision day: "Tomorrow, you decide nothing. I handle transport, food, booking, payment, and exit plan." 2. Service relief voucher: 24 hours where she forwards any household/admin nuisance to you. 3. Personal-care float: ClassPass/spa/salon voucher plus the promise: "I will book the slot and taxi, not just give you a coupon." A romance playwright 1. 24 tiny vows: not grand vows; operational vows: "I will stop asking where the charger is." 2. The ordinary-places pilgrimage: one route across 3-5 mundane but meaningful places. 3. Private audio guide: 8 short voice notes she unlocks at home / taxi / restaurant / temple. ... and so on. For some of these, I'm absolutely the worst person to execute. ClassPass? Spa? Salon? I don't even know the difference between them. But 1.2 and 2.1 were interesting. So, after a few iterations with ChatGPT, I woke up the next morning with: Today's our 24th anniversary. For the next 24 hours, I'm going to knock off 24 things from your TODO list. I rescheduled my meetings. I spent the entire day doing nothing but what was on her list. Water purifier, doctor appointments, toothbrush shopping, investments, drying clothes, duct-taping, ... and we dined out. At 10:00 pm: "I think it was my most memorable anniversary. Thank you." Thank you, ChatGPT. Thank you, habit of setting low expectations.

My most memorable anniversary


I recount how a recurring daydream of being locked out of my own overcrowded talk manifested during a Google Meet session that hit its participant limit, turning a technical glitch into a funny milestone.

I daydream a lot. One recurring daydream is where I'm a speaker, but the event is so packed with people that I'm not able to enter the hall.\ The organizers call me, worried, asking where I am. I tell them "I'm outside. I'm not able to get in!"\ They apologize profusely. "We'll get you in," they say. They move out a few people, control the crowd, and manage to get me in. In fact, I had this daydream again just yesterday as I was walking back from dinner. Today, that daydream came true! (Kind of.) Straive runs a monthly series, "AI Conversations with Anand", on Google Meet. I joined, couldn't share my screen, and tried reloading. When I did, I got a message saying that the meeting was full (only 250 people allowed), and that I couldn't join! It played out almost exactly like the daydream. Kathleen messaged me.\ I replied: "Maximum number of people reached. I can't join! 🙂"\ She replied: "OMG. Let me kick someone 🙂" She controlled the crowd and managed to get me in. Daydream unlocked! PS: I had Claude write a version of the same story with a brief prompt - to test how close it is to my writing style. Short answer: close, but it's not my style. Got kicked out of my own talk today. It was the monthly Straive AI Conversations session, the internal one where I share whatever I've been doing with AI over the last month. Google Meet. Kathleen was hosting. For the first time, more than 250 people showed up. Neither of us knew Google Meet caps at 250. So as the room filled, Meet started doing what it does at the limit: someone has to leave for someone to join. I got bumped out of my own session. I tried to rejoin. Couldn't. The room was full. Of people who came to hear me. For years I've had this slightly embarrassing fantasy. That one day I'd be so popular my talk would overflow, and I'd be turned away at the door of my own event for lack of space. I never thought it would actually happen. It did. The universe granted the wish exactly as written, then immediately revoked my speaking rights to make room for the crowd. I sat there staring at the "you've been removed" screen, briefly the most popular person who was not allowed into his own talk. Kathleen sorted it out. I got back in. The session went on. But for a few minutes I was living the dream, locked outside, while 250 colleagues waited inside for a speaker who couldn't get past the bouncer. A few things I'm filing away: 1. Google Meet stops at 250\. Check this before you outgrow it. 2. The host should probably not also be the one most likely to get evicted. 3. Be specific with your fantasies. I wished to be turned away for popularity. I did not specify that I shouldn't be the one turned away. Maybe popularity has a hard limit, and it's 250.

My Overcrowded Talk Daydream


I use AI to transform my reading experience through summarizing, fact-checking, and re-authoring books into different styles. I explore applying these LLM techniques to everything from single sentences to comparisons across multiple volumes for deeper insight.

I'm using AI to read books by: Summarizing. This tells me what the books is about, the key points it makes and the main takeaways. It also helps me decide if I want to dig deeper. Fact-checking. I can find mistakes, alternate perspectives, and biases. That's a huge win! Re-authoring. I can write it in the style of Malcolm Gladwell, Randall Munroe, Richard Feynman, or anyone else I like. Makes dense prose much more enjoyable. So far, I've applied this at different levels - and I'm sure there are more possibilities: 1. A book. I can summarize & fact-check books like How Not To Die and learn what's really established. 2. A chapter. I can turn each chapter of Primo Levi's The Periodic Table into a Randall Munroe article that makes me laugh. 3. A sentence. I can take a single proverb like 忙しいほど幸せ or a Kural like அடக்கம் அமரருள் உய்க்கும் and turn it into an essay that makes me cry. 4. Multiple books. I can compare and fact-check multiple books on the same topic, e.g. Make It Stick, A Mind for Numbers, Ultralearning, and How to Take Smart Notes. But I suspect this is just the beginning. AI opens up many more reading styles. For example: Reviews over time. Could we read Lolita along with the 1950s interpretation, the 1970s feminist critique, the postcolonial turn, the contemporary reassessment? Understanding how meaning evolves over time? Character story. Reading just the sub-novel of a single character, e.g. Hoid across the Cosmere? AMA with the author. Interpret what the author might have meant or said, e.g. What caused the quake in Arelon? We should be mindful that artistry is not understanding. Assessing, teaching, applying, debating, ... these are better tests. But accessibility, enjoyment, and novelty are meaningful too. Let's go exploring! Calvin & Hobbes: Wow, it really snowed last night! Isn't it wonderful? Everything familiar has disappeared! The world looks brand new! A new year... a fresh, clean start! It's like having a big white sheet of paper to draw on! A day full of possibilities! It's a magical world, Hobbes, ol'd buddy... let's go exploring!

New ways of reading books


I shared a funny interaction where Gemini 3 Pro overthinks my 'no response required' instruction. Its extensive internal reasoning about social protocols and minimal interaction is a hilarious look into LLM chain-of-thought logic.

I asked Gemini 3 Pro to: Spark: A small but significant beginning. Lab: Short for laboratory; implies experimentation. ... (long and pretty good list) THINKING... Assessing User Response I've carefully considered the user's latest input, recognizing their selection of "Labs" and their appreciative, but brief, response. I'm focusing on parsing the meaning of "No response required" to determine if further interaction is needed. The information should help me to understand future similar responses. Refining Closure Strategy I'm now refining how to handle "No response required" situations. I was considering standard social protocol, but the user's instructions present a conflict. I must now balance the need for an output against respecting the user's intent to end the interaction. My current thinking leans towards a very brief, polite closing, as remaining completely silent could be misconstrued as an error. However, "No response required" suggests a user may want to end the chat. Prioritizing Minimal Interaction I've been meticulously considering how to respect the user's explicit wish for no further response. My initial instinct, drawn from typical AI interaction protocols, conflicts with the "No response required" instruction. I've ruled out complete silence, as it might appear as an error. Ultimately, I will attempt a minimal, polite confirmation, acknowledging the choice of "Labs". I want the interaction to end respectfully. Adjusting Response Protocol I'm now revising my response. "No response required" is a very strong constraint I must address. My initial plan involved a brief acknowledgment, but this could be unwelcome. The system's typical turn-forcing conflicts with the user's intent. My current approach involves a minimal, almost invisible, confirmation. I've re-evaluated my initial plan, recognizing that "next step" is irrelevant here. I will remove the next step, to respect the instruction and wish the user luck! You're welcome. "Labs" is a classic, strong choice—clear and professional. Best of luck with the project! Vadivelu says "என்ன ஒரு புத்திசாலித்தனம்"

No response required