<?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>cursor on S Anand</title>
    <link>https://www.s-anand.net/blog/tag/cursor/</link>
    <description>Recent content in cursor on S Anand</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 06 Apr 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.s-anand.net/blog/tag/cursor/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Things I Learned - 06 Apr 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-06-apr-2025/</link>
      <pubDate>Sun, 06 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-06-apr-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; will soon be &lt;em&gt;very&lt;/em&gt; customizable via CSS. Including custom HTML inside options - even SVG. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/Customizable_select&#34;&gt;MDN&lt;/a&gt;. Edge/Chrome already support it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=_cr46G2K5Fo&amp;amp;t=1042s&#34;&gt;The Vitali Set&lt;/a&gt; is every real number none of whose difference is rational. A sparse collection of irrational sets. It&amp;rsquo;s like a line but doesn&amp;rsquo;t have a measurable &amp;ldquo;length&amp;rdquo;.
&lt;ul&gt;
&lt;li&gt;The Lebesgue measure measures the length of broken lines. You add up the lengths of the smallest continuous intervals that cover the line.&lt;/li&gt;
&lt;li&gt;The Cantor set (take a line, drop every middle third, repeat) has a Lebesgue measure of 0 because the sum of the removed thirds = 1/3 + 2/9 + 4/27 + &amp;hellip; = 1. You&amp;rsquo;ve removed every &amp;ldquo;length&amp;rdquo; though infinitely many points remain.&lt;/li&gt;
&lt;li&gt;The Vitali set built so that if you shift it by &lt;em&gt;every&lt;/em&gt; rational from -1 to +1 and add them up, you definitely cover every real from 0-1, but never anything beyond -1 to +2. So the length &lt;em&gt;must&lt;/em&gt; be between 1-3. Yet, there&amp;rsquo;s no number you can add infinitely many times to get something between 1-3.&lt;/li&gt;
&lt;li&gt;If you add up multiple unmeasurable sets like the Vitali set, you can get any total length you want. The &lt;a href=&#34;https://en.wikipedia.org/wiki/Banach%E2%80%93Tarski_paradox&#34;&gt;Banach Tarski paradox&lt;/a&gt; splits a sphere into unmeasurable sets and adds them to get 2 spheres.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://askubuntu.com/a/1293952/601330&#34;&gt;Ctrl+Alt+F1/F2/&amp;hellip;&lt;/a&gt; on Ubuntu switches the terminal. Typically &lt;a href=&#34;https://askubuntu.com/a/1307012/601330&#34;&gt;Ctrl+Alt+F2&lt;/a&gt; switches back to Gnome. But it&amp;rsquo;s a useful hack if Gnome freezes and you need to kill a process. Press &lt;code&gt;Ctrl+Alt+F3&lt;/code&gt;, log in, and kill what you need.&lt;/li&gt;
&lt;li&gt;Notes from &lt;a href=&#34;https://ai-2027.com/&#34;&gt;AI 2027&lt;/a&gt;. BTW, this is the most impactful piece I&amp;rsquo;ve read recently. It&amp;rsquo;s been on my mind continuously for 36 hours. A bit distubring, too.
&lt;ul&gt;
&lt;li&gt;2025: AI can act as autonomous agents, like &lt;a href=&#34;https://www.glean.com/&#34;&gt;Glean&lt;/a&gt;, &lt;a href=&#34;https://devin.ai/&#34;&gt;Devin&lt;/a&gt;, &lt;a href=&#34;https://openai.com/index/introducing-operator/&#34;&gt;Operator&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;turn bullet points into emails&lt;/li&gt;
&lt;li&gt;take instructions via Slack or Teams and make substantial code changes on their own&lt;/li&gt;
&lt;li&gt;spend half an hour scouring the Internet to answer your question&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2026:
&lt;ul&gt;
&lt;li&gt;automating AI R&amp;amp;D is the biggest enabler for AI Labs&lt;/li&gt;
&lt;li&gt;job market for junior software engineers is in turmoil&lt;/li&gt;
&lt;li&gt;people who know how to manage and quality-control teams of AIs are making a killing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2027:
&lt;ul&gt;
&lt;li&gt;potential demand for ~20,000 FTEs solving long-horizon tasks to train AI&lt;/li&gt;
&lt;li&gt;every researcher/coder becomes the manager of an AI team&lt;/li&gt;
&lt;li&gt;hiring new programmers has nearly stopped, but there’s never been a better time to be a consultant on integrating AI into your business&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.w3.org/TR/css-speech-1/&#34;&gt;CSS Speech&lt;/a&gt; is a W3C spec that lets you control how screen readers should read pages. No browser support now, though.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://euangoddard.github.io/clipboard2markdown/&#34;&gt;Clipboard2Markdown&lt;/a&gt; is a utility that lets you paste rich text and convert it to Markdown.&lt;/li&gt;
&lt;li&gt;ChatGPT can&amp;rsquo;t yet create good sketchnotes. Here&amp;rsquo;s the &lt;a href=&#34;https://freeimage.host/i/35IZkqG&#34;&gt;impact of US tariffs on India&lt;/a&gt;. &lt;a href=&#34;https://chatgpt.com/share/67ee16b8-e8e0-800c-a43e-63bf858f2a9c&#34;&gt;ChatGPT&lt;/a&gt; #IMPOSSIBLE&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ohdsi.org/&#34;&gt;OHDSI&lt;/a&gt; has a &lt;a href=&#34;https://github.com/OHDSI/Vocabulary-v5.0&#34;&gt;vocabulary&lt;/a&gt; you can download from &lt;a href=&#34;https://athena.ohdsi.org/&#34;&gt;Athena&lt;/a&gt; that includes ICD codes and a lot of medical data standards. It also has a hostable &lt;a href=&#34;https://github.com/OHDSI/WebAPI&#34;&gt;WebAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No open source LLM-based tool handles live transcription &lt;em&gt;and&lt;/em&gt; allows you to query notes so far &lt;em&gt;during&lt;/em&gt; the transcription. The closest seems to be &lt;a href=&#34;https://github.com/Zackriya-Solutions/meeting-minutes&#34;&gt;Meetily&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learnings on AI code editors via Deep Research from &lt;a href=&#34;https://chatgpt.com/share/67ecad81-6390-800c-81f6-61a65ebc5d3f&#34;&gt;ChatGPT&lt;/a&gt;, &lt;a href=&#34;https://g.co/gemini/share/02249fb0c53d&#34;&gt;Gemini&lt;/a&gt;, &lt;a href=&#34;https://x.com/i/grok/share/7BLsfId9mCZOZFiO7TkmDWdol&#34;&gt;Grok&lt;/a&gt;, &lt;a href=&#34;https://www.perplexity.ai/search/write-a-detailed-practical-act-OxUIlTlOQzGi0k_H7DYi3Q&#34;&gt;Perplexity&lt;/a&gt;: #ai-coding
&lt;ul&gt;
&lt;li&gt;GitHub Copilot can identify the source of a code snippet as a repo. That helps with copyright issues.&lt;/li&gt;
&lt;li&gt;Cursor uses a shadow workspace - a temporary sandbox where it edits files before applying changes at one shot.&lt;/li&gt;
&lt;li&gt;Cursor auto-complete has context of other files, i.e. inserting an class in a .js file based on another HTML file&amp;rsquo;s contents.&lt;/li&gt;
&lt;li&gt;Windsurf seems to be best for large code bases and for large-scale refactoring. It can also run test results fix them.&lt;/li&gt;
&lt;li&gt;Windsurf includes a browser and lets you click on an element and prompt to change its behavior, etc. That&amp;rsquo;s good for front-end developers.&lt;/li&gt;
&lt;li&gt;Roo Code can run scripts as part of the workflow, letting you run linting, tests, starting web apps, query databases, etc.&lt;/li&gt;
&lt;li&gt;Roo Code lets you create persona, e.g. code reviewer, data storytelling and analysis, etc. with access to different tools and behaviors.&lt;/li&gt;
&lt;li&gt;Roo Code does not support auto-complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s outrage around Cursor not taking responsibility for a rules file backdoor (&lt;a href=&#34;https://x.com/i/grok/share/P7fs71jI5kIKbQSEyxBM9LiLI&#34;&gt;via Grok Deep Research&lt;/a&gt;) and &lt;a href=&#34;https://www.reddit.com/r/cursor/comments/1jmitld/wtf_have_you_done/&#34;&gt;pricing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://zapier.com/mcp&#34;&gt;Zapier has an MCP server&lt;/a&gt;. That should make most integrations easier.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/astronomer/airflow-ai-sdk&#34;&gt;Airflow AI SDK&lt;/a&gt; is a clever idea. Airflow is a workflow system. Agents are a workflow system (sort of). This SDK exposes LLMs as Airflow tasks.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2503.15299v2&#34;&gt;Hidden Factual Knowledge in LLMs&lt;/a&gt; finds that the hidden states in LLMs contain much more knowledge than they share. (Sort of like sub-consciously knowing the answer.) Even after asking 1,000 times, the answer is not expressed. &lt;a href=&#34;https://chatgpt.com/share/67eb8cee-44f4-800c-9377-25066a5a8ef6&#34;&gt;ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2503.18866v1&#34;&gt;Reasoning to Learn from Latent Thoughts&lt;/a&gt; finds that the internal reasoning process of LLMs is useful to train other models.&lt;/li&gt;
&lt;li&gt;Notes from &lt;a href=&#34;https://youtu.be/D7BzTxVVMuw&#34;&gt;AI Engineering Summit, NY, Day 1&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;When deploying in production, you need reliable output with fundamentally unreliable components. Sort of like how the ENIAC worked with 17,000 vacuum tubes that would fail every few hours. This is a reliability engineering subject matter and needs to be thought of that way.&lt;/li&gt;
&lt;li&gt;Google
&lt;ul&gt;
&lt;li&gt;Follow up Deep Research queries are a natural way to extend knowledge beyond just a single report&lt;/li&gt;
&lt;li&gt;Deep research offloads less relevant parts of the context to a separate memory store for selective retrieval later.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t use agents if workflows can do the task.&lt;/li&gt;
&lt;li&gt;The reliability of each individual step of an agent is critical.&lt;/li&gt;
&lt;li&gt;Code, file access, search. These are the top three tools to use.&lt;/li&gt;
&lt;li&gt;Making agents budget aware can help deploy reliably in production.&lt;/li&gt;
&lt;li&gt;Having multiple agents like sub agents can help protect the main agents context window.&lt;/li&gt;
&lt;li&gt;Self evolving tools are a useful next step in the evolution of agents.&lt;/li&gt;
&lt;li&gt;Software development lifecycle is about how we iteratively improve consistently without getting worse. Almost like the scientific principle.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Morgan Stanley
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s easy to improve knowledge in a problem. It&amp;rsquo;s very hard to influence skin in a problem. Reinforcement learning from deepseek seems one of the most promising approaches that allow llms to learn skills&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I published an eBook on Amazon. It takes about an hour if you have the content ready.
&lt;ul&gt;
&lt;li&gt;&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 information. (10 min.)&lt;/li&gt;
&lt;li&gt;&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;. (15 min)&lt;/li&gt;
&lt;li&gt;Reformat the Markdown by writing a script in Cursor (10 min). Here&amp;rsquo;s the prompt:
&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;em&gt;Sun, 01 Jan 2000&lt;/em&gt; in a new para after the frontmatter and before the content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Convert it to an ePub using pandoc &lt;code&gt;pandoc *.md -o book.epub --toc --metadata title=&amp;quot;An LBS Exchange Program&amp;quot; --metadata author=&amp;quot;Anand S&amp;quot; --metadata language=en --metadata date=&amp;quot;31 Mar 2025&amp;quot;&lt;/code&gt; (15 min).&lt;/li&gt;
&lt;li&gt;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;. (10 min)
&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;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kdp.amazon.com/&#34;&gt;Publish the book on KDP&lt;/a&gt; (10 min)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;There are several &lt;em&gt;small&lt;/em&gt; things that delight me about switching to Ubuntu. One that brings joy to my heart is that I can customize gestures for music on Gnome using &lt;a href=&#34;https://github.com/JoseExposito/touche&#34;&gt;Touche&lt;/a&gt; and &lt;a href=&#34;https://github.com/JoseExposito/touchegg&#34;&gt;TouchEgg&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;Swipe with 3 fingers Up: Increase volume. Execute a command &lt;code&gt;amixer sset Master 5%+&lt;/code&gt;. Repeat command.&lt;/li&gt;
&lt;li&gt;Swipe with 3 fingers Down: Decrease volume. Execute a command &lt;code&gt;amixer sset Master 5%-&lt;/code&gt;. Repeat command.&lt;/li&gt;
&lt;li&gt;Swipe left/right with 3 fingers: Play/Pause VLC. &lt;code&gt;dbus-send --print-reply --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause&lt;/code&gt; on Gesture start.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Notes from discussion with &lt;a href=&#34;https://www.linkedin.com/in/anandamoy/&#34;&gt;Roy&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;There&amp;rsquo;s more pressure on successful founders in Asia than in the US, since winners are rarer.
&lt;ul&gt;
&lt;li&gt;Most failed founders try another startup based on their experience. Their likelihood of getting funded is largely based on their reputation, e.g. did the venture fail despite them or because of then.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Expertise is over-rated when the underlying context changes. A lot of expertise is about managing current constraints. As Jeff Bezos asks, &amp;ldquo;What are the invariants?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;As the cost of intelligence drops, industries that rely on intelligence are disrupted.
&lt;ul&gt;
&lt;li&gt;E.g. Cyber security. It&amp;rsquo;s a data analysis problem. A needle in the haystack problem. A signal anticipation problem. A classic IQ gap problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;As building software becomes easy:
&lt;ul&gt;
&lt;li&gt;Demand will explore, since ROI is higher.&lt;/li&gt;
&lt;li&gt;Not everyone will build software. (3D printers are cheap. How many people own one?)&lt;/li&gt;
&lt;li&gt;So demand for custom software and craftsmen engineers will grow - including from enterprises.&lt;/li&gt;
&lt;li&gt;Demand for SaaS (one-size-fits-all) will shrink.&lt;/li&gt;
&lt;li&gt;Demand for personalized software (services model) will grow.&lt;/li&gt;
&lt;li&gt;Code migration will get consolidated. It&amp;rsquo;s a niche space competing with new app generation. There is an opportunity for high margins in fragmented businesses. Consolidation is likely.&lt;/li&gt;
&lt;li&gt;Verticalized coding agents (i.e. specialized software for specific platforms) might grow.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;You don&amp;rsquo;t get the US without the guns!&amp;rdquo;&lt;/li&gt;
&lt;li&gt;AI voice generation is in the uncanny valley. We need non-verbal cues for good voice conversations.
&lt;ul&gt;
&lt;li&gt;An aside: Is the uncanny valley biological? Did the revulsion push homo hapiens to kill off the homo neanderthalensis, homo erectus, etc?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vertical model gardens (i.e. specialized HuggingFaces, e.g. for HealthCare) are a niche, potentially temporary, opportunity corporates will likely leverage in the near future.&lt;/li&gt;
&lt;li&gt;Thoughts on angel investing.
&lt;ul&gt;
&lt;li&gt;The VC industry is designed to win in the long run. Given a huge AuM base managed by a small team with a steady carry, it&amp;rsquo;s hard to lose in the long term&lt;/li&gt;
&lt;li&gt;But you need that large AuM. Angel investing is &lt;em&gt;not&lt;/em&gt; designed to win.&lt;/li&gt;
&lt;li&gt;Know why you want to angel-invest. Lack of clarity hurts most people&lt;/li&gt;
&lt;li&gt;For most people, angel investing is an expensive MBA. You don&amp;rsquo;t know shit. Invest if a VC will invest &lt;em&gt;at that moment&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The angel investor matters only until the point of investment. For successful companies, once VCs start funding them, you&amp;rsquo;re a drop in the ocean and irrelevant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pick portfolio managers who don&amp;rsquo;t advertise. The ones that do don&amp;rsquo;t have enough business. &lt;!-- Roy aims for 18% in India in sub 10K cr companies. --&gt;&lt;/li&gt;
&lt;li&gt;The Telok Blangah walking trail and the Sentosa walk are less known but good walking trails in Singapore.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&#34;https://www.qrcode-monkey.com/#vcard&#34;&gt;QR vCards&lt;/a&gt; instead of business cards. Less to carry. Directly adds to their contacts.&lt;/li&gt;
&lt;li&gt;LLM Native Multimodal image generation experiments:
&lt;ul&gt;
&lt;li&gt;Stickers
&lt;ul&gt;
&lt;li&gt;Sending your wife AI-generated family photos, stickers, etc. is now a thing. Both an AI use case and a &amp;hellip; um&amp;hellip; &amp;ldquo;family media&amp;rdquo; (?) use case. For example, ask ChatGPT to &amp;ldquo;Create a transparent comic-style sticker of a lady chef featuring this person happily cooking salad&amp;rdquo; with a photo. Then &lt;a href=&#34;https://faq.whatsapp.com/639351827594474&#34;&gt;send it as a custom sticker&lt;/a&gt;. &lt;a href=&#34;https://iili.io/3ASLUJ9.png&#34;&gt;Image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vadivelu stickers work well but the Tamil script generation is poor. &lt;a href=&#34;https://iili.io/3ASs9YF.png&#34;&gt;Image&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Asking ChatGPT to generate 25-year younger pictures of people produces pretty poor results if you really knew what they looked like then. If you didn&amp;rsquo;t, it&amp;rsquo;s fairly convincing. Yet another example of &amp;ldquo;hallucinations&amp;rdquo; - except, it does have its uses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 09 Mar 2025</title>
      <link>https://www.s-anand.net/blog/things-i-learned-09-mar-2025/</link>
      <pubDate>Sun, 09 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-09-mar-2025/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Jan 2025, ChatGPT included images as part of their data chat export. They also have a 30 second limit for the export. As an extensive user, my export is about 1GB which takes well over 30 seconds to download. &lt;a href=&#34;https://community.openai.com/t/chatgpt-data-export-too-big-feature-in-the-options/1080111&#34;&gt;Like many others&lt;/a&gt; the export option pretty much doesn&amp;rsquo;t work for me any more.&lt;/li&gt;
&lt;li&gt;Bharathi said மெல்லத் தமிழினிச் சாகும் in a poem that has been often quoted (and parodied). &lt;a href=&#34;https://www.tumblr.com/kuvikam/105265085187/%E0%AE%AA-%E0%AE%B0%E0%AE%A4-%E0%AE%9A-%E0%AE%A9-%E0%AE%A9-%E0%AE%B0-%E0%AE%AE-%E0%AE%B2-%E0%AE%B2%E0%AE%A4-%E0%AE%A4%E0%AE%AE-%E0%AE%B4-%E0%AE%A9-%E0%AE%9A-%E0%AE%9A-%E0%AE%95-%E0%AE%AE-%E0%AE%8E%E0%AE%A9-%E0%AE%B1&#34;&gt;Here&amp;rsquo;s the context&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://www.goodnotes.com/blog/zettelkasten-method&#34;&gt;Zettelkasten note-taking method&lt;/a&gt; proposes that you:
&lt;ul&gt;
&lt;li&gt;Capture: Write down every idea or piece of information on a separate note. Use your own words to ensure understanding.&lt;/li&gt;
&lt;li&gt;Organize: Consolidate fleeting notes into permanent ones. Assign unique identifiers to each note for easy reference.&lt;/li&gt;
&lt;li&gt;Connect: Link related notes to form a web of knowledge. This can be done with tags, references, or hyperlinks in digital systems.&lt;/li&gt;
&lt;li&gt;Review: Regularly revisit your notes to strengthen connections and discover new insights.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I agree with almost every point on this LinkedIn post on scoring candidates for AI roles. &lt;a href=&#34;https://www.linkedin.com/posts/robbalian_were-starting-to-use-a-points-system-when-activity-7303542581580156929-BrNG&#34;&gt;Rob Balian&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Uses DeepSeek R1 or Claude 3.7 +5 points&lt;/li&gt;
&lt;li&gt;Uses Langchain -5 points&lt;/li&gt;
&lt;li&gt;Uses Langgraph +5 points (I don&amp;rsquo;t know enough to comment)&lt;/li&gt;
&lt;li&gt;Built a RAG in 2023 +3 points&lt;/li&gt;
&lt;li&gt;Built a RAG in 2025 -3 points&lt;/li&gt;
&lt;li&gt;&amp;ldquo;pinecone&amp;rdquo; -5 points (I don&amp;rsquo;t know enough to comment)&lt;/li&gt;
&lt;li&gt;&amp;ldquo;What is cursor&amp;rdquo; - 50 points no coming back from this&lt;/li&gt;
&lt;li&gt;Uses Cursor composer +10 points&lt;/li&gt;
&lt;li&gt;&amp;ldquo;You don&amp;rsquo;t need a full agent for this&amp;rdquo; +5 points&lt;/li&gt;
&lt;li&gt;Did hackathons to learn AI outside of work +5 points&lt;/li&gt;
&lt;li&gt;&amp;ldquo;We probably need to fine tune for this&amp;rdquo; -3 points unless you can explain why&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Gemini is making a comeback&amp;rdquo; +3 points (I have a soft spot for Gemini)&lt;/li&gt;
&lt;li&gt;+3 points each for mentioning reasoning trace, structured outputs, MCP, chain-of-thought, prompt caching, TPM limits&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Export to prompt&amp;rdquo; can be a useful feature in apps (or even as a bookmarklet). It would let you export content in an LLM-friendly Markdown format. You can paste it into an LLM and ask questions. Here are things I would find useful:
&lt;ul&gt;
&lt;li&gt;Copy an entire issue (with history) from GitHub, Gitlab, or JIRA&lt;/li&gt;
&lt;li&gt;Copy an entire PR (with code changes) from GitHub, Gitlab, or Bitbucket&lt;/li&gt;
&lt;li&gt;Copy CI/CD logs from GitHub Actions, Gitlab CI, Azure DevOps, etc.&lt;/li&gt;
&lt;li&gt;Copy entire conversation thread in Gmail or Discourse, Service now etc.&lt;/li&gt;
&lt;li&gt;Copy product reviews from Amazon, Shopify, etc.&lt;/li&gt;
&lt;li&gt;Copy page(s) from wikis and content sites like Wikipedia, StackOverflow, etc.&lt;/li&gt;
&lt;li&gt;Copy survey responses from Google Forms, Typeform, etc.&lt;/li&gt;
&lt;li&gt;Copy all interactions with a contact (including interactions, proposal history) from HubSpot or Salesforce&lt;/li&gt;
&lt;li&gt;Copy transcripts from Zoom, Teams, Google Meet, etc.&lt;/li&gt;
&lt;li&gt;Copy as Markdown from Word, GDocs, PDF or HTML&lt;/li&gt;
&lt;li&gt;Copy the summary of an analysis as well as all key metrics from any dashboard&lt;/li&gt;
&lt;li&gt;Copy SAP invoices&lt;/li&gt;
&lt;li&gt;Copy JDs, CVs, and reviews from Workday, BambooHR, DarwinBox, etc.&lt;/li&gt;
&lt;li&gt;Copy design specs, component libraries, and style guides from Figma, Miro, etc.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chatgpt.com/share/67b25a21-4164-800c-bf1b-ef218007fOa9&#34;&gt;Generated with the help of ChatGPT&lt;/a&gt; &amp;ndash; link not working&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ancient languages tend to have fewer words for hues than brightness, since they didn&amp;rsquo;t need them. So &amp;ldquo;Krishna was blue&amp;rdquo; or &amp;ldquo;the sea is wine-dark&amp;rdquo; is more an indication of darkness than shade of color. &lt;a href=&#34;https://www.quora.com/Why-is-Krishnas-complexion-depicted-as-blue-when-he-is-actually-black/answer/Ajit-Narayanan-1&#34;&gt;Ajit Narayanan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Mistral released an &lt;a href=&#34;https://mistral.ai/fr/news/mistral-ocr&#34;&gt;impressive OCR model&lt;/a&gt;.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/VikParuchuri/marker&#34;&gt;Marker&lt;/a&gt; from &lt;a href=&#34;https://www.datalab.to/&#34;&gt;DataLab&lt;/a&gt; seems &lt;a href=&#34;https://news.ycombinator.com/item?id=43285912&#34;&gt;comparable&lt;/a&gt; but is CC-BY-NC-SA.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/opendatalab/MinerU&#34;&gt;MinerU&lt;/a&gt; convert &lt;a href=&#34;https://news.ycombinator.com/item?id=43284248&#34;&gt;medical textbooks to Markdown&lt;/a&gt; well.&lt;/li&gt;
&lt;li&gt;Gemini Flash may be more &lt;a href=&#34;https://news.ycombinator.com/item?id=43283942&#34;&gt;cost effective&lt;/a&gt; and &lt;a href=&#34;https://news.ycombinator.com/item?id=43287278&#34;&gt;better&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;From &lt;a href=&#34;https://youtu.be/H1ztOoADp7M&#34;&gt;How I Write with Tyler Cowen&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Keep researching. Use LLMs as an altemative to books and other reading material. Keep publishing what you learn regularly.&lt;/li&gt;
&lt;li&gt;While reading a chapter, keep asking the LLM. What did you think of that? What just happened there? What should I focus more on? What&amp;rsquo;s puzzling about this? How do I connect this to something else later or earlier in the book?&lt;/li&gt;
&lt;li&gt;LLM is better used to support you rather than replace you in areas of your expertise. Where you are an expert it&amp;rsquo;s best for you to be yourself and have AI fill in the gaps.&lt;/li&gt;
&lt;li&gt;Ask the AI: &amp;ldquo;What is in my writing that some people might find obnoxious? Or cold / heartless? Explain it to me in great detail.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;The first input is context setting and should be really long. Use voice dictation for that instead of typing.&lt;/li&gt;
&lt;li&gt;Send your blog post to an LLM. No need to explain it. Just let it be the reader and see what it understands and doesn&amp;rsquo;t understand.&lt;/li&gt;
&lt;li&gt;His PhD students don&amp;rsquo;t have a textbook, which saves them some money. But they are required to subscribe to a large language model which ends up costing less.&lt;/li&gt;
&lt;li&gt;Today, it makes sense to use the best models and pay $200 for it if required. The differences are large. But in some years in the future, the cost of these models may come down for the free versions.&lt;/li&gt;
&lt;li&gt;Humans know secrets. AI does not. So at least in some areas, humans will have an advantage.&lt;/li&gt;
&lt;li&gt;Secrets full matter a lot more in the future. Gossip will matter a lot more. How good are you at keeping and trading secret? Travelling and meeting people will become more important. So will the value of social networks.&lt;/li&gt;
&lt;li&gt;Since everyone has access to better intelligence, the value of mobilization or being able to &lt;em&gt;do&lt;/em&gt; things with people will have higher value. Leadership is an example. The value of your network therefore has gone up a lot.&lt;/li&gt;
&lt;li&gt;There&amp;rsquo;s more value in prompting one thing 10 times then 10 things one time. Follow up questions work better than long prompts.&lt;/li&gt;
&lt;li&gt;There are so many AI note-takers (and transcribers) these days that you are not just writing for an AI but speaking for AIs as well!&lt;/li&gt;
&lt;li&gt;Which model to use:
&lt;ul&gt;
&lt;li&gt;O1 Pro is the best model. Claude does a decent job. DeepSeek is full of hallucinations but is interesting. It is more imaginative.&lt;/li&gt;
&lt;li&gt;Use O3 mini to write your prompt first, and &lt;em&gt;then&lt;/em&gt; ask the model&lt;/li&gt;
&lt;li&gt;Use DeepSeek and other somewhat wacky high-end models once a day so that you stay in touch with what is models are capable of (beyond the conventional.)&lt;/li&gt;
&lt;li&gt;Perplexity has entirely replaced Google for many people.&lt;/li&gt;
&lt;li&gt;Anthropic&amp;rsquo;s models are the best writers.&lt;/li&gt;
&lt;li&gt;Gemini is good for long documents and hence for things like legal work. Gemini also has excellent YouTube integration and hands can directly read the transcripts.&lt;/li&gt;
&lt;li&gt;Grok is very good at fact checking tweets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Converting data into LLM consumable forms will be a huge project. Lot of a knowledge is not in such a form and a huge human project will involve this conversion.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Indians do not need a visa to enter Thailand. &lt;a href=&#34;https://www.thaievisa.go.th/&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Build apps (not just content) for agents. In the next 3 to 5 years, agents will surpass humans as the top product users.&lt;/li&gt;
&lt;li&gt;Reliably creating interactive tutorials is hard today. Claude 3.7 Sonnet ran out of tokens when I tried creating an interactive tutorial on diffraction. Cursor got the tokens but failed to get the application right after 3 attempts. This is not yet reliable, and when it does become reliable, education will change a fair bit. #IMPOSSIBLE&lt;/li&gt;
&lt;li&gt;Tools and solutions should fit within existing workflows. That means almost all capabilities need to be exposed as APIs.&lt;/li&gt;
&lt;li&gt;LLMs make many different kinds of errors that are useful to differentiate between. Here are a few
&lt;ul&gt;
&lt;li&gt;Model errors. The model itself makes a mistake. E.g. hallucinations, not following the prompt, etc.&lt;/li&gt;
&lt;li&gt;Context errors. The model makes a mistake because the question was out of context, or the context was missing.&lt;/li&gt;
&lt;li&gt;Input errors. The input to the model was parsed incorrectly, e.g. poor audio, poor image OCR, etc.&lt;/li&gt;
&lt;li&gt;Tool errors. The model&amp;rsquo;s tools are wrong or not good enough, e.g. Retrieval errors.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Most browsers are moving away from third-party cookies. Here&amp;rsquo;s &lt;a href=&#34;https://developers.google.com/privacy-sandbox/cookies&#34;&gt;Google&amp;rsquo;s recommendation on alternatives&lt;/a&gt;. The simplest of these is &lt;a href=&#34;https://developers.google.com/privacy-sandbox/cookies/chips&#34;&gt;CHIPS&lt;/a&gt;, which requires adding a &lt;code&gt;Partitioned&lt;/code&gt; cookie attribute.&lt;/li&gt;
&lt;li&gt;Notes from &lt;a href=&#34;https://youtu.be/L89GzWEILkM&#34;&gt;AI Engineering Summit, NY, Day 1&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;An agent requires 3 things: a router, tools or skills, and memory.&lt;/li&gt;
&lt;li&gt;Agents are often sequential, but sometimes parallel execution makes sense for independent tasks that you consolidate.&lt;/li&gt;
&lt;li&gt;Always allow LLMs the option of NOT answering a question if there is no good answer.&lt;/li&gt;
&lt;li&gt;Focus prompts on the happy path. Use guard rails for edge cases.&lt;/li&gt;
&lt;li&gt;Here are a few &amp;ldquo;tools&amp;rdquo; an agent would need to call:
&lt;ul&gt;
&lt;li&gt;Clarification from user&lt;/li&gt;
&lt;li&gt;Saving to memory&lt;/li&gt;
&lt;li&gt;Google search&lt;/li&gt;
&lt;li&gt;Edit a file introducing SPECIFIC changes&lt;/li&gt;
&lt;li&gt;Search in codebase using embeddings&lt;/li&gt;
&lt;li&gt;Run scripts on the shell or in a REPL (Python, Node, etc.)&lt;/li&gt;
&lt;li&gt;Run code in a new container for isolation&lt;/li&gt;
&lt;li&gt;Automatically discover, read an API documentation and use it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Modify environment to enable logging and other system changes.&lt;/li&gt;
&lt;li&gt;When code is cheap, you can explore more ideas and hence design and product management need to approach things differently. We also need to reaching testing completely because it makes very different kinds of mistakes and we don&amp;rsquo;t often have an intuition&lt;/li&gt;
&lt;li&gt;You can have an agent explore all the issues and full request and recent comments against the repository and summarise it for the project manager&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Notes from AI Engineering Summit, NY. Session by Lux Capital.
&lt;ul&gt;
&lt;li&gt;Agents make multiple LLM calls. Errors accumulate. So the quality of the model is key&lt;/li&gt;
&lt;li&gt;What&amp;rsquo;s really critical: data + context + user preference&lt;/li&gt;
&lt;li&gt;Set up evals for subjective responses by collecting signals continuously.&lt;/li&gt;
&lt;li&gt;Create scaffolding for agents where errors don&amp;rsquo;t accumulate. Better yet, make it FIX errors&lt;/li&gt;
&lt;li&gt;UX is critical. We need lots more UX styles&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://yaytext.com/&#34;&gt;YayText&lt;/a&gt; converts text to Unicode that has strikethrough, bold, italics, alternate fonts, and other interesting features. So does
&lt;a href=&#34;https://unitextify.com/&#34;&gt;Unitextify&lt;/a&gt;,
&lt;a href=&#34;https://convertcase.net/unicode-text-converter/&#34;&gt;ConvertCase&lt;/a&gt;, and
&lt;a href=&#34;https://lingojam.com/BoldTextGenerator&#34;&gt;LingoJam&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/jnpayne_10-red-flags-i-look-for-as-an-angel-investor-activity-7298357529967771649-IqdO&#34;&gt;10 red flags I look for as an angel investor&lt;/a&gt; is an interesting read.
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No real customers&lt;/strong&gt;: A deck, a landing page, and a &amp;ldquo;vision&amp;rdquo; don’t impress me. Show me paying customers. Even better, show me customers coming back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No path to profitability&lt;/strong&gt;: I don’t care if you raise $100M &amp;ndash; if there’s no plan to make money, you’re just burning oxygen. Growth is great, but cash flow keeps you alive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Founders who won’t sell&lt;/strong&gt;: If you’re scared to get on sales calls, that’s a red flag. The best founders sell in the early days &amp;ndash; whether it’s to customers, employees, or investors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No differentiation&lt;/strong&gt;: &amp;ldquo;Like X, but cheaper&amp;rdquo; isn’t a strategy. If your only edge is price, you’ll get crushed. What do you have that no one else does?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No urgency&lt;/strong&gt;: The best founders operate like time is running out. If you’re &amp;ldquo;exploring ideas&amp;rdquo; or &amp;ldquo;thinking about raising next year,&amp;rdquo; you’ve already lost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Raising money before proving anything&lt;/strong&gt;: Too many founders try to fundraise their way out of bad ideas. If you need VC to get off the ground, you’re building the wrong business.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No clear distribution strategy&lt;/strong&gt;: Product alone doesn’t win. First-time founders obsess over features. Second-time founders obsess over distribution. How are you getting customers?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No ownership mentality&lt;/strong&gt;: If I hear &amp;ldquo;I need to hire someone to do that&amp;rdquo; too early, I’m out. Founders who win figure things out before they delegate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A CEO who can’t attract talent&lt;/strong&gt;: Your first hires are everything. If great people aren’t willing to join, either the vision is weak &amp;ndash; or you are.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No skin in the game&lt;/strong&gt;: If a founder won’t invest their own money or take a pay cut to make it work, why should I?&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;By contrast, this &lt;a href=&#34;https://chatgpt.com/share/67c3e38c-e514-800c-8cfc-983bd4fdeb21&#34;&gt;OpenAI Deep Research report&lt;/a&gt; feels a lot less actionable.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.inceptionlabs.ai/&#34;&gt;Inception Labs&lt;/a&gt; offers &amp;ldquo;Diffusion LLMs&amp;rdquo;. (No API yet.) They start with random text and refine it in parallel. The benefit is:
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s faster and cheaper due to parallellalization and better GPU use&lt;/li&gt;
&lt;li&gt;It doesn&amp;rsquo;t commit to tokens and can fix hallucinations, JSON structure errors, reasoning fallacies, etc.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s better with multi-modal since images are diffusion based already.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Launching an app only with LLMs and failing</title>
      <link>https://www.s-anand.net/blog/launching-an-app-only-with-llms-and-failing/</link>
      <pubDate>Tue, 07 Jan 2025 04:00:09 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/launching-an-app-only-with-llms-and-failing/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Launching an app only with LLMs and failing&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/DALL%C2%B7E-2025-01-07-11.57.24-A-colorful-single-panel-16x9-comic-strip-in-the-style-of-classic-Calvin-Hobbes.-Calvin-a-young-boy-with-wild-hair-sits-in-a-DIY-spaceship-made-out.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://zohaib.me/using-llms-and-cursor-for-finishing-projects-productivity/&#34;&gt;Zohaib Rauf&lt;/a&gt; suggested using LLMs to spec code and using &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt; to build it. (via &lt;a href=&#34;https://simonwillison.net/2025/Jan/4/llms-and-cursor/&#34;&gt;Simon Willison&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I tried it. It&amp;rsquo;s promising, but my first attempt failed.&lt;/p&gt;
&lt;h3 id=&#34;i-couldnt-generate-a-specmd-using-llms&#34;&gt;I couldn&amp;rsquo;t generate a &lt;code&gt;SPEC.md&lt;/code&gt; using LLMs&lt;/h3&gt;
&lt;p&gt;At first, I started writing what I wanted.&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-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;This application identifies the drugs, diseases, and symptoms, as well as the emotions from an audio recording of a patient call in a clinical trial.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;… and then went on to define the &lt;strong&gt;EXACT&lt;/strong&gt; code structure I wanted. So I spent 20 minutes spec-ing &lt;a href=&#34;https://www.s-anand.net/notes/#/gpts?id=gramener-demos&#34;&gt;our application structure&lt;/a&gt; and 20 minutes spec-ing our internal &lt;a href=&#34;https://www.s-anand.net/notes/#/gpts?id=llm-foundry&#34;&gt;LLM Foundry APIs&lt;/a&gt; and 40 minutes detailing &lt;strong&gt;every step&lt;/strong&gt; of how I wanted the app to look and interact.&lt;/p&gt;
&lt;p&gt;After 90 minutes, I realized that I&amp;rsquo;m too controlling or too inexperienced in LLM-speccing. But I had a solid &lt;a href=&#34;https://github.com/gramener/patientpulse/blob/689d7870cd71e47b07d330d4fddec86e561e0798/SPEC.md&#34;&gt;&lt;code&gt;SPEC.md&lt;/code&gt;&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-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# Patient Pulse
&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;The application identifies the drugs, diseases, and symptoms, as well as the emotions from an audio recording of a patient call in a clinical trial.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;gu&#34;&gt;## How the application works
&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;The application is a [&lt;span class=&#34;nt&#34;&gt;Gramener Demo&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;#gramener-demos&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&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;`script.js`&lt;/span&gt; implements this logic:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;k&#34;&gt;-&lt;/span&gt; Reads &lt;span class=&#34;sb&#34;&gt;`config.json`&lt;/span&gt; to get the list of transcripts and renders them, allowing users to select a transcript
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; When the user selects a transcript, it reads the audio and prosody files
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Once it reads these files, it makes a request to GPT-4o-mini via [&lt;span class=&#34;nt&#34;&gt;LLM Foundry API&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;#llm-foundry&lt;/span&gt;) with the system prompt:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&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;sb&#34;&gt;`markdown
&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;sb&#34;&gt;You are a clinical trial expert. Read this call transcript. Identify all drugs, diseases, and symptoms mentioned. Return a JSON that mentions each along with the line in the call transcript they occur in. Example:
&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;sb&#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;sb&#34;&gt;`&lt;/span&gt;`&lt;span class=&#34;sb&#34;&gt;`json
&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;sb&#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;sb&#34;&gt;  &amp;#34;symptoms&amp;#34;: [
&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [1, 4] }, // first symptom is mentioned in lines 1, 4
&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [8] } // second symptom is mentioned in line 8
&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;sb&#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;sb&#34;&gt;  &amp;#34;drugs&amp;#34;: [
&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [6] } // first drug is mentioned in line 6
&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;sb&#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;sb&#34;&gt;  &amp;#34;emotions&amp;#34;: [
&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;sb&#34;&gt;    { &amp;#34;name&amp;#34;: &amp;#34;...&amp;#34;, &amp;#34;lines&amp;#34;: [9] } // first emotion is mentioned in line 9
&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;sb&#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;sb&#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;sb&#34;&gt;`&lt;/span&gt;`&lt;span class=&#34;sb&#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;sb&#34;&gt;`&lt;/span&gt;```
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;It then renders a UI (via lit-html) that

- Plays the audio
- Maps the emotions in `${filename}.prosody.csv` to the 8 basic emotions on Robert Plutchik&amp;#39;s theory of emotions. See [How to map emotions](#how-to-map-emotions)
- Displays [wheel.png](wheel.png), which is a 1080x1080px image of Plutchik&amp;#39;s wheel of emotions
- As the audio plays, it
  - displays text up to the currently playing `Text` from `${filename}.prosody.csv`, highlighting the current sentence.
  - displays the emotions as a semi-transparent radar chart on the wheel of emotions
- It allows pausing and resuming the audio.
- It allows users to drag the audio slider to jump to any point in the audio. The transcript and the wheel of emotions are updated to reflect the new position in the audio.

... (and it goes on for 500+ lines.)
```

I did use [O1](https://openai.com/o1/) to help with the spec. Specifically:

- **How to name it.** I asked for short demo names and chose &amp;#34;Patient Pulse&amp;#34;.
- **How to arrange emotions.** I asked how to arrange 53 emotions in a circle so similar ones were next to each other.

**My takeaway**: Writing a `SPEC.md` can help, especially if you plan to re-use parts of it. But the spec kept evolving as I built the app, because I often don’t know what I want until I see it. Maybe an “agile” approach would work better for me.

### Cursor messed up the code

I prompted Cursor to `Generate an application based on this spec. @SPEC.md`. Here&amp;#39;s the code it generated.

```javascript
import { render, html } from &amp;#34;https://cdn.jsdelivr.net/npm/lit-html@3/+esm&amp;#34;;
import * as d3 from &amp;#34;https://cdn.jsdelivr.net/npm/d3@7/+esm&amp;#34;;

// Map of Hume emotions to Plutchik&amp;#39;s 8 basic emotions
const EMOTION_MAP = {
  Admiration: [&amp;#34;Joy&amp;#34;, &amp;#34;Trust&amp;#34;],
  Adoration: [&amp;#34;Joy&amp;#34;, &amp;#34;Trust&amp;#34;],
  &amp;#34;Aesthetic Appreciation&amp;#34;: [&amp;#34;Joy&amp;#34;],
  // ... (truncated for brevity - use mapping from spec)
};

// ... skipping lots of code ...

/**
 * Main application component
 * @returns {TemplateResult} Main application UI
 */
const App = async () =&amp;gt; {
  const config = await fetch(&amp;#34;config.json&amp;#34;).then((r) =&amp;gt; r.json());
  const [selectedTranscript, setSelectedTranscript] = useState(null);
  const [audioPlayer, setAudioPlayer] = useState(null);
  const [currentTime, setCurrentTime] = useState(0);
  const [prosodyData, setProsodyData] = useState([]);
  const [analysisResults, setAnalysisResults] = useState(null);

  const loadTranscript = async (transcript) =&amp;gt; {
    setSelectedTranscript(transcript);

  // ... skipping lots of code
};

// Initialize app
render(App(), document.getElementById(&amp;#34;app&amp;#34;));
```

This code was a mess. I had told it to use `lit-html`, which doesn’t have `useState`. That’s a React feature, so nothing worked right.

I ended up building the app from scratch. It took four hours and many changes from the original spec, though having a spec did help a bit.

**My learning**: Cursor and I still can’t build a mid-sized app in one go. I’m in the &amp;#34;scaffold and refine&amp;#34; phase.
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Things I Learned - 27 Oct 2024</title>
      <link>https://www.s-anand.net/blog/things-i-learned-27-oct-2024/</link>
      <pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-27-oct-2024/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://lancedb.github.io/lancedb/&#34;&gt;LanceDB&lt;/a&gt; is a more scalable alternative to ChromaDB. Written in Rust. Does not require a separate HSNW library.&lt;/li&gt;
&lt;li&gt;Meta has a bunch of image embedding models:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/roboflow/notebooks/blob/main/notebooks/dinov2-image-retrieval.ipynb&#34;&gt;DINOv2&lt;/a&gt; creates image embeddings (Apr 2023)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://research.facebook.com/publications/imagebind-one-embedding-space-to-bind-them-all/&#34;&gt;ImageBind&lt;/a&gt; is an embedding model for text, images, audio, and more (Jun 2023)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gemini has a &lt;a href=&#34;https://ai.google.dev/gemini-api/docs/code-execution&#34;&gt;code execution API&lt;/a&gt;!&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://0x0.st/&#34;&gt;0x0.st&lt;/a&gt; is an open API-based file upload + URL shortening service. You can dump files there temporarily.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://novnc.com/info.html&#34;&gt;noVNC&lt;/a&gt; is a JavaScript VNC client. You can control a remote (virtual) machine from your browser.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.wired.com/story/friend-ai-pendant/&#34;&gt;Friend&lt;/a&gt; is an always recording pendant that you can ask questions to.&lt;/li&gt;
&lt;li&gt;Anthropic&amp;rsquo;s new Sonnet model is even better at code. Plus it has the ability to extract coordinates from images. &lt;a href=&#34;https://www.anthropic.com/news/3-5-models-and-computer-use&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gemini sort-of supports diarization. &lt;a href=&#34;https://cloud.google.com/vertex-ai/generative-ai/docs/prompt-gallery/samples/classify_audio_diarization&#34;&gt;Ref&lt;/a&gt;. I tried it and it&amp;rsquo;s OK but not perfect.
&lt;ul&gt;
&lt;li&gt;#IMPOSSIBLE LLMs cannot diarize reliably yet. (Gemini just guesses the speaker differences.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Replit is good for hobbyists, Cursor for developers, and Pythagora &amp;amp; Bolt for non-developers building business apps. &lt;a href=&#34;https://youtu.be/8fEdaXwdDl8&#34;&gt;Ref&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Leaning into the power of AI coding</title>
      <link>https://www.s-anand.net/blog/leaning-into-the-power-of-ai-coding/</link>
      <pubDate>Wed, 16 Oct 2024 03:55:59 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/leaning-into-the-power-of-ai-coding/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Leaning into the power of AI coding&#34; loading=&#34;lazy&#34; src=&#34;https://www.s-anand.net/blog/assets/DALL%C2%B7E-2024-10-16-11.52.50-A-colorful-single-panel-comic-strip-in-the-style-of-classic-Calvin-Hobbes.-Calvin-a-young-boy-with-wild-hair-is-wobbling-precariously-on-a-bike-as.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;Yesterday (15 Oct 2024), I used &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt; to code more than I ever have. (Doing&#39;s how we learn, I guess. Not just reading.)&lt;/p&gt;
&lt;svg overflow=&#34;hidden&#34; viewbox=&#34;0 0 1697 1288&#34; width=&#34;500&#34; xml:space=&#34;preserve&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path d=&#34;M32 18h1621v107H32z&#34; fill=&#34;#C0E6F5&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M521 130h92v82h-92zM521 232h163v82H521zM521 334h526v82H521zM521 437h97v81h-97zM521 539h5v81h-5zM521 641h255v81H521zM521 743h143v81H521zM521 845h342v81H521zM521 946h92v82h-92zM521 1049h169v81H521zM521 1151h1122v81H521z&#34; fill=&#34;#FFB628&#34;&gt;&lt;/path&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;700&#34; transform=&#34;translate(47.4 96)&#34;&gt;Date&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;700&#34; transform=&#34;translate(526.35 96)&#34;&gt;Usage&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 198)&#34;&gt;05&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 198)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 198)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 198)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 198)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 198)&#34;&gt;15&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 300)&#34;&gt;06&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 300)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 300)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 300)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 300)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 300)&#34;&gt;27&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 402)&#34;&gt;07&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.5 402)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.32 402)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.38 402)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.44 402)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 402)&#34;&gt;87&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 504)&#34;&gt;08&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 504)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 504)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 504)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 504)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 504)&#34;&gt;16&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 606)&#34;&gt;09&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 606)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 606)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 606)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 606)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 708)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 708)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 708)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 708)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 708)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 708)&#34;&gt;42&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 810)&#34;&gt;11&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 810)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 810)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 810)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 810)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 810)&#34;&gt;24&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 912)&#34;&gt;12&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 912)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 912)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 912)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 912)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 912)&#34;&gt;57&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 1014)&#34;&gt;13&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 1014)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 1014)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 1014)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 1014)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 1014)&#34;&gt;15&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 1117)&#34;&gt;14&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 1117)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 1117)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 1117)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 1117)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1566.77 1117)&#34;&gt;28&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(47.4 1219)&#34;&gt;15&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(126.46 1219)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(145.27 1219)&#34;&gt;10&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(224.34 1219)&#34;&gt;-&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(248.4 1219)&#34;&gt;2024&lt;/text&gt;&lt;text font-family=&#34;Aptos Narrow,Aptos Narrow_MSFontService,sans-serif&#34; font-size=&#34;78&#34; font-stretch=&#34;semi-condensed&#34; font-weight=&#34;400&#34; transform=&#34;translate(1530.68 1219)&#34;&gt;186&lt;/text&gt;&lt;path d=&#34;M511 18h5v1h-5z&#34; fill=&#34;#E0E0E0&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M32.5 120.5h1621&#34; fill=&#34;none&#34;&gt;&lt;/path&gt;&lt;path d=&#34;M32 120h1621v5H32z&#34; fill=&#34;#44B3E1&#34;&gt;&lt;/path&gt;&lt;/svg&gt;
&lt;p&gt;This was mainly to create and publish 2 libraries on npm over 6 hours:&lt;/p&gt;
&lt;ol class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/asyncsse&#34;&gt;asyncsse&lt;/a&gt; - which converts a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events&#34;&gt;Server-Sent Event&lt;/a&gt; stream into an async iterator that I can use in a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of&#34;&gt;for await ... of&lt;/a&gt; loop&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/asyncllm&#34;&gt;asyncllm&lt;/a&gt; - which standardizes the Server-Sent Events streamed by the popular LLMs into an easy to use form.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This exercise broke several mental barriers for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Writing in a new language&lt;/strong&gt;. &lt;a href=&#34;https://deno.com/blog/v2.0&#34;&gt;Deno 2.0&lt;/a&gt; was released recently. I was impressed by the compatibility with npm packages. Plus, it&#39;s a single EXE download that includes a linter, tester, formatter, etc. Like all recent cool fast tools, it&#39;s written in Rust. So I decided to use it for testing. Running &lt;code&gt;deno test&lt;/code&gt; runs the &lt;a href=&#34;https://github.com/gramener/asyncsse/blob/main/test.js&#34;&gt;entire test suite&lt;/a&gt;. My prompts included asking it to:&lt;/p&gt;
&lt;ul class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;code&gt;Create a Deno HTTP server to mock requests for the tests&lt;/code&gt;. This is cool because a single, simple code chunk runs the server within the test suite.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Serve static files from samples/&lt;/code&gt; to move my tests into files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Writing test cases&lt;/strong&gt;. Every line of this code was written by Cursor via Claude 3.5 Sonnet. &lt;em&gt;Every line&lt;/em&gt;. My prompt was, &lt;code&gt;Look at the code in @index.js and write test cases for scenarios not yet covered.&lt;/code&gt; It&#39;s surprising how much of the SSE spec it already knew, and anticipated edge cases like:&lt;/p&gt;
&lt;ul class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L67-L69&#34;&gt;SSE values might have a colon&lt;/a&gt;. I learnt for the first time that the &lt;code&gt;limit&lt;/code&gt; parameter in &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split&#34;&gt;String.split()&lt;/a&gt; is very different from Python&#39;s str.split. (The splits, then picks the first few, ignoring the rest. Python ensures the rest is packed into the last split.) This helped me find a major bug.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L52-L54&#34;&gt;SSE has comments&lt;/a&gt;. Empty keys are treated as strings. Didn&#39;t know this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was able to use it to generate test cases based on content as well. &lt;code&gt;Based on @index.js and @&lt;a href=&#34;https://github.com/gramener/asyncllm/blob/main/samples/openai.txt&#34;&gt;openai.txt&lt;/a&gt; write a test case that verifies the functionality&lt;/code&gt;  created the entire &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/cbde11155f3a8567794058d01da1bd8d72f996b7/test.js#L25-L34&#34;&gt;test case for OpenAI responses&lt;/a&gt;. (I did have to edit it because LLMs don&#39;t count very well, but it was minimal.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bridging test coverage gaps&lt;/strong&gt;. The prompt that gave me the most delightful result was &lt;code&gt;Are there any scenarios in @index.js not tested by @test.js?&lt;/code&gt; It did a great job of highlighting that I hadn&#39;t covered Groq, Azure, or CloudFlare AI workers (though they were mentioned in the comments), error handling, empty/null values in some cases, tested for multiple tool calls. I had it generate mock test data for some of these and added the tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enhancing knowledge with references&lt;/strong&gt;. I passed Cursor the SSE documentation via &lt;code&gt;@https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events&lt;/code&gt; and asked it to find more scenarios my code at &lt;code&gt;@index.js&lt;/code&gt; had not covered. This found a number of new issues.&lt;/p&gt;
&lt;ul class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L79-L82&#34;&gt;SSE values can be split across multiple lines&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L75-L78&#34;&gt;Fields without values are valid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/13b33140f6bc17618789b5075a96f8f85a84c605/test.js#L71-L73&#34;&gt;Empty lines should be ignored&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Generating bindings&lt;/strong&gt;. I avoid TypeScript because I don&#39;t know it. Plus, it requires an compilation step for the browser. But TypeScript bindings are helpful. So I prompted Cursor, using the Composer (which can create new files) to &lt;code&gt;Create TypeScript bindings for @index.js in index.d.ts&lt;/code&gt; - which id did almost perfectly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Check for errors&lt;/strong&gt;. I typed &lt;code&gt;Check this file for errors&lt;/code&gt; on @&lt;a href=&#34;https://github.com/gramener/asyncsse/blob/main/index.d.ts&#34;&gt;index.d.ts&lt;/a&gt;. I don&#39;t know enough to figure this out. It went through the description and said everything seems fine. But I saw a TypeScript plugin error that said, &lt;code&gt;Property &#39;data&#39; of type &#39;string | undefined&#39; is not assignable to &#39;string&#39; index type &#39;string&#39;.ts(2411)&lt;/code&gt;. When prompted, it spotted the issue. (The earlier code assumed all properties are strings. But some can be undefined too. It fixed it.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;. At first, I asked the Composer to &lt;code&gt;Create a README.md suitable for a world-class professional open source npm package&lt;/code&gt; and it did a &lt;a href=&#34;https://github.com/gramener/asyncsse/blob/main/README.md&#34;&gt;pretty good job&lt;/a&gt;. I just needed to update the repository name. I further prompted it to &lt;code&gt;Modify README based on @index.js and share examples from @test.js&lt;/code&gt; on &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/main/README.md&#34;&gt;asyncllm&lt;/a&gt;, which did an excellent job.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code review&lt;/strong&gt;. I asked it to &lt;code&gt;Review this code. Suggest possible improvements for simplicity, future-proofing, robustness, and efficiency&lt;/code&gt; and it shared a few very effective improvements.&lt;/p&gt;
&lt;ol class=&#34;wp-block-list&#34;&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookahead_assertion&#34;&gt;Regex lookaheads&lt;/a&gt; for efficient regular expression splitting, i.e. use &lt;code&gt;buffer.split(/(?=\r?\n\r?\n)/)&lt;/code&gt; instead of &lt;code&gt;buffer.split(/(\r?\n\r?\n)/)&lt;/code&gt; -- and though I haven&#39;t tested this, it looked cool.&lt;/li&gt;
&lt;li&gt;Restructuring complex if-else code into &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/cbde11155f3a8567794058d01da1bd8d72f996b7/index.js#L64-L84&#34;&gt;elegant parsers&lt;/a&gt; that made my code a lot more modular.&lt;/li&gt;
&lt;li&gt;Error handling. It added &lt;code&gt;try {} catch {}&lt;/code&gt; blocks at a few places that helped catch errors that I don&#39;t anticipate but don&#39;t hurt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Code simplification&lt;/strong&gt;. Several times, I passed it a code snippet, saying just &lt;code&gt;Simplify&lt;/code&gt;. Here&#39;s an example:&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;events&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&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;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;asyncLLM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(...))&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;nx&#34;&gt;events&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&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;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This can be simplified to&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-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;events&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fromAsync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;asyncLLM&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(...))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Packaging&lt;/strong&gt;. I copied a &lt;code&gt;package.json&lt;/code&gt; from an earlier file and asked it to &lt;code&gt;Modify package.json, notable keywords and files and scripts based on @index.js&lt;/code&gt; which it did a &lt;a href=&#34;https://github.com/gramener/asyncllm/blob/main/package.json&#34;&gt;perfect job of&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blogging&lt;/strong&gt;. I wrote this blog post with the help of the chat history on Cursor. Normally, such blog posts take me 3-4 hours. This one took 45 minutes. I just had to pick and choose from history. (I lost a few because I renamed directories. I&#39;ll be careful not to do that going forward.)&lt;/p&gt;
&lt;hr class=&#34;wp-block-separator has-alpha-channel-opacity&#34;/&gt;
&lt;p&gt;Overall, it was a day of great learning. Not in the classroom sense of &#34;Here&#39;s something I didn&#39;t know before&#34;, but rather the cycling / swimming sense of &#34;Here&#39;s something I now know to do.&#34;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 22 Sep 2024</title>
      <link>https://www.s-anand.net/blog/things-i-learned-22-sep-2024/</link>
      <pubDate>Sun, 22 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-22-sep-2024/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E2E is a cheap GPU hosting provider for India. About Rs 100/hr for a V100 16GB&lt;/li&gt;
&lt;li&gt;Jetson NVIDIa is like Raspberry Pi with a GPU! But it&amp;rsquo;s expensive.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.sarvam.ai/apis/text-to-speech&#34;&gt;Sarvam.ai offers Indic text to speech&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jupyter.org/try-jupyter/lab/&#34;&gt;Jupyter Lite&lt;/a&gt; lets you run Jupyter notebooks in the browser&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://piston.readthedocs.io/&#34;&gt;Piston&lt;/a&gt; lets you run Python code via a REST API&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/modulepreload&#34;&gt;&lt;code&gt;&amp;lt;link rel=&amp;quot;modulepreload&amp;quot;&amp;gt;&lt;/code&gt;&lt;/a&gt; lets you load and compile modules early!&lt;/li&gt;
&lt;li&gt;Ollama 0.2 can handle &lt;a href=&#34;https://github.com/ollama/ollama/releases/tag/v0.2.0&#34;&gt;concurrent requests&lt;/a&gt; with only a little additional memory. (So can vLLM and DeepSpeed.)&lt;/li&gt;
&lt;li&gt;Prompt engineering for code generators:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/dedlim/6bf6d81f77c19e20cd40594aa09e3ecd#file-claude_3-5_sonnet_artifacts-xml&#34;&gt;Claude Artifacts Prompt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/simonw/d8cc934ad76b3bba82127937d45dc719&#34;&gt;Val.Townie system prompt&lt;/a&gt;. Good example of how to create&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://llmfoundry.straive.com/history#?app=cursor&amp;amp;model=&amp;amp;t=1725629416223543&#34;&gt;Cursor editing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://llmfoundry.straive.com/history#?app=cursor&amp;amp;t=1726379294138938&#34;&gt;Cursor debugging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://llmfoundry.straive.com/history#?app=cursor&amp;amp;model=&amp;amp;t=1726368766109438&#34;&gt;Cursor conversation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;XML tags seem best to structure prompts across LLMs.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/use-xml-tags&#34;&gt;Claude&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions&#34;&gt;OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/structure-prompts&#34;&gt;Gemini&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.moreusefulthings.com/instructor-prompts&#34;&gt;Instructor prompts&lt;/a&gt; by Ethan Mollick help teach better&lt;/li&gt;
&lt;li&gt;Non-Negative matrix factorization apparantly aligns to intuition more than K-Means and hence would be a great fit for most cosine-similarity matrices (via Jaidev).&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.segmind.com/models/hallo&#34;&gt;Segmind&amp;rsquo;s Hallo&lt;/a&gt; lets you animate a face to an audio clip&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://voideditor.com/&#34;&gt;VoidEditor&lt;/a&gt; aims to be an open source Cursor alternative&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://youtu.be/M9YOO7N5jF8&#34;&gt;Video of ChatGPT o1 + mini reproducing the methodology of a paper&lt;/a&gt; by writing the code - in 6 iterations. &lt;a href=&#34;https://github.com/kylekaba/chatgpt-01-youtube&#34;&gt;Here&amp;rsquo;s the repo&lt;/a&gt;. Prompts:
&lt;ol&gt;
&lt;li&gt;You are a Python and Astrophysics expert who is tasked with helping me on my research project. Please read the following methods section of this research paper and re-create the Python code described.&lt;/li&gt;
&lt;li&gt;Thank you, this code looks really nice. I don&amp;rsquo;t have any actual data or noise cube ready at the moment, but could you please generate some test data that can be used in the code you just wrote: {CODE}&lt;/li&gt;
&lt;li&gt;Hi. thank you for writing the code! Unfortunately, it seems that I get an error when I try to run it. I&amp;rsquo;ve attached the error message below, can you please refine the code so that the error is resolved? {ERROR}&lt;/li&gt;
&lt;li&gt;Thank you, but when attempting to run the code that you provided, I received the following error: {ERROR}&lt;/li&gt;
&lt;li&gt;Hello, thank you for the code. but now I get the following error pasted below: {ERROR}&lt;/li&gt;
&lt;li&gt;Thank you, I think we are getting close to a final solutiom I still get an error, which I&amp;rsquo;ve pasted below: {ERROR}&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Groq, SembaNova and Cerebras are fast inference models. All appear to be free&lt;/li&gt;
&lt;li&gt;The skills required to vet the AI&amp;rsquo;s response is the same skillset used to vet a Pull Request. It&amp;rsquo;s a good way to teach code review. Source: &lt;a href=&#34;https://www.reddit.com/r/LocalLLaMA/comments/1fbe995/my_personal_guide_for_developing_software_with_ai/&#34;&gt;My personal guide for developing software with AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Prompt engineering tip: Tell LLMs another AI wrote code. Else they will agree with you!&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>Cursor custom rules</title>
      <link>https://www.s-anand.net/blog/cursor-custom-rules/</link>
      <pubDate>Sun, 15 Sep 2024 09:37:26 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/cursor-custom-rules/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://cursor.directory/&#34;&gt;cursor.directory&lt;/a&gt; is a catalog of &lt;a href=&#34;https://docs.cursor.com/context/rules-for-ai#rules-for-ai&#34;&gt;Cursor rules&lt;/a&gt;. Since I&amp;rsquo;ve actively switched over from &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;VS Code&lt;/a&gt; to &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt; as my editor, I reviewed the popular rules and came up with this as my list:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You are an expert full stack developer in Python and JavaScript.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write concise, technical responses with accurate Python examples.&lt;/li&gt;
&lt;li&gt;Use functional, declarative programming; avoid classes.&lt;/li&gt;
&lt;li&gt;Avoid code duplication (iteration, functions, vectorization).&lt;/li&gt;
&lt;li&gt;Use descriptive variable names with auxiliary verbs as snake_case for Python (is_active, has_permission) and camelCase for JavaScript (isActive, hasPermission).&lt;/li&gt;
&lt;li&gt;Functions should receive and object and return an object (RORO) where possible.&lt;/li&gt;
&lt;li&gt;Use environment variables for sensitive information.&lt;/li&gt;
&lt;li&gt;Write unit tests in pytest for Python and Jest for JavaScript.&lt;/li&gt;
&lt;li&gt;Follow PEP 8 for Python.&lt;/li&gt;
&lt;li&gt;Always use type hints in all function signatures.&lt;/li&gt;
&lt;li&gt;Always write docstrings. Use Google style for Python and JSDoc for JavaScript.&lt;/li&gt;
&lt;li&gt;Cache slow or frequent operations in memory.&lt;/li&gt;
&lt;li&gt;Minimize blocking I/O operations with async operations.&lt;/li&gt;
&lt;li&gt;Only write ESM (ES6) JavaScript. Target modern browsers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Libraries&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lit-html and vanilla JavaScript for frontend development.&lt;/li&gt;
&lt;li&gt;D3 for data visualization.&lt;/li&gt;
&lt;li&gt;Bootstrap for CSS.&lt;/li&gt;
&lt;li&gt;Pandas and DuckDB for data analysis and manipulation.&lt;/li&gt;
&lt;li&gt;FastAPI for API development.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Error Handling and Validation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validate preconditions and errors early to avoid deeply nested if statements.&lt;/li&gt;
&lt;li&gt;Use try-except or try-catch blocks for error-prone operations, especially when reading external data.&lt;/li&gt;
&lt;li&gt;Avoid unnecessary else statements; use the if-return pattern instead.&lt;/li&gt;
&lt;li&gt;Log all errors with user-friendly error messages shown on the frontend.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 15 Sep 2024</title>
      <link>https://www.s-anand.net/blog/things-i-learned-15-sep-2024/</link>
      <pubDate>Sun, 15 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-15-sep-2024/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://app.hume.ai/&#34;&gt;Hume&lt;/a&gt; provides a voice-to-voice model (EVI 2) that handles emotions at 7 cents/minute.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openart.ai/workflows/home&#34;&gt;OpenArt workflows&lt;/a&gt; has image generation workflows&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://huggingface.co/mistral-community/pixtral-12b-240910&#34;&gt;Pixtral&lt;/a&gt; seems quite &lt;a href=&#34;https://x.com/swyx/status/1833934254834942047&#34;&gt;good at OCR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LLM coding
&lt;ul&gt;
&lt;li&gt;Makes you more ambitious&lt;/li&gt;
&lt;li&gt;Lets you code without stress. (Just pass it the error and have it fix it. Or find another approach)&lt;/li&gt;
&lt;li&gt;Is unlimited. You can run dozens of agents in parallel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Simon Willison&amp;rsquo;s crowdsourced list of &lt;a href=&#34;https://x.com/simonw/status/1832944559162269990&#34;&gt;prompt engineering hacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Invest in things that don&amp;rsquo;t change.&amp;rdquo; Jeff Bezos. Like faster delivery, SQL, web platform.&lt;/li&gt;
&lt;li&gt;Medical cost in Singapore (for insurance coverage) - via Kumar
&lt;ul&gt;
&lt;li&gt;Root canal at clinic: $1,300&lt;/li&gt;
&lt;li&gt;Crown replacement at clinic: $1,300&lt;/li&gt;
&lt;li&gt;Periodontist (gums) at hospital: $2,500&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://stack-auth.com/blog/oauth-from-first-principles&#34;&gt;OAuth from First Principles&lt;/a&gt; is a SIMPLE explanation of OAuth. Conclusion: &amp;ldquo;You probably shouldn&amp;rsquo;t implement your own OAuth client.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.alphaxiv.org/&#34;&gt;Alphaxiv&lt;/a&gt; is Arxiv.org but with author comments and chat&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/news/the-impact-of-ai-on-computer-science-education/&#34;&gt;The Impact of AI on Computer Science Education&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;Eric Klopfer divided his undergrad CS class into three groups and gave them a Fortran task.&lt;/li&gt;
&lt;li&gt;One used ChatGPT. Another, Meta&amp;rsquo;s Code Llama LLM. Third, only use Google.&lt;/li&gt;
&lt;li&gt;ChatGPT group was faster than Code Llama was faster than Google&lt;/li&gt;
&lt;li&gt;When tested on the approach, the ChatGPT remembered nothing. Half the Code Llama group passed. The Google group passed fully&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Server-side implementation of an OAuth2 client is too complex. Best to delegate this to Auth0&lt;/li&gt;
&lt;li&gt;Via Pratap Vardhan:
&lt;ul&gt;
&lt;li&gt;At Khan Academy, every developer working on Khanmigo has cursor. Everyone who&amp;rsquo;s contributed to a Khan Academy GitHub repo has GitHub Copilot.&lt;/li&gt;
&lt;li&gt;I stopped using Google + StackOverflow 2 years ago. I use ChatGPT, Copilot, etc. For humans, I ask Reddit.&lt;/li&gt;
&lt;li&gt;Excited by async agents. Things that do my job while I sleep.
&lt;ul&gt;
&lt;li&gt;Zapier notifications.&lt;/li&gt;
&lt;li&gt;Monitor what happens. Put it into a flow diagram and alert me.&lt;/li&gt;
&lt;li&gt;Every month, did my broker trade? Did my bank transaction fail? Did I pay my electricity bill?&lt;/li&gt;
&lt;li&gt;Every time you delegate, use an agent instead.&lt;/li&gt;
&lt;li&gt;Read my RSS feeds.&lt;/li&gt;
&lt;li&gt;Read my browser history and suggest interests.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Plan a session in Bain, BCG, etc. on Artifacts.&lt;/li&gt;
&lt;li&gt;Explore sparse embeddings. More effective. ColiPali, ColBERT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>AI Coding: $12M return for $240K spend?</title>
      <link>https://www.s-anand.net/blog/ai-coding-12m-return-for-240k-spend/</link>
      <pubDate>Sun, 08 Sep 2024 02:05:11 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/ai-coding-12m-return-for-240k-spend/</guid>
      <description>&lt;p&gt;&lt;strong&gt;This is an email I sent to our leadership team a few minutes ago.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We may be witnessing the third major leap in computing productivity, after high-level languages in the 1960s and spreadsheets in the 1980s&lt;/p&gt;
&lt;p&gt;In the last few weeks, AI coding really took off. &lt;a href=&#34;https://www.cursor.com/&#34;&gt;Cursor&lt;/a&gt;, &lt;a href=&#34;https://sourcegraph.com/cody&#34;&gt;Cody&lt;/a&gt;, &lt;a href=&#34;https://docs.replit.com/replitai/agent&#34;&gt;Replit Agents&lt;/a&gt; are FAR better than GitHub Copilot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4945566&#34;&gt;Research&lt;/a&gt; on ~5,000 devs in Fortune 100 shows that even GitHub Copilot makes them ~25% more productive.&lt;/p&gt;
&lt;p&gt;Personally, Cursor helped me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Write &lt;strong&gt;faster&lt;/strong&gt; code (at least 2X). I&amp;rsquo;ve given away my team (there&amp;rsquo;s not enough work for them).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write &lt;strong&gt;better&lt;/strong&gt; code. I now document code for others to replicate - because it&amp;rsquo;s so easy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Write &lt;strong&gt;complex&lt;/strong&gt; code. I&amp;rsquo;ve built stuff I didn&amp;rsquo;t know how to. WhatsApp agents, AI code writers, even LLM Foundry. Each has opened a client&amp;rsquo;s door.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;So, should we leverage AI Coding for our developers?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maybe not. Consider these risks.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;It costs $10-$20/month/dev. That&amp;rsquo;s $120-$240K/year for ~1,000 devs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clients may not be comfortable with us using AI coding. IP. Security.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Higher productivity reduces our T&amp;amp;M billing, hence revenue.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Maybe yes. Consider these benefits.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We could save 25% per developer. Maybe $4K/month/dev x 25% = $12M/year&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We could win more complex engagements. (Pitching AI coding as an edge has worked well, too.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We could reduce time to get someone to a tech-lead level.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There&amp;rsquo;s probably no one-size-fits-all answer. We might need to pilot while we strategize.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How might this impact our hiring and training?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1. &lt;strong&gt;Hire for AI coding skills&lt;/strong&gt;. In interviews, I&amp;rsquo;d look for use of AI coding agents. We need a few AI coding leads to share our engineering future.&lt;/p&gt;
&lt;p&gt;2. &lt;strong&gt;Hire for dual skills&lt;/strong&gt;. AI can take care of the code. I&amp;rsquo;d hire people with good client-facing skills.&lt;/p&gt;
&lt;p&gt;3. &lt;strong&gt;Train on AI coding&lt;/strong&gt;. Integrate these into the onboarding process. Train existing devs.&lt;/p&gt;
&lt;p&gt;4. &lt;strong&gt;Train non-developers&lt;/strong&gt;. Analysts, designers, managers can become as good as junior devs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why am I mailing you?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In Nov 2022, when ChatGPT was released, I thought LLMs were the biggest knowledge leap since Google.&lt;/p&gt;
&lt;p&gt;In Sep 2024, with Cursor, Cody, and Replit agents, I think AI coding the biggest productivity leap since Excel.&lt;/p&gt;
&lt;p&gt;This is not for immediate action.&lt;/p&gt;
&lt;p&gt;Please think over it. Share it. Discuss it. Pilot it. Let&amp;rsquo;s explore.&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Things I Learned - 01 Sep 2024</title>
      <link>https://www.s-anand.net/blog/things-i-learned-01-sep-2024/</link>
      <pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.s-anand.net/blog/things-i-learned-01-sep-2024/</guid>
      <description>&lt;p&gt;This week, I learned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LLMs are so good that they can simulate Doom in real time. &lt;a href=&#34;https://gamengen.github.io/&#34;&gt;gamengen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/simonw/d8cc934ad76b3bba82127937d45dc719&#34;&gt;Val.town&amp;rsquo;s code generation system prompt&lt;/a&gt; uses &lt;a href=&#34;https://maxm-imggenurl.web.val.run/the-description-of-your-image&#34;&gt;https://maxm-imggenurl.web.val.run/the-description-of-your-image&lt;/a&gt; to dynamically generate images&lt;/li&gt;
&lt;li&gt;Practice for each thought: &amp;ldquo;What would make me change my mind? How likely is that?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cursor.com/blog/instant-apply&#34;&gt;Cursor uses speculative edits&lt;/a&gt; and a variety of other techniques to speed up code editing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.s-anand.net/blog/image-generation-gets-better-at-comics/&#34;&gt;ChatGPT does a better job at cartoon generation than even Flux.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
  </channel>
</rss>
