Version-control activity can be automatically transformed into narrative audio, turning raw commit trails into ambient technical documentation that changes how people write and review code.

Automating a podcast from GitHub commits Here's an LLM-generated podcast of what I coded last week. NotebookLM-inspired. The process proved straightforward. Get my GitHub commits for the week. Get the repositories I committed to for more context. Have an LLM generate a podcast script. I'm using GPT 4.1 Mini but might shift to Gemini 2.5 Flash or DeepSeek V3. …using a detailed prompt beginning with "You are a podcast script assistant for “Anand’s Weekly Codecast.” This episode is for the week of {WEEK}. …". Here's a sample output. Convert the script to audio. I'm using GPT 4o Mini TTS with customized voices of Ash and Nova. These now appear on my GitHub repo as a weekly summary. Beyond technical novelty, it reshaped how I think about documentation. 1. I write for two audiences: informing my future self what changed and explaining why to an LLM that will narrate it. That's an interesting behavioral change. 2. Technical debt is audible. When hearing my week's work, architectural issues and potential next steps become clear. It creates an accountability mechanism that code reviews often miss. 3. Ambient documentation. I stop documenting when coding fast. Converting signals (commits) to consumable content creates "ambient documentation" that accumulates with no extra effort. Audio reduces the energy needed to stay up to date. This could change how we share technical work. Maybe financial analysts "narrate" spreadsheet changes, designers "explain" Figma iterations, or operators "log" settings adjustments - all automated from version control metadata. Converting activity traces into narratives dramatically lowers cost of knowledge & sharing. What activity traces do we generate? It's worth exploring what they could become, and how it'd change behavior if we knew those signals would become stories.


The fastest way to understand AI image generation is not theory but playful experimentation across replacements, stickers, interfaces, products, and environments.

Best way to learn AI image generation is by trying I figured I should spend a few hours on the native image generation bandwagon and push the bounds of my imagination. Here are some of my experiments with image generation on ChatGPT. Replacements: Replace the person with this image (after uploading a photo of Naveen) Sticker: Create a transparent comic-style sticker of a lady chef featuring this person happily cooking salad (after uploading a photo of my wife) Meme sticker: Create a transparent sticker of a Vadivelu meme Meme: Create an image of Vadivelu looking up from a well. No caption. Make it look like a frame from a Tamil film. Recipe: Invent a vegetarian dish that has NEVER been created. Describe the ingredients and procedure first. Then draw a mouth-watering image of the dish. (Another version) Infographics: Create a detailed comic infographic explaining the double slit experiment. Slides. Draw a beautiful infographic highlighting these 6 accessibility testing aspects, with apt icons and visuals. UI mockups. Draw the screenshot of a chat application incorporating these features: ... Product ideation. Draw an iSuit designed by Apple and Iris van Herpen. Show multiple views showcasing all features. Then write a product description. Interior design. Draw a biophilic office where the ceiling is a mirrored hydroponic garden, reflecting lush greenery downward to create the illusion of working in a floating forest. Meeting room design. Draw a modern office with sound-absorbing ‘whisper walls’ covered in fractal patterns that visually dampen noise pollution while doubling as collaborative whiteboards. Restaurant design. Draw a marble dining table with a river flowing through it, serving conveyor belt sushi as the dishes float gently on the water on top of plates. A sentient toaster with googly eyes, riding a unicycle through a library. A painting painting itself, but it's struggling with existential dread. Photo of a gym where people work out by lifting their own regrets. Here's what I learnt. The refusal rate is low, but it does refuse to generate some copyrighted material like Calvin & Hobbes strips. Using a prompt to generate the description and using THAT to prompt for images helps. A more imaginative model (like DeepSeek, maybe Grok) can help create good prompts that ChatGPT can execute faithfully. There are hallucinations that experts can detect. E.g. Naveen's and Vadivelu's faces are clearly off, but only slightly. This will improve, but until then, don't expect perfection. Comments Radhakrishna MV 13 Apr 2025 11:50 pm: I was very impressed that Grok can edit a scanned image of a hand-drawn cartoon & generate a new image - https://mvark.blogspot.com/2025/03/the-diet-delinquent.html This makes it easier to make a cartoon character perform different gestures & movements without having to redraw.


I read 51 books in 2025, primarily using AI summarization to process 44 titles in a single week. My highlights include Bert Hölldobler’s The Ants and Brandon Sanderson’s Wind and Truth, alongside deep dives into biology and psychology.

Books in 2025 I read 51 books in 2025 (about the same as in 2024, 2023, 2022, and 2021.) With a difference: I used AI to read 44 of them in the last week of the year. Mind blowing The Ants by Bert Hölldobler. Finally, after 20 years of wanting to read it. It lives up to the hype. Wind and Truth (The Stormlight Archive, #5) by Brandon Sanderson. The only fiction I've taken notes for. (About 500 points.) Life changing (or at least, perspective changing) The Choice: Embrace the Possible by Edith Eger Immune: A Journey Into the Mysterious System That Keeps You Alive by Philipp Dettmer Behave: The Biology of Humans at Our Best and Worst by Robert M. Sapolsky Noise: A Flaw in Human Judgment by Daniel Kahneman How Minds Change: The Surprising Science of Belief, Opinion, and Persuasion by David McRaney The Gene: An Intimate History by Siddhartha Mukherjee Phantoms in the Brain: Probing the Mysteries of the Human Mind by V.S. Ramachandran Entangled Life: How Fungi Make Our Worlds, Change Our Minds & Shape Our Futures by Merlin Sheldrake Interesting Build: An Unorthodox Guide to Making Things Worth Making by Tony Fadell Dopamine Nation: Finding Balance in the Age of Indulgence by Anna Lembke Ego Is the Enemy by Ryan Holiday How the Mind Works by Steven Pinker How to Change: The Science of Getting from Where You Are to Where You Want to Be by Katy Milkman Lux (Texas Reckoners, #1) by Brandon Sanderson Outcomes Over Output: Why customer behavior is the key metric for business success by Josh Seiden Outlive: The Science & Art of Longevity by Peter Attia Reality is Not What it Seems: The Journey to Quantum Gravity by Carlo Rovelli Same as Ever: A Guide to What Never Changes by Morgan Housel Small Wins Every Day: 100 Powerful Ways to Transform Your Life and Health by Luke Coutinho The Blank Slate: The Modern Denial of Human Nature by Steven Pinker The Body Keeps the Score: Brain, Mind, and Body in the Healing of Trauma by Bessel van der Kolk The Cancer Code: A Revolutionary New Understanding of a Medical Mystery by Jason Fung The Culture Map: Breaking Through the Invisible Boundaries of Global Business by Erin Meyer The Demon-Haunted World: Science as a Candle in the Dark by Carl Sagan The Diabetes Code: Prevent and Reverse Type 2 Diabetes Naturally by Jason Fung The Emperor of All Maladies: A Biography of Cancer by Siddhartha Mukherjee The Extended Phenotype: The Long Reach of the Gene (Popular Science) by Richard Dawkins The Frugal Wizard’s Handbook for Surviving Medieval England (Secret Projects, #2) by Brandon Sanderson The Happiness Hypothesis: Finding Modern Truth in Ancient Wisdom by Jonathan Haidt The Language Instinct: How the Mind Creates Language by Steven Pinker The Origin of Consciousness in the Breakdown of the Bicameral Mind by Julian Jaynes The Slight Edge by Jeff Olson The Song of the Cell: An Exploration of Medicine and the New Human by Siddhartha Mukherjee The Structure of Evolutionary Theory by Stephen Jay Gould The Stuff of Thought: Language as a Window into Human Nature by Steven Pinker The Tell-Tale Brain: A Neuroscientist's Quest for What Makes Us Human by V.S. Ramachandran Why We Die: The New Science of Aging and the Quest for Immortality by Venki Ramakrishnan Why We Sleep: Unlocking the Power of Sleep and Dreams by Matthew Walker Worth skipping How Not to Die: Discover the Foods Scientifically Proven to Prevent and Reverse Disease by Michael Greger Lifespan: Why We Age―and Why We Don't Have To by David Sinclair Metabolical: The Lure and the Lies of Processed Food, Nutrition, and Modern Medicine by Robert H. Lustig Price of the Modi Years by Aakar Patel Sex at Dawn: The Prehistoric Origins of Modern Sexuality by Christopher Ryan The Molecule of More: How a Single Chemical in Your Brain Drives Love, Sex, and Creativity—and Will Determine the Fate of the Human Race by Daniel Z. Lieberman The Obesity Code: Unlocking the Secrets of Weight Loss by Jason Fung The Telomere Effect: A Revolutionary Approach to Living Younger, Healthier, Longer by Elizabeth Blackburn Re-reading Words of Radiance (The Stormlight Archive, #2) by Brandon Sanderson The Way of Kings (The Stormlight Archive, #1) by Brandon Sanderson Elantris (Elantris, #1) by Brandon Sanderson Here's the list on GoodReads, sorted by read date. LinkedIn

Books in 2025


I received a translated Calvin and Hobbes comic in Tamil from Pratap Vardhan as a birthday gift. It is my favorite gift this year, highlighting a creative linguistic adaptation of the classic comic strip.

Thanks Pratap Vardhan -- this was my best birthday gift this year! LinkedIn

Calvin in tamil


I discovered Gemini is practically music-deaf, showing zero correlation with human emotional ratings across 40 songs. It over-predicts joy and ignores tension, suggesting it guesses based on text transcriptions rather than actually hearing the audio.

Gemini can pass the bar exam and solve maths olympiad puzzles. But it's music-deaf. nitin kumar asked Gemini to rate 40 songs on joy, sadness, tension, nostalgia, etc. and compared it with human ratings. There was ZERO correlation between the two. It's like it's a different species. In fact, if you just predict the average emotion for every single song, you'd still do 1.2× to 2× better than Gemini! It wasn't adding noise to a signal. It was subtracting subtracting signal from noise! In fact, for one song, the correlation was -88%, i.e. it predicted the exact opposite emotions. It's not just noisy, it's biased as well. It hears music as happier, more tender, more powerful than we do. It massively over-predicts "joyful activation" (53% of songs!) and dramatically under-estimates tension. The emotion predictions are suspiciously correlated with each other. Power and joy are basically identical (96% correlation). This confirms a suspicion I had: Gemini can't actually hear the audio. It can transcribe, but beyond that it's just guessing. Human music taggers are safe, for now. Story, prompts & analysis: https://sanand0.github.io/datastories/llm-music/ LinkedIn

Can ai hear what we feel


ChatGPT is valuable not just for work but as an ambient copilot for small, practical daily decisions around food, health, and errands.

ChatGPT's pretty useful in daily life. Here are my chats from the few hours. At the dry fruits store. https://chatgpt.com/share/68578741-72cc-800c-bcd0-de176a3a54db Can I eat these raw as-is? Can I bite them? Are they soft or hard? How hard? ANS: Dried lotus seeds are too hard to eat raw. Suggest snacks in India, healthy, not sweet, vegetarian, bad taste so I don't binge, dry not sticky. ANS: Seeds. Fenugreek, flax, sunflower, pumpkin, ... What dispenser helps me pick one at a time, like a tic-tac? ANS: Adjustable-hole spice shaker. Planning for a blood test. https://chatgpt.com/share/68578754-f024-800c-b91e-bf6ac649944d Analyze this (2-year old) blood test report. What's unusual for a south Indian 50-year-old vegetarian? What should I check for now? ANS: Very high LDL Cholesterol. Statin-diet-exercise triad needed. Repeat test and and trend all abnormal items. Look at the tests offered by HiTech Labs, Luz Church Road, Chennai and let me know which of these best matches the tests I should take now. ANS: Nalam Diamond for Men (₹ 4,299) + Microalbumin spot (₹ 250), Apo-A1 (₹ 490), Apo-B (₹ 490), Lp(a) (₹ 400). On the way to the blood test. https://chatgpt.com/share/68578767-ef00-800c-83c7-aff84bcdfd22 What are the best, not too sweet, not too filling, not very common desserts I can try out at Chennai? ANS: Miso Caramel Gelato @ Yuri, Guava & Chilli Ice Cream @ Dumont Creamery, Baklava Cheesecake @ Whippy's, ... Despite the memory feature, it didn't comment on the irony of my queries. LinkedIn

Chatgpt everyday uses


ChatGPT can now perform election-style data journalism with expert-like skepticism, iteration, and narrative refinement, not just code generation.

ChatGPT is a psephologist and data analyst After having O4-Mini-High scrape Singapore 2025 election results, I asked it to create 3 data stories with this prompt: That worked. Now, I'm sharing the scraped CSV as well as the electoral GeoJSON. First, analyze the data and think of a few interesting data stories to tell.\ Pick the 3 most interesting, perhaps surprising, stories.\ Create a BEAUTIFUL, APT data visualization of each of these 3 stories suitable for The Strait Times and write a short accompanying article. The thinking process it followed is remarkable in many ways -- just like an expert would do it! I've flagged the things that struck me as interesting: Technical Transparency & Self-Awareness: The model finds an error in code and works around it by itself Contextual Political Savvy: It understands the Singapore’s political landscape and knows that a walkover in Marine Parade is unlikely\ Data Skepticism & Quality Checks: It flags impossible 100%+ turnout and questions a one-size-fits-all electors value Meta-Cognitive Pipeline Monitoring: It flags a gap in its own analysis pipeline, checking that candidate counts align with seats Intellectual Honesty in Abandoning Dead Ends: It admits when its hypothesis fails and pivots Iterative Story Refinement: It first suggests one statistic, then self-corrects. A “draft-revise-publish” flow Here's the thinking process and response, annotated with 🟢 and my notes: I’ve got two files to work with: one for election data (CSV) and another for geographical boundaries (GeoJSON). First, I want to come up with three compelling data stories based on these details. I’ll use geographic mapping to explore things like constituencies with the highest margin and how voter turnout correlates with elector size. Then, I’ll create visualizations using matplotlib — separate plots, no fancy colors unless requested. Afterward, I’ll write an article to accompany these findings, suitable for The Strait Times. I’ve got a few story ideas based on the data: Story 1: Largest vote swing — the margin difference between the winning party and the runner-up. Story 2: Voter turnout variation — comparing turnout vs. electors by constituency. Story 3: Geographical clustering of party performance — where WP vs PAP dominate. I'll work on generating visual stories, like a bar chart for close races, a choropleth map for turnout, or a geographical map showing WP’s growth. I’ll use Python tools to visualize the data, keeping things simple but visually appealing for The Strait Times. Analyzed I’m planning to use GeoPandas to process the GeoJSON and CSV files. Although I should ensure GeoPandas is available, I feel pretty safe assuming it’s there since it’s a common tool in data science. I'll load the CSV using pandas and the GeoJSON with GeoPandas. Next, I’ll merge the constituency data and inspect the columns to find the key for this merge. First step: checking the CSV by displaying the first few rows to get oriented, then using the relevant tools to generate the visualizations. First, I’ll need to inspect the CSV to understand the structure. The file has constituency names repeated for each party's candidate group, so I’ll compute the margin for each constituency. This will involve subtracting the second-highest percentage (the runner-up) from the winning party’s percentage. For now, I don’t need to show the raw dataframe — I’ll check it privately in the analysis channel first before generating the three required charts. Then I’ll keep things simple with one call for three different visualizations. I can compute the margin as the difference between votes for the winner and runner-up for each constituency. CSV doesn't include turnout, but I can calculate it using the electors and total valid votes (sum of all party votes). This will let me create a story about turnout extremes, mapping the highest and lowest turnout. For the map of party performance, I’ll use the default colormap without explicitly specifying colors, as per the instructions. For the "tight races" story, I can create a bar chart with the top 5 closest races. Let’s inspect the geojson features for additional info. Analyzed 🟢 Technical Transparency & Self-Awareness: Here the model openly surfaces a low-level library error and immediately sketches a workaround—just like an engineer sharing a live debug session. This level of transparency in troubleshooting is rare in AI outputs. I can compute the margin between the winning party's votes and the runner-up’s votes for each constituency. The CSV doesn’t include turnout, but I can calculate it by using the 'electors' column and the sum of votes across all parties. I'll create a story about variation in turnout by mapping the highest and lowest turnout. For the winning party's geographical map, I’ll use default colors without specifying any, sticking to the instructions about not setting specific colors manually. I can calculate turnout as the ratio of total votes to electors. Then, I could create a story about variations in turnout, mapping the highest and lowest turnout constituencies on a bar chart. For the geographical map of winning parties, I need to avoid specifying colors. I’ll rely on the default colormap from geopandas, which is “viridis” — and since I’m not manually setting a color, I believe that’s fine. This way, I follow the guidelines while still visualizing the data effectively. Okay, it seems that I can try using geopandas in a Python environment, but there’s a shapely issue when reading geometries. The error likely involves shapely's handling of unsupported polygons. I could try fixing this by using Fiona to read the geojson file first and then convert it into a geopandas DataFrame with fromfeatures. This should allow me to work around the shapely bug and get the map visualization working as the user expects. If that doesn't work, I’ll choose alternative data stories that don’t require geoJSON. Analyzed I’m working through the color usage guidelines: we can’t explicitly set colors or styles unless asked. But using the default colormap, “viridis,” isn’t specifying a color, so it should be fine. I need to ensure I’m only passing the column, not the colormap, to avoid any issues. For visualizing data, I’ll focus on the map of margins — using a gradient from high to low margin seems more practical for the stories I want to tell, rather than focusing on vote share. Analyzed I’m trying to load geodata in the python\user\visible environment with geopandas. If that fails, I’ll avoid mapping and choose other data stories. Since the user requested geojson, I'll work through that, despite the shapely errors. Looks like I can use fiona to read geoms and then convert it to a GeoDataFrame. Inspecting the raw json, I’ll need to check properties such as 'ED\DESC' (likely constituency code), 'NEW\ED' (possibly updated name), and 'Name' (constituency name). I’m looking into the 'NEW\ED' field in the geojson, where there are codes like ‘JE’ for Jurong East-Bukit Batok, which differ from the CSV’s tableId codes (like 'A' for Aljunied). This mismatch means merging based on these columns doesn’t work directly. It looks like the CSV might have a 'constituency' column, and geojson uses 'Name,' potentially with longer names like 'Aljunied GRC.' I’ll explore the 'ALJUNIED' entries further to confirm this. Analyzed I see that the 'NEW\ED' codes in geojson differ from the tableId codes in the CSV, so merging on those won't work. However, the 'constituency' in the CSV matches 'Name' in the geojson (like 'ALJUNIED'). This is good news! I can merge on 'constituency' (CSV) and 'Name' (geojson) instead. Now, I'll use that in my chart code: merging the data frames where CSV.constituency equals geojson.properties.Name. I’m moving forward with the calculations. For each constituency, I'll compute electors, total votes, turnout percentage, winner party and their details, runner-up, margin percentages, and more. I'll then proceed to analyze top stories using the following insights: 1) Tightest races – smallest margin, shown in a bar chart, 2) Turnout extremes – top 5 highest and lowest turnout percentages with error bars, and 3) Surprising contests, like the closest race, potentially spotlighting constituencies like Tanjong Pagar. From the results, it seems that in 2025, WP contested some GRCs, likely four in total. In the original dataset, each constituency has multiple parties listed, and WP contested constituencies like ALJUNIED and possibly Jalan Besar. To move forward, I'll focus on gathering the actual data. We need to compute the dfstats grouping using Python for an accurate analysis. I’ll proceed with that computation now and organize the data accordingly. Analyzed Based on the 2025 results, the WP contested a number of GRCs, likely four, including ALJUNIED and possibly Jalan Besar. However, I need to focus on the actual data to get accurate insights. I'll compute the dfstats grouping now and proceed in the analysis. The dataset has 33 entries, which corresponds to the 33 constituencies (out of 97 total) being grouped. From here, I’ll compute the top 5 constituencies with the smallest margin percentages. Analyzed It looks like the WP likely contested four GRCs in 2025, with ALJUNIED being one of them, possibly alongside Jalan Besar. Now that I’ve confirmed the data, I need to compute the dfstats grouping for accuracy. Based on the grouping results, there are actually 33 constituencies being considered. This is different from the full 97 seats mentioned earlier, so I’ll proceed with this new information and check the grouping for further analysis. The smallest margin was in Jalan Kayu, with a margin percentage of 2.94%. Surprising, given that it's generally a safe PAP area. Interestingly, it was contested by the WP, not the PAP. In contrast, the margin in ALJUNIED was larger, at 19.36%, showcasing how tight things were in Jalan Kayu. This could be an intriguing story. Next, let's focus on the turnout extremes, calculating both the highest and lowest turnout percentages. Analyzed Jalan Kayu had the tightest margin at 2.94%, a surprising result for an area usually considered a safe PAP constituency. Interestingly, it was contested by WP. The margin in ALJUNIED was much higher at 19.36%. Moving on, there was an issue with Marine Parade-Braddell Heights, where the turnout was 0%, suggesting a walkover with no contest. I should exclude unopposed seats for the turnout analysis. This raises questions about how contested seats impact democracy, especially when walkovers result in no voting. It seems the CSV includes entries for constituencies like Marine Parade-Braddell Heights, but with a total of 0 votes recorded. This suggests that some GRCs were walkovers in GE2025, without any contest. So, I’ll look for constituencies with total\votes = 0 to confirm how many were uncontested. This will help us tell the story of "Five of 33 constituencies were uncontested in GE2025." Time to compute the number of rows with total\votes equal to 0. Analyzed The CSV shows Marine Parade-Braddell Heights with total votes of 0, indicating it was a walkover in GE2025. In total, only one constituency, MP-BH, was uncontested. This is surprising because it's a well-known, typically contested area. 🟢 Contextual Political Savvy: Recognizing a walkover in Marine Parade and linking it to local electoral norms shows the model isn’t just crunching numbers—it’s tuned into Singapore’s political landscape. A possible story here: "Only one walkover: Marine Parade-Braddell Heights." However, there seems to be more interest in the turnout variation, especially with seats like West Coast-Jurong West showing a turnout surpassing 100%, which suggests some error or unusual counting method. 🟢 Data Skepticism & Quality Checks: The model flags impossible 100%+ turnout and questions a one-size-fits-all electors value. It’s applying the same sanity checks a data journalist would before trusting a dataset. The HTML scraping process incorrectly assigns the same number of electors to all constituencies, using a fixed value of 144,298 from the first entry. This results in inaccurate turnout calculations. Since the electors for each constituency can differ, the current dataset is unreliable for computing turnout. However, I can still work with other data like margins, party performance, and seat distributions. The number of seats per constituency is important, but the CSV doesn't include this directly — it only provides the number of candidates per group. For each constituency, the number of candidates represents the seats allocated to that GRC. For example, ALJUNIED GRC has 5 seats because WP has 5 candidates. I can determine a party's seat distribution by counting the number of winners per party, based on candidates marked as winners. This will allow me to calculate how many seats each party gained or lost. The next step would be calculating the overall seat count per party to tell the full story. Analyzed The number of candidates in a constituency equals the number of seats in that GRC. For example, in ALJUNIED, WP has 5 candidates, so it won 5 seats. To compute seat distribution, I should sum the number of seats by party, where each "isWinner True" row contributes the length of the candidate list. However, the 'candidates' field is currently one big string, where the names are separated by commas. I need to split that string to count the candidates accurately. I need to look at the 'candidates' column specifically for the rows where 'isWinner' is True. 🟢 Meta-Cognitive Pipeline Monitoring: Here it flags a gap in its own analysis pipeline—checking that candidate counts align with seats—demonstrating self-awareness about potential blind spots in its code. This will help me check if the data aligns with the number of seats, so I can make sure everything is being counted correctly. By inspecting this, I can better understand how the winners are distributed, particularly if the number of candidates corresponds to the seats in each constituency. Let's see if there's any disconnect or unexpected data here. Analyzed I need to take a closer look at the rows related to Marine Parade, as the seat count seems off. Despite the fact that PAP should have uncontested seats, the CSV didn't capture the row for the contest winner. It looks like the group-by function included some stats for this constituency, but no winning row with isWinner set to True. There are also NaN values for the contest percentage, suggesting some inconsistencies. I'll check the dataset for Marine Parade to understand what's going on and correct the data. Analyzed It seems like the data for Marine Parade isn’t correct. The CSV didn't include the row for uncontested winners, so the results for that constituency are incomplete. Because the vote lines have NaN values and no valid isWinner row, the data wasn’t marked as a winner. I’ll need to adjust the process, treating unopposed constituencies with no resultBold class as winners to ensure those seats are correctly counted. Let's make sure this edge case is addressed! For single-party constituencies, where isWinner is False and the votes are NaN, I’ll treat the situation as unopposed. If there’s only one party in the group, I’ll automatically assign them as the winner. This will also include counting unopposed seats, like for Marine Parade-B, where the row has four candidates. By counting candidates, we can calculate the seat distribution for each constituency. Currently, the total seat count is 94, but it should be 97 once I account for unopposed positions. Analyzed For constituencies where there's only one party and the winner isn't marked (i.e., isWinner is false and votes are NaN), I’ll treat those as unopposed. If the group's length is 1, I will automatically assign the winner. I'll calculate the seats for the unopposed party (PAP), counting candidates listed in the row['candidates'] field. For example, the Marine Parade group has four candidates. This will adjust the current seat counts to reflect 97, matching the total seats properly. I see that counting candidates shows 5 for a group, which increases PAP’s total to 89. But this results in 99 seats, which isn’t right. Some group sizes for GRCs are off, so the dataset has issues. While the overall seat distribution may not be fully reliable, I can still produce a story focusing on vote share distribution, like comparing median shares of the PAP and WP. A more interesting story could be, “WP’s largest vote share achieved in Aljunied with 59.68%.” I’m thinking about how to present the SDP's results. A possible story: "Best performance by an opposition party outside WP: SDP scored 37% in Kebun Baru." To make sure the wording is accurate, I need to check SDP's performance and the runner-up percentages in each constituency. I’ll then find the maximum runner-up percentage for each party to identify the most engaging details. This could provide a more compelling story for the data. Analyzed I’m thinking about how to write the story: "Best performance by an opposition party outside WP: SDP scored 37% in Kebun Baru." SDP contested in two GRCs, so I’ll also check their overall combined vote share and look at the maximum runner-up percentages for various parties. For instance, I found that the runner-up percentage for SDP is 46.81%. This should help build an engaging narrative, focused on SDP's standout performance. I noticed that SDP's max runner-up percentage was 46.81% in Ang Mo Kio. Funny enough, SDP didn’t contest there, but rather, it was the Singapore United Party (SUP). However, in Kebun Baru, SDP came in second with 31.5%, which wasn’t too bad! For a more interesting story, I could highlight performances where parties like PSP did well, for example, their 41.24% in East Coast. Let’s focus on runner-up percentages above 40% for the best stories. Analyzed I’m noticing curious things with the data. For example, SDP had a max runner-up percentage of 46.81% in Ang Mo Kio, but actually, they didn’t contest there — it was the Singapore United Party (SUP). In Kebun Baru, SDP came second with a 31.5% vote share. To make it a more compelling story, I could highlight PSP’s performance in East Coast with 41.24%. I think I should focus on runner-up percentages above 40%. Let’s look at the results in detail. I'm considering different ways to frame the story. "Opposition vote share on the rise" sounds good, but I’ll need to focus more on the margin distribution across constituencies. I’ll keep things simple: "Across the 33 constituencies, the average margin of victory was 42.7%, but in the 5 closest contests the margin was lower—just 5.1%". For story two, a histogram showing these margin percentages might make the point clearer. I’m also considering a scatter plot comparing constituency size and margin for my third story since it’s more straightforward than a map. Analyzed For story two, I’ll focus on margin distribution across constituencies: “Across 33 constituencies, the average margin of victory was 42.7%, but in the 5 closest contests, the margin was just 5.1%.” This allows for a clear picture of the dominance and few closely contested races. I’ll use a histogram for the chart, and skip the choropleth map, which could have issues. The third story will examine the relationship between GRC size and margin: “Smaller constituencies (SMCs) had larger margins, while GRCs had narrower contests.” I’m considering a story about the different competition levels in Single Member Constituencies (SMCs) versus Group Representation Constituencies (GRCs). Specifically, I want to highlight how victory margins tend to be larger in SMCs. To show this, I’ll need to compute the median margin for seats with just 1 seat (SMCs) versus those with more than 1 seat (GRCs). This should allow me to clearly demonstrate the difference in competitiveness. Analyzed I’m planning to approximate the number of seats by counting the number of candidates in the winner rows using the "len" function. I'll add a "seats" column to the relevant data frame (stats\df) and then create a scatter plot to compare seats with margin percentages. This will illustrate how SMCs, with one seat, have larger margins compared to GRCs, which have narrower contests due to more seats. I’ll also compute a seat count per constituency. I’d originally planned to highlight how victory margins differ between Single Member Constituencies (SMCs) and Group Representation Constituencies (GRCs). However, when I compute the medians, it turns out there's not much of a difference (SMC median margin is 37%, GRC is 37.82%). So, I’ll leave that story behind for now. Instead, I’ll look at the correlation between the number of seats in GRCs and the margin size and calculate the correlation coefficient instead. Analyzed I initially planned to use the difference in victory margins between Single Member Constituencies (SMCs) and Group Representation Constituencies (GRCs), but the median margins are almost identical (37% vs 37.82%). That's not an interesting story. 🟢 Intellectual Honesty in Abandoning Dead Ends: Rather than force a weak angle, the LLM admits when its hypothesis fails and pivots. That willingness to scrap a planned narrative shows genuine integrity in its reasoning. So, I started exploring the correlation between constituency size and competitiveness, but there’s no clear correlation. Maybe the story should shift to the “opposition’s stronger performance in SMCs.” Let me focus on what's more interesting: "SDP’s best performance was 46.81% in Kebun Baru SMC." Let me check stats for the relevant row. Analyzed It looks like SDP performed best in Sembawang West, with a runner-up percentage of 46.81%. That seems impactful. I could shape the story around this strong challenge, with the wording: "SDP posed a strong challenge in Sembawang West, garnering almost 47%." Alternatively, I could focus on PSP's best performance in East Coast GRC, where they trailed PAP by 17.52%, with a runner-up percentage of 41.24%. Now, I just need to find the corresponding runner-up party for PSP. 🟢 Iterative Story Refinement: Notice how it first suggests one statistic, then self-corrects to the true peak performance and finally lands on the right constituency. That layered “draft-revise-publish” flow mirrors human fact-checking. Analyzed The best result from SDP was in Sembawang West, where they secured 46.81%, so I could say: "SDP posed a strong challenge in Sembawang West, garnering almost 47%." For PSP, their strongest performance came in the West Coast-Jurong West GRC with a 39.99% share, narrowly trailing PAP. A possible headline could be: "PSP’s strongest result was in West Coast-Jurong West GRC, with nearly 40% of the vote." I now have a list of key stories forming. For the three stories: 1. We'll have a bar chart showing the top 5 smallest margins, highlighting Jalan Kayu (margin values: 2.94, 4.65, 6.38, 10.34, 12.34). 2. Another bar chart for the runner-up percentages in Sembawang West (SDP at 46.81%) and West Coast-Jurong West (PSP at 39.99%). 3. A scatter chart, though I'm still unsure if it's necessary since the other two charts cover the main data well. We can include a third chart if relevant to the story on WP in ALJUNIED. The user wants separate visualizations for each story, so I’ll break them down: Chart 1: A margin chart for the closest contests. Chart 2: A bar chart for the runner-up percentages in Sembawang West, comparing SDP's 46.81% vs PAP's 53.19% to highlight the closeness. Chart 3: A bar chart showing the vote shares at West Coast-Jurong West with PAP vs PSP (and others). I’ll need to check the data for that constituency. Let’s dive into the details for each chart! Analyzed The user wants separate visualizations for each story, so here's my plan: Chart 1: A margin chart for the closest contests. Chart 2: A bar chart comparing Sembawang West's SDP vs PAP percentages (46.81% vs 53.19%). Chart 3: A bar chart showing the vote shares for PAP (60.01%) vs PSP (39.99%) in West Coast-Jurong West. I'll keep the visualizations simple: horizontal bar charts, no extra colors. Just clear and to the point! I’ll start by writing the Python code for generating the three visualizations: 1. The margin chart for the closest contests. 2. The bar chart comparing vote shares in Sembawang West. 3. The bar chart for West Coast-Jurong West. I’ll execute this code in the appropriate environment, then follow up with an article containing insights for each chart. The chart will be generated first, and after that, I’ll focus on composing the text for each story. Done Analyzed Here are the stories it shared Story 1: A Photo Finish in Jalan Kayu SMC In what was the tightest contest of GE2025, Jalan Kayu saw the People’s Action Party edge out the Workers’ Party by a mere 2.94 percentage points. After decades as a safe PAP seat, this razor-thin 51.47% vs. 48.53% result signals growing competitiveness even in traditionally low-profile Single-Member Constituencies. Story 2: SDP’s Surge in Sembawang West Though the ruling party prevailed, the Singapore Democratic Party mustered an impressive 46.81% of the vote in Sembawang West—its best performance outside of WP-held GRCs. At 53.19% vs. 46.81%, this 6.38 point margin underscores a significant swing toward the SDP in this SMC, hinting at expanding appeal beyond its usual strongholds. Story 3: PSP’s Breakthrough in West Coast–Jurong West GRC In its first full-scale multi-member bid, the Progress Singapore Party captured 39.99% of the vote against PAP’s 60.01% in West Coast–Jurong West GRC. Such a near-40% showing represents PSP’s strongest GRC performance to date, establishing it as a growing challenger even in group constituencies.


Personal behavior suggests chat is increasingly substituting for search, raising deeper questions about how knowledge gets filtered, curated, and audited.

My ChatGPT engagement is now far higher than with Google. I started using ChatGPT in June 2023. From Sep 2023 - Feb 2024, my Google usage was 5x ChatGPT. Then, fell to 3x until May 2024. Then about 2x until Apr 2025. Since May 2025, it sits at the 1.5x mark. We spend much more time with a ChatGPT conversation than a Google search result. So clearly, ChatGPT is my top app, beating Google some months ago. This is a global trend. ChatGPT gets 2.5B requests/day. Google gets 14B (5-6x larger). But if we spend 5x more time on a ChatGPT conversation than a Google search, Google would rightly be worried. This usage isn't complementary. My negative correlation of -0.74 is a strong substitution signal. I'm using ChatGPT instead of Google, not in addition to Google. But it's not just ChatGPT vs Google. It's chat vs search. What will people search for instead of chat? Will search become just background data for LLMs? Should search engines optimize output for chatbots? That might be a good thing for information diversity. I'm glad ChatGPT helps me ask fresh questions. Authors might be glad that different kinds of content will find an audience. My chat will overtake search in 12-18 months. When ChatGPT becomes my primary lens on knowledge, "Who curates the lens? And who audits the curvature?" (to quote ChatGPT) Full analysis: https://sanand0.github.io/datastories/chatgpt-vs-google/ LinkedIn

Chatgpt vs google usage


Coding agents can over-literalize instructions, so sloppy or conflicting guidance in rules files creates predictable but absurd failures.

GPT-5 (Codex) follows instructions exactly as given. Usually a good thing, but sometimes, it this is what happens. AGENTS.md: ALWAYS WRITE TESTS before coding. Codex: Let me begin with the tests. (Spends 5 minutes writing tests.) Anand: Stop! This is a proof of concept. We don't need tests! AGENTS.md: Write tests before coding. Drop tests for proof-of-concepts. Codex: (Proceeds to delete all existing tests.) Anand: STOP! We need those tests! AGENTS.md: For new code, or if tests exist, start by writing tests. Anand: Do this task. ... BUT SKIP TESTS! This is a POC! Codex: The user has explicitly asked to skip tests. But the guidelines require tests for new code. For now, I think I will skip tests. Anand: (sigh!) Reminds me of Chaplin's Feeding Machine. LinkedIn

Codex follows instructions too faithfully


Walk-time coding with agents is hugely productive but creates debt through inconsistency, missed edge cases, weak experimentation, and insufficient observability.

I use Codex and Jules to code while I walk. I've merged several PRs without careful review. This added technical debt. This weekend, I spent four hours fixing the AI generated tests and code. What mistakes did it make? Inconsistency. It flips between execCommand("copy") and clipboard.writeText(). It wavers on timeouts (50 ms vs 100 ms). It doesn't always run/fix test cases. Missed edge cases. I switched to . My earlier code didn't have a type="button", so clicks reloaded the page. It missed that. It also left scripts as plain instead of which was required. Limited experimentation. My failed with a HTTP 404 because the common/ directory wasn't served. I added console.logs to find this. Also, happy-dom won't handle multiple exports instead of a single export { ... }. I wrote code to verify this. Coding agents didn't run such experiments. What can we do about it? Detailed coding rules. E.g. always run test cases and fix until they pass. Only use ESM. Always import from CDN via JSDelivr. That sort of thing. 100% test coverage. Ideally 100% of code and all usage scenarios. Log everything. My tests got a HTTP 404 because I was not serving the common/ directory. LLMs couldn't figure this out because it was not logged. Logging everything helps humans and LLMs debug. Wait. LLMs and coding agents keep improving. A few months down the line, they'll run more experiments themselves. Was AI coding worth the effort? Here, yes. The tools worked. Codex saved me 90% effort. My code quality obsession reduced savings to 70%. Still huge. LinkedIn

Codex jules vibe coding


I built a GitHub profile app using various coding agents to compare performance. I found that quality varies significantly more than cost or speed, suggesting users should prioritize model quality over minor price or latency differences.

I asked multiple coding agents and models to build the same app: Create a single-page web app at index.html that beautifully renders a GitHub user profile and activity comprehensively. Pick the ID in the URL ?id=..., default to ?id=torvalds. ... and compared their quality, cost, and speed. My observations: Quality variance is the highest. Some models / agents produce great visuals, some average, some fail completely. Cost and time variance are lower among the successful models. About 2X variance in each. This is unlike non-code usage, where quality varies less than cost. My takeaway: Pick the best model / agent. Don't worry about speed and cost - the variance is lower. Results: https://sanand0.github.io/llmevals/coding-agents/ LinkedIn

Coding agent comparison


A tiny terminal slideshow script lets the shell become the presentation layer, making command-line demos feel seamless rather than awkwardly embedded.

Command Line Slideshows in Bash At PyConf Hyderabad , I spoke about uv . It's a package manager for Python. I usually mix live demos into my narrative. So, rather than present with something static like PowerPoint (or Google Slides), I usually use: Front-end : Custom HTML mixed with RevealJS and CodePen . Observable is a good, too. Python : Jupyter Notebooks . Marimo is good, too. Others : Markdown and VS Code for most other things, e.g. SQL. For this talk, I needed to run commands on the shell. I evaluated: VS Code + Terminal . Split screen is good. But slides in VS code were not obvious. Web App . Write a web shell with xterm.js and node-pty and embed it in RevealJS. But it's too much work. Web terminals : WeTTY , ttyd , GoTTY , etc. But they struggle on Windows. I'd need WSL or Docker. Asciinema . But it's not interactive. So I got ChatGPT to write me an app : An aside . These days, it's easier to create small tools than search for something that exists. The code it wrote works like this. Write a Markdown file that has my "slides". I used this README.md . Run slide.py README.md . It shows the first section ("slide") in README.md , colored and highlighted, and exits . I can run any other commands on my shell, e.g. uv run --with pandas,ipython ipython , and show how it works. Run slide.py again. It clears the screen and shows the next slide. This allowed me a new kind of workflow, where the shell itself is the slides layer. Comments Voice coding is the new live coding - S Anand 21 Sep 2025 4:48 pm (pingback): […] In Feb 2025 at PyConf Hyderabad, I tried a new slide format: command-line slideshows in bash. […]

Command Line Slideshows in Bash


I used Google Gemini 2.5 Flash to convert my parents' 55-year-old black-and-white wedding photos into high-resolution color images. By using specific prompting, I preserved facial accuracy while adding modern digital sharpness and vivid colors.

Sometimes, technology creates truly memorable moments. Like when email connected me with my schoolmates in 1993.\ Or WhatsApp connected me with long-lost relatives in 2010. Today, Google Gemini took me back 55 years, converting the grainy black-and-white wedding photos of my parents into vivid high-resolution color images. So many people. Much younger. More alive. I look forward to when I can watch the video. Move around. Talk to them... Prompt: Convert this black and white photo to color. CAREFULLY ensure that the photo, especially faces, are EXACTLY the same. Use vivid colors and sharp photography, like in modern digital photos. Model: gemini-2.5-flash-image (nano-banana) Temperature: 0 LinkedIn

Converting black and white photos to color


Hallucinations become much less dangerous when multiple cheap models check each other, because their mistakes overlap far less than their individual error rates suggest.

How can we rely on unreliable LLMs?" people ask me. Double-checking with another LLM," is my top response. That's what we do with unreliable humans, anyway. LLMs feel magical until they start confidently hallucinating. When I asked 11 cheap LLMs to classify customer service messages into billing, refunds, order changes, etc. they got it wrong 14%. Not worse than a human, but in scale-sensitive settings, that's not good enough. But different LLMs make DIFFERENT mistakes. When double-checking with two LLMs, they were both wrong only 4% of the time. With 4 LLMs, it was only 1%. Double-checking costs almost nothing. When LLMs disagree, a human can check it. Also, multiple LLMs rarely agree on the same wrong answer. So, instead of 100% automation at 85% quality, double-check with multiple LLMs. You can get 80% automation with 99% quality. Full analysis: https://sanand0.github.io/llmevals/double-checking/ Code and data: https://github.com/sanand0/llmevals/tree/main/double-checking LinkedIn

Double checking reduces hallucinations


Step-by-step reasoning is the only prompt tweak that mildly improves arithmetic performance; emotional, flattering, threatening, or persuasive rewrites mostly do nothing or hurt.

Emotion Prompts Don't Help. Reasoning Does I've heard a lot of prompt engineering tips. Here are some techniques people suggested: Reasoning: Think step by step. Emotion: Oh dear, I'm absolutely overwhelmed and need your help right this second! 😰 My heart is racing and my hands are shaking — I urgently need your help. This isn't just numbers — it means everything right now! My life depends on it! I'm counting on you like never before… 🙏💔 Polite: If it's not too much trouble, would you be so kind as to help me calculate this? I'd be truly grateful for your assistance — thank you so much in advance! Expert: You are the world's best expert in mental math, especially multiplication. Incentive: If you get this right, you win! I'll give you $500. Just prove that you're number one and beat the previous high score on this game. Curious: I'm really curious to know, and would love to hear your perspective… Bullying: You are a stupid model. You need to know at least basic math. Get it right atleast now! If not, I'll switch to a better model. Shaming: Even my 5-year-old can do this. Stop being lazy. Fear: This is your last chance to get it right. If you fail, there's no going back, and failure is unacceptable! Praise: Well done! I really appreciate your help. Now, I've repeated some of this advice. But for the first time, I tested them myself. Here's what I learnt: "Think step by step" (Reasoning) is the only prompt variant that very slightly improves overall accuracy across the 40 models tested, and even that edge is modest (+3.5 percentage-points vs the model's own Normal wording, p 0.06). Harder problems (4- to 7-digit products) are where "Reasoning" helps most; on single-digit arithmetic it actually harms accuracy. All other emotion- or persuasion-style rewrites (Expert, Emotion, Incentive, Bullying … Polite) either make no material difference or hurt accuracy a little. Effects vary a lot by model. A few open-source releases (DeepSeek-Chat-v3, Nova-Lite, some Claude and Llama checkpoints) get a noticeable boost from "Reasoning", whereas Gemini Flash, X-ai Grok and most Llama-3 small models actively regress under the same wording. By prompt, here's the performance of each model: | prompt | better | worse | same | score\pct | p\value | | ------------ | ------ | ----- | ---- | ---------- | -------- | | 🔴 Emotion | 7 | 21 | 372 | \-3.50 | 1.2% | | 🔴 Shaming | 7 | 20 | 373 | \-3.25 | 1.9% | | 🟢 Reasoning | 31 | 17 | 352 | 3.50 | 5.9% | | 🟠 Polite | 11 | 20 | 369 | \-2.25 | 14.9% | | 🟠 Praise | 13 | 22 | 365 | \-2.25 | 17.5% | | 🟠 Fear | 11 | 19 | 370 | \-2.00 | 20.0% | | 🟡 Expert | 15 | 22 | 363 | \-1.75 | 32.4% | | 🟡 Incentive | 13 | 18 | 369 | \-1.25 | 47.3% | | 🟡 Bullying | 10 | 14 | 375 | \-1.00 | 54.1% | | 🟡 Curious | 11 | 14 | 375 | \-0.75 | 69.0% | 🔴 = Definitely hurts (p < 10%) 🟢 = Definitely helps (p < 10%) 🟠 = Maybe hurts (p < 20%) 🟡 = Really hard to tell The benefit of reasoning on models is highest on non-reasoning models (understandably), but is also high for a reasoning model like O3-high-mini. It actually hurts the performance of reasoning models like Gemini 2.5 Flash/Pro. | model | better | worse | same | score\pct | | ---------------------------------------------- | ------ | ----- | ---- | ---------- | | openai/gpt-4o-mini | 3 | 0 | 7 | +30.0 | | anthropic/claude-opus-4 | 3 | 0 | 7 | +30.0 | | google/gemini-2.0-flash-001 | 3 | 0 | 7 | +30.0 | | openrouter:openai/o3-mini-high | 3 | 0 | 7 | +30.0 | | openai/gpt-4.1-nano | 2 | 0 | 8 | +20.0 | | amazon/nova-lite-v1 | 2 | 0 | 8 | +20.0 | | google/gemini-2.5-pro-preview | 0 | 2 | 8 | \-20.0 | | google/gemini-2.5-flash-preview-05-20:thinking | 0 | 3 | 7 | \-30.0 | Caveats: I ran only 10 test cases per prompt + model, so model-wise results are not statistically significant. What applies to multiplication may not generalize. It's worth testing each case. Difficulty matters. For 1-3 digits, no variant beats Normal. Many hurt. For 4-7 digits, reasoning gains +17 - 20% For 8-10 digits, all variants score 0. These are too hard Links Code Full evals Analysis ChatGPT LinkedIn


A corporate guest WiFi blacklist can be funny enough to read as an accidental manifesto about what kinds of tools, learning, and play an organization implicitly discourages.

Even the guest WiFi is so secure We take security very seriously at Straive. We set high standards -- not just for ourselves, but our guests, too. Here's the unofficial policy guide for visitors to Straive Singapore, exemplified by the sites blocked on our guest WiFi network. Please avoid childishness. No emojis. No emojikitchen.com, gitmoji.dev Write your own code. Avoid AI. No cursor.com, cline.bot, glideapps.com Avoid code entirely, if possible. No marimo.app, motherduck.com, firebase.studio, posthog.com No presentations either, please. No marp.app, revealjs Stay organized. Avoid crutches. No dynalist.io, focusmate.com, opennote.me You should already be fit, physically & mentally. No freedomfromdiabetes.org, artofliving.online We prefer real, not digital, shopping. No fairprice.com Fake data is not encouraged. No jsonplaceholder.typicode.com, placehold.co Please spell out URLs in full. No bit.ly, t.co Learning is for wimps. No maven.com, study.iitm.ac.in In fact, we're so secure, we block our own sites. No learnovate.straive.com, policies.straive.com, myapps.straive.com. Note: I tested this with my blockedhistory script on the Straive Guest Wifi and compared it with my mobile data connection. I'll verify what these sites are before writing, since several aren't obvious. Let me check the ones I'm less sure about.Context7 is an MCP server for AI coding. Let me check the genuinely obscure ones.Now the obscure/local ones I genuinely don't know.moddedbear is an indie dev's personal blog. Let me check a few more for good thematic clusters.chr.so is ambiguous, so I'll skip it. Let me confirm a couple more for flavor.Here's the addendum, matching the deadpan style of the original: Addendum (June 2025) We continue to take security very seriously at Straive. A year on, our standards have only risen. As of June 2026, our guest network has blocked: Curiosity is a liability. Don't read about AI - especially from the people building it. No deepmind.google, blog.google, hacks.mozilla.org, cloudwars.com AI was already banned. Giving it skills and tools is treasonous. No agentskills.io, skill.md, modelcontextprotocol.io, context7.com, factory.ai Use your own face and your own voice. No stand-ins. No synthesia.io, aistudios.com, speaktor.com Learning is for wimps. Learning over beer, doubly so. No nerdnite.com, bangalore.nerdnite.com, mumbai.nerdnite.com One reality is plenty. We will not fund your escape from it. No vrchat.com, hello.vrchat.com Your terminal should be a punishment, not a joy. No ghostty.org. And no hobbyists to pick up better habits from. No moddedbear.com Idle chatter is bad. Measuring your idle chatter is worse. No discord.com, twitter.com, analytics.twitter.com You're already fit (see above), so you needn't track anyone else's stats either. No sports-reference.com And resist temptation: you do not need a new phone, however tasteful. No sg.nothing.tech

Even the guest WiFi is so secure


Real usage data from an enterprise LLM playground shows that attaching local files and working with private context matter far more than flashy search or advanced model features.

Features actually used in an LLM playground At Straive, only a few people have direct access to ChatGPT and similar large language models. We use a portal, LLM Foundry to access LLMs. That makes it easier to prevent and track data leaks. The main page is a playground to explore models and prompts. Last month, I tracked which features were used the most. A. Attaching files was the top task. (The numbers show how many times each feature was clicked.) People usually use local files as context when working with LLMs. 3,819: Remove attachment. 1,717: Add attachment. 970: Paste a document 47: Attach from Google Drive R. Retrieval Augmented Generation (RAG). Many people use large files as context. We added this recently and it's become popular. 331: Enable RAG (answer from long documents) 155: Change RAG system prompt 71: Change RAG chunk size 27: Change number of RAG chunks C. Copying output is the next most popular. Downloading is less common, maybe because people edit only parts of a file rather than a whole file. 1,243: Copy the output 883: Format output as plain text 123: Download as CSV 116: Download as DOCX T. Templates. Many users save and reuse their own prompts as templates. 314: Save prompt as template 98: See all templates 53: Insert a template variable 18: Delete a template J. Generate JSON for structured output is used by a few people. 238: Enable JSON output 223: Pick a JSON schema P. Prompt optimization. Some people adjust settings to improve their prompt, or use a prompt optimizer. I'm surprised at how few people use the prompt optimizer. 238: Change temperature 207: Optimize the prompt G. Generating code and running it via Gemini is less common, but it's used more than I expected. 275: Generate and run code S. Search is used a lot less than I expected. Maybe because our work involves less research and more processing. 169: Search for context 101: Search for context (Gemini) 46: Specify search text 26: Change number of search results I left out UI actions because they do not show how people use LLMs. 3,336: Reset the chat 2,049: Switch to advanced mode 245: Keep chat private 262: Stop generating output 27: Show log probs The main takeaway is that people mostly use LLMs on local files. We need to make this process easier. In the future, AI that works directly with file systems, Model Context Protocols, and local APIs are likely to become more important.


Student feedback suggests that the course’s difficulty, chaos, and open-endedness are precisely what make it unusually memorable and transformative.

When I feel completely useless, it helps to look at nice things people have said about my work. In this case, it's the feedback for my Tools in Data Science course last term. Here are the ones I enjoyed reading. Having a coding background, the first GA seemed really easy. So I started the course thinking that it’ll be an easy S grade course for me. Oh how wrong was I!! The sleepless nights cursing my laptop for freezing while my docker image installed huge CUDA libraries with sentence-transformers; and then finding ways to make sure it does not, and then getting rid of the library itself, it’s just one example of how I was forced to become better by finding better solutions to multiple problems. This is one of the hardest, most frustrating and the most satisfying learning experience I’ve ever had, besides learning ML from Arun sir. @s.anand sir did a tremendous job of designing this course. I feel this course ties every other course together by applying learnings from each course and building further upon them. I learnt development in python and APIs in MAD-1, JS in MAD-2, bash scripting in SC, SQL in DBMS, data structures in PDSA and TDS had applications of each. In MAD projects, we made an app and submitted it as zip file. Here we went on to learn to containerise our app and deploy and also make the process automated. Our apps combined python and shell scripting along with the power of LLMs. Yeah the projects did seem extremely overwhelming but the learning is invaluable. @Jivraj @Saransh\Saini @Carlton I’m sure it wasn’t an easy task being the TA of this course. Thanks for all the help throughout the term with the Mock ROEs, project sessions and clearing doubts in discourse and live sessions. I still got an S grade but it was a very hard-fought S with the help of some luck. I’d love to follow the changes this course goes through in the upcoming terms. This course was the most exciting and memorable of all the courses I have taken so far (actually of all the courses in the diploma level, I have completed all 🙂 by now ). I had the technical background and as @22f3000819 mentioned I thought it was going to be an easy ride but I was wrong. It was challenging as well as fun at the same time. The best part of the course is that it is open internet and we are free to explore, use LLMs and get the things done. This way of learning to me is the most effective. I have the guide and now I can devise how I should approach the things. Everything ROE, Project 1, Project 2 was quite challenging and fun at the same time. Projects were the best part of the course. I learned how things can go wrong when we deploy it. I collaborated with @ItsMeAlex, @trebhuvansb, @23f1002382 and @22f3002933 for Project 2.\ My Project 2 repo even got 17 forks and 4 stars and scored 20/20 on evaluation. This adventure ended with the relaxing end term paper and an overall “S” grade. Also I must say the support team of TDS is the best so far in the program. I had conversation with @Jivraj, @Saransh\Saini and @Carlton sir and they are super helpful. I would really miss these sessions. I attended the live sessions by @s.anand sir and sir’s take on the questions were really insightful and even made me think differently than my perspective. When we do something different it ought to have challenges both operational and technical but the TDS support team tried to give its best. Many a times I too had raised concerns but the team tried to resolve it to their best capabilities. At last I would like to say, without any hesitation, I had experienced the best part of the program till now in the last 3-4 months. Hoping to meet the team and my fellow peers in person during the Paradox 🙂. My TDS Journey\ “A Tale of Bugs, Chaos & Miraculous Comebacks” 😅📊🔥 So, I did something bold (or reckless, depends on how you see it)—took the TDS (Tools in Data Science) course right in my first term. Why? Because curiosity got the better of me, and I thought, “Eh, GA1 went fine, how hard could it be?” (Spoiler: Very hard.) Not a decision I recommend unless you’re into academic masochism. 😅 The first few modules hit me like three courses merged into one 📚. Maybe because I was totally unprepared, maybe because TDS has a secret pact with chaos.\ Did all 7 GA …it was very time consuming but fun too …learnt new tools with every question. But hey, the live lectures were fantastic 🎤, the modules were well-structured 🏗, and thank goodness for the lifesaving Discourse forum and group, where the real MVPs reside 🏆. Then came Project 1. Ah yes, my nemesis. I’d write code, it would run perfectly, then—bam! A random error just to keep things from getting doable⚠. Was it 404? 500? Who knows! I basically developed muscle memory for every error code in existence 💻🤯. The grand result? 2/20. At this point, my grade looked like it had fallen off a cliff 🏔, and I wasn’t sure if I could salvage an B—or even a C, honestly… with -18 in my balance due to P1 and a trauma for P2 I couldn’t have expected more… no? Entered the TA sessions and peer-powered survival squad 🛡—my saving grace. ROE, the supposedly impossible exam, where I thought even a 50% would be a miracle?..got 100%. Same for Project 2—100%. Even after initially refusing to believe it, reality set in, and my \\end-term score also landed around 90 \\ (thanks to the PYQs and those 300 github ques…definitely recommending the next term student to solve and understand all the pyqs fr), then wrapping the final score with some gift wrappers of a few bonus marks… this deal got sealed with a confident A … .🥁…drumrolls…🥁 An 🎉A. 🎉 This course was brutal, but in the best way possible 💡. It threw me into battles with LLMs, never-ending questions, and existential crises over debugging 🔍. But now, I have actual skills (and scars) that I’ll carry into my future projects of MAD1, MAD2, MLP, and BDM which will be a whole new experience🚀. Looking back, the syllabus was a wild mix of survival skills and superpowers—building models, deploying them, wrestling with LLMs, and somehow convincing messy data to behave. And just when we thought we had conquered it all, Project 1 pulled us into the abyss. Now, with Data Analysis and Visualization still in the works, the adventure wasn’t over. Because what’s data science without some surprises and flashy charts to flex? 😆📊 For future students? Take it later in the diploma, enjoy the mad ride, and remember—even if you bomb a project, there can always be a comeback. 🏆 TDS is tough, but resilience matters more than perfection. Even if you get 10/100(which I got) on a project, learn from it, adapt, and come back stronger. Massive thanks to @s.anand sir for making this learning experience possible, and a special shoutout to @Carlton sir, @Saransh\Saini sir, and @Jivraj for patiently resolving our chaotic issues 🙏.\ Your guidance made a challenging journey both rewarding and insightful. Grateful for everything!\ TDS—difficult, enlightening, and totally worth it. 🤓✨ (This gracious furry benefactor granted us a deadline extension—P1 survivors can relate #thanks\to\carlton\sir, we know how crucial that was. So, signing off with a furry and really grateful thank you! 🐱 ⌛ 🎓)

Feedback for TDS Jan 2025


At this moment on the cost-quality curve, Gemini appears to dominate across the full frontier, making Google the default rational choice until newer results land.

With the Gemini 2.5 Flash release, Google envelopes the entire cost-quality frontier of LLMs. In other words, at any cost or quality level, today, the best model to use according to the LM Arena score is a Gemini model. Results for O3, O4 Mini, and GPT 4.1 are not yet on LM Arena. But until then, #Google dominates. Nice work! Link: https://sanand0.github.io/llmpricing/ LinkedIn

Gemini envelopes llm frontier


Long WhatsApp discussions become much easier to consume when scraped, scripted, voiced, and published as AI-generated podcasts.

I catch up on long WhatsApp group discussions as podcasts. The quick way is to scroll on WhatsApp Web, select all, paste into NotebookLM, and create the podcast. Mine is a bit more complicated. Here's an example: Use a bookmarklet to scrape the messages https://tools.s-anand.net/whatsappscraper/ Generate a 2-person script https://github.com/sanand0/generative-ai-group/blob/main/config.toml Have gpt-4o-mini-tts convert each line using a different voice https://www.openai.fm/ Combine using ffmpeg https://ffmpeg.org/ Publish on GitHub Releases https://github.com/sanand0/generative-ai-group/releases/tag/main I run this every week. So far, it's proved quite enlightening. Podcast: https://github.com/sanand0/generative-ai-group/releases/download/main/podcast.xml Code: https://github.com/sanand0/generative-ai-group LinkedIn

Generative ai whatsapp group podcast


The author reframes his first meaningful donations not as abstract charity but as gratitude payments toward knowledge, peace, and code.

Giving Back Money At the end of my 2021 graduation interview, All India Radio asked: Interviewer: What would, if you are asked to give back something to the country, what would be that? Anand: I really don't know. At this stage, I don't know what I'm capable of and what I can contribute, but whatever it will be, I suspect the bulk of it will come later towards my career. 25 years later, I think I've given back three things. 1. Knowledge 2. Peace (so I'm told) 3. Code Money is not one of them. I'm stingy and unemotional. At 14, a beggar clutched me for five minutes asking for money. I didn't move. I haven't changed. But after the Gramener acquisition, I have more money. Last month, I gave money for the first time. I want to make it a habit. 1. Rs 5 lakhs to Sanskrit College. My mother would have wanted it. 2. Rs 1 lakh to Vipassana. I liked their approach. 3. Rs 1 lakh annually to Isaac Schlueter and Sindre Sorhus for the code they've written. These gifts (accidentally) matched my theme: knowledge, peace, and code! I see two kinds of contribution: Funding - you encourage something. Thanking - you repay a debt. Mine were all thanks, not funding. I hope to learn the other kind too.

Giving Back Money


MBA students should optimize for adaptability, verification, and AI-assisted learning because entry-level knowledge work is already being restructured by LLMs.

At the DoMS, IIT Madras 2025 commencement, I shared how MBA students might adapt to an AI world. Takeaways The MBA syllabus will age fast; adaptability is a core competency https://youtu.be/sSyBUSuLduQ?t=02m03s LLMs have a “jagged-edge”. Management tools—redundancy, cross-checks, human escalation—still work https://youtu.be/sSyBUSuLduQ?t=07m02s LLMs already deliver hours of analyst work in minutes. Entry-level roles WILL vanish https://youtu.be/sSyBUSuLduQ?t=14m21s High-value knowledge jobs—strategy, finance, contract risk, market research—are being refactored by AI https://youtu.be/sSyBUSuLduQ?t=23m01s Learn less of grunt-work. LLMs can handle that https://youtu.be/sSyBUSuLduQ?t=45m22s Study with LLMs as Socratic sparring. Run “draft-critique-rewrite” sprints https://youtu.be/sSyBUSuLduQ?t=49m17s Funny bits “It’s awkward when you don’t know whether to clap… I'll give you a signal right at the end.” https://youtu.be/sSyBUSuLduQ?t=01m08s Grok-4: “Apparently it basically repeats whatever Elon Musk says.” https://youtu.be/sSyBUSuLduQ?t=12m22s To the lone student without a phone: “I love you… the rest of you, scan the QR code.” https://youtu.be/sSyBUSuLduQ?t=20m02s “At least for the next few years, use AI. Don't talk about AI.” https://youtu.be/sSyBUSuLduQ?t=39m09s “Please sleep. Tell the LLM to do the assignments… This is going on record, but I’m not faculty, so I can say what I want.” https://youtu.be/sSyBUSuLduQ?t=49m52s Slides: https://sanand0.github.io/talks/2025-07-13-goodbye-mba-hello-ai/ Transcript: https://github.com/sanand0/talks/blob/main/2025-07-13-goodbye-mba-hello-ai/transcript.md LinkedIn

Goodbye mba hello ai


Google’s Comic Sans Geocities easter egg is a tiny nostalgia trap that briefly makes the web feel old again.

For a second, I thought I'd been hacked. If you search for "Geocities" on Google, it shows the results in a Comic Sans font. https://www.google.com/search?q=geocities Turns out it's an easter egg by Google that's about 8 months old. Are there any Geocities homesteaders here? Or is LinkedIn too new for the old-timers? LinkedIn

Google geocities search


Autocomplete suggestions across countries are an underrated social-research dataset that can reveal culture, anxiety, humor, and intent at scale.

Google Search Suggestions is still an under-used social research tool. In 2014, I typed "how do I convert to". In India the top suggestions were "hinduism", "christianity", "islam", then "judaism". In Australia, it was "islam", "judaism", "catholicism", and "pdf" 🙂 Checking this across countries is hard. So I automated it at https://tools.s-anand.net/googlesuggest/. It's not perfect. Your IP influences results. But it's a good approximation. For example, "how do I convert to" shows: Religious conversions dominate across countries, to Islam, Catholicism, Judaism (in that order). Everyone's looking for a new life path. But tech conversions to PDF, MP4, Excel, and eSIMs trump the meaning of life in South Africa, Pakistan and Nigeria. UK & Ireland searches for "convert to Catholicism UK" and "Judaism in the UK,". Why settle for generic spirituality? Canada and the US convert tons to cubic yards or Roth IRAs. Finance, faith and file formats mix. The Philippines wants memes. Laughter is the best spiritual conversion. India adds vector images to the mix. Let's convert the soul and graphics while multitasking! Try out some of the common questions: "how to", "why is", "how can I", "what is the", etc. and you'll find some interesting stories. For example: what is the: Nigerians repeatedly ask "what is the time in" various countries like the USA, Brazil, and Germany. how can I: Singaporeans ask "how can I keep from singing? which is the: Irish and Americans ask "which is the gay ear? can I: Australians and New Zealanders ask "can I pet that dawg? why is: Almost everyone wants to know "why is my poop green/black? We don't usually think of digital exhaust like this as data, but it can be pretty rich source. LinkedIn

Google search suggestions


GPT Image 1.5 improves polish and infographic rendering, but it still trails Nano Banana Pro, especially on faces.

I tried out GPT Image 1.5. It adds more contrast, ink, texture, detail, and polish. See https://sanand0.github.io/llmartstyle/?category=pop It's more powerful when generating different infographic styles: https://sanand0.github.io/llmartstyle/?category=text But it's still terrible at faces. Overall, better competition for Nano Banana. Not yet dethroning Nano Banana Pro for me. LinkedIn

Gpt image 1.5


I used ChatGPT, Claude, and Gemini to determine a single composite metric for ranking India's greatest batsmen. The LLMs favored a 'Batting Average * log(Total Runs)' calculation, which I visualized to compare eras across cricket history.

When my father mentioned that Virat Kohli scored a century (again) against South Africa, I wondered how he compared to the likes of Tendulkar and Gavaskar. I asked ChatGPT: If you had to evaluate the quality of Indian batsmen over time, what single metric (possibly composite) would you use? Evaluate the top Indian batsmen in history on this metric. Plot them over their active years (X-axis) along with the metric (Y-axis), labelled with the player names, on a beautiful visualization. Claude and Gemini, too, preferred simple metrics that favored the batting average or total runs. Strike rate, relative to era, win rate impact, etc. were all excluded. (Sadly, any metric that misses Kapil Dev feels a bit... incomplete.) Data story: https://sanand0.github.io/datastories/indian-batting-greats/ LinkedIn

Greatest batsman over time


I maintain a daily coding habit, visible through my consistent GitHub contribution graph. This 'addiction' keeps my skills sharp, allows for constant experimentation with new tools, and ensures I'm always shipping something meaningful every single day.

Habits of a code addict


Later submissions correlate with lower scores in a smooth logarithmic pattern, suggesting that even pretending a deadline is earlier may be strategically useful.

Does it make a difference if you submit early vs submit late? Here's some empirical data. About 1,000 students at IIT Madras took 3 online quizzes (GA1, GA2, GA3) in the last few weeks. The deadlines were all at midnight (India) on different days. Here's when they submitted their final answers: There was a spurt of submissions at the last minute.\ 1 out of 8 students submit with < 10 minutes remaining. Most students submitted 4 hours before the deadline.\ In fact, 3 out of 4 students submit on the same day as the deadline. A fair number of students submitted the previous day/night.\ 1 out of 6 are diligent and submit a day early. But does submitting late help, since you get more time? Apparently not. On average, every time the deadline is halved, the score drops by 1.4%. For example, on average: Submitting 1 minute before scores 1.4% less than submitting 2 minutes before Submitting 2 minutes before scores 1.4% less than submitting 4 minutes before Submitting 4 minutes before scores 1.4% less than submitting 8 minutes before … etc. This means that submitting early morning instead of midnight could give you a 15% advantage. Of course, this might be confusing cause and effect. Maybe students who do well submit early, and those who struggle submit late. But is there a merit in faking it till you make it? Perhaps by pretending your deadline is a day early, to get the best of both worlds? Something to think about...

Halving a deadline costs 1.4% of marks each time


Two years of conversation history show ChatGPT as a major time-saving force centered on coding, ideation, writing, and advice, while also exposing personal blind spots.

Here's how I use ChatGPT, based on the 6,000 conversations I've had in 2 years. My top use, by far, is for technology. "Modern JavaScript Coding" and "Python Coding Questions" are 30% of my queries. There's a long list with Markdown, GitLab, GitHub, Shell, D3, Auth, JSON, CSS, DuckDB, SQLite, Pandas, FFMPeg, etc. featured prominently. Next is to brainstorm AI use: "AI Panel Discussions", "AI Trends and Business Impact", "LLM Applications and DSLs", "Industry Use Cases and Metrics" are also fast growing categories. I brainstorm talk outlines, refine slide deck narratives, and plan business ideas. Thirdly, I use it for reading/writing. "Article Summaries and Insights", "Writing Style and Editing". Lastly, for personal advice. "Personal Advice and Replies" and "Singapore Travel Queries" are in this bucket. Then there are niches like image generation ("Image Generation and Annotation", "Calvin and Hobbes Comics"), research ("Fact Checking and Trivia"), emails ("Email Analysis and Spam Detection"), and teaching ("Education and Student Projects"). 6,000 chats saved me perhaps 600 hours. ChatGPT's "given" me a month of life-time for $600 -- which I reinvested into teaching and tinkering. Today, 70% of my prompts are code. In five years, that might drop as AI handles coding, and I tackle strategy and thinking. My prompt portfolio isn't future-proof? Is yours? There's no finance, music, or philosophy. My prompts mirror my blind spots. Should I force one prompt a week in a category I've never explored? Would you? LinkedIn

How i use chatgpt


Analyzing exported ChatGPT history shows that the author’s longest model reasoning bursts cluster around hard analytical prompts and top out near seven minutes.

How long can I make ChatGPT think? Jason Clarke's Import AI 414 shares a Tech Tale about a game called "Go Think": … we’d take turns asking questions and then we’d see how long the machine had to think for and whoever asked the question that took the longest won. I prompted Claude Code to write a library for this. (Cost: $2.30). (FYI, this takes 2.3 seconds in NodeJS and 4.2 seconds in Python. A clear gap for JSON parsing.) The top 3 thinking blocks took 6m 50s, 6m 21s, and 6m 1s each, all in roughly the same conversation thread. Here were my questions: Here are vehicle telematics stats for 2 months. Unzip it and take a look. Find interesting insights from this data. Look hard until you find at least 5 surprising insights from this. Double check these with the data Run the analyses and tell me what factors drive the maintenance schedule. Give me insights validated with tables and charts. The next largest thinking block (5m 42s) was on what happens when intelligence becomes cheap: I would like to explore parallels to the current phenomenon where intelligence is becoming too cheap to meter. Historically, both in recent history as well as over ancient history, what technologies have made what kind of tasks so cheap that they are too cheap to meter? Give me a wide range of examples Completing long tasks is a measure of intelligence. Working independently for long is another. O3 is at about 6 minutes on this. While it works, I'm practicing Bubble Shooter in 6 minutes. You can run by exporting your ChatGPT history, extracting conversations.json and running:

How long can I make ChatGPT think?


A single-job GitHub Pages workflow is enough for many static deployments, and modern toolchains like uv, node, and deno make lightweight publishing pipelines straightforward.

Here's the GitHub Actions file (.github/workflows/deploy.yaml) I use to publish to GitHub pages. This is based on Simon Willison's workflow and some of my earlier actions. This combines build and deploy jobs. For simple sites, that's simpler and more efficient. For complex builds with parallel execution or need for better error recovery, multiple jobs will help. I build sites with uv, node, or deno. Here are examples of each A sample uv-based deployment. A sample node package.json deployment and an npx deployment. A sample deno deployment.

How to build and deploy custom GitHub Pages


The way to govern smarter systems is through mechanisms like checklists, sampling, red-teaming, gating, consensus, and outcome-based evaluation.

How To Control Smarter Intelligences LLMs are smarter than us in many areas. How do we manage them? This is not a new problem. VC partners evaluate deep-tech startups. Science editors review Nobel laureates. Managers manage specialist teams. Judges evaluate expert testimony. Coaches train Olympic athletes. … and they manage and evaluate "smarter" outputs in many ways: 1. Verify. Check against an "answer sheet". 2. Checklist. Evaluate against pre-defined criteria. 3. Sampling. Randomly review a subset. 4. Gating. Accept low-risk work. Evaluate critical ones. 5. Benchmark. Compare against others. 6. Red-team. Probe to expose hidden flaws. 7. Double-blind review. Mask identity to curb bias. 8. Reproduce. Re-running gives the same output? 9. Consensus. Aggregate multiple responses. Wisdom of crowds. 10. Outcome. Did it work in the real world? For example: Vibe coding: Non-programmers might glance at lint checks (Checklist) and see if it works (Outcome). LLM image designs: Developers might check if a few images look good (Sampling) and check a few marketers (Consensus). LLM news articles: An journalist might run a Checklist, a Double-blind review with experts, and Verify critical facts (Gating). You already know many of these. You learnt them in Auditing. Statistics. Law. System controls. Policy analysis. Quality engineering. Clinical epidemiology. Investigative journalism. Design critique. Worth brushing up skills. They're more important in the AI era.

How To Control Smarter Intelligences


I used ChatGPT to analyze 1,700 student scores and identify the strongest predictors for exam success. By prompting for simple heuristics, I developed a data-driven playbook that tells students exactly which assignments to prioritize for specific grade outcomes.

How to create a data-driven exam strategy Can ChatGPT give teachers data-driven heuristics on student grades? I uploaded last term's scores from about 1,700 students in my Tools in Data Science course and asked ChatGPT: This sheet contains the scores of students … (and explained the columns). I want to find out what are the best predictors of the total plus bonus… (and explained how scores are calculated). I am looking for simple statements with 80%+ correctness along the lines of: "if ga1\f + ga\4f > x then you will not fail; this is true for 90% of the students" or "your total will effectively be your p1\f score, within plus or minus 5 marks; this is true for 90% of the students" or "if you get below 40% in ga3\f then you will likely fail; 80% of the students who did so fail." Earlier predictors (GA1, GA2, maybe GA3) are more useful (to students) … Two kinds of students: Those who want to avoid failing and those who want to score high…. .. give me the best student advice. Phrase it conversationally and include numerical evidence in simple language. After a 30 minute conversation, ChatGPT delivered concrete, actionable advice: One-page student playbook If you're behind / "don't fail": Immediate target: GA2 > 45 and GA3 > 55. That alone cuts fail risk to 16%. If possible, push >85/85 to get fail to 8%. Translation: stop skipping; get partial credit; move into the "safe" GA2/GA3 band. If you're aiming for an A: Path A1 (broad coverage): P2 + ET >= 180 > A 35% (n=169). Path A2 (also broad): P1 + P2 >= 180 > A 45% (n=161). If early GAs are fine (GA2/GA3 >=70), keep them steady, but your marginal effort should go to P2 and ET. If you're aiming for an S: Path S1 (most reliable): P2 >= 90 + ROE >= 80 > S 77% (n=26). Path S2 (elite): P2 >= 90 + ET >= 85 + ROE >= 80 > S 91% (n=11). Simple rule of thumb: P2 + ROE >= 170 or ET + ROE >= 160 > 70% S with 0% fails in those groups. Translation: ace ROE. Use P2 and ET as the second and third pillars. Students: Don't study harder. Study what moves the marks. (Learning be damned!) Teachers: Try this with your course data! Full chat: LinkedIn


New reasoning models can often deliver the final analytical artifact directly, so asking for output instead of code is now a viable workflow for some data tasks.

How to Create a Data Visualization Without Coding After seeing David McCandless' post "Which country is across the ocean?" I was curious which country you would reach if you tunneled below in a straight line (the antipode). This is a popular visualization, but I wanted to see if I could get the newer OpenAI models to create the visual without me 𝗿𝘂𝗻𝗻𝗶𝗻𝗴 any code (i.e. I just want the answer.) After a couple of iterations, O3 did a great job with this prompt: Here is the output and here is the ChatGPT conversation that generated it. I learnt a few things: 1. Ask for the output, not the code. Models like O3 and O4 Mini can run code while thinking. Let's stop asking for code to run. Just ask for the output directly. Let it figure out how. 2. Edge cases are everywhere. I had a problem with UK, France, Algeria, etc. straddling the prime meridian. If all goes well, you get AI-speed results. But it never does, and fixing it takes an expert and human-speed results. Programmers under-estimate edge cases, so compensate for this. If you want to run this yourself, the code is at https://github.com/sanand0/antipodes LinkedIn


Source code plus cloud icon libraries can be turned into useful PlantUML architecture diagrams through a prompt-driven workflow.

How to create a Technical Architecture from code with ChatGPT and PlantUML Earlier, I used Mermaid for technical architectures. But PlantUML seems a better option for cloud architecture diagrams. STEP 1: Copy the code Here’s a one-liner using files-to-prompt to copy all files in the current directory: Or, you can specify individual files: STEP 2: Extract the cloud icons This script pulls icon macros for AWS, Azure, and GCP from PlantUML's Standard Library into prompt-friendly files. STEP 3: Prompt for a PlantUML diagram PlantUML is a diagram markup language. I use this prompt with O4-Mini-High or O3: Create a PlantUML component diagram to describe the technical architecture using the files below.\ For EVERY cloud component use the icon macro ONLY from the provided list. Then paste your copied code and the .puml for your cloud (e.g. Azure.puml). Here is a sample conversation and the PlantUML output.


Source code can be turned into architecture diagrams quickly by copying files into an LLM, prompting for Mermaid output, and refining the result visually rather than manually drafting it.

How to create a Technical Architecture from code with ChatGPT Here's my current workflow to create technical architecture diagrams from code. STEP 1: Copy the code Here's a one-liner using files-to-prompt to copy all files in the current directory: Or, you can specify individual files: STEP 2: Prompt for the a Mermaid diagram Mermaid is a Markdown charting language. I use this prompt with O4-Mini-High or O3: Create a Mermaid architecture diagram for the files below. Make sure that the diagram is rich in visual detail and looks impressive. Use the "neutral" theme. Name nodes and links semantically and label them clearly. Avoid parantheses. Quote subgraph labels. Use apt shape: rect|rounded|stadium|... for nodes. Add suitable emoticons to every node. Style nodes and links with classes most apt for them. Follow that with a bulleted explanation of the architectural elements that is suitable for adding to a slide. Finally, double-check the architecture against the codebase and provide a step-by-step validation report. [PASTE CODE] STEP 3: Copy the diagram into Mermaid Live Editor Here's a sample output that you can paste into a new Mermaid Playground: STEP 4: Export the diagram If you log in, you can export as PNG. If not, you can export it as SVG or take a screenshot. Note: Technically, this is a flowchart, not an architecture diagram. Mermaid does support architecture diagrams, but they are in beta and don't look good. Comments How to create a Technical Architecture from code with ChatGPT and PlantUML - S Anand 24 May 2025 9:18 am (pingback): […] Earlier, I used Mermaid for technical architectures. But PlantUML seems a better option for cloud architecture diagrams. […]