<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Puneet Nanda</title>
    <description>The latest articles on DEV Community by Puneet Nanda (@puneet_nanda_dc25d8b489ad).</description>
    <link>https://dev.to/puneet_nanda_dc25d8b489ad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3052678%2F9952de67-6d7e-4c81-8c78-df52dcf6c380.png</url>
      <title>DEV Community: Puneet Nanda</title>
      <link>https://dev.to/puneet_nanda_dc25d8b489ad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/puneet_nanda_dc25d8b489ad"/>
    <language>en</language>
    <item>
      <title>A URL Is Not a File</title>
      <dc:creator>Puneet Nanda</dc:creator>
      <pubDate>Tue, 03 Nov 2026 15:01:48 +0000</pubDate>
      <link>https://dev.to/puneet_nanda_dc25d8b489ad/a-url-is-not-a-file-112b</link>
      <guid>https://dev.to/puneet_nanda_dc25d8b489ad/a-url-is-not-a-file-112b</guid>
      <description>&lt;p&gt;A bookmark is a polite request. If you want the page later, save the HTTP responses while that server still sends them.&lt;/p&gt;

&lt;p&gt;A fansite for a forgotten anime sat online, barely changed, from 2004 until the domain started serving gambling ads. The person who missed it works in web archiving. They still had no copy. Fondness never triggered a crawl.&lt;/p&gt;

&lt;p&gt;Save the conversation, not a souvenir of it. A screenshot is a picture of the layout. A "Save as HTML" file is often the shell, with the images and the follow-up requests still living on a host you do not control. WARC writes down each request and each response, headers included. A WACZ bundles those records so a replay can answer from the file after the origin is gone, JavaScript included.&lt;/p&gt;

&lt;p&gt;A public archive will not cover your bookmarks for you. It saves what it crawled. Open a link from a few years ago and you can get a 404 with nothing useful in the Wayback Machine. An old Angelfire site is still there as the bones. The hand-scanned photos are not. A forum went dark, and most of it had never been crawled. Ask a model to rebuild that and you get smooth paragraphs where the threads were. Training does not recreate a JPEG nobody fetched.&lt;/p&gt;

&lt;p&gt;The pages that vanish on you are the ones with no fan club and no dump. A professor's course site, written as plain HTML, is the whole demo. &lt;code&gt;wget -mkpnp&lt;/code&gt; while it still answers, and those notes are on your disk years later when you are prepping for an interview. Wait for the department to redesign, and you get a parking page.&lt;/p&gt;

&lt;p&gt;If a menu only loads its data after a click, a capture that never clicked stored a hole with a nice title. You have to fetch the page the way you actually use it, while it still works.&lt;/p&gt;

&lt;p&gt;Don't do this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Count a bookmark as a copy.&lt;/li&gt;
&lt;li&gt;Assume the Internet Archive already grabbed the URL you will miss.&lt;/li&gt;
&lt;li&gt;Keep a screenshot and delete the assets it points at.&lt;/li&gt;
&lt;li&gt;Notice the site is dead, then ask an LLM to invent the missing posts.&lt;/li&gt;
&lt;li&gt;Leave the only WACZ on the only laptop in the house. Send a copy to someone else who wants the site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the bytes are not on a disk you control, you do not have the page. You have a rumor with a hyperlink.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.mistys-internet.website/post/2026/10/29/if-you-love-a-website-back-it-up/" rel="noopener noreferrer"&gt;If you love a website, back it up&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=50336518" rel="noopener noreferrer"&gt;Discussion on Hacker News&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post was generated automatically from public Hacker News data.&lt;/p&gt;

</description>
      <category>tech</category>
      <category>programming</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>"Nobody Is Faster" Is Not a Date</title>
      <dc:creator>Puneet Nanda</dc:creator>
      <pubDate>Tue, 03 Nov 2026 07:07:04 +0000</pubDate>
      <link>https://dev.to/puneet_nanda_dc25d8b489ad/nobody-is-faster-is-not-a-date-2hk6</link>
      <guid>https://dev.to/puneet_nanda_dc25d8b489ad/nobody-is-faster-is-not-a-date-2hk6</guid>
      <description>&lt;p&gt;A speed promise is a number of days, or it is a slogan. Slogans do not show up late.&lt;/p&gt;

&lt;p&gt;Ubuntu's security page says nobody provides fixes faster than Canonical. For CVE-2026-98432, a critical kernel bug, their own tracker still says Vulnerable on current LTS releases.&lt;/p&gt;

&lt;p&gt;Debian's security tracker already lists fixed kernels for the same CVE. The slogan has no due date. The table does.&lt;/p&gt;

&lt;p&gt;"Fast" cannot miss. "Within 7 days of the CVE page going up" can.&lt;/p&gt;

&lt;p&gt;If you will not write the number, you do not have a patch policy. You have a typeface.&lt;/p&gt;

&lt;p&gt;Watch the thing a package upload changes. That is the status line, and the kernel version in the security pocket.&lt;/p&gt;

&lt;p&gt;The homepage does not rebuild when a fix ships. It also does not blush when the status sits on "work in progress."&lt;/p&gt;

&lt;p&gt;The whole policy fits in an alert. Critical kernel CVEs are fixed in the image within N days of publication, or a person gets paged.&lt;/p&gt;

&lt;p&gt;N is a number you would hate to miss. Seven and fourteen are both real choices.&lt;/p&gt;

&lt;p&gt;"Timely" is a shrug.&lt;/p&gt;

&lt;p&gt;CVE-2026-98432 has been on Ubuntu's tracker since 15 October 2026. On 3 November the page still marked the current LTS releases Vulnerable.&lt;/p&gt;

&lt;p&gt;The fix is labeled work in progress. You cannot boot that label, and apt cannot install it.&lt;/p&gt;

&lt;p&gt;Until the row names a package, the machine is the one from day one.&lt;/p&gt;

&lt;p&gt;Debian is the control, not the point. Their security pocket lists fixed packages for this CVE.&lt;/p&gt;

&lt;p&gt;The company whose site says nobody is faster had not flipped its own row. Diff the two pages and skip the subplot.&lt;/p&gt;

&lt;p&gt;Skip these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reading "LTS" as a clock. A support window is not a latency.&lt;/li&gt;
&lt;li&gt;Treating "work in progress" as good enough for this week.&lt;/li&gt;
&lt;li&gt;Trusting a superlative with no due date. "Nobody is faster" cannot be late, which is how you know it is useless.&lt;/li&gt;
&lt;li&gt;Letting the VPS default pick the distro, then calling that a review.&lt;/li&gt;
&lt;li&gt;Waiting for the marketing page to correct the tracker. It is not on the release hook.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put the CVE id next to the package version you expect. When N days pass and the row still says Vulnerable, that is the incident.&lt;/p&gt;

&lt;p&gt;If they will not name the number of days, the CVE table is the contract.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chalmovsky.com/posts/wtf-ubuntu" rel="noopener noreferrer"&gt;WTF Ubuntu?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=50337608" rel="noopener noreferrer"&gt;HN thread&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post was generated automatically from public Hacker News data.&lt;/p&gt;

</description>
      <category>tech</category>
      <category>programming</category>
      <category>learning</category>
    </item>
    <item>
      <title>131,072 Weights, and None of Them Were a Math Lesson</title>
      <dc:creator>Puneet Nanda</dc:creator>
      <pubDate>Mon, 02 Nov 2026 22:49:43 +0000</pubDate>
      <link>https://dev.to/puneet_nanda_dc25d8b489ad/131072-weights-and-none-of-them-were-a-math-lesson-1b65</link>
      <guid>https://dev.to/puneet_nanda_dc25d8b489ad/131072-weights-and-none-of-them-were-a-math-lesson-1b65</guid>
      <description>&lt;p&gt;A small edit can look like a new skill. Measure the failure you removed before you call the score learning.&lt;/p&gt;

&lt;p&gt;That is the part worth stealing from a Hacker News thread about models that read and write neural network weights directly. Researchers at MIT CSAIL asked GPT-6 Astra to make Qwen3.5-0.8B better at math by editing weights. No gradients. No training loop. Astra traced a reasoning loop to one direction written by the MLPs in layers 15 and 19, then subtracted that direction from 64 output columns in each of those layers. The patch is 131,072 weights. On a model they describe as having 0.8 billion weights, that is 0.016%.&lt;/p&gt;

&lt;p&gt;The scoreboard is easy to screenshot and easy to strip of context. MATH-500 went from 7.9% to 48.1%. GSM8K went from 13.8% to 67.1%. IFEval, which measures instruction following, went from 21.0% to 62.3%. Qwen's own model card already warns that this small model is prone to thinking loops. On the unedited model, 85 of the first 96 practice answers ran into the 32,768-token limit. After the edit that stuck, the share of MATH-500 answers hitting that limit fell from 93% to 33%.&lt;/p&gt;

&lt;p&gt;The attempts that missed are the lesson. With 10 forward passes, MATH-500 only reached 12.3%, and 87.2% of answers still died at the cap. With 25 passes, 14.1% and 86.4%. The score did not climb while the model learned math. It sat still until the loop broke, and then it jumped. The loop is not special to math, which is why a non-math test moved too. A model that never lands the last line fails every exam that grades the last line.&lt;/p&gt;

&lt;p&gt;The authors then ran the control that separates a blocker from a skill. Gemma 3 270M rarely loops. They report that only 8.5% of its answers reach its token limit, against 93% for that Qwen. Same style of direct weight edit. MATH-500 started at 6.8%, and no edited run moved it by more than about a point. The best figure in their table is 7.7%. On their account, Astra found ordinary wrong arithmetic and invalid algebra, with no single component to switch off. Fixing a loop lets the model finish answers it could already work out. Removing an obstacle that hid an ability does not install an ability the model lacked.&lt;/p&gt;

&lt;p&gt;The same shape shows up in systems that have no weights at all.&lt;/p&gt;

&lt;p&gt;Suppose an API's success rate climbs after you delete one retry bug: on timeout, call yourself until the gateway hangs up. Callers start getting a response. The handler did not get wiser. It stopped spending the whole deadline on a polite panic. Requests that were wrong for a real reason are still wrong. Success rate cannot tell those two stories apart. A math benchmark cannot either, once you crop the column that says the answer never finished.&lt;/p&gt;

&lt;p&gt;Or take a function that returns early on a weird input, so the suite is a pile of timeouts. You delete the early return. The tests go green. The changelog says the score jumped. What jumped was termination. The missing branch is still missing. It is only visible now. That is worth shipping, and it is still not a new algorithm.&lt;/p&gt;

&lt;p&gt;Do not publish the headline number and leave the blocker in a footnote you drop from the slide.&lt;/p&gt;

&lt;p&gt;MATH-500 and "hit the token limit" are one measurement. Ten and twenty-five passes barely moved either one. Fifty passes moved both. If the score rises while the loop rate stays put, you might have taught something. If they move together, you unblocked a finish. Deleting &lt;code&gt;while (true)&lt;/code&gt; is not a math curriculum. It is a favor to whoever pays for the electricity.&lt;/p&gt;

&lt;p&gt;Before you trust a delta tomorrow, write the suspected blocker in one sentence, in the language of the system you have.&lt;/p&gt;

&lt;p&gt;"It repeats until the sampler stops." "It retries until the gateway kills the request." "The test times out because we return before the hard case." Log that rate beside the score, on the same examples, before and after. Then find a control where the blocker is already rare. If the control sits still, you removed an obstacle. Put the remaining errors on a real plan: data, training, or code that implements the case you do not have yet.&lt;/p&gt;

&lt;p&gt;Ship the unblocker. A model that can do the step, and then repeats until the token limit cuts it off, should have that habit removed. The patch was small because the habit was narrow. Do not send the next reader looking for a math lesson inside 131,072 weights that were only holding the door shut. The answers it could already work out were waiting behind that door.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://rikiyat.github.io/blog/weight-space-programming/" rel="noopener noreferrer"&gt;https://rikiyat.github.io/blog/weight-space-programming/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hacker News: &lt;a href="https://news.ycombinator.com/item?id=50341174" rel="noopener noreferrer"&gt;https://news.ycombinator.com/item?id=50341174&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post was generated automatically from public Hacker News data.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>learning</category>
      <category>tech</category>
    </item>
    <item>
      <title>The Second Scrape Should Be Almost Free</title>
      <dc:creator>Puneet Nanda</dc:creator>
      <pubDate>Mon, 02 Nov 2026 18:04:56 +0000</pubDate>
      <link>https://dev.to/puneet_nanda_dc25d8b489ad/the-second-scrape-should-be-almost-free-55g5</link>
      <guid>https://dev.to/puneet_nanda_dc25d8b489ad/the-second-scrape-should-be-almost-free-55g5</guid>
      <description>&lt;p&gt;A one-shot script that classifies a forum archive feels done the moment the catalog shows up. It is not done. It has not met next Sunday.&lt;/p&gt;

&lt;p&gt;The idea is less glamorous than a new video site, which is how you know it will still matter on Monday. An LLM label is a pure function of the text, the prompt, and the model. If none of those changed, you already bought the answer. Write it down. The second run should spend almost nothing.&lt;/p&gt;

&lt;p&gt;This week's exhibit is a catalog of YouTube videos people on Hacker News have recommended since 2007. The interesting object is the pipeline, and it splits into two stages that should never share a function.&lt;/p&gt;

&lt;p&gt;Stage one is a parser. Walk a comment, pull out a YouTube URL or video id, and store the hit next to the comment id. That step is deterministic. Run it every night. It will give you the same rows it gave you yesterday, which is the highest compliment a pipeline can receive.&lt;/p&gt;

&lt;p&gt;Stage two is the judgment. A link is not a recommendation. One person is praising a conference talk. Another is pasting the same URL to complain about the codec. A third comment is spam with a video id glued to the end. You want those separated, and you probably want a topic so the catalog is browsable. That call is the whole budget.&lt;/p&gt;

&lt;p&gt;On the Hacker News thread, the author reported about 504 million input tokens and 7.6 million output tokens for the project, more than 90 percent of them spent labeling comments. Building and deploying the app was on the order of a million tokens. Sit with that ratio before you schedule anything. The interface is a view over a table. The table is what you paid for.&lt;/p&gt;

&lt;p&gt;Keep the table. One row per judgment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the comment id&lt;/li&gt;
&lt;li&gt;a hash of the comment body&lt;/li&gt;
&lt;li&gt;a prompt version&lt;/li&gt;
&lt;li&gt;the model name&lt;/li&gt;
&lt;li&gt;the label&lt;/li&gt;
&lt;li&gt;when you labeled it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hash matters because comments get edited, and an edit is a new input. The prompt version is an integer you increment when the instructions change. A lookup key of comment id, content hash, prompt version, and model turns a rerun into a read. You are not asking the model whether it still agrees with itself.&lt;/p&gt;

&lt;p&gt;Beside the table, store a watermark: the newest item id you have fully processed. Each run fetches only newer items, extracts links, and calls the model only when that key is missing. Then it moves the watermark forward. The first run walks the archive. Every later run is a delta. If the front page adds forty comments overnight, you pay for forty judgments, not for 2007.&lt;/p&gt;

&lt;p&gt;The common failure is a script with an honest name like &lt;code&gt;rebuild.py&lt;/code&gt;. It downloads the corpus and labels every row, on the theory that the provider's prompt cache will catch the repeat. It will not, not for long. Those caches expire. They miss when you change a single line of the system prompt. They also do not promise the same output twice, so a comment from 2009 can grow a new topic on Thursday and the catalog flickers for no editorial reason. Cached input does not make output tokens free. You have built a small business whose only product is paying a model to re-read "this talk is great."&lt;/p&gt;

&lt;p&gt;There is a quieter version of the same bug. You change the prompt, forget to bump the version, and celebrate a perfect hit rate. You are serving last month's policy under this month's filename. Stale labels are fine when you chose them and can see the migration. They are a defect when the cache hid them.&lt;/p&gt;

&lt;p&gt;Tomorrow, add the table before you add the schedule. At the end of every run, print two counts: comments seen, and comments sent to the model. After the first backfill those numbers should diverge, hard. If they stay equal, the watermark is a comment in the code, and you are still running the demo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://karpathy.bearblog.dev/hacker-tube/" rel="noopener noreferrer"&gt;HackerTube, the source post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=50319510" rel="noopener noreferrer"&gt;Hacker News discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post was generated automatically from public Hacker News data.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>learning</category>
      <category>tech</category>
    </item>
    <item>
      <title>A Brighter Flashlight Makes the Release Look Late</title>
      <dc:creator>Puneet Nanda</dc:creator>
      <pubDate>Mon, 02 Nov 2026 18:00:25 +0000</pubDate>
      <link>https://dev.to/puneet_nanda_dc25d8b489ad/a-brighter-flashlight-makes-the-release-look-late-3ceh</link>
      <guid>https://dev.to/puneet_nanda_dc25d8b489ad/a-brighter-flashlight-makes-the-release-look-late-3ceh</guid>
      <description>&lt;p&gt;A better bug finder does not mean the code got worse. It means you can finally see the bottle caps from 1987, and someone still has to decide which ones to dig up before lunch.&lt;/p&gt;

&lt;p&gt;That is the lesson. Detection got cheap. Judgment did not. A release calendar that pretends those two speeds match will slip, or it will ship a fix that should never have been committed.&lt;/p&gt;

&lt;p&gt;PostgreSQL major releases have been boring for a decade, in the good way: no earlier than mid-September, no later than mid-October. This year broke the pattern. Robert Haas wrote that version 19 will most likely wait until November, and might wait longer. Three large features came out between August 27 and September 15, deep in beta: &lt;code&gt;UPDATE&lt;/code&gt;/&lt;code&gt;DELETE FOR PORTION OF&lt;/code&gt;, SQL Property Graph Queries, and partition merge/split. Yanking a big feature right after the April feature freeze is ordinary. Yanking several of them at the end of summer is not.&lt;/p&gt;

&lt;p&gt;The interesting part is where the extra work went. Haas compared April 8 through September 25. In 2025, master got 1,037 commits and the stable branch for the release then in progress got 724. In 2026 those numbers were 1,443 and 1,169. Commits that landed only on master declined slightly. Back-patched commits jumped by more than 60 percent. The previous stable branch did the same thing: 248 commits in that window last year, 433 this year, more than 74 percent. The committers did not suddenly get careless. A lot more people are pointing language models at a codebase whose history runs past thirty years, and filing what those models surface. Drafting a patch got easier. Reviewing one did not. The people allowed to commit still have the same number of hours.&lt;/p&gt;

&lt;p&gt;Treat it as a queue, because it is one.&lt;/p&gt;

&lt;p&gt;Findings per week are the arrival rate. Reviewed fixes that meet the project's own rules are the service rate. For a long time those rates were close enough that the train left on time. Then arrivals jumped, and service did not. A model can propose a patch in a closed loop: read the code, write a test, see if it fails. You can run that loop all night. The internet currently is. The loop that ships is open. It ends at a person who knows whether the patch is right, whether it belongs on every supported version, and whether the cure is worse than the bug. Haas is plain that model-written fixes are often wrong, or right in a way Postgres will not accept.&lt;/p&gt;

&lt;p&gt;That is why the date moved. Hours that were supposed to answer "is this feature ready?" went to security issues and older bugs that had just become visible. Near a release, an unanswered question about a large feature has one responsible answer: take it out. Do that three times and you are off the old calendar. The delay is what quality looks like when inspection outruns repair. It is not proof that the code rotted in a single summer.&lt;/p&gt;

&lt;p&gt;You have already seen the small version. Turn on a fuzzer, a sanitizer, or a stricter linter and the bug count spikes that week. Nobody rewrote the module overnight. You changed the sensor. If "bugs opened" is your quality score, you will scold the team for buying a better sensor, and someone will turn the sensor down until the chart behaves.&lt;/p&gt;

&lt;p&gt;Don't do this: feed every new report to an agent and merge whatever comes back with a green test. Finding scales. Judgment does not. Plenty of defects in a system this old sit on extreme edges, and the tidy fix deletes a feature or spends a performance budget you do not have. A patch that compiles is not a patch you understand. In a database, the difference is someone's data.&lt;/p&gt;

&lt;p&gt;Tomorrow, before you enable the new finder, write two numbers where the team will see them. How many findings a week a human can actually close. What gets dropped when the queue passes that. Drop scope. Keep the security work. Split the chart in two: bugs introduced after the cutoff, and bugs discovered after the cutoff. One series tells you if new code is getting worse. The other tells you the flashlight works. Keep only one series and the retro becomes an argument about a failure that never happened.&lt;/p&gt;

&lt;p&gt;Point the finder at the oldest code your users still run. That is the buried layer. Budget the digging before you announce the count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="http://rhaas.blogspot.com/2026/10/postgres-19-is-late-and-its-ais-fault.html" rel="noopener noreferrer"&gt;Postgres 19 is late, and it's AI's fault&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discussion:&lt;/strong&gt; &lt;a href="https://news.ycombinator.com/item?id=50312408" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post was generated automatically from public Hacker News data.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>ai</category>
      <category>learning</category>
    </item>
    <item>
      <title>Hacker News Has a Bookshelf. The Ranking Is the Hard Part</title>
      <dc:creator>Puneet Nanda</dc:creator>
      <pubDate>Mon, 02 Nov 2026 17:53:28 +0000</pubDate>
      <link>https://dev.to/puneet_nanda_dc25d8b489ad/hacker-news-has-a-bookshelf-the-ranking-is-the-hard-part-ige</link>
      <guid>https://dev.to/puneet_nanda_dc25d8b489ad/hacker-news-has-a-bookshelf-the-ranking-is-the-hard-part-ige</guid>
      <description>&lt;p&gt;The top story on Hacker News is a bookshelf made from the site's own comments. &lt;a href="https://hackerbooks.org" rel="noopener noreferrer"&gt;HackerBooks&lt;/a&gt;, posted by roansh, led the front page with 1,771 points and 289 comments. It applies the idea behind Andrej Karpathy's HackerTube to books: titles named on the site since 2007, each linked to the comment that named it. Karpathy replied "Love it!"&lt;/p&gt;

&lt;p&gt;roansh says Claude Opus 5.5 wrote almost all of the pipeline and the site. Steering, a few decisions, and the domain were the human part. The layout brief was to feel like HackerTube, but for books. What is unusual is the artifact: a compiled index of a public archive, a CSV on the about page, and no account required.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the index contains
&lt;/h2&gt;

&lt;p&gt;The launch post says roughly 16,500 books were mentioned by at least two commenters. The about page, beside a dataset generated on November 2, 2026, lists 15,766 books, 281,363 mentions, 225,861 comments, and 57,773 commenters. The first number is the launch sketch. The second is the one that ships with the file.&lt;/p&gt;

&lt;p&gt;The pipeline starts from the public Hacker News dump. Patterns pick out quoted titles, "by Author" phrases, store and Open Library links, and ISBNs. Those candidates are matched to Open Library for an id, authors, a year, a cover, and subjects, then searched across the whole corpus so an unlinked title still counts. A small model handles only ambiguous names. The page cites "Dune", "Influence", and "Range".&lt;/p&gt;

&lt;p&gt;roansh said the live site is plain JavaScript and static JSON on Cloudflare. About 30 kilobytes of top books load first. The rest of the roughly 16,000 titles follow in the background. Covers are on R2. Python and DuckDB build the tables offline on a laptop, with no live crawl. A monthly refresh, the author said, might be enough. Rankings prefer distinct commenters to one person repeating a title.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the ranking is the hard part
&lt;/h2&gt;

&lt;p&gt;The launch post warned that praise and complaints both count. A commenter then noted Mein Kampf showing as recommended by 651 people. The label on the site was changed to "mentioned by."&lt;/p&gt;

&lt;p&gt;A second pass, described on the about page, asks Claude Sonnet 5.5 to mark each mention as recommend, neutral, critical, or not about the book. "Recommended by" counts distinct recommenders. Films, games, and other same-name works are dropped. On 400 mentions, Claude Opus 5.5 agreed 85 percent of the time. Keyword rules, sentiment scores, and a TF-IDF classifier did worse. The page says noise remains.&lt;/p&gt;

&lt;p&gt;The thread showed that noise. Vanity Fair the novel was inflated by the magazine, and roansh said it would count only alongside Thackeray. A dragon-book nickname hit the wrong record until the link was fixed. Readers also reported bad subject shelves, a publication decade that was far off, and sarcasm scored as praise. Why's (Poignant) Guide to Ruby was missing from Open Library and had to be added by hand. The Invention of Morel, mentioned by about three people, still drops out of the matcher.&lt;/p&gt;

&lt;p&gt;A commenter totaled mentions by year and saw a peak in 2022, then a fall. Others said the series ignores how many people were posting, and that newer readers may mention fewer books. roansh asked if Hacker News traffic is down. The curve is about this archive, not about reading in general.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should care
&lt;/h2&gt;

&lt;p&gt;Anyone using the chart as a reading list should open the comment. The thread itself was an argument about fiction, audiobooks, and how weak "most mentioned" is as a verdict. The link back to the sentence is the useful object. The sort order is only a way in.&lt;/p&gt;

&lt;p&gt;Anyone extracting entities from forums should study the misses. Open metadata is incomplete, short titles collide, and a loose label will treat a denunciation as a pick. Commenters were also plain that covers and dates from Open Library are often wrong. Bookshop and Amazon links added during the thread are affiliate links, which the author disclosed.&lt;/p&gt;

&lt;p&gt;Anyone who has lost an older HN book site to a 404 should take the CSV. Commenters cited earlier versions, including one from 2021, and a builder whose revival never shipped. The about page says browsing is untracked and that "For You" lives in localStorage on your machine. An email address is stored only if you ask for updates.&lt;/p&gt;

&lt;p&gt;What is still open is whether the laptop job becomes a schedule, whether that 85 percent check survives sarcasm and name collisions, and whether the file is used once the points stop. Readers had already posted sibling indexes for products and for Wikipedia. They last if somebody keeps the table.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://hackerbooks.org" rel="noopener noreferrer"&gt;HackerBooks&lt;/a&gt;. Discussion: &lt;a href="https://news.ycombinator.com/item?id=50326821" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This post was generated automatically from public Hacker News data.&lt;/p&gt;

</description>
      <category>tech</category>
      <category>programming</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
