<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>pandoc on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/pandoc/</link>
    <description>Recent content in pandoc on S Anand</description>
    <generator>Hugo -- 0.156.0</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 26 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/pandoc/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Things I Learned - 26 Apr 2026</title>
      <link>https://www.s-anand.net/blog/things-i-learned-26-apr-2026/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-26-apr-2026/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mdq&lt;/code&gt; is pretty useful to extract Markdown sections. For example &lt;code&gt;cat *.md | mdq &#39;# Title&#39;&lt;/code&gt; extracts all sections where the header contains &amp;lsquo;Title&amp;rsquo; (case-insensitive).&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developers.cloudflare.com/browser-run/&#34;&gt;CloudFlare Browser Run&lt;/a&gt; is, roughly, a browser as a service. &lt;a href=&#34;https://developers.cloudflare.com/browser-run/pricing/&#34;&gt;Pricing&lt;/a&gt;: 10 hours free per month, then 9c per hour. I had Codex run a small &lt;a href=&#34;https://github.com/sanand0/research/tree/main/cloudflare-browser-run&#34;&gt;research&lt;/a&gt; to explore it, and it seems simple to set it up and use it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;&gt;GPT 5.5&lt;/a&gt; seems to be especially better than GPT 5.4 and running for long, with tool calls, without losing focus. That&amp;rsquo;s something OpenAI models are good at anyway, so this takes it a step further. &lt;a href=&#34;https://chatgpt.com/share/69eaccb0-b9e0-8399-be3f-6bd73906d0ec&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I added &lt;a href=&#34;https://developers.openai.com/api/docs/models/gpt-image-2&#34;&gt;gpt-image-2&lt;/a&gt; to my &lt;a href=&#34;https://sanand0.github.io/llmartstyle/&#34;&gt;LLM Art Style gallery&lt;/a&gt;. It is notably better with text accuracy. For example, on &lt;a href=&#34;https://sanand0.github.io/llmartstyle/?category=text&#34;&gt;Rock - Paper - Scissors - Lizard - Spock&lt;/a&gt; it consistently lists all 10 rules, which Nano Banana 2 does not.&lt;/li&gt;
&lt;li&gt;World leaders do keep us entertained. &lt;!-- https://gemini.google.com/app/240186d320b283d8 --&gt;
&lt;ul&gt;
&lt;li&gt;Saparmurat Niyazov (Turkmenistan) renamed the months of the year and days of the week after himself and his mother. He built a towering, gold-plated statue of himself in the capital that rotated so it would always face the sun. He also banned lip-syncing at concerts, outlawed gold teeth, and banished dogs from the capital because he found their smell unappealing.&lt;/li&gt;
&lt;li&gt;Idi Amin (Uganda) declared himself the &amp;ldquo;Uncrowned King of Scotland&amp;rdquo; and sent baffling, unsolicited telegrams to world leaders - advising Richard Nixon to recover from Watergate, or offering food aid to a struggling Britain.&lt;/li&gt;
&lt;li&gt;François &amp;ldquo;Papa Doc&amp;rdquo; Duvalier (Haiti) reportedly ordered all black dogs in Haiti to be put to death and claimed his personal Vodou curse was responsible for the assassination of John F. Kennedy.&lt;/li&gt;
&lt;li&gt;Francisco Macías Nguema (Equatorial Guinea) banned the word &amp;ldquo;intellectual&amp;rdquo;, banned the use of lubricants in the power plant (claiming his magic would keep it running, which promptly broke the generators), and stored the nation&amp;rsquo;s remaining foreign currency under his bed.&lt;/li&gt;
&lt;li&gt;Kim Jong-il (North Korea) claimed he invented the hamburger (calling it &amp;ldquo;double bread with meat&amp;rdquo;) and shot 11 holes-in-one his first time playing golf.&lt;/li&gt;
&lt;li&gt;Donald Trump (United States) used late-night tweets to announce major policy shifts and fire his own cabinet members. He altered an official government hurricane map with a Sharpie to match a previous erroneous statement, and publicly mused during a press briefing about the injection of household disinfectants as a medical treatment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Git repositories inside git repositories (without using sub-modules) don&amp;rsquo;t seem to work well. I need this because I have mono-repos for research and I want to use git in a sub-folder to iterate, then commit just the final version to the parent folder. Looks like I need to remove the child &lt;code&gt;.git/&lt;/code&gt; (e.g. rename to &lt;code&gt;.git.bak/&lt;/code&gt;, which I&amp;rsquo;ve added to my &lt;code&gt;~/.config/git/ignore&lt;/code&gt;) for this to work. &lt;a href=&#34;https://gemini.google.com/share/1a89ad8cf6da&#34;&gt;Gemini&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To run a script in the background (without logs) and detach / disown it, use &lt;code&gt;nohup your-script &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp; disown&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Running &lt;code&gt;/insights&lt;/code&gt; on Claude Code helped me add these two instructions to my &lt;a href=&#34;https://github.com/sanand0/scripts/blob/main/agents/code/SKILL.md&#34;&gt;code skill&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;Test web pages with screenshots (for layout, overlaps, contrast) AND CDP (for interactions, navigation) before finalizing&lt;/li&gt;
&lt;li&gt;Prefer icon libraries over unicode/emoji icons.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sending an entire PDF/PPTX to Gemini costs ~40% of sending PDF/PPTX + images. The quality is fine for small files, but for large files adding images reduces error rate from ~5% to 0.5%.&lt;/li&gt;
&lt;li&gt;Pandoc Markdown to Word DOCX supports sidebar comments. You can use this Markdown: Here is &lt;code&gt;[comment in sidebar]{.comment-start id=&amp;quot;c1&amp;quot; author=&amp;quot;Anand&amp;quot; date=&amp;quot;2026-01-01T12:00:00Z&amp;quot;}commented text[]{.comment-end id=&amp;quot;c1&amp;quot;} inline.&lt;/code&gt; &lt;a href=&#34;https://gemini.google.com/share/430e7556ad69&#34;&gt;Gemini&lt;/a&gt;. In fact, Pandoc supports lots of other things, like: &lt;!-- https://gemini.google.com/app/0fe9e7b12650f7f2 --&gt;
&lt;ul&gt;
&lt;li&gt;Custom styles via block &lt;code&gt;::: {custom-style=&amp;quot;Custom Style Name&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Track changes via &lt;code&gt;[inserted text]{.insertion author=&amp;quot;Name&amp;quot; date=&amp;quot;2026-04-20T12:00:00Z&amp;quot;}&lt;/code&gt; and &lt;code&gt;[deleted text]{.deletion author=&amp;quot;Name&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Page breaks via &lt;code&gt;\newpage&lt;/code&gt; (a LaTeX command that Pandoc supports in Markdown)&lt;/li&gt;
&lt;li&gt;CSS styles via &lt;code&gt;![Alt Text](image.png){width=&amp;quot;5.5in&amp;quot; height=&amp;quot;3in&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://offpunk.net/&#34;&gt;Offpunk&lt;/a&gt; is a CLI offline-first browser. Interesting idea, but installation is a problem.
After &lt;code&gt;sudo apt uninstall offpunk&lt;/code&gt; running &lt;code&gt;offpunk&lt;/code&gt; failed with &lt;code&gt;ImportError: lxml.html.clean module is now a separate project lxml_html_clean.&lt;/code&gt;
After a &lt;code&gt;git clone&lt;/code&gt; it reported &lt;code&gt;HTML document detected. Please install python-bs4 and python-readability&lt;/code&gt;.
These are easy to fix, but I wasn&amp;rsquo;t inclined.&lt;/li&gt;
&lt;li&gt;Creating an authenticated &lt;a href=&#34;https://developers.openai.com/api/docs/mcp&#34;&gt;MCP Server for ChatGPT&lt;/a&gt; is complex. It requires OpenID Connect (for which library support is weak and requires a provider like Auth0), dynamic client registration (which is hard to implement though Auth0 supports it), and after half a day of experiments, I still couldn&amp;rsquo;t connect. An easier option is to run temporary tunnels with &lt;code&gt;cloudflared&lt;/code&gt; or &lt;code&gt;ngrok&lt;/code&gt; or &lt;code&gt;localtunnel&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 23 Nov 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-23-nov-2025/</link>
      <pubDate>Sun, 23 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-23-nov-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Here are some new CLI tools I installed:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/saulpw/visidata&#34;&gt;&lt;code&gt;vd&lt;/code&gt;&lt;/a&gt; (visidata): Terminal spreadsheet viewer &amp;amp; editor for CSV, Excel, JSON, SQL, Parquet, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/jqnatividad/qsv&#34;&gt;&lt;code&gt;qsv&lt;/code&gt;&lt;/a&gt;: Fast CSV command line toolkit for slicing, filtering, aggregating, and analyzing CSV files.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/phiresky/ripgrep-all&#34;&gt;&lt;code&gt;rga&lt;/code&gt;&lt;/a&gt; (ripgrep-all): ripgrep that searches PDFs, Office docs, EPUBs, zip files.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/pdfcpu/pdfcpu&#34;&gt;&lt;code&gt;pdfcpu&lt;/code&gt;&lt;/a&gt;: PDF processor for splitting, merging, optimizing, and manipulating PDF files.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/charmbracelet/gum&#34;&gt;&lt;code&gt;gum&lt;/code&gt;&lt;/a&gt;: Stylish CLI tool for creating interactive prompts, confirmations, and more.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Models read pretty fast, consuming input tokens at ~4K-20K words per second. It&amp;rsquo;s the &amp;ldquo;speaking&amp;rdquo; (output token rate) that is the bottleneck. So shortening input doesn&amp;rsquo;t matter as much as shortening output for latence. &lt;a href=&#34;https://chatgpt.com/share/6922cde4-4d40-800c-9524-8e35d68039f3&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;When building agents, as of now, prefer native provider SDKs (OpenAI Agents SDK, Anthropic SDK) over even light abstractions like Vercel AI SDK or Pydantic. There are subtle issues related to error messages, response handling, cache handling, etc. that trip up abstractions given how early things are. &lt;a href=&#34;https://lucumr.pocoo.org/2025/11/21/agents-are-hard/&#34;&gt;Armin Ronacher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gone are the times when LLMs couldn&amp;rsquo;t do mental math. Now they&amp;rsquo;re computing base64 and SHA256 from memory, without needing code! &lt;a href=&#34;https://chatgpt.com/share/6921b2c5-6cf4-800c-9958-357c788e3e72&#34;&gt;Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Organizing a round table event in Singapore costs ~$75-150. Here&amp;rsquo;s what drives the cost variation &lt;a href=&#34;https://chatgpt.com/c/691fbbbf-4870-8321-a12d-36faf1da2ae4&#34;&gt;#&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;50%: brand/location.&lt;/li&gt;
&lt;li&gt;25%: food and beverage.&lt;/li&gt;
&lt;li&gt;15%: duration (full day is only slightly more expensive than half day)&lt;/li&gt;
&lt;li&gt;10%: date, demand, etc.&lt;/li&gt;
&lt;li&gt;10%: add-ons: AV, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OpenRouter supports &lt;a href=&#34;https://openrouter.ai/docs/api-reference/api-reference/embeddings&#34;&gt;embedding models&lt;/a&gt;. &lt;a href=&#34;https://openrouter.ai/baai/bge-base-en-v1.5&#34;&gt;BGE base&lt;/a&gt; seems pareto optimal with 0.5 cents / MTok and a good &lt;a href=&#34;https://huggingface.co/spaces/mteb/leaderboard&#34;&gt;MTEB&lt;/a&gt; ranking.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chatgpt.com/share/691e63a9-ae98-800c-b9bd-0cc7e6013700&#34;&gt;TOON vs JSON&lt;/a&gt;. Early days, and &lt;a href=&#34;https://github.com/toon-format/toon&#34;&gt;TOON&lt;/a&gt; seems to be marketing a lot, so I&amp;rsquo;m wary, but for large tabular data where input tokens are crunched, it seems a readable alternative to multiple CSVs, but not worth the hype.
0 19 Nov 2025. Always use GPT-5.1-Codex-Max instead of GPT-5.1-Codex. At every thinking level, it takes fewer tokens for similar or higher accuracy. &lt;a href=&#34;https://x.com/thsottiaux/status/1991210545253609875&#34;&gt;Tibo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ug -i --smart-case --bool &#39;word1 word2 ...&#39;&lt;/code&gt; seems the cleanest way to find files that have all words. &amp;ndash;smart-case uses case-insensitive if all words are lowercase, else case-sensitive. Examples:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ug --bool &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#34;exact phrase&amp;#34; word2&amp;#39;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# exact phrase + other tokens anywhere&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ug --bool &lt;span class=&#34;s1&#34;&gt;&amp;#39;word1 word2 -word3&amp;#39;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;# must contain word1 AND word2, but NOT word3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ug --bool &lt;span class=&#34;s1&#34;&gt;&amp;#39;(&amp;#34;foo bar&amp;#34;) OR baz&amp;#39;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;# grouped expressions and OR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ug --bool &lt;span class=&#34;s1&#34;&gt;&amp;#39;word1 NEAR/5 word2&amp;#39;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;# match when words are within 5 tokens/words&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ug -Z2 &lt;span class=&#34;s1&#34;&gt;&amp;#39;word&amp;#39;&lt;/span&gt;                     &lt;span class=&#34;c1&#34;&gt;# allows up to 2 typos in &amp;#39;word&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;⭐ &lt;code&gt;ug -i --smart-case --bool -Q&lt;/code&gt; lets you &lt;em&gt;interactively&lt;/em&gt; search within files. This is the &lt;strong&gt;coolest&lt;/strong&gt; feature!&lt;/li&gt;
&lt;li&gt;Fixing laptop issues is clearly a whole lot easier with an AI chatbot. I fixed these Ubuntu issues purely using Claude. It told me what to run. I ran it, shared the output, it diagnosed, told me what to do next, etc. until the issues were fixed. For example:
&lt;ul&gt;
&lt;li&gt;My keyboard shortcuts stopped working. It turned out I edited my &lt;a href=&#34;https://github.com/sanand0/scripts/blob/29be5c4d79b5d75e96677aa1a850d273833caea8/setup/media-keys.dconf&#34;&gt;media-keys.dconf&lt;/a&gt; and removed the trailing slash. &lt;a href=&#34;https://claude.ai/chat/1ba03ff1-627d-44bb-8c80-ef5f5c18f90d&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A 3-finger tap mapped to a middle click and I couldn&amp;rsquo;t remove it. It turned out my &lt;a href=&#34;https://github.com/sanand0/scripts/blob/29be5c4d79b5d75e96677aa1a850d273833caea8/touchegg.conf&#34;&gt;touchegg.conf&lt;/a&gt; explicitly had this mapping. I disabled it. &lt;a href=&#34;https://claude.ai/chat/46b030c2-7d82-439c-afb7-41515924ff0f&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My gnome extensions would get disabled every time the screen went to sleep. It turned out my extension cache was corrupted or stale. &lt;code&gt;sudo apt install --reinstall gnome-shell-extension-manager&lt;/code&gt; and &lt;code&gt;rm -rf ~/.cache/gnome-shell/&lt;/code&gt; fixed it. &lt;a href=&#34;https://claude.ai/chat/46b030c2-7d82-439c-afb7-41515924ff0f&#34;&gt;#&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ghostscript.com/&#34;&gt;GhostScript&lt;/a&gt; seems the best way to compress PDFs via the CLI. Example: &lt;code&gt;gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pandoc supports &lt;a href=&#34;https://pandoc.org/lua-filters.html&#34;&gt;Lua filters&lt;/a&gt; which are a powerful way to customize the document conversion process. Here is a Lua filter that converts horizontal rules in a markdown document to page breaks and preserve in a Word document (OpenXML format)
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;HorizontalRule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pandoc.RawBlock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;openxml&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;lt;w:p&amp;gt;&amp;lt;w:r&amp;gt;&amp;lt;w:br w:type=&amp;#34;page&amp;#34;/&amp;gt;&amp;lt;/w:r&amp;gt;&amp;lt;/w:p&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manpages.debian.org/unstable/pst-utils/readpst.1.en.html&#34;&gt;readpst&lt;/a&gt; - via &lt;code&gt;sudo apt install pst-utils&lt;/code&gt; - extracts emails from Outlook PST files to mbox format. Useful for email migrations.&lt;/li&gt;
&lt;li&gt;Write tutorials or blog posts as you learn. &lt;a href=&#34;https://steveklabnik.github.io/jujutsu-tutorial/&#34;&gt;Steve Klabnik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Running a coding agent post mortem, e.g. &amp;ldquo;what worked well, what didn&amp;rsquo;t, and why? Next time, what are a few bullets I could include that will avoid these problems?&amp;rdquo; helps me prompt better next time. For example, &lt;a href=&#34;https://claude.ai/code/session_01EWtnaQVZxqTqsVuY7tSCgA&#34;&gt;Claude Code&lt;/a&gt; suggested:
&lt;ul&gt;
&lt;li&gt;Use Firefox for headless browser automation (Chromium often crashes)&lt;/li&gt;
&lt;li&gt;Set HOME=/root when running Playwright with Firefox&lt;/li&gt;
&lt;li&gt;Start a local HTTP server rather than using file:// protocol&lt;/li&gt;
&lt;li&gt;External images may not load in screenshots due to network isolation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 18 May 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-18-may-2025/</link>
      <pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-18-may-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Birds navigate using quantum entanglement! &lt;a href=&#34;https://www.theguardian.com/science/2025/mar/23/they-have-no-one-to-follow-how-migrating-birds-use-quantum-mechanics-to-navigate&#34;&gt;Guardian&lt;/a&gt; &lt;a href=&#34;https://chatgpt.com/share/68282f03-3978-800c-8e46-e9979887317d&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/bytedance/deer-flow&#34;&gt;DeerFlow&lt;/a&gt; is an open source Deep Research MCP. Lets you run deep research outside of the standard chatbots.&lt;/li&gt;
&lt;li&gt;⭐ Today, if I had to store a bunch of data files (e.g. parquet) under 1GB, I would use GitHub Releases. Here are options:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Releases&lt;/strong&gt;. 2 GiB &lt;strong&gt;per file&lt;/strong&gt;, unlimited total &amp;amp; bandwidth. 🟢 Immortal URL, versioning, easy CI publish. 🔴 Each file must stay &amp;lt; 2 GiB; no built-in SQL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zenodo&lt;/strong&gt; (CERN). 50 GB per record; one-off bumps to 200 GB. 🟢 DOI assignment, archival mandate. 🔴 Occasional throttled bandwidth; no API for partial file reads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hugging Face Hub&lt;/strong&gt;. 300 GB per repo; 50 GB per file. 🟢 Git-based, dataset tooling, lively ML community. 🔴 Large files need git-LFS; pushes via LFS can be slow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare R2&lt;/strong&gt;. 10 GB storage &amp;amp; 1 M ops / month. 🟢 S3 API, zero-egress to Cloudflare Workers, fast. 🔴 10 GB cap below your 50 GB target.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaggle Datasets&lt;/strong&gt;. 20 GB per dataset, public only. 🟢 Built-in notebooks &amp;amp; GPU. 🔴 No programmatic SQL API; quotas sometimes change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;data.world (free)&lt;/strong&gt;. 1 GB total, 100 MB per dataset. 🟢 Nice social features. 🔴 Too small for your size.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If I had to query a bunch of data files in an external Parquet or SQLite file, here are SQL engines-as-a-service:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MotherDuck&lt;/strong&gt;. 10 GB storage + 10 CU-hrs/mo compute. Native DuckDB; no credit card; GA June 2024; monthly feature drops.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datasette Cloud&lt;/strong&gt;. Two-month trial (or 1-yr for non-profits). SQLite backend. Great UX; but not free forever for general use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWS Athena&lt;/strong&gt;. Pay-per-TB scanned; no free tier; S3 fees after 12 mo. Costs creep quickly; free-tier S3 ends after a year.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bootstrap has a &lt;a href=&#34;https://getbootstrap.com/docs/5.3/helpers/stretched-link/&#34;&gt;&lt;code&gt;.stretched-link&lt;/code&gt;&lt;/a&gt; that makes a link cover the containing block. A clever trick that I discovered when Claude 3.5 Sonnet wrote &lt;a href=&#34;https://github.com/sanand0/sanand0.github.io/blob/0932f2efe3ad6c950c20b2ed7534ef27d8fff304/update.js#L62&#34;&gt;my code&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Discovered spray and peel paints at &lt;a href=&#34;https://artfriendonline.com/&#34;&gt;ArtFriend&lt;/a&gt;. I had no idea that was a thing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ai.google.dev/gemini-api/docs/live&#34;&gt;Gemini Live API&lt;/a&gt; is the real-time equivalent from Gemini. It supports tools, search, and code execution.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/coleam00/mcp-mem0&#34;&gt;mcp-mem0&lt;/a&gt; is an MCP for memory&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/marv1nnnnn/llm-min.txt&#34;&gt;llm-min.txt&lt;/a&gt; compresses docs for LLMs to read optimally. Like a compressed &lt;a href=&#34;https://llmstxt.org/&#34;&gt;llms.txt&lt;/a&gt; or &lt;a href=&#34;https://context7.com/&#34;&gt;context7&lt;/a&gt;. Usage &lt;code&gt;GEMINI_API_KEY=... uvx llm-min -i $DIR&lt;/code&gt; #ai-coding&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s a lot of action on encrypted LLM operations.
&lt;ul&gt;
&lt;li&gt;Responses API allows reasoning tokens to be encrypted if organizations don&amp;rsquo;t want their reasoning data to persist. &lt;a href=&#34;https://cookbook.openai.com/examples/responses_api/reasoning_items&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tinfoil.sh/&#34;&gt;Tinfoil&lt;/a&gt; (YC X25) offers an OpenAI-compatible inference API where data is encrypted from the client to the NVIDIA Hopper/Blackwell GPUs in confidential computing mode. Prompts, model weights, outputs are encrypted in transit and memory, with verifiable privacy on code running in GPU.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://modelyo.com/&#34;&gt;Modelyo&lt;/a&gt; (Israel) offers VMs/K8 clusters with encrypted GPUs across multiple cloud providers with continuous attestation, managed on Modelyo&amp;rsquo;s portal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;⭐ LLMs are able to do things independently longer and longer. That&amp;rsquo;s a useful metric to track. &lt;a href=&#34;https://www.lesswrong.com/posts/deesrjitvXM4xYGZd/metr-measuring-ai-ability-to-complete-long-tasks&#34;&gt;METR: Measuring AI Ability to Complete Long Tasks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re looking for datasets / APIs related to research publications (especially funding), then explore:
&lt;ul&gt;
&lt;li&gt;Crossref &lt;a href=&#34;https://api.crossref.org/swagger-ui/index.html&#34;&gt;API&lt;/a&gt; and &lt;a href=&#34;https://www.crossref.org/documentation/retrieve-metadata/rest-api/tips-for-using-public-data-files-and-plus-snapshots/&#34;&gt;snapshots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenAlex &lt;a href=&#34;https://docs.openalex.org/&#34;&gt;API&lt;/a&gt; and &lt;a href=&#34;https://docs.openalex.org/download-all-data/openalex-snapshot&#34;&gt;snapshots&lt;/a&gt; which is funded by &lt;a href=&#34;https://ourresearch.org/&#34;&gt;OurResearch&lt;/a&gt;. OpenAlex is like CrossRef but includes some disambiguation&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://graph.openaire.eu/docs/category/downloads/&#34;&gt;OpenAIRE Graph&lt;/a&gt; &lt;a href=&#34;https://zenodo.org/records/13133184&#34;&gt;2024&lt;/a&gt; / &lt;a href=&#34;https://zenodo.org/records/14851262&#34;&gt;2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pmc.ncbi.nlm.nih.gov/articles/PMC10767826/&#34;&gt;Europe PMC&lt;/a&gt; &lt;a href=&#34;https://ftp.ebi.ac.uk/pub/databases/pmc/&#34;&gt;dataset&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;To avoid Ubuntu 24 suspending on closing the laptop lid use one of these and restart:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/systemd/logind.conf&lt;/code&gt;: Set &lt;code&gt;HandleLidSwitch=ignore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;etc/UPower/UPower.conf&lt;/code&gt;: Set &lt;code&gt;IgnoreLid=true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UV_TORCH_BACKEND=auto uv pip install torch torchvision torchaudio&lt;/code&gt; installs the most appropriate PyTorch version. &lt;a href=&#34;https://docs.astral.sh/uv/guides/integration/pytorch/#automatic-backend-selection&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cog.readthedocs.io/en/latest/&#34;&gt;Cog&lt;/a&gt; is a Python based templating language. It is embedded as comment chunks in any file and replaced itself with the output of the Python code you write.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cloudflare.com/en-in/zero-trust/products/access/&#34;&gt;CloudFlare Zero Trust&lt;/a&gt; seems the easiest way to enable auth on static websites, especially if your DNS is already on Cloudflare. No cost&lt;/li&gt;
&lt;li&gt;We could &amp;ldquo;fine-tune&amp;rdquo; system prompts automatically with evals, creating a &amp;ldquo;system prompt learning&amp;rdquo; paradim &amp;ndash; like my &lt;a href=&#34;https://github.com/gramener/promptevals&#34;&gt;promptevals&lt;/a&gt;. &lt;a href=&#34;https://x.com/karpathy/status/1921368644069765486&#34;&gt;Andrej Karpathy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I was asked how to improve speed when building an enterprise ChatGPT clone using an API. Here&amp;rsquo;s what I&amp;rsquo;d suggest, in order:
&lt;ul&gt;
&lt;li&gt;Streaming. High impact, low effort.&lt;/li&gt;
&lt;li&gt;Caching RAG retrieval as well as generation. High impact, low effort.&lt;/li&gt;
&lt;li&gt;UI tweaks. Loading / streaming icons and progress hints ()&amp;ldquo;Retrieving context&amp;rdquo;, &amp;ldquo;Generating answer&amp;rdquo;, etc.)&lt;/li&gt;
&lt;li&gt;Parallelize, if possible&lt;/li&gt;
&lt;li&gt;Use model options where available, e.g. speculative decoding, models with higher speed, models with closer CDN, etc.&lt;/li&gt;
&lt;li&gt;Shorten prompts&lt;/li&gt;
&lt;li&gt;Persistent HTTP/2 Keep-Alive. Low impact, low effort (tweak server settings).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developers.cloudflare.com/vectorize/platform/pricing/&#34;&gt;Cloudflare Vectorize&lt;/a&gt;, at 768 dimensions / embedding, is free for ~6.5K chunks storage at ~1,000 queries / day. For a light load like 1M 768d chunks queried 1K times a day, the cost is: &lt;a href=&#34;https://chatgpt.com/share/6821a25a-9f80-800c-8d95-8b2200ad6de4&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2&#34;&gt;NVIDIA parakeet&lt;/a&gt; is a lightweight speech to text model that leads benchmarks. Installing such packages continues to be a nightmare due to PyTorch (despite &lt;code&gt;uv&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;I explored the real-time avatar space. Heygen seems to be the easiest to use, but even that is complex and expensive ($99/mo). We may need to wait a few months for avatars to explode.&lt;/li&gt;
&lt;li&gt;⭐ Model reliability is a huge enabler for performance. As models become more reliable, they can work autonomously for longer and that is another kind of scaling. &lt;a href=&#34;https://andonlabs.com/evals/vending-bench&#34;&gt;Vending Bench&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ChatGPT, Gemini, etc. have become lead generation engines. Chat Bot Optimization (CBO), is it? &lt;a href=&#34;https://chatgpt.com/share/68215e14-9870-800c-a8e0-4fe476f48cc5&#34;&gt;WhatsApp + ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⭐ Never live delete data. Mark it for deletion and schedule a deletion task. That way you have time to react to mistakes. &lt;a href=&#34;https://simonwillison.net/2025/May/14/james-cowling/&#34;&gt;Simon Willison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pandoc.org/MANUAL.html&#34;&gt;Pandoc&lt;/a&gt; has several options useful when converting Markdown to HTML (&lt;code&gt;cat file.md | pandoc -f markdown -t html&lt;/code&gt;). My favorites:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--no-highlight&lt;/code&gt; skips code-highlighting. &lt;code&gt;--highlight=pygments&lt;/code&gt; adds Pygments styling&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--wrap=none&lt;/code&gt; doesn&amp;rsquo;t wrap the content in a single block&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--number-sections&lt;/code&gt; adds section numbering (&lt;code&gt;&amp;lt;h2&amp;gt;1. Introduction&amp;lt;/h2&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--shift-heading-level-by=NUM&lt;/code&gt; – shift all headings by NUM levels (e.g., start at &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; instead of &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pandoc -f markdown-auto_identifiers&lt;/code&gt; drops the auto-identifiers extension that generates &lt;code&gt;id=...&lt;/code&gt; for each heading&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pandoc -f gfm&lt;/code&gt; uses GitHub flavored Markdown. Run &lt;code&gt;pandoc --list-extensions=gfm&lt;/code&gt; to identify the extensions it uses.&lt;/li&gt;
&lt;li&gt;Pandoc&amp;rsquo;s &lt;a href=&#34;https://pandoc.org/demo/example33/8-pandocs-markdown.html&#34;&gt;Markdown extension examples&lt;/a&gt; are quite extensive.&lt;/li&gt;
&lt;li&gt;Auto-enabled GFM extensions:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;alerts&lt;/code&gt;: GitHub-style callouts (info, tip, warning) via &lt;code&gt;&amp;gt; [!TYPE]&lt;/code&gt; blocks.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;autolink_bare_uris&lt;/code&gt;: Turns bare URLs into links, without needing &lt;code&gt;&amp;lt;...&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;emoji&lt;/code&gt;: Parses &lt;code&gt;:smile:&lt;/code&gt;-style codes into Unicode emoji characters.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;footnotes&lt;/code&gt;: Enables footnote syntax with &lt;code&gt;[^id]&lt;/code&gt; and definitions at the bottom.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gfm_auto_identifiers&lt;/code&gt;: Uses GitHub’s heading-ID algorithm: spaces → dashes, lowercase, removes punctuation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipe_tables&lt;/code&gt;: Enables table.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;raw_html&lt;/code&gt;: Raw HTML is unchanged.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;strikeout&lt;/code&gt;: Enables strikethrough with &lt;code&gt;~~text~~&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;task_lists&lt;/code&gt;: Parses &lt;code&gt;- [ ]&lt;/code&gt; and &lt;code&gt;- [x]&lt;/code&gt; items as checkboxes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yaml_metadata_block&lt;/code&gt;: YAML front matter for document metadata, e.g. &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GFM extensions worth enabling:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ascii_identifiers&lt;/code&gt;: Strips accents/non-Latin letters in automatically generated IDs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bracketed_spans&lt;/code&gt;: &lt;code&gt;[Warning]{.alert}&lt;/code&gt; becomes &lt;code&gt;&amp;lt;span class=&amp;quot;alert&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;definition_lists&lt;/code&gt;: &lt;code&gt;Term\n: Definition text&lt;/code&gt; becomes a definition list&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fenced_divs&lt;/code&gt;: &lt;code&gt;::: {.note}&lt;/code&gt; block creates a &lt;code&gt;&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;...&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;implicit_figures&lt;/code&gt;: Standalone images become &lt;code&gt;&amp;lt;figure&amp;gt;&lt;/code&gt; with &lt;code&gt;&amp;lt;figcaption&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;implicit_header_references&lt;/code&gt;: &lt;code&gt;[Section]&lt;/code&gt; is treated as &lt;code&gt;[Section][#section]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;raw_attribute&lt;/code&gt;: &lt;code&gt;&amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;&lt;/code&gt;{=html} is inserted as HTML&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smart&lt;/code&gt;: Converts straight quotes to curly, &lt;code&gt;--&lt;/code&gt; to en-dash, &lt;code&gt;---&lt;/code&gt; to em-dash, &lt;code&gt;...&lt;/code&gt; to ellipsis.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subscript &amp;amp; superscript&lt;/code&gt;: E.g. &lt;code&gt;H~2~O&lt;/code&gt; and &lt;code&gt;E = mc^2^&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>How to publish an eBook in 60 minutes</title>
      <link>https://www.s-anand.net/blog/how-to-publish-an-ebook-in-60-minutes/</link>
      <pubDate>Mon, 31 Mar 2025 12:47:13 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/how-to-publish-an-ebook-in-60-minutes/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;How to publish an eBook in 60 minutes&#34; loading=&#34;lazy&#34; src=&#34;https://files.s-anand.net/images/2025-03-31-an-lbs-exchange-program-ebook-cover.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;I &lt;a href=&#34;https://www.amazon.in/dp/B0F3D55R2Z/&#34;&gt;published an eBook on Amazon&lt;/a&gt;. It takes an hour &lt;strong&gt;if you have the content ready&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STEP 1&lt;/strong&gt; (10 min): &lt;a href=&#34;https://account.kdp.amazon.com/&#34;&gt;Set up a Kindle Direct Publishing account&lt;/a&gt; with your address, bank details, and tax info.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STEP 2&lt;/strong&gt; (15 min): &lt;a href=&#34;https://wordpress.com/support/export/&#34;&gt;Export&lt;/a&gt; my &lt;a href=&#34;https://www.s-anand.net/blog/category/london-2000/&#34;&gt;London 2000&lt;/a&gt; blog archive and &lt;a href=&#34;https://github.com/lonekorean/wordpress-export-to-markdown&#34;&gt;convert to Markdown&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STEP 3&lt;/strong&gt; (10 min): Reformat the Markdown by writing a script in &lt;a href=&#34;https://cursor.com/&#34;&gt;Cursor&lt;/a&gt;. Here&amp;rsquo;s the prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Write a Python script that reads &lt;code&gt;*.md&lt;/code&gt; including the YAML frontmatter, adds the YAML &lt;code&gt;title&lt;/code&gt; as H1, &lt;code&gt;date&lt;/code&gt; (yyyy-mm-dd) like &lt;strong&gt;Sun, 01 Jan 2000&lt;/strong&gt; in a new para after the frontmatter and before the content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;STEP 4&lt;/strong&gt; (15 min): Convert it to an ePub using &lt;a href=&#34;https://pandoc.org/&#34;&gt;pandoc&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pandoc *.md -o book.epub --toc &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --metadata &lt;span class=&#34;nv&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;An LBS Exchange Program&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --metadata &lt;span class=&#34;nv&#34;&gt;author&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Anand S&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --metadata &lt;span class=&#34;nv&#34;&gt;language&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;en &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --metadata &lt;span class=&#34;nv&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;31 Mar 2025&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;STEP 5&lt;/strong&gt; (10 min): Generated a cover page with &lt;a href=&#34;https://chatgpt.com/&#34;&gt;ChatGPT&lt;/a&gt; (5 min) and compressed it into JPEG via &lt;a href=&#34;https://squoosh.app/&#34;&gt;Squoosh&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Draw a comic-style book cover page that covers the experiences of an Indian exchange student (picture attached) from IIM Bangalore at London Business School and exploring London. The book title is &amp;ldquo;An LBS Exchange Program&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;STEP 6&lt;/strong&gt; (10 min): &lt;a href=&#34;https://kdp.amazon.com/&#34;&gt;Publish the book on KDP&lt;/a&gt;. It&amp;rsquo;s priced at $0.99 / ₹49 because Kindle doesn&amp;rsquo;t allow free downloads.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it. Here&amp;rsquo;s the book: &lt;a href=&#34;https://www.amazon.in/dp/B0F3D55R2Z/&#34;&gt;https://www.amazon.in/dp/B0F3D55R2Z/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The three things that made publishing in 1 hour possible are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Amazon&amp;rsquo;s publishing process is &lt;strong&gt;simple&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open-source tooling (&lt;a href=&#34;https://wordpress.org/&#34;&gt;WordPress&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/Markdown&#34;&gt;Markdown&lt;/a&gt;, &lt;a href=&#34;https://en.wikipedia.org/wiki/EPUB&#34;&gt;ePub&lt;/a&gt;, &lt;a href=&#34;https://pandoc.org/&#34;&gt;pandoc&lt;/a&gt;) has built a big part of the infrastructure.&lt;/li&gt;
&lt;li&gt;LLMs make the rest (&lt;a href=&#34;https://chatgpt.com/share/67ea8da7-7f90-800c-a89c-6f087e893749&#34;&gt;figuring out the steps&lt;/a&gt;, generating the cover) very easy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(An eBook takes 72 hours of review before going live on the Kindle store.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.linkedin.com/feed/update/urn%3Ali%3Ashare%3A7314884520820854784&#34;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
