From 8f2285a63c273162c8f5fa38ab957aee867c343d Mon Sep 17 00:00:00 2001 From: "Tommy D. Rossi" Date: Mon, 5 Jan 2026 11:11:00 +0100 Subject: [PATCH] bigger labels. fix screenshots sizes --- playwriter/src/aria-snapshot.ts | 24 +- .../assets/aria-labels-google-snapshot.txt | 2 +- .../aria-labels-hacker-news-snapshot.txt | 1208 +++++++++-------- playwriter/src/mcp.test.ts | 65 +- playwriter/src/prompt.md | 25 +- 5 files changed, 710 insertions(+), 614 deletions(-) diff --git a/playwriter/src/aria-snapshot.ts b/playwriter/src/aria-snapshot.ts index f51e2c2..d8db8bc 100644 --- a/playwriter/src/aria-snapshot.ts +++ b/playwriter/src/aria-snapshot.ts @@ -93,7 +93,7 @@ const css = String.raw const LABEL_STYLES = css` .__pw_label__ { position: absolute; - font: bold 11px Helvetica, Arial, sans-serif; + font: bold 12px Helvetica, Arial, sans-serif; padding: 1px 4px; border-radius: 3px; color: black; @@ -300,8 +300,8 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { // Each rect is { left, top, right, bottom } in viewport coordinates const placedLabels: Array<{ left: number; top: number; right: number; bottom: number }> = [] - // Estimate label dimensions (11px font + padding) - const LABEL_HEIGHT = 16 + // Estimate label dimensions (12px font + padding) + const LABEL_HEIGHT = 17 const LABEL_CHAR_WIDTH = 7 // approximate width per character // Parse alpha from rgb/rgba color string (getComputedStyle always returns these formats) @@ -518,7 +518,7 @@ export async function screenshotWithAccessibilityLabels({ page, interactiveOnly const timestamp = Date.now() const random = Math.random().toString(36).slice(2, 6) const filename = `playwriter-screenshot-${timestamp}-${random}.jpg` - + // Use ./tmp folder (gitignored) instead of system temp const tmpDir = path.join(process.cwd(), 'tmp') if (!fs.existsSync(tmpDir)) { @@ -526,12 +526,20 @@ export async function screenshotWithAccessibilityLabels({ page, interactiveOnly } const screenshotPath = path.join(tmpDir, filename) - // Take screenshot - const buffer = await page.screenshot({ type: 'jpeg', quality: 80 }) - + // Get actual viewport size (innerWidth/innerHeight, not outer window size) + const viewport = await page.evaluate('(() => ({ width: window.innerWidth, height: window.innerHeight }))()') as { width: number; height: number } + + // Take screenshot clipped to actual viewport (excludes browser chrome) + const buffer = await page.screenshot({ + type: 'jpeg', + quality: 80, + scale: 'css', + clip: { x: 0, y: 0, width: viewport.width, height: viewport.height }, + }) + // Save to file fs.writeFileSync(screenshotPath, buffer) - + // Convert to base64 const base64 = buffer.toString('base64') diff --git a/playwriter/src/assets/aria-labels-google-snapshot.txt b/playwriter/src/assets/aria-labels-google-snapshot.txt index 185c501..36f4dab 100644 --- a/playwriter/src/assets/aria-labels-google-snapshot.txt +++ b/playwriter/src/assets/aria-labels-google-snapshot.txt @@ -31,7 +31,7 @@ - generic [ref=e55]: - text: "Google offered in:" - link [ref=e56] [cursor=pointer]: - - /url: https://www.google.com/setprefs?sig=0_U_LREl4THfXa2sQ-b49g0Jd45jk%3D&hl=it&source=homepage&sa=X&ved=0ahUKEwiYgJn4hfSRAxU00xoGHUTZBMEQ2ZgBCBU + - /url: https://www.google.com/setprefs?sig=0_gi5Q9KT3akeon6vbuxB8Wv_u0vw%3D&hl=it&source=homepage&sa=X&ved=0ahUKEwiG0LuSlPSRAxWiLtAFHc53GkwQ2ZgBCBU - text: Italiano - contentinfo [ref=e58]: - generic [ref=e59]: Italy diff --git a/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt b/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt index a8775a8..304978b 100644 --- a/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt +++ b/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt @@ -56,21 +56,21 @@ - link "dlp.rip" [ref=e42] [cursor=pointer]: - /url: from?site=dlp.rip - text: ) - - row "19 points by todsacerdoti 36 minutes ago | hide | 2 comments" [ref=e43]: + - row "50 points by todsacerdoti 1 hour ago | hide | 12 comments" [ref=e43]: - cell [ref=e44] - - cell "19 points by todsacerdoti 36 minutes ago | hide | 2 comments" [ref=e45]: + - cell "50 points by todsacerdoti 1 hour ago | hide | 12 comments" [ref=e45]: - generic [ref=e46]: - - text: 19 points by + - text: 50 points by - link "todsacerdoti" [ref=e47] [cursor=pointer]: - /url: user?id=todsacerdoti - generic "2026-01-05T08:29:38 1767601778" [ref=e48]: - - link "36 minutes ago" [ref=e49] [cursor=pointer]: + - link "1 hour ago" [ref=e49] [cursor=pointer]: - /url: item?id=46496494 - text: "|" - link "hide" [ref=e50] [cursor=pointer]: - /url: hide?id=46496494&goto=news - text: "|" - - link "2 comments" [ref=e51] [cursor=pointer]: + - link "12 comments" [ref=e51] [cursor=pointer]: - /url: item?id=46496494 - row [ref=e52] - 'row "2. upvote Databases in 2025: A Year in Review (cmu.edu)" [ref=e53]': @@ -88,86 +88,86 @@ - link "cmu.edu" [ref=e63] [cursor=pointer]: - /url: from?site=cmu.edu - text: ) - - row "30 points by viveknathani_ 1 hour ago | hide | 4 comments" [ref=e64]: + - row "77 points by viveknathani_ 2 hours ago | hide | 7 comments" [ref=e64]: - cell [ref=e65] - - cell "30 points by viveknathani_ 1 hour ago | hide | 4 comments" [ref=e66]: + - cell "77 points by viveknathani_ 2 hours ago | hide | 7 comments" [ref=e66]: - generic [ref=e67]: - - text: 30 points by + - text: 77 points by - link "viveknathani_" [ref=e68] [cursor=pointer]: - /url: user?id=viveknathani_ - generic "2026-01-05T07:14:30 1767597270" [ref=e69]: - - link "1 hour ago" [ref=e70] [cursor=pointer]: + - link "2 hours ago" [ref=e70] [cursor=pointer]: - /url: item?id=46496103 - text: "|" - link "hide" [ref=e71] [cursor=pointer]: - /url: hide?id=46496103&goto=news - text: "|" - - link "4 comments" [ref=e72] [cursor=pointer]: + - link "7 comments" [ref=e72] [cursor=pointer]: - /url: item?id=46496103 - row [ref=e73] - - row "3. upvote Building a Rust-style static analyzer for C++ with AI (mpaxos.com)" [ref=e74]: + - row "3. upvote A spider web unlike any seen before (nytimes.com)" [ref=e74]: - cell "3." [ref=e75] - cell "upvote" [ref=e76]: - link "upvote" [ref=e78] [cursor=pointer]: - - /url: vote?id=46495539&how=up&goto=news + - /url: vote?id=46496054&how=up&goto=news - generic "upvote" [ref=e79] - - cell "Building a Rust-style static analyzer for C++ with AI (mpaxos.com)" [ref=e80]: + - cell "A spider web unlike any seen before (nytimes.com)" [ref=e80]: - generic [ref=e81]: - - link "Building a Rust-style static analyzer for C++ with AI" [ref=e82] [cursor=pointer]: - - /url: http://mpaxos.com/blog/rusty-cpp.html + - link "A spider web unlike any seen before" [ref=e82] [cursor=pointer]: + - /url: https://www.nytimes.com/2025/11/08/science/biggest-spiderweb-sulfur-cave.html - generic [ref=e83]: - text: ( - - link "mpaxos.com" [ref=e84] [cursor=pointer]: - - /url: from?site=mpaxos.com + - link "nytimes.com" [ref=e84] [cursor=pointer]: + - /url: from?site=nytimes.com - text: ) - - row "48 points by shuaimu 3 hours ago | hide | 21 comments" [ref=e85]: + - row "63 points by juanplusjuan 3 hours ago | hide | 19 comments" [ref=e85]: - cell [ref=e86] - - cell "48 points by shuaimu 3 hours ago | hide | 21 comments" [ref=e87]: + - cell "63 points by juanplusjuan 3 hours ago | hide | 19 comments" [ref=e87]: - generic [ref=e88]: - - text: 48 points by - - link "shuaimu" [ref=e89] [cursor=pointer]: - - /url: user?id=shuaimu - - generic "2026-01-05T05:11:59 1767589919" [ref=e90]: + - text: 63 points by + - link "juanplusjuan" [ref=e89] [cursor=pointer]: + - /url: user?id=juanplusjuan + - generic "2026-01-05T07:06:22 1767596782" [ref=e90]: - link "3 hours ago" [ref=e91] [cursor=pointer]: - - /url: item?id=46495539 + - /url: item?id=46496054 - text: "|" - link "hide" [ref=e92] [cursor=pointer]: - - /url: hide?id=46495539&goto=news + - /url: hide?id=46496054&goto=news - text: "|" - - link "21 comments" [ref=e93] [cursor=pointer]: - - /url: item?id=46495539 + - link "19 comments" [ref=e93] [cursor=pointer]: + - /url: item?id=46496054 - row [ref=e94] - - row "4. upvote A spider web unlike any seen before (nytimes.com)" [ref=e95]: + - row "4. upvote Revisiting the original Roomba and its simple architecture (robotsinplainenglish.com)" [ref=e95]: - cell "4." [ref=e96] - cell "upvote" [ref=e97]: - link "upvote" [ref=e99] [cursor=pointer]: - - /url: vote?id=46496054&how=up&goto=news + - /url: vote?id=46472930&how=up&goto=news - generic "upvote" [ref=e100] - - cell "A spider web unlike any seen before (nytimes.com)" [ref=e101]: + - cell "Revisiting the original Roomba and its simple architecture (robotsinplainenglish.com)" [ref=e101]: - generic [ref=e102]: - - link "A spider web unlike any seen before" [ref=e103] [cursor=pointer]: - - /url: https://www.nytimes.com/2025/11/08/science/biggest-spiderweb-sulfur-cave.html + - link "Revisiting the original Roomba and its simple architecture" [ref=e103] [cursor=pointer]: + - /url: https://robotsinplainenglish.com/e/2025-12-27-roomba.html - generic [ref=e104]: - text: ( - - link "nytimes.com" [ref=e105] [cursor=pointer]: - - /url: from?site=nytimes.com + - link "robotsinplainenglish.com" [ref=e105] [cursor=pointer]: + - /url: from?site=robotsinplainenglish.com - text: ) - - row "28 points by juanplusjuan 1 hour ago | hide | 12 comments" [ref=e106]: + - row "15 points by ripe 1 hour ago | hide | 3 comments" [ref=e106]: - cell [ref=e107] - - cell "28 points by juanplusjuan 1 hour ago | hide | 12 comments" [ref=e108]: + - cell "15 points by ripe 1 hour ago | hide | 3 comments" [ref=e108]: - generic [ref=e109]: - - text: 28 points by - - link "juanplusjuan" [ref=e110] [cursor=pointer]: - - /url: user?id=juanplusjuan - - generic "2026-01-05T07:06:22 1767596782" [ref=e111]: + - text: 15 points by + - link "ripe" [ref=e110] [cursor=pointer]: + - /url: user?id=ripe + - generic "2026-01-03T04:53:20 1767416000" [ref=e111]: - link "1 hour ago" [ref=e112] [cursor=pointer]: - - /url: item?id=46496054 + - /url: item?id=46472930 - text: "|" - link "hide" [ref=e113] [cursor=pointer]: - - /url: hide?id=46496054&goto=news + - /url: hide?id=46472930&goto=news - text: "|" - - link "12 comments" [ref=e114] [cursor=pointer]: - - /url: item?id=46496054 + - link "3 comments" [ref=e114] [cursor=pointer]: + - /url: item?id=46472930 - row [ref=e115] - row "5. upvote Lessons from 14 years at Google (addyosmani.com)" [ref=e116]: - cell "5." [ref=e117] @@ -184,150 +184,150 @@ - link "addyosmani.com" [ref=e126] [cursor=pointer]: - /url: from?site=addyosmani.com - text: ) - - row "1195 points by cdrnsf 17 hours ago | hide | 511 comments" [ref=e127]: + - row "1247 points by cdrnsf 18 hours ago | hide | 535 comments" [ref=e127]: - cell [ref=e128] - - cell "1195 points by cdrnsf 17 hours ago | hide | 511 comments" [ref=e129]: + - cell "1247 points by cdrnsf 18 hours ago | hide | 535 comments" [ref=e129]: - generic [ref=e130]: - - text: 1195 points by + - text: 1247 points by - link "cdrnsf" [ref=e131] [cursor=pointer]: - /url: user?id=cdrnsf - generic "2026-01-04T15:23:54 1767540234" [ref=e132]: - - link "17 hours ago" [ref=e133] [cursor=pointer]: + - link "18 hours ago" [ref=e133] [cursor=pointer]: - /url: item?id=46488819 - text: "|" - link "hide" [ref=e134] [cursor=pointer]: - /url: hide?id=46488819&goto=news - text: "|" - - link "511 comments" [ref=e135] [cursor=pointer]: + - link "535 comments" [ref=e135] [cursor=pointer]: - /url: item?id=46488819 - row [ref=e136] - - 'row "6. upvote Logos Language Guide: Compile English to Rust (logicaffeine.com)" [ref=e137]': + - 'row "6. upvote Show HN: Terminal UI for AWS (github.com/huseyinbabal)" [ref=e137]': - cell "6." [ref=e138] - cell "upvote" [ref=e139]: - link "upvote" [ref=e141] [cursor=pointer]: - - /url: vote?id=46454085&how=up&goto=news + - /url: vote?id=46491749&how=up&goto=news - generic "upvote" [ref=e142] - - 'cell "Logos Language Guide: Compile English to Rust (logicaffeine.com)" [ref=e143]': + - 'cell "Show HN: Terminal UI for AWS (github.com/huseyinbabal)" [ref=e143]': - generic [ref=e144]: - - 'link "Logos Language Guide: Compile English to Rust" [ref=e145] [cursor=pointer]': - - /url: https://logicaffeine.com/guide + - 'link "Show HN: Terminal UI for AWS" [ref=e145] [cursor=pointer]': + - /url: https://github.com/huseyinbabal/taws - generic [ref=e146]: - text: ( - - link "logicaffeine.com" [ref=e147] [cursor=pointer]: - - /url: from?site=logicaffeine.com + - link "github.com/huseyinbabal" [ref=e147] [cursor=pointer]: + - /url: from?site=github.com/huseyinbabal - text: ) - - row "35 points by tristenharr 4 hours ago | hide | 16 comments" [ref=e148]: + - row "310 points by huseyinbabal 13 hours ago | hide | 154 comments" [ref=e148]: - cell [ref=e149] - - cell "35 points by tristenharr 4 hours ago | hide | 16 comments" [ref=e150]: + - cell "310 points by huseyinbabal 13 hours ago | hide | 154 comments" [ref=e150]: - generic [ref=e151]: - - text: 35 points by - - link "tristenharr" [ref=e152] [cursor=pointer]: - - /url: user?id=tristenharr - - generic "2026-01-01T13:48:27 1767275307" [ref=e153]: - - link "4 hours ago" [ref=e154] [cursor=pointer]: - - /url: item?id=46454085 + - text: 310 points by + - link "huseyinbabal" [ref=e152] [cursor=pointer]: + - /url: user?id=huseyinbabal + - generic "2026-01-04T20:17:22 1767557842" [ref=e153]: + - link "13 hours ago" [ref=e154] [cursor=pointer]: + - /url: item?id=46491749 - text: "|" - link "hide" [ref=e155] [cursor=pointer]: - - /url: hide?id=46454085&goto=news + - /url: hide?id=46491749&goto=news - text: "|" - - link "16 comments" [ref=e156] [cursor=pointer]: - - /url: item?id=46454085 + - link "154 comments" [ref=e156] [cursor=pointer]: + - /url: item?id=46491749 - row [ref=e157] - - 'row "7. upvote Show HN: Terminal UI for AWS (github.com/huseyinbabal)" [ref=e158]': + - row "7. upvote During Helene, I just wanted a plain text website (sparkbox.com)" [ref=e158]: - cell "7." [ref=e159] - cell "upvote" [ref=e160]: - link "upvote" [ref=e162] [cursor=pointer]: - - /url: vote?id=46491749&how=up&goto=news + - /url: vote?id=46494734&how=up&goto=news - generic "upvote" [ref=e163] - - 'cell "Show HN: Terminal UI for AWS (github.com/huseyinbabal)" [ref=e164]': + - cell "During Helene, I just wanted a plain text website (sparkbox.com)" [ref=e164]: - generic [ref=e165]: - - 'link "Show HN: Terminal UI for AWS" [ref=e166] [cursor=pointer]': - - /url: https://github.com/huseyinbabal/taws + - link "During Helene, I just wanted a plain text website" [ref=e166] [cursor=pointer]: + - /url: https://sparkbox.com/foundry/helene_and_mobile_web_performance - generic [ref=e167]: - text: ( - - link "github.com/huseyinbabal" [ref=e168] [cursor=pointer]: - - /url: from?site=github.com/huseyinbabal + - link "sparkbox.com" [ref=e168] [cursor=pointer]: + - /url: from?site=sparkbox.com - text: ) - - row "295 points by huseyinbabal 12 hours ago | hide | 149 comments" [ref=e169]: + - row "201 points by CqtGLRGcukpy 7 hours ago | hide | 102 comments" [ref=e169]: - cell [ref=e170] - - cell "295 points by huseyinbabal 12 hours ago | hide | 149 comments" [ref=e171]: + - cell "201 points by CqtGLRGcukpy 7 hours ago | hide | 102 comments" [ref=e171]: - generic [ref=e172]: - - text: 295 points by - - link "huseyinbabal" [ref=e173] [cursor=pointer]: - - /url: user?id=huseyinbabal - - generic "2026-01-04T20:17:22 1767557842" [ref=e174]: - - link "12 hours ago" [ref=e175] [cursor=pointer]: - - /url: item?id=46491749 + - text: 201 points by + - link "CqtGLRGcukpy" [ref=e173] [cursor=pointer]: + - /url: user?id=CqtGLRGcukpy + - generic "2026-01-05T02:36:20 1767580580" [ref=e174]: + - link "7 hours ago" [ref=e175] [cursor=pointer]: + - /url: item?id=46494734 - text: "|" - link "hide" [ref=e176] [cursor=pointer]: - - /url: hide?id=46491749&goto=news + - /url: hide?id=46494734&goto=news - text: "|" - - link "149 comments" [ref=e177] [cursor=pointer]: - - /url: item?id=46491749 + - link "102 comments" [ref=e177] [cursor=pointer]: + - /url: item?id=46494734 - row [ref=e178] - - row "8. upvote During Helene, I just wanted a plain text website (sparkbox.com)" [ref=e179]: + - row "8. upvote The unbearable joy of sitting alone in a café (candost.blog)" [ref=e179]: - cell "8." [ref=e180] - cell "upvote" [ref=e181]: - link "upvote" [ref=e183] [cursor=pointer]: - - /url: vote?id=46494734&how=up&goto=news + - /url: vote?id=46488355&how=up&goto=news - generic "upvote" [ref=e184] - - cell "During Helene, I just wanted a plain text website (sparkbox.com)" [ref=e185]: + - cell "The unbearable joy of sitting alone in a café (candost.blog)" [ref=e185]: - generic [ref=e186]: - - link "During Helene, I just wanted a plain text website" [ref=e187] [cursor=pointer]: - - /url: https://sparkbox.com/foundry/helene_and_mobile_web_performance + - link "The unbearable joy of sitting alone in a café" [ref=e187] [cursor=pointer]: + - /url: https://candost.blog/the-unbearable-joy-of-sitting-alone-in-a-cafe/ - generic [ref=e188]: - text: ( - - link "sparkbox.com" [ref=e189] [cursor=pointer]: - - /url: from?site=sparkbox.com + - link "candost.blog" [ref=e189] [cursor=pointer]: + - /url: from?site=candost.blog - text: ) - - row "182 points by CqtGLRGcukpy 6 hours ago | hide | 90 comments" [ref=e190]: + - row "620 points by mooreds 19 hours ago | hide | 370 comments" [ref=e190]: - cell [ref=e191] - - cell "182 points by CqtGLRGcukpy 6 hours ago | hide | 90 comments" [ref=e192]: + - cell "620 points by mooreds 19 hours ago | hide | 370 comments" [ref=e192]: - generic [ref=e193]: - - text: 182 points by - - link "CqtGLRGcukpy" [ref=e194] [cursor=pointer]: - - /url: user?id=CqtGLRGcukpy - - generic "2026-01-05T02:36:20 1767580580" [ref=e195]: - - link "6 hours ago" [ref=e196] [cursor=pointer]: - - /url: item?id=46494734 + - text: 620 points by + - link "mooreds" [ref=e194] [cursor=pointer]: + - /url: user?id=mooreds + - generic "2026-01-04T14:37:58 1767537478" [ref=e195]: + - link "19 hours ago" [ref=e196] [cursor=pointer]: + - /url: item?id=46488355 - text: "|" - link "hide" [ref=e197] [cursor=pointer]: - - /url: hide?id=46494734&goto=news + - /url: hide?id=46488355&goto=news - text: "|" - - link "90 comments" [ref=e198] [cursor=pointer]: - - /url: item?id=46494734 + - link "370 comments" [ref=e198] [cursor=pointer]: + - /url: item?id=46488355 - row [ref=e199] - - row "9. upvote The unbearable joy of sitting alone in a café (candost.blog)" [ref=e200]: + - 'row "9. upvote Logos Language Guide: Compile English to Rust (logicaffeine.com)" [ref=e200]': - cell "9." [ref=e201] - cell "upvote" [ref=e202]: - link "upvote" [ref=e204] [cursor=pointer]: - - /url: vote?id=46488355&how=up&goto=news + - /url: vote?id=46454085&how=up&goto=news - generic "upvote" [ref=e205] - - cell "The unbearable joy of sitting alone in a café (candost.blog)" [ref=e206]: + - 'cell "Logos Language Guide: Compile English to Rust (logicaffeine.com)" [ref=e206]': - generic [ref=e207]: - - link "The unbearable joy of sitting alone in a café" [ref=e208] [cursor=pointer]: - - /url: https://candost.blog/the-unbearable-joy-of-sitting-alone-in-a-cafe/ + - 'link "Logos Language Guide: Compile English to Rust" [ref=e208] [cursor=pointer]': + - /url: https://logicaffeine.com/guide - generic [ref=e209]: - text: ( - - link "candost.blog" [ref=e210] [cursor=pointer]: - - /url: from?site=candost.blog + - link "logicaffeine.com" [ref=e210] [cursor=pointer]: + - /url: from?site=logicaffeine.com - text: ) - - row "600 points by mooreds 18 hours ago | hide | 346 comments" [ref=e211]: + - row "38 points by tristenharr 5 hours ago | hide | 19 comments" [ref=e211]: - cell [ref=e212] - - cell "600 points by mooreds 18 hours ago | hide | 346 comments" [ref=e213]: + - cell "38 points by tristenharr 5 hours ago | hide | 19 comments" [ref=e213]: - generic [ref=e214]: - - text: 600 points by - - link "mooreds" [ref=e215] [cursor=pointer]: - - /url: user?id=mooreds - - generic "2026-01-04T14:37:58 1767537478" [ref=e216]: - - link "18 hours ago" [ref=e217] [cursor=pointer]: - - /url: item?id=46488355 + - text: 38 points by + - link "tristenharr" [ref=e215] [cursor=pointer]: + - /url: user?id=tristenharr + - generic "2026-01-01T13:48:27 1767275307" [ref=e216]: + - link "5 hours ago" [ref=e217] [cursor=pointer]: + - /url: item?id=46454085 - text: "|" - link "hide" [ref=e218] [cursor=pointer]: - - /url: hide?id=46488355&goto=news + - /url: hide?id=46454085&goto=news - text: "|" - - link "346 comments" [ref=e219] [cursor=pointer]: - - /url: item?id=46488355 + - link "19 comments" [ref=e219] [cursor=pointer]: + - /url: item?id=46454085 - row [ref=e220] - row "10. upvote Why does a least squares fit appear to have a bias when applied to simple data? (stats.stackexchange.com)" [ref=e221]: - cell "10." [ref=e222] @@ -344,21 +344,21 @@ - link "stats.stackexchange.com" [ref=e231] [cursor=pointer]: - /url: from?site=stats.stackexchange.com - text: ) - - row "230 points by azeemba 12 hours ago | hide | 60 comments" [ref=e232]: + - row "243 points by azeemba 13 hours ago | hide | 64 comments" [ref=e232]: - cell [ref=e233] - - cell "230 points by azeemba 12 hours ago | hide | 60 comments" [ref=e234]: + - cell "243 points by azeemba 13 hours ago | hide | 64 comments" [ref=e234]: - generic [ref=e235]: - - text: 230 points by + - text: 243 points by - link "azeemba" [ref=e236] [cursor=pointer]: - /url: user?id=azeemba - generic "2026-01-04T20:25:30 1767558330" [ref=e237]: - - link "12 hours ago" [ref=e238] [cursor=pointer]: + - link "13 hours ago" [ref=e238] [cursor=pointer]: - /url: item?id=46491821 - text: "|" - link "hide" [ref=e239] [cursor=pointer]: - /url: hide?id=46491821&goto=news - text: "|" - - link "60 comments" [ref=e240] [cursor=pointer]: + - link "64 comments" [ref=e240] [cursor=pointer]: - /url: item?id=46491821 - row [ref=e241] - row "11. upvote Street Fighter II, the World Warrier (2021) (fabiensanglard.net)" [ref=e242]: @@ -376,663 +376,669 @@ - link "fabiensanglard.net" [ref=e252] [cursor=pointer]: - /url: from?site=fabiensanglard.net - text: ) - - row "371 points by birdculture 18 hours ago | hide | 63 comments" [ref=e253]: + - row "380 points by birdculture 19 hours ago | hide | 67 comments" [ref=e253]: - cell [ref=e254] - - cell "371 points by birdculture 18 hours ago | hide | 63 comments" [ref=e255]: + - cell "380 points by birdculture 19 hours ago | hide | 67 comments" [ref=e255]: - generic [ref=e256]: - - text: 371 points by + - text: 380 points by - link "birdculture" [ref=e257] [cursor=pointer]: - /url: user?id=birdculture - generic "2026-01-04T14:30:29 1767537029" [ref=e258]: - - link "18 hours ago" [ref=e259] [cursor=pointer]: + - link "19 hours ago" [ref=e259] [cursor=pointer]: - /url: item?id=46488278 - text: "|" - link "hide" [ref=e260] [cursor=pointer]: - /url: hide?id=46488278&goto=news - text: "|" - - link "63 comments" [ref=e261] [cursor=pointer]: + - link "67 comments" [ref=e261] [cursor=pointer]: - /url: item?id=46488278 - row [ref=e262] - - row "12. upvote I charged $18k for a Static HTML Page (2019) (idiallo.com)" [ref=e263]: + - row "12. upvote Why Microsoft Store Discontinued Support for Office Apps (bgr.com)" [ref=e263]: - cell "12." [ref=e264] - cell "upvote" [ref=e265]: - link "upvote" [ref=e267] [cursor=pointer]: - - /url: vote?id=46469877&how=up&goto=news + - /url: vote?id=46454824&how=up&goto=news - generic "upvote" [ref=e268] - - cell "I charged $18k for a Static HTML Page (2019) (idiallo.com)" [ref=e269]: + - cell "Why Microsoft Store Discontinued Support for Office Apps (bgr.com)" [ref=e269]: - generic [ref=e270]: - - link "I charged $18k for a Static HTML Page (2019)" [ref=e271] [cursor=pointer]: - - /url: https://idiallo.com/blog/18000-dollars-static-web-page + - link "Why Microsoft Store Discontinued Support for Office Apps" [ref=e271] [cursor=pointer]: + - /url: https://www.bgr.com/2027774/why-microsoft-store-discontinued-office-support/ - generic [ref=e272]: - text: ( - - link "idiallo.com" [ref=e273] [cursor=pointer]: - - /url: from?site=idiallo.com + - link "bgr.com" [ref=e273] [cursor=pointer]: + - /url: from?site=bgr.com - text: ) - - row "273 points by caminanteblanco 15 hours ago | hide | 68 comments" [ref=e274]: + - row "23 points by itronitron 5 hours ago | hide | 16 comments" [ref=e274]: - cell [ref=e275] - - cell "273 points by caminanteblanco 15 hours ago | hide | 68 comments" [ref=e276]: + - cell "23 points by itronitron 5 hours ago | hide | 16 comments" [ref=e276]: - generic [ref=e277]: - - text: 273 points by - - link "caminanteblanco" [ref=e278] [cursor=pointer]: - - /url: user?id=caminanteblanco - - generic "2026-01-02T21:54:56 1767390896" [ref=e279]: - - link "15 hours ago" [ref=e280] [cursor=pointer]: - - /url: item?id=46469877 + - text: 23 points by + - link "itronitron" [ref=e278] [cursor=pointer]: + - /url: user?id=itronitron + - generic "2026-01-01T15:27:28 1767281248" [ref=e279]: + - link "5 hours ago" [ref=e280] [cursor=pointer]: + - /url: item?id=46454824 - text: "|" - link "hide" [ref=e281] [cursor=pointer]: - - /url: hide?id=46469877&goto=news + - /url: hide?id=46454824&goto=news - text: "|" - - link "68 comments" [ref=e282] [cursor=pointer]: - - /url: item?id=46469877 + - link "16 comments" [ref=e282] [cursor=pointer]: + - /url: item?id=46454824 - row [ref=e283] - - 'row "13. upvote Monads in C# (Part 2): Result (alexyorke.github.io)" [ref=e284]': + - row "13. upvote I charged $18k for a Static HTML Page (2019) (idiallo.com)" [ref=e284]: - cell "13." [ref=e285] - cell "upvote" [ref=e286]: - link "upvote" [ref=e288] [cursor=pointer]: - - /url: vote?id=46456787&how=up&goto=news + - /url: vote?id=46469877&how=up&goto=news - generic "upvote" [ref=e289] - - 'cell "Monads in C# (Part 2): Result (alexyorke.github.io)" [ref=e290]': + - cell "I charged $18k for a Static HTML Page (2019) (idiallo.com)" [ref=e290]: - generic [ref=e291]: - - 'link "Monads in C# (Part 2): Result" [ref=e292] [cursor=pointer]': - - /url: https://alexyorke.github.io/2025/09/13/monads-in-c-sharp-part-2-result/ + - link "I charged $18k for a Static HTML Page (2019)" [ref=e292] [cursor=pointer]: + - /url: https://idiallo.com/blog/18000-dollars-static-web-page - generic [ref=e293]: - text: ( - - link "alexyorke.github.io" [ref=e294] [cursor=pointer]: - - /url: from?site=alexyorke.github.io + - link "idiallo.com" [ref=e294] [cursor=pointer]: + - /url: from?site=idiallo.com - text: ) - - row "15 points by polygot 3 hours ago | hide | 11 comments" [ref=e295]: + - row "286 points by caminanteblanco 16 hours ago | hide | 72 comments" [ref=e295]: - cell [ref=e296] - - cell "15 points by polygot 3 hours ago | hide | 11 comments" [ref=e297]: + - cell "286 points by caminanteblanco 16 hours ago | hide | 72 comments" [ref=e297]: - generic [ref=e298]: - - text: 15 points by - - link "polygot" [ref=e299] [cursor=pointer]: - - /url: user?id=polygot - - generic "2026-01-01T18:45:02 1767293102" [ref=e300]: - - link "3 hours ago" [ref=e301] [cursor=pointer]: - - /url: item?id=46456787 + - text: 286 points by + - link "caminanteblanco" [ref=e299] [cursor=pointer]: + - /url: user?id=caminanteblanco + - generic "2026-01-02T21:54:56 1767390896" [ref=e300]: + - link "16 hours ago" [ref=e301] [cursor=pointer]: + - /url: item?id=46469877 - text: "|" - link "hide" [ref=e302] [cursor=pointer]: - - /url: hide?id=46456787&goto=news + - /url: hide?id=46469877&goto=news - text: "|" - - link "11 comments" [ref=e303] [cursor=pointer]: - - /url: item?id=46456787 + - link "72 comments" [ref=e303] [cursor=pointer]: + - /url: item?id=46469877 - row [ref=e304] - - row "14. upvote Baffling purple honey found only in North Carolina (bbc.com)" [ref=e305]: + - row "14. upvote Building a Rust-style static analyzer for C++ with AI (mpaxos.com)" [ref=e305]: - cell "14." [ref=e306] - cell "upvote" [ref=e307]: - link "upvote" [ref=e309] [cursor=pointer]: - - /url: vote?id=46448356&how=up&goto=news + - /url: vote?id=46495539&how=up&goto=news - generic "upvote" [ref=e310] - - cell "Baffling purple honey found only in North Carolina (bbc.com)" [ref=e311]: + - cell "Building a Rust-style static analyzer for C++ with AI (mpaxos.com)" [ref=e311]: - generic [ref=e312]: - - link "Baffling purple honey found only in North Carolina" [ref=e313] [cursor=pointer]: - - /url: https://www.bbc.com/travel/article/20250417-the-baffling-purple-honey-found-only-in-north-carolina + - link "Building a Rust-style static analyzer for C++ with AI" [ref=e313] [cursor=pointer]: + - /url: http://mpaxos.com/blog/rusty-cpp.html - generic [ref=e314]: - text: ( - - link "bbc.com" [ref=e315] [cursor=pointer]: - - /url: from?site=bbc.com + - link "mpaxos.com" [ref=e315] [cursor=pointer]: + - /url: from?site=mpaxos.com - text: ) - - row "70 points by rmason 6 hours ago | hide | 19 comments" [ref=e316]: + - row "56 points by shuaimu 4 hours ago | hide | 25 comments" [ref=e316]: - cell [ref=e317] - - cell "70 points by rmason 6 hours ago | hide | 19 comments" [ref=e318]: + - cell "56 points by shuaimu 4 hours ago | hide | 25 comments" [ref=e318]: - generic [ref=e319]: - - text: 70 points by - - link "rmason" [ref=e320] [cursor=pointer]: - - /url: user?id=rmason - - generic "2025-12-31T21:06:16 1767215176" [ref=e321]: - - link "6 hours ago" [ref=e322] [cursor=pointer]: - - /url: item?id=46448356 + - text: 56 points by + - link "shuaimu" [ref=e320] [cursor=pointer]: + - /url: user?id=shuaimu + - generic "2026-01-05T05:11:59 1767589919" [ref=e321]: + - link "4 hours ago" [ref=e322] [cursor=pointer]: + - /url: item?id=46495539 - text: "|" - link "hide" [ref=e323] [cursor=pointer]: - - /url: hide?id=46448356&goto=news + - /url: hide?id=46495539&goto=news - text: "|" - - link "19 comments" [ref=e324] [cursor=pointer]: - - /url: item?id=46448356 + - link "25 comments" [ref=e324] [cursor=pointer]: + - /url: item?id=46495539 - row [ref=e325] - - row "15. upvote Inducing self-NSFW classification in image models to prevent deepfakes edits" [ref=e326]: + - row "15. upvote Baffling purple honey found only in North Carolina (bbc.com)" [ref=e326]: - cell "15." [ref=e327] - cell "upvote" [ref=e328]: - link "upvote" [ref=e330] [cursor=pointer]: - - /url: vote?id=46496357&how=up&goto=news + - /url: vote?id=46448356&how=up&goto=news - generic "upvote" [ref=e331] - - cell "Inducing self-NSFW classification in image models to prevent deepfakes edits" [ref=e332]: - - link "Inducing self-NSFW classification in image models to prevent deepfakes edits" [ref=e334] [cursor=pointer]: - - /url: item?id=46496357 - - row "12 points by Genesis_rish 36 minutes ago | hide | 2 comments" [ref=e335]: - - cell [ref=e336] - - cell "12 points by Genesis_rish 36 minutes ago | hide | 2 comments" [ref=e337]: - - generic [ref=e338]: - - text: 12 points by - - link "Genesis_rish" [ref=e339] [cursor=pointer]: - - /url: user?id=Genesis_rish - - generic "2026-01-05T08:02:01 1767600121" [ref=e340]: - - link "36 minutes ago" [ref=e341] [cursor=pointer]: - - /url: item?id=46496357 - - text: "|" - - link "hide" [ref=e342] [cursor=pointer]: - - /url: hide?id=46496357&goto=news - - text: "|" - - link "2 comments" [ref=e343] [cursor=pointer]: - - /url: item?id=46496357 - - row [ref=e344] - - row "16. upvote ICE Is Using Facial-Recognition Technology to Quickly Arrest People (wsj.com)" [ref=e345]: - - cell "16." [ref=e346] - - cell "upvote" [ref=e347]: - - link "upvote" [ref=e349] [cursor=pointer]: - - /url: vote?id=46495560&how=up&goto=news - - generic "upvote" [ref=e350] - - cell "ICE Is Using Facial-Recognition Technology to Quickly Arrest People (wsj.com)" [ref=e351]: - - generic [ref=e352]: - - link "ICE Is Using Facial-Recognition Technology to Quickly Arrest People" [ref=e353] [cursor=pointer]: - - /url: https://www.wsj.com/politics/policy/ice-facial-recognition-app-mobile-fortify-dfdd00bf - - generic [ref=e354]: + - cell "Baffling purple honey found only in North Carolina (bbc.com)" [ref=e332]: + - generic [ref=e333]: + - link "Baffling purple honey found only in North Carolina" [ref=e334] [cursor=pointer]: + - /url: https://www.bbc.com/travel/article/20250417-the-baffling-purple-honey-found-only-in-north-carolina + - generic [ref=e335]: - text: ( - - link "wsj.com" [ref=e355] [cursor=pointer]: - - /url: from?site=wsj.com + - link "bbc.com" [ref=e336] [cursor=pointer]: + - /url: from?site=bbc.com - text: ) - - row "96 points by KnuthIsGod 3 hours ago | hide | 42 comments" [ref=e356]: - - cell [ref=e357] - - cell "96 points by KnuthIsGod 3 hours ago | hide | 42 comments" [ref=e358]: - - generic [ref=e359]: - - text: 96 points by - - link "KnuthIsGod" [ref=e360] [cursor=pointer]: - - /url: user?id=KnuthIsGod - - generic "2026-01-05T05:16:37 1767590197" [ref=e361]: - - link "3 hours ago" [ref=e362] [cursor=pointer]: - - /url: item?id=46495560 + - row "77 points by rmason 7 hours ago | hide | 20 comments" [ref=e337]: + - cell [ref=e338] + - cell "77 points by rmason 7 hours ago | hide | 20 comments" [ref=e339]: + - generic [ref=e340]: + - text: 77 points by + - link "rmason" [ref=e341] [cursor=pointer]: + - /url: user?id=rmason + - generic "2025-12-31T21:06:16 1767215176" [ref=e342]: + - link "7 hours ago" [ref=e343] [cursor=pointer]: + - /url: item?id=46448356 - text: "|" - - link "hide" [ref=e363] [cursor=pointer]: - - /url: hide?id=46495560&goto=news + - link "hide" [ref=e344] [cursor=pointer]: + - /url: hide?id=46448356&goto=news - text: "|" - - link "42 comments" [ref=e364] [cursor=pointer]: - - /url: item?id=46495560 - - row [ref=e365] - - row "17. upvote Claude Code On-the-Go (granda.org)" [ref=e366]: - - cell "17." [ref=e367] - - cell "upvote" [ref=e368]: - - link "upvote" [ref=e370] [cursor=pointer]: - - /url: vote?id=46491486&how=up&goto=news - - generic "upvote" [ref=e371] - - cell "Claude Code On-the-Go (granda.org)" [ref=e372]: - - generic [ref=e373]: - - link "Claude Code On-the-Go" [ref=e374] [cursor=pointer]: - - /url: https://granda.org/en/2026/01/02/claude-code-on-the-go/ - - generic [ref=e375]: + - link "20 comments" [ref=e345] [cursor=pointer]: + - /url: item?id=46448356 + - row [ref=e346] + - 'row "16. upvote Monads in C# (Part 2): Result (alexyorke.github.io)" [ref=e347]': + - cell "16." [ref=e348] + - cell "upvote" [ref=e349]: + - link "upvote" [ref=e351] [cursor=pointer]: + - /url: vote?id=46456787&how=up&goto=news + - generic "upvote" [ref=e352] + - 'cell "Monads in C# (Part 2): Result (alexyorke.github.io)" [ref=e353]': + - generic [ref=e354]: + - 'link "Monads in C# (Part 2): Result" [ref=e355] [cursor=pointer]': + - /url: https://alexyorke.github.io/2025/09/13/monads-in-c-sharp-part-2-result/ + - generic [ref=e356]: - text: ( - - link "granda.org" [ref=e376] [cursor=pointer]: - - /url: from?site=granda.org + - link "alexyorke.github.io" [ref=e357] [cursor=pointer]: + - /url: from?site=alexyorke.github.io - text: ) - - row "308 points by todsacerdoti 12 hours ago | hide | 193 comments" [ref=e377]: - - cell [ref=e378] - - cell "308 points by todsacerdoti 12 hours ago | hide | 193 comments" [ref=e379]: - - generic [ref=e380]: - - text: 308 points by - - link "todsacerdoti" [ref=e381] [cursor=pointer]: - - /url: user?id=todsacerdoti - - generic "2026-01-04T19:48:20 1767556100" [ref=e382]: - - link "12 hours ago" [ref=e383] [cursor=pointer]: - - /url: item?id=46491486 + - row "21 points by polygot 4 hours ago | hide | 18 comments" [ref=e358]: + - cell [ref=e359] + - cell "21 points by polygot 4 hours ago | hide | 18 comments" [ref=e360]: + - generic [ref=e361]: + - text: 21 points by + - link "polygot" [ref=e362] [cursor=pointer]: + - /url: user?id=polygot + - generic "2026-01-01T18:45:02 1767293102" [ref=e363]: + - link "4 hours ago" [ref=e364] [cursor=pointer]: + - /url: item?id=46456787 - text: "|" - - link "hide" [ref=e384] [cursor=pointer]: - - /url: hide?id=46491486&goto=news + - link "hide" [ref=e365] [cursor=pointer]: + - /url: hide?id=46456787&goto=news - text: "|" - - link "193 comments" [ref=e385] [cursor=pointer]: - - /url: item?id=46491486 - - row [ref=e386] - - row "18. upvote Web development is fun again (ma.ttias.be)" [ref=e387]: - - cell "18." [ref=e388] - - cell "upvote" [ref=e389]: - - link "upvote" [ref=e391] [cursor=pointer]: + - link "18 comments" [ref=e366] [cursor=pointer]: + - /url: item?id=46456787 + - row [ref=e367] + - row "17. upvote Web development is fun again (ma.ttias.be)" [ref=e368]: + - cell "17." [ref=e369] + - cell "upvote" [ref=e370]: + - link "upvote" [ref=e372] [cursor=pointer]: - /url: vote?id=46488576&how=up&goto=news - - generic "upvote" [ref=e392] - - cell "Web development is fun again (ma.ttias.be)" [ref=e393]: - - generic [ref=e394]: - - link "Web development is fun again" [ref=e395] [cursor=pointer]: + - generic "upvote" [ref=e373] + - cell "Web development is fun again (ma.ttias.be)" [ref=e374]: + - generic [ref=e375]: + - link "Web development is fun again" [ref=e376] [cursor=pointer]: - /url: https://ma.ttias.be/web-development-is-fun-again/ - - generic [ref=e396]: + - generic [ref=e377]: - text: ( - - link "ma.ttias.be" [ref=e397] [cursor=pointer]: + - link "ma.ttias.be" [ref=e378] [cursor=pointer]: - /url: from?site=ma.ttias.be - text: ) - - row "373 points by Mojah 18 hours ago | hide | 466 comments" [ref=e398]: - - cell [ref=e399] - - cell "373 points by Mojah 18 hours ago | hide | 466 comments" [ref=e400]: - - generic [ref=e401]: - - text: 373 points by - - link "Mojah" [ref=e402] [cursor=pointer]: + - row "389 points by Mojah 19 hours ago | hide | 485 comments" [ref=e379]: + - cell [ref=e380] + - cell "389 points by Mojah 19 hours ago | hide | 485 comments" [ref=e381]: + - generic [ref=e382]: + - text: 389 points by + - link "Mojah" [ref=e383] [cursor=pointer]: - /url: user?id=Mojah - - generic "2026-01-04T15:00:18 1767538818" [ref=e403]: - - link "18 hours ago" [ref=e404] [cursor=pointer]: + - generic "2026-01-04T15:00:18 1767538818" [ref=e384]: + - link "19 hours ago" [ref=e385] [cursor=pointer]: - /url: item?id=46488576 - text: "|" - - link "hide" [ref=e405] [cursor=pointer]: + - link "hide" [ref=e386] [cursor=pointer]: - /url: hide?id=46488576&goto=news - text: "|" - - link "466 comments" [ref=e406] [cursor=pointer]: + - link "485 comments" [ref=e387] [cursor=pointer]: - /url: item?id=46488576 - - row [ref=e407] - - 'row "19. upvote How to translate a ROM: The mysteries of the game cartridge [video] (youtube.com)" [ref=e408]': - - cell "19." [ref=e409] - - cell "upvote" [ref=e410]: - - link "upvote" [ref=e412] [cursor=pointer]: + - row [ref=e388] + - 'row "18. upvote How to translate a ROM: The mysteries of the game cartridge [video] (youtube.com)" [ref=e389]': + - cell "18." [ref=e390] + - cell "upvote" [ref=e391]: + - link "upvote" [ref=e393] [cursor=pointer]: - /url: vote?id=46440188&how=up&goto=news - - generic "upvote" [ref=e413] - - 'cell "How to translate a ROM: The mysteries of the game cartridge [video] (youtube.com)" [ref=e414]': - - generic [ref=e415]: - - 'link "How to translate a ROM: The mysteries of the game cartridge [video]" [ref=e416] [cursor=pointer]': + - generic "upvote" [ref=e394] + - 'cell "How to translate a ROM: The mysteries of the game cartridge [video] (youtube.com)" [ref=e395]': + - generic [ref=e396]: + - 'link "How to translate a ROM: The mysteries of the game cartridge [video]" [ref=e397] [cursor=pointer]': - /url: https://www.youtube.com/watch?v=XDg73E1n5-g - - generic [ref=e417]: + - generic [ref=e398]: - text: ( - - link "youtube.com" [ref=e418] [cursor=pointer]: + - link "youtube.com" [ref=e399] [cursor=pointer]: - /url: from?site=youtube.com - text: ) - - row "14 points by zdw 5 hours ago | hide | discuss" [ref=e419]: - - cell [ref=e420] - - cell "14 points by zdw 5 hours ago | hide | discuss" [ref=e421]: - - generic [ref=e422]: - - text: 14 points by - - link "zdw" [ref=e423] [cursor=pointer]: + - row "18 points by zdw 6 hours ago | hide | discuss" [ref=e400]: + - cell [ref=e401] + - cell "18 points by zdw 6 hours ago | hide | discuss" [ref=e402]: + - generic [ref=e403]: + - text: 18 points by + - link "zdw" [ref=e404] [cursor=pointer]: - /url: user?id=zdw - - generic "2025-12-31T01:10:05 1767143405" [ref=e424]: - - link "5 hours ago" [ref=e425] [cursor=pointer]: + - generic "2025-12-31T01:10:05 1767143405" [ref=e405]: + - link "6 hours ago" [ref=e406] [cursor=pointer]: - /url: item?id=46440188 - text: "|" - - link "hide" [ref=e426] [cursor=pointer]: + - link "hide" [ref=e407] [cursor=pointer]: - /url: hide?id=46440188&goto=news - text: "|" - - link "discuss" [ref=e427] [cursor=pointer]: + - link "discuss" [ref=e408] [cursor=pointer]: - /url: item?id=46440188 - - row [ref=e428] - - 'row "20. upvote Show HN: An interactive guide to how browsers work (howbrowserswork.com)" [ref=e429]': - - cell "20." [ref=e430] - - cell "upvote" [ref=e431]: - - link "upvote" [ref=e433] [cursor=pointer]: + - row [ref=e409] + - 'row "19. upvote Show HN: An interactive guide to how browsers work (howbrowserswork.com)" [ref=e410]': + - cell "19." [ref=e411] + - cell "upvote" [ref=e412]: + - link "upvote" [ref=e414] [cursor=pointer]: - /url: vote?id=46488654&how=up&goto=news - - generic "upvote" [ref=e434] - - 'cell "Show HN: An interactive guide to how browsers work (howbrowserswork.com)" [ref=e435]': - - generic [ref=e436]: - - 'link "Show HN: An interactive guide to how browsers work" [ref=e437] [cursor=pointer]': + - generic "upvote" [ref=e415] + - 'cell "Show HN: An interactive guide to how browsers work (howbrowserswork.com)" [ref=e416]': + - generic [ref=e417]: + - 'link "Show HN: An interactive guide to how browsers work" [ref=e418] [cursor=pointer]': - /url: https://howbrowserswork.com/ - - generic [ref=e438]: + - generic [ref=e419]: - text: ( - - link "howbrowserswork.com" [ref=e439] [cursor=pointer]: + - link "howbrowserswork.com" [ref=e420] [cursor=pointer]: - /url: from?site=howbrowserswork.com - text: ) - - row "227 points by krasun 17 hours ago | hide | 33 comments" [ref=e440]: - - cell [ref=e441] - - cell "227 points by krasun 17 hours ago | hide | 33 comments" [ref=e442]: - - generic [ref=e443]: - - text: 227 points by - - link "krasun" [ref=e444] [cursor=pointer]: + - row "231 points by krasun 19 hours ago | hide | 33 comments" [ref=e421]: + - cell [ref=e422] + - cell "231 points by krasun 19 hours ago | hide | 33 comments" [ref=e423]: + - generic [ref=e424]: + - text: 231 points by + - link "krasun" [ref=e425] [cursor=pointer]: - /url: user?id=krasun - - generic "2026-01-04T15:08:02 1767539282" [ref=e445]: - - link "17 hours ago" [ref=e446] [cursor=pointer]: + - generic "2026-01-04T15:08:02 1767539282" [ref=e426]: + - link "19 hours ago" [ref=e427] [cursor=pointer]: - /url: item?id=46488654 - text: "|" - - link "hide" [ref=e447] [cursor=pointer]: + - link "hide" [ref=e428] [cursor=pointer]: - /url: hide?id=46488654&goto=news - text: "|" - - link "33 comments" [ref=e448] [cursor=pointer]: + - link "33 comments" [ref=e429] [cursor=pointer]: - /url: item?id=46488654 - - row [ref=e449] - - row "21. upvote Why Microsoft Store Discontinued Support for Office Apps (bgr.com)" [ref=e450]: - - cell "21." [ref=e451] - - cell "upvote" [ref=e452]: - - link "upvote" [ref=e454] [cursor=pointer]: - - /url: vote?id=46454824&how=up&goto=news - - generic "upvote" [ref=e455] - - cell "Why Microsoft Store Discontinued Support for Office Apps (bgr.com)" [ref=e456]: - - generic [ref=e457]: - - link "Why Microsoft Store Discontinued Support for Office Apps" [ref=e458] [cursor=pointer]: - - /url: https://www.bgr.com/2027774/why-microsoft-store-discontinued-office-support/ - - generic [ref=e459]: - - text: ( - - link "bgr.com" [ref=e460] [cursor=pointer]: - - /url: from?site=bgr.com - - text: ) - - row "11 points by itronitron 4 hours ago | hide | 5 comments" [ref=e461]: - - cell [ref=e462] - - cell "11 points by itronitron 4 hours ago | hide | 5 comments" [ref=e463]: - - generic [ref=e464]: - - text: 11 points by - - link "itronitron" [ref=e465] [cursor=pointer]: - - /url: user?id=itronitron - - generic "2026-01-01T15:27:28 1767281248" [ref=e466]: - - link "4 hours ago" [ref=e467] [cursor=pointer]: - - /url: item?id=46454824 - - text: "|" - - link "hide" [ref=e468] [cursor=pointer]: - - /url: hide?id=46454824&goto=news - - text: "|" - - link "5 comments" [ref=e469] [cursor=pointer]: - - /url: item?id=46454824 - - row [ref=e470] - - row "22. upvote Six Harmless Bugs Lead to Remote Code Execution (mehmetince.net)" [ref=e471]: - - cell "22." [ref=e472] - - cell "upvote" [ref=e473]: - - link "upvote" [ref=e475] [cursor=pointer]: - - /url: vote?id=46457488&how=up&goto=news - - generic "upvote" [ref=e476] - - cell "Six Harmless Bugs Lead to Remote Code Execution (mehmetince.net)" [ref=e477]: - - generic [ref=e478]: - - link "Six Harmless Bugs Lead to Remote Code Execution" [ref=e479] [cursor=pointer]: - - /url: https://mehmetince.net/the-story-of-a-perfect-exploit-chain-six-bugs-that-looked-harmless-until-they-became-pre-auth-rce-in-a-security-appliance/ - - generic [ref=e480]: - - text: ( - - link "mehmetince.net" [ref=e481] [cursor=pointer]: - - /url: from?site=mehmetince.net - - text: ) - - row "59 points by ozirus 10 hours ago | hide | 11 comments" [ref=e482]: - - cell [ref=e483] - - cell "59 points by ozirus 10 hours ago | hide | 11 comments" [ref=e484]: - - generic [ref=e485]: - - text: 59 points by - - link "ozirus" [ref=e486] [cursor=pointer]: - - /url: user?id=ozirus - - generic "2026-01-01T20:02:09 1767297729" [ref=e487]: - - link "10 hours ago" [ref=e488] [cursor=pointer]: - - /url: item?id=46457488 - - text: "|" - - link "hide" [ref=e489] [cursor=pointer]: - - /url: hide?id=46457488&goto=news - - text: "|" - - link "11 comments" [ref=e490] [cursor=pointer]: - - /url: item?id=46457488 - - row [ref=e491] - - 'row "23. upvote Linear Address Spaces: Unsafe at any speed (2022) (acm.org)" [ref=e492]': - - cell "23." [ref=e493] - - cell "upvote" [ref=e494]: - - link "upvote" [ref=e496] [cursor=pointer]: + - row [ref=e430] + - 'row "20. upvote Linear Address Spaces: Unsafe at any speed (2022) (acm.org)" [ref=e431]': + - cell "20." [ref=e432] + - cell "upvote" [ref=e433]: + - link "upvote" [ref=e435] [cursor=pointer]: - /url: vote?id=46442282&how=up&goto=news - - generic "upvote" [ref=e497] - - 'cell "Linear Address Spaces: Unsafe at any speed (2022) (acm.org)" [ref=e498]': - - generic [ref=e499]: - - 'link "Linear Address Spaces: Unsafe at any speed (2022)" [ref=e500] [cursor=pointer]': + - generic "upvote" [ref=e436] + - 'cell "Linear Address Spaces: Unsafe at any speed (2022) (acm.org)" [ref=e437]': + - generic [ref=e438]: + - 'link "Linear Address Spaces: Unsafe at any speed (2022)" [ref=e439] [cursor=pointer]': - /url: https://queue.acm.org/detail.cfm?id=3534854 - - generic [ref=e501]: + - generic [ref=e440]: - text: ( - - link "acm.org" [ref=e502] [cursor=pointer]: + - link "acm.org" [ref=e441] [cursor=pointer]: - /url: from?site=acm.org - text: ) - - row "152 points by nithssh 14 hours ago | hide | 111 comments" [ref=e503]: - - cell [ref=e504] - - cell "152 points by nithssh 14 hours ago | hide | 111 comments" [ref=e505]: - - generic [ref=e506]: - - text: 152 points by - - link "nithssh" [ref=e507] [cursor=pointer]: + - row "157 points by nithssh 15 hours ago | hide | 114 comments" [ref=e442]: + - cell [ref=e443] + - cell "157 points by nithssh 15 hours ago | hide | 114 comments" [ref=e444]: + - generic [ref=e445]: + - text: 157 points by + - link "nithssh" [ref=e446] [cursor=pointer]: - /url: user?id=nithssh - - generic "2025-12-31T07:57:53 1767167873" [ref=e508]: - - link "14 hours ago" [ref=e509] [cursor=pointer]: + - generic "2025-12-31T07:57:53 1767167873" [ref=e447]: + - link "15 hours ago" [ref=e448] [cursor=pointer]: - /url: item?id=46442282 - text: "|" - - link "hide" [ref=e510] [cursor=pointer]: + - link "hide" [ref=e449] [cursor=pointer]: - /url: hide?id=46442282&goto=news - text: "|" - - link "111 comments" [ref=e511] [cursor=pointer]: + - link "114 comments" [ref=e450] [cursor=pointer]: - /url: item?id=46442282 - - row [ref=e512] - - 'row "24. upvote Eurostar AI vulnerability: When a chatbot goes off the rails (pentestpartners.com)" [ref=e513]': - - cell "24." [ref=e514] - - cell "upvote" [ref=e515]: - - link "upvote" [ref=e517] [cursor=pointer]: + - row [ref=e451] + - 'row "21. upvote Eurostar AI vulnerability: When a chatbot goes off the rails (pentestpartners.com)" [ref=e452]': + - cell "21." [ref=e453] + - cell "upvote" [ref=e454]: + - link "upvote" [ref=e456] [cursor=pointer]: - /url: vote?id=46492063&how=up&goto=news - - generic "upvote" [ref=e518] - - 'cell "Eurostar AI vulnerability: When a chatbot goes off the rails (pentestpartners.com)" [ref=e519]': - - generic [ref=e520]: - - 'link "Eurostar AI vulnerability: When a chatbot goes off the rails" [ref=e521] [cursor=pointer]': + - generic "upvote" [ref=e457] + - 'cell "Eurostar AI vulnerability: When a chatbot goes off the rails (pentestpartners.com)" [ref=e458]': + - generic [ref=e459]: + - 'link "Eurostar AI vulnerability: When a chatbot goes off the rails" [ref=e460] [cursor=pointer]': - /url: https://www.pentestpartners.com/security-blog/eurostar-ai-vulnerability-when-a-chatbot-goes-off-the-rails/ - - generic [ref=e522]: + - generic [ref=e461]: - text: ( - - link "pentestpartners.com" [ref=e523] [cursor=pointer]: + - link "pentestpartners.com" [ref=e462] [cursor=pointer]: - /url: from?site=pentestpartners.com - text: ) - - row "134 points by speckx 12 hours ago | hide | 34 comments" [ref=e524]: - - cell [ref=e525] - - cell "134 points by speckx 12 hours ago | hide | 34 comments" [ref=e526]: - - generic [ref=e527]: - - text: 134 points by - - link "speckx" [ref=e528] [cursor=pointer]: + - row "146 points by speckx 13 hours ago | hide | 36 comments" [ref=e463]: + - cell [ref=e464] + - cell "146 points by speckx 13 hours ago | hide | 36 comments" [ref=e465]: + - generic [ref=e466]: + - text: 146 points by + - link "speckx" [ref=e467] [cursor=pointer]: - /url: user?id=speckx - - generic "2026-01-04T20:52:52 1767559972" [ref=e529]: - - link "12 hours ago" [ref=e530] [cursor=pointer]: + - generic "2026-01-04T20:52:52 1767559972" [ref=e468]: + - link "13 hours ago" [ref=e469] [cursor=pointer]: - /url: item?id=46492063 - text: "|" - - link "hide" [ref=e531] [cursor=pointer]: + - link "hide" [ref=e470] [cursor=pointer]: - /url: hide?id=46492063&goto=news - text: "|" - - link "34 comments" [ref=e532] [cursor=pointer]: + - link "36 comments" [ref=e471] [cursor=pointer]: - /url: item?id=46492063 - - row [ref=e533] - - row "25. upvote NeXTSTEP on Pa-RISC (openpa.net)" [ref=e534]: - - cell "25." [ref=e535] - - cell "upvote" [ref=e536]: - - link "upvote" [ref=e538] [cursor=pointer]: - - /url: vote?id=46494061&how=up&goto=news - - generic "upvote" [ref=e539] - - cell "NeXTSTEP on Pa-RISC (openpa.net)" [ref=e540]: - - generic [ref=e541]: - - link "NeXTSTEP on Pa-RISC" [ref=e542] [cursor=pointer]: - - /url: https://www.openpa.net/nextstep_pa-risc.html - - generic [ref=e543]: + - row [ref=e472] + - row "22. upvote Claude Code On-the-Go (granda.org)" [ref=e473]: + - cell "22." [ref=e474] + - cell "upvote" [ref=e475]: + - link "upvote" [ref=e477] [cursor=pointer]: + - /url: vote?id=46491486&how=up&goto=news + - generic "upvote" [ref=e478] + - cell "Claude Code On-the-Go (granda.org)" [ref=e479]: + - generic [ref=e480]: + - link "Claude Code On-the-Go" [ref=e481] [cursor=pointer]: + - /url: https://granda.org/en/2026/01/02/claude-code-on-the-go/ + - generic [ref=e482]: - text: ( - - link "openpa.net" [ref=e544] [cursor=pointer]: + - link "granda.org" [ref=e483] [cursor=pointer]: + - /url: from?site=granda.org + - text: ) + - row "319 points by todsacerdoti 13 hours ago | hide | 203 comments" [ref=e484]: + - cell [ref=e485] + - cell "319 points by todsacerdoti 13 hours ago | hide | 203 comments" [ref=e486]: + - generic [ref=e487]: + - text: 319 points by + - link "todsacerdoti" [ref=e488] [cursor=pointer]: + - /url: user?id=todsacerdoti + - generic "2026-01-04T19:48:20 1767556100" [ref=e489]: + - link "13 hours ago" [ref=e490] [cursor=pointer]: + - /url: item?id=46491486 + - text: "|" + - link "hide" [ref=e491] [cursor=pointer]: + - /url: hide?id=46491486&goto=news + - text: "|" + - link "203 comments" [ref=e492] [cursor=pointer]: + - /url: item?id=46491486 + - row [ref=e493] + - row "23. upvote Six Harmless Bugs Lead to Remote Code Execution (mehmetince.net)" [ref=e494]: + - cell "23." [ref=e495] + - cell "upvote" [ref=e496]: + - link "upvote" [ref=e498] [cursor=pointer]: + - /url: vote?id=46457488&how=up&goto=news + - generic "upvote" [ref=e499] + - cell "Six Harmless Bugs Lead to Remote Code Execution (mehmetince.net)" [ref=e500]: + - generic [ref=e501]: + - link "Six Harmless Bugs Lead to Remote Code Execution" [ref=e502] [cursor=pointer]: + - /url: https://mehmetince.net/the-story-of-a-perfect-exploit-chain-six-bugs-that-looked-harmless-until-they-became-pre-auth-rce-in-a-security-appliance/ + - generic [ref=e503]: + - text: ( + - link "mehmetince.net" [ref=e504] [cursor=pointer]: + - /url: from?site=mehmetince.net + - text: ) + - row "62 points by ozirus 11 hours ago | hide | 15 comments" [ref=e505]: + - cell [ref=e506] + - cell "62 points by ozirus 11 hours ago | hide | 15 comments" [ref=e507]: + - generic [ref=e508]: + - text: 62 points by + - link "ozirus" [ref=e509] [cursor=pointer]: + - /url: user?id=ozirus + - generic "2026-01-01T20:02:09 1767297729" [ref=e510]: + - link "11 hours ago" [ref=e511] [cursor=pointer]: + - /url: item?id=46457488 + - text: "|" + - link "hide" [ref=e512] [cursor=pointer]: + - /url: hide?id=46457488&goto=news + - text: "|" + - link "15 comments" [ref=e513] [cursor=pointer]: + - /url: item?id=46457488 + - row [ref=e514] + - row "24. upvote NeXTSTEP on Pa-RISC (openpa.net)" [ref=e515]: + - cell "24." [ref=e516] + - cell "upvote" [ref=e517]: + - link "upvote" [ref=e519] [cursor=pointer]: + - /url: vote?id=46494061&how=up&goto=news + - generic "upvote" [ref=e520] + - cell "NeXTSTEP on Pa-RISC (openpa.net)" [ref=e521]: + - generic [ref=e522]: + - link "NeXTSTEP on Pa-RISC" [ref=e523] [cursor=pointer]: + - /url: https://www.openpa.net/nextstep_pa-risc.html + - generic [ref=e524]: + - text: ( + - link "openpa.net" [ref=e525] [cursor=pointer]: - /url: from?site=openpa.net - text: ) - - row "29 points by andsoitis 8 hours ago | hide | 5 comments" [ref=e545]: - - cell [ref=e546] - - cell "29 points by andsoitis 8 hours ago | hide | 5 comments" [ref=e547]: - - generic [ref=e548]: - - text: 29 points by - - link "andsoitis" [ref=e549] [cursor=pointer]: + - row "34 points by andsoitis 9 hours ago | hide | 5 comments" [ref=e526]: + - cell [ref=e527] + - cell "34 points by andsoitis 9 hours ago | hide | 5 comments" [ref=e528]: + - generic [ref=e529]: + - text: 34 points by + - link "andsoitis" [ref=e530] [cursor=pointer]: - /url: user?id=andsoitis - - generic "2026-01-05T00:48:44 1767574124" [ref=e550]: - - link "8 hours ago" [ref=e551] [cursor=pointer]: + - generic "2026-01-05T00:48:44 1767574124" [ref=e531]: + - link "9 hours ago" [ref=e532] [cursor=pointer]: - /url: item?id=46494061 - text: "|" - - link "hide" [ref=e552] [cursor=pointer]: + - link "hide" [ref=e533] [cursor=pointer]: - /url: hide?id=46494061&goto=news - text: "|" - - link "5 comments" [ref=e553] [cursor=pointer]: + - link "5 comments" [ref=e534] [cursor=pointer]: - /url: item?id=46494061 - - row [ref=e554] - - row "26. upvote Ripple, a puzzle game about 2nd and 3rd order effects (ripplegame.app)" [ref=e555]: - - cell "26." [ref=e556] - - cell "upvote" [ref=e557]: - - link "upvote" [ref=e559] [cursor=pointer]: + - row [ref=e535] + - row "25. upvote Ripple, a puzzle game about 2nd and 3rd order effects (ripplegame.app)" [ref=e536]: + - cell "25." [ref=e537] + - cell "upvote" [ref=e538]: + - link "upvote" [ref=e540] [cursor=pointer]: - /url: vote?id=46490323&how=up&goto=news - - generic "upvote" [ref=e560] - - cell "Ripple, a puzzle game about 2nd and 3rd order effects (ripplegame.app)" [ref=e561]: - - generic [ref=e562]: - - link "Ripple, a puzzle game about 2nd and 3rd order effects" [ref=e563] [cursor=pointer]: + - generic "upvote" [ref=e541] + - cell "Ripple, a puzzle game about 2nd and 3rd order effects (ripplegame.app)" [ref=e542]: + - generic [ref=e543]: + - link "Ripple, a puzzle game about 2nd and 3rd order effects" [ref=e544] [cursor=pointer]: - /url: https://ripplegame.app/ - - generic [ref=e564]: + - generic [ref=e545]: - text: ( - - link "ripplegame.app" [ref=e565] [cursor=pointer]: + - link "ripplegame.app" [ref=e546] [cursor=pointer]: - /url: from?site=ripplegame.app - text: ) - - row "117 points by mooreds 13 hours ago | hide | 29 comments" [ref=e566]: - - cell [ref=e567] - - cell "117 points by mooreds 13 hours ago | hide | 29 comments" [ref=e568]: - - generic [ref=e569]: - - text: 117 points by - - link "mooreds" [ref=e570] [cursor=pointer]: + - row "123 points by mooreds 14 hours ago | hide | 32 comments" [ref=e547]: + - cell [ref=e548] + - cell "123 points by mooreds 14 hours ago | hide | 32 comments" [ref=e549]: + - generic [ref=e550]: + - text: 123 points by + - link "mooreds" [ref=e551] [cursor=pointer]: - /url: user?id=mooreds - - generic "2026-01-04T17:50:04 1767549004" [ref=e571]: - - link "13 hours ago" [ref=e572] [cursor=pointer]: + - generic "2026-01-04T17:50:04 1767549004" [ref=e552]: + - link "14 hours ago" [ref=e553] [cursor=pointer]: - /url: item?id=46490323 - text: "|" - - link "hide" [ref=e573] [cursor=pointer]: + - link "hide" [ref=e554] [cursor=pointer]: - /url: hide?id=46490323&goto=news - text: "|" - - link "29 comments" [ref=e574] [cursor=pointer]: + - link "32 comments" [ref=e555] [cursor=pointer]: - /url: item?id=46490323 - - row [ref=e575] - - 'row "27. upvote Millennium Challenge: A corrupted military exercise and its legacy (2015) (warontherocks.com)" [ref=e576]': - - cell "27." [ref=e577] - - cell "upvote" [ref=e578]: - - link "upvote" [ref=e580] [cursor=pointer]: - - /url: vote?id=46493623&how=up&goto=news - - generic "upvote" [ref=e581] - - 'cell "Millennium Challenge: A corrupted military exercise and its legacy (2015) (warontherocks.com)" [ref=e582]': - - generic [ref=e583]: - - 'link "Millennium Challenge: A corrupted military exercise and its legacy (2015)" [ref=e584] [cursor=pointer]': - - /url: https://warontherocks.com/2015/11/millennium-challenge-the-real-story-of-a-corrupted-military-exercise-and-its-legacy/ - - generic [ref=e585]: + - row [ref=e556] + - row "26. upvote ICE is using facial-recognition technology to quickly arrest people (wsj.com)" [ref=e557]: + - cell "26." [ref=e558] + - cell "upvote" [ref=e559]: + - link "upvote" [ref=e561] [cursor=pointer]: + - /url: vote?id=46495560&how=up&goto=news + - generic "upvote" [ref=e562] + - cell "ICE is using facial-recognition technology to quickly arrest people (wsj.com)" [ref=e563]: + - generic [ref=e564]: + - link "ICE is using facial-recognition technology to quickly arrest people" [ref=e565] [cursor=pointer]: + - /url: https://www.wsj.com/politics/policy/ice-facial-recognition-app-mobile-fortify-dfdd00bf + - generic [ref=e566]: - text: ( - - link "warontherocks.com" [ref=e586] [cursor=pointer]: - - /url: from?site=warontherocks.com + - link "wsj.com" [ref=e567] [cursor=pointer]: + - /url: from?site=wsj.com - text: ) - - row "35 points by lifeisstillgood 9 hours ago | hide | 36 comments" [ref=e587]: - - cell [ref=e588] - - cell "35 points by lifeisstillgood 9 hours ago | hide | 36 comments" [ref=e589]: - - generic [ref=e590]: - - text: 35 points by - - link "lifeisstillgood" [ref=e591] [cursor=pointer]: - - /url: user?id=lifeisstillgood - - generic "2026-01-04T23:43:48 1767570228" [ref=e592]: - - link "9 hours ago" [ref=e593] [cursor=pointer]: - - /url: item?id=46493623 + - row "118 points by KnuthIsGod 4 hours ago | hide | 59 comments" [ref=e568]: + - cell [ref=e569] + - cell "118 points by KnuthIsGod 4 hours ago | hide | 59 comments" [ref=e570]: + - generic [ref=e571]: + - text: 118 points by + - link "KnuthIsGod" [ref=e572] [cursor=pointer]: + - /url: user?id=KnuthIsGod + - generic "2026-01-05T05:16:37 1767590197" [ref=e573]: + - link "4 hours ago" [ref=e574] [cursor=pointer]: + - /url: item?id=46495560 - text: "|" - - link "hide" [ref=e594] [cursor=pointer]: - - /url: hide?id=46493623&goto=news + - link "hide" [ref=e575] [cursor=pointer]: + - /url: hide?id=46495560&goto=news - text: "|" - - link "36 comments" [ref=e595] [cursor=pointer]: - - /url: item?id=46493623 - - row [ref=e596] - - row "28. upvote California residents can now request all data brokers delete personal info (ca.gov)" [ref=e597]: - - cell "28." [ref=e598] - - cell "upvote" [ref=e599]: - - link "upvote" [ref=e601] [cursor=pointer]: - - /url: vote?id=46495220&how=up&goto=news - - generic "upvote" [ref=e602] - - cell "California residents can now request all data brokers delete personal info (ca.gov)" [ref=e603]: - - generic [ref=e604]: - - link "California residents can now request all data brokers delete personal info" [ref=e605] [cursor=pointer]: - - /url: https://consumer.drop.privacy.ca.gov/ - - generic [ref=e606]: - - text: ( - - link "ca.gov" [ref=e607] [cursor=pointer]: - - /url: from?site=ca.gov - - text: ) - - row "226 points by memalign 5 hours ago | hide | 55 comments" [ref=e608]: - - cell [ref=e609] - - cell "226 points by memalign 5 hours ago | hide | 55 comments" [ref=e610]: - - generic [ref=e611]: - - text: 226 points by - - link "memalign" [ref=e612] [cursor=pointer]: - - /url: user?id=memalign - - generic "2026-01-05T04:00:38 1767585638" [ref=e613]: - - link "5 hours ago" [ref=e614] [cursor=pointer]: - - /url: item?id=46495220 - - text: "|" - - link "hide" [ref=e615] [cursor=pointer]: - - /url: hide?id=46495220&goto=news - - text: "|" - - link "55 comments" [ref=e616] [cursor=pointer]: - - /url: item?id=46495220 - - row [ref=e617] - - row "29. upvote Moiré Explorer (ertdfgcvb.xyz)" [ref=e618]: - - cell "29." [ref=e619] - - cell "upvote" [ref=e620]: - - link "upvote" [ref=e622] [cursor=pointer]: + - link "59 comments" [ref=e576] [cursor=pointer]: + - /url: item?id=46495560 + - row [ref=e577] + - row "27. upvote Moiré Explorer (ertdfgcvb.xyz)" [ref=e578]: + - cell "27." [ref=e579] + - cell "upvote" [ref=e580]: + - link "upvote" [ref=e582] [cursor=pointer]: - /url: vote?id=46487472&how=up&goto=news - - generic "upvote" [ref=e623] - - cell "Moiré Explorer (ertdfgcvb.xyz)" [ref=e624]: - - generic [ref=e625]: - - link "Moiré Explorer" [ref=e626] [cursor=pointer]: + - generic "upvote" [ref=e583] + - cell "Moiré Explorer (ertdfgcvb.xyz)" [ref=e584]: + - generic [ref=e585]: + - link "Moiré Explorer" [ref=e586] [cursor=pointer]: - /url: https://play.ertdfgcvb.xyz/#/src/demos/moire_explorer - - generic [ref=e627]: + - generic [ref=e587]: - text: ( - - link "ertdfgcvb.xyz" [ref=e628] [cursor=pointer]: + - link "ertdfgcvb.xyz" [ref=e588] [cursor=pointer]: - /url: from?site=ertdfgcvb.xyz - text: ) - - row "161 points by Luc 20 hours ago | hide | 19 comments" [ref=e629]: - - cell [ref=e630] - - cell "161 points by Luc 20 hours ago | hide | 19 comments" [ref=e631]: - - generic [ref=e632]: - - text: 161 points by - - link "Luc" [ref=e633] [cursor=pointer]: + - row "166 points by Luc 21 hours ago | hide | 19 comments" [ref=e589]: + - cell [ref=e590] + - cell "166 points by Luc 21 hours ago | hide | 19 comments" [ref=e591]: + - generic [ref=e592]: + - text: 166 points by + - link "Luc" [ref=e593] [cursor=pointer]: - /url: user?id=Luc - - generic "2026-01-04T12:54:20 1767531260" [ref=e634]: - - link "20 hours ago" [ref=e635] [cursor=pointer]: + - generic "2026-01-04T12:54:20 1767531260" [ref=e594]: + - link "21 hours ago" [ref=e595] [cursor=pointer]: - /url: item?id=46487472 - text: "|" - - link "hide" [ref=e636] [cursor=pointer]: + - link "hide" [ref=e596] [cursor=pointer]: - /url: hide?id=46487472&goto=news - text: "|" - - link "19 comments" [ref=e637] [cursor=pointer]: + - link "19 comments" [ref=e597] [cursor=pointer]: - /url: item?id=46487472 - - row [ref=e638] - - row "30. upvote Agentic Patterns (github.com/nibzard)" [ref=e639]: - - cell "30." [ref=e640] - - cell "upvote" [ref=e641]: - - link "upvote" [ref=e643] [cursor=pointer]: + - row [ref=e598] + - row "28. upvote Agentic Patterns (github.com/nibzard)" [ref=e599]: + - cell "28." [ref=e600] + - cell "upvote" [ref=e601]: + - link "upvote" [ref=e603] [cursor=pointer]: - /url: vote?id=46491244&how=up&goto=news - - generic "upvote" [ref=e644] - - cell "Agentic Patterns (github.com/nibzard)" [ref=e645]: - - generic [ref=e646]: - - link "Agentic Patterns" [ref=e647] [cursor=pointer]: + - generic "upvote" [ref=e604] + - cell "Agentic Patterns (github.com/nibzard)" [ref=e605]: + - generic [ref=e606]: + - link "Agentic Patterns" [ref=e607] [cursor=pointer]: - /url: https://github.com/nibzard/awesome-agentic-patterns - - generic [ref=e648]: + - generic [ref=e608]: - text: ( - - link "github.com/nibzard" [ref=e649] [cursor=pointer]: + - link "github.com/nibzard" [ref=e609] [cursor=pointer]: - /url: from?site=github.com/nibzard - text: ) - - row "116 points by PretzelFisch 13 hours ago | hide | 20 comments" [ref=e650]: - - cell [ref=e651] - - cell "116 points by PretzelFisch 13 hours ago | hide | 20 comments" [ref=e652]: - - generic [ref=e653]: - - text: 116 points by - - link "PretzelFisch" [ref=e654] [cursor=pointer]: + - row "123 points by PretzelFisch 14 hours ago | hide | 22 comments" [ref=e610]: + - cell [ref=e611] + - cell "123 points by PretzelFisch 14 hours ago | hide | 22 comments" [ref=e612]: + - generic [ref=e613]: + - text: 123 points by + - link "PretzelFisch" [ref=e614] [cursor=pointer]: - /url: user?id=PretzelFisch - - generic "2026-01-04T19:24:47 1767554687" [ref=e655]: - - link "13 hours ago" [ref=e656] [cursor=pointer]: + - generic "2026-01-04T19:24:47 1767554687" [ref=e615]: + - link "14 hours ago" [ref=e616] [cursor=pointer]: - /url: item?id=46491244 - text: "|" - - link "hide" [ref=e657] [cursor=pointer]: + - link "hide" [ref=e617] [cursor=pointer]: - /url: hide?id=46491244&goto=news - text: "|" - - link "20 comments" [ref=e658] [cursor=pointer]: + - link "22 comments" [ref=e618] [cursor=pointer]: - /url: item?id=46491244 - - row [ref=e659] - - row [ref=e660] - - row "More" [ref=e661]: - - cell [ref=e662] - - cell "More" [ref=e663]: - - link "More" [ref=e664] [cursor=pointer]: + - row [ref=e619] + - row "29. upvote Anti-aging injection regrows knee cartilage and prevents arthritis (scitechdaily.com)" [ref=e620]: + - cell "29." [ref=e621] + - cell "upvote" [ref=e622]: + - link "upvote" [ref=e624] [cursor=pointer]: + - /url: vote?id=46488711&how=up&goto=news + - generic "upvote" [ref=e625] + - cell "Anti-aging injection regrows knee cartilage and prevents arthritis (scitechdaily.com)" [ref=e626]: + - generic [ref=e627]: + - link "Anti-aging injection regrows knee cartilage and prevents arthritis" [ref=e628] [cursor=pointer]: + - /url: https://scitechdaily.com/anti-aging-injection-regrows-knee-cartilage-and-prevents-arthritis/ + - generic [ref=e629]: + - text: ( + - link "scitechdaily.com" [ref=e630] [cursor=pointer]: + - /url: from?site=scitechdaily.com + - text: ) + - row "311 points by nis0s 18 hours ago | hide | 117 comments" [ref=e631]: + - cell [ref=e632] + - cell "311 points by nis0s 18 hours ago | hide | 117 comments" [ref=e633]: + - generic [ref=e634]: + - text: 311 points by + - link "nis0s" [ref=e635] [cursor=pointer]: + - /url: user?id=nis0s + - generic "2026-01-04T15:13:18 1767539598" [ref=e636]: + - link "18 hours ago" [ref=e637] [cursor=pointer]: + - /url: item?id=46488711 + - text: "|" + - link "hide" [ref=e638] [cursor=pointer]: + - /url: hide?id=46488711&goto=news + - text: "|" + - link "117 comments" [ref=e639] [cursor=pointer]: + - /url: item?id=46488711 + - row [ref=e640] + - row "30. upvote Bison return to Illinois' Kane County after 200 years (phys.org)" [ref=e641]: + - cell "30." [ref=e642] + - cell "upvote" [ref=e643]: + - link "upvote" [ref=e645] [cursor=pointer]: + - /url: vote?id=46436279&how=up&goto=news + - generic "upvote" [ref=e646] + - cell "Bison return to Illinois' Kane County after 200 years (phys.org)" [ref=e647]: + - generic [ref=e648]: + - link "Bison return to Illinois' Kane County after 200 years" [ref=e649] [cursor=pointer]: + - /url: https://phys.org/news/2025-12-bison-illinois-kane-county-years.html + - generic [ref=e650]: + - text: ( + - link "phys.org" [ref=e651] [cursor=pointer]: + - /url: from?site=phys.org + - text: ) + - row "151 points by bikenaga 18 hours ago | hide | 46 comments" [ref=e652]: + - cell [ref=e653] + - cell "151 points by bikenaga 18 hours ago | hide | 46 comments" [ref=e654]: + - generic [ref=e655]: + - text: 151 points by + - link "bikenaga" [ref=e656] [cursor=pointer]: + - /url: user?id=bikenaga + - generic "2025-12-30T18:22:56 1767118976" [ref=e657]: + - link "18 hours ago" [ref=e658] [cursor=pointer]: + - /url: item?id=46436279 + - text: "|" + - link "hide" [ref=e659] [cursor=pointer]: + - /url: hide?id=46436279&goto=news + - text: "|" + - link "46 comments" [ref=e660] [cursor=pointer]: + - /url: item?id=46436279 + - row [ref=e661] + - row [ref=e662] + - row "More" [ref=e663]: + - cell [ref=e664] + - cell "More" [ref=e665]: + - link "More" [ref=e666] [cursor=pointer]: - /url: "?p=2" - - row "Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact Search:" [ref=e665]: - - cell "Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact Search:" [ref=e666]: + - row "Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact Search:" [ref=e667]: + - cell "Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact Search:" [ref=e668]: - img - - table [ref=e667]: - - rowgroup [ref=e668]: - - row [ref=e669]: - - cell [ref=e670] - - generic [ref=e671]: - - generic [ref=e672]: - - link "Guidelines" [ref=e673] [cursor=pointer]: + - table [ref=e669]: + - rowgroup [ref=e670]: + - row [ref=e671]: + - cell [ref=e672] + - generic [ref=e673]: + - generic [ref=e674]: + - link "Guidelines" [ref=e675] [cursor=pointer]: - /url: newsguidelines.html - text: "|" - - link "FAQ" [ref=e674] [cursor=pointer]: + - link "FAQ" [ref=e676] [cursor=pointer]: - /url: newsfaq.html - text: "|" - - link "Lists" [ref=e675] [cursor=pointer]: + - link "Lists" [ref=e677] [cursor=pointer]: - /url: lists - text: "|" - - link "API" [ref=e676] [cursor=pointer]: + - link "API" [ref=e678] [cursor=pointer]: - /url: https://github.com/HackerNews/API - text: "|" - - link "Security" [ref=e677] [cursor=pointer]: + - link "Security" [ref=e679] [cursor=pointer]: - /url: security.html - text: "|" - - link "Legal" [ref=e678] [cursor=pointer]: + - link "Legal" [ref=e680] [cursor=pointer]: - /url: https://www.ycombinator.com/legal/ - text: "|" - - link "Apply to YC" [ref=e679] [cursor=pointer]: + - link "Apply to YC" [ref=e681] [cursor=pointer]: - /url: https://www.ycombinator.com/apply/ - text: "|" - - link "Contact" [ref=e680] [cursor=pointer]: + - link "Contact" [ref=e682] [cursor=pointer]: - /url: mailto:hn@ycombinator.com - - generic [ref=e681]: + - generic [ref=e683]: - text: "Search:" - - textbox [ref=e682] \ No newline at end of file + - textbox [ref=e684] \ No newline at end of file diff --git a/playwriter/src/mcp.test.ts b/playwriter/src/mcp.test.ts index e70f4f9..dd3b2d0 100644 --- a/playwriter/src/mcp.test.ts +++ b/playwriter/src/mcp.test.ts @@ -2314,10 +2314,58 @@ describe('MCP Server Tests', () => { const page = await browserContext.newPage() await page.setContent(` + + + - - About Us - +
+ + About Us + +
+ +
200px
+
400px
+
600px
+ +
200
+
400
+
600
+
800
+
1000
+
1200
`) @@ -2370,6 +2418,17 @@ describe('MCP Server Tests', () => { // Verify the image is valid JPEG by checking base64 const buffer = Buffer.from(imageContent.data, 'base64') const dimensions = imageSize(buffer) + + // Get actual viewport size from page + const viewport = await page.evaluate(() => ({ + innerWidth: window.innerWidth, + innerHeight: window.innerHeight, + outerWidth: window.outerWidth, + outerHeight: window.outerHeight, + })) + console.log('Screenshot dimensions:', dimensions.width, 'x', dimensions.height) + console.log('Window viewport:', viewport) + expect(dimensions.type).toBe('jpg') expect(dimensions.width).toBeGreaterThan(0) expect(dimensions.height).toBeGreaterThan(0) diff --git a/playwriter/src/prompt.md b/playwriter/src/prompt.md index 43f24ac..7fad98c 100644 --- a/playwriter/src/prompt.md +++ b/playwriter/src/prompt.md @@ -31,6 +31,8 @@ After any action (click, submit, navigate), verify what happened: console.log('url:', page.url()); console.log(await accessibilitySnapshot({ page }).then(x => x.split('\n').slice(0, 30).join('\n'))); ``` +For visually complex pages (grids, galleries, dashboards), use `screenshotWithAccessibilityLabels({ page })` instead to understand spatial layout. + If nothing changed, try `await page.waitForLoadState('networkidle', {timeout: 3000})` or you may have clicked the wrong element. ## accessibility snapshots @@ -66,6 +68,24 @@ Search for specific elements: const snapshot = await accessibilitySnapshot({ page, search: /button|submit/i }) ``` +## choosing between snapshot methods + +Both `accessibilitySnapshot` and `screenshotWithAccessibilityLabels` use the same `aria-ref` system, so you can combine them effectively. + +**Use `accessibilitySnapshot` when:** +- Page has simple, semantic structure (articles, forms, lists) +- You need to search for specific text or patterns +- Token usage matters (text is smaller than images) +- You need to process the output programmatically + +**Use `screenshotWithAccessibilityLabels` when:** +- Page has complex visual layout (grids, galleries, dashboards, maps) +- Spatial position matters (e.g., "first image", "top-left button") +- DOM order doesn't match visual order +- You need to understand the visual hierarchy + +**Combining both:** Use screenshot first to understand layout and identify target elements visually, then use `accessibilitySnapshot({ search: /pattern/ })` for efficient searching in subsequent calls. + ## selector best practices **For unknown websites**: use `accessibilitySnapshot()` with `aria-ref` - it shows what's actually interactive. @@ -206,7 +226,9 @@ const matches = await editor.grep({ regex: /console\.log/ }); await editor.edit({ url: matches[0].url, oldString: 'DEBUG = false', newString: 'DEBUG = true' }); ``` -**screenshotWithAccessibilityLabels** - take a screenshot with Vimium-style visual labels overlaid on interactive elements. Shows labels, captures screenshot, then removes labels. The image and accessibility snapshot are automatically included in the response. Can be called multiple times to capture multiple screenshots. Use a timeout of 10 seconds at least. +**screenshotWithAccessibilityLabels** - take a screenshot with Vimium-style visual labels overlaid on interactive elements. Shows labels, captures screenshot, then removes labels. The image and accessibility snapshot are automatically included in the response. Can be called multiple times to capture multiple screenshots. Use a timeout of **20 seconds** for complex pages. + +Prefer this for pages with grids, image galleries, maps, or complex visual layouts where spatial position matters. For simple text-heavy pages, `accessibilitySnapshot` with search is faster and uses fewer tokens. ```js await screenshotWithAccessibilityLabels({ page }); @@ -296,5 +318,6 @@ Examples of what playwriter can do: - Intercept network requests to reverse-engineer APIs and build SDKs - Scrape data by replaying paginated API calls instead of scrolling DOM - Get accessibility snapshot to find elements, then automate interactions +- Use visual screenshots to understand complex layouts like image grids, dashboards, or maps - Debug issues by collecting logs and controlling the page simultaneously - Handle popups, downloads, iframes, and dialog boxes