diff --git a/.gitignore b/.gitignore index a6fe502..5ff1081 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ coverage *.zip *.log tmp +playwriter/src/assets/*.png diff --git a/playwriter/src/aria-snapshot.ts b/playwriter/src/aria-snapshot.ts index b058493..9d9a07e 100644 --- a/playwriter/src/aria-snapshot.ts +++ b/playwriter/src/aria-snapshot.ts @@ -37,6 +37,37 @@ const INTERACTIVE_ROLES = new Set([ 'treeitem', ]) +// Color categories for different role types (light backgrounds with good contrast for black text) +// Format: [gradient-top, gradient-bottom, border] +const ROLE_COLORS: Record = { + // Links - light blue + link: ['#B3E5FC', '#81D4FA', '#4FC3F7'], + // Buttons - light green + button: ['#C8E6C9', '#A5D6A7', '#81C784'], + // Text inputs - light orange + textbox: ['#FFE0B2', '#FFCC80', '#FFB74D'], + combobox: ['#FFE0B2', '#FFCC80', '#FFB74D'], + searchbox: ['#FFE0B2', '#FFCC80', '#FFB74D'], + spinbutton: ['#FFE0B2', '#FFCC80', '#FFB74D'], + // Checkboxes/Radios/Switches - light purple + checkbox: ['#E1BEE7', '#CE93D8', '#BA68C8'], + radio: ['#E1BEE7', '#CE93D8', '#BA68C8'], + switch: ['#E1BEE7', '#CE93D8', '#BA68C8'], + // Sliders - light teal + slider: ['#B2DFDB', '#80CBC4', '#4DB6AC'], + // Menu items - light pink + menuitem: ['#F8BBD9', '#F48FB1', '#F06292'], + menuitemcheckbox: ['#F8BBD9', '#F48FB1', '#F06292'], + menuitemradio: ['#F8BBD9', '#F48FB1', '#F06292'], + // Tabs/Options - light indigo + tab: ['#C5CAE9', '#9FA8DA', '#7986CB'], + option: ['#C5CAE9', '#9FA8DA', '#7986CB'], + treeitem: ['#C5CAE9', '#9FA8DA', '#7986CB'], +} + +// Default yellow for unknown roles +const DEFAULT_COLORS: [string, string, string] = ['#FFF785', '#FFC542', '#E3BE23'] + // Use String.raw for CSS syntax highlighting in editors const css = String.raw @@ -45,8 +76,6 @@ const LABEL_STYLES = css` position: absolute; font: bold 11px Helvetica, Arial, sans-serif; padding: 1px 4px; - background: linear-gradient(to bottom, #FFF785 0%, #FFC542 100%); - border: 1px solid #E3BE23; border-radius: 3px; color: black; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6); @@ -197,15 +226,28 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { }) : refHandles + // Build refs with role info for color coding + const refsWithRoles = filteredRefs.map(({ ref, handle }) => ({ + ref, + element: handle, + role: refToElement.get(ref)?.role || 'generic', + })) + // Single evaluate call: create container, styles, and all labels // ElementHandles get unwrapped to DOM elements in browser context // Using 'any' types here since this code runs in browser context const labelCount = await page.evaluate( - ({ refs, containerId, containerStyles, labelStyles }: { - refs: Array<{ ref: string; element: { getBoundingClientRect(): { width: number; height: number; left: number; top: number; right: number; bottom: number } } }> + ({ refs, containerId, containerStyles, labelStyles, roleColors, defaultColors }: { + refs: Array<{ + ref: string + role: string + element: { getBoundingClientRect(): { width: number; height: number; left: number; top: number; right: number; bottom: number } } + }> containerId: string containerStyles: string labelStyles: string + roleColors: Record + defaultColors: [string, string, string] }) => { const doc = (globalThis as any).document const win = globalThis as any @@ -218,7 +260,7 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { container.id = containerId container.style.cssText = containerStyles - // Inject Vimium-style CSS + // Inject base label CSS const style = doc.createElement('style') style.textContent = labelStyles container.appendChild(style) @@ -241,7 +283,7 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { // Create label for each interactive element let count = 0 - for (const { ref, element } of refs) { + for (const { ref, role, element } of refs) { const rect = element.getBoundingClientRect() // Skip elements with no size (hidden) @@ -266,10 +308,15 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { continue } + // Get colors for this role + const [gradTop, gradBottom, border] = roleColors[role] || defaultColors + // Place the label const label = doc.createElement('div') label.className = '__pw_label__' label.textContent = ref + label.style.background = `linear-gradient(to bottom, ${gradTop} 0%, ${gradBottom} 100%)` + label.style.border = `1px solid ${border}` // Position above element, accounting for scroll label.style.left = `${win.scrollX + labelLeft}px` @@ -284,10 +331,12 @@ export async function showAriaRefLabels({ page, interactiveOnly = true }: { return count }, { - refs: filteredRefs.map(({ ref, handle }) => ({ ref, element: handle })), + refs: refsWithRoles.map(({ ref, role, element }) => ({ ref, role, element })), containerId: LABELS_CONTAINER_ID, containerStyles: CONTAINER_STYLES, labelStyles: LABEL_STYLES, + roleColors: ROLE_COLORS, + defaultColors: DEFAULT_COLORS, } ) diff --git a/playwriter/src/assets/aria-labels-github.png b/playwriter/src/assets/aria-labels-github.png deleted file mode 100644 index 77a9e8b..0000000 Binary files a/playwriter/src/assets/aria-labels-github.png and /dev/null differ diff --git a/playwriter/src/assets/aria-labels-google-snapshot.txt b/playwriter/src/assets/aria-labels-google-snapshot.txt index bb41249..67d2713 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_uKW2_iLdDvITPr98P8jjLIgrMiY%3D&hl=it&source=homepage&sa=X&ved=0ahUKEwjeh4Llye-RAxVrJNAFHaspBugQ2ZgBCBU + - /url: https://www.google.com/setprefs?sig=0_9hKalRtXzD5AWtzEh3KSYnYsv7w%3D&hl=it&source=homepage&sa=X&ved=0ahUKEwjUxd_Qyu-RAxUqwskDHd_ZFnQQ2ZgBCBU - text: Italiano - contentinfo [ref=e58]: - generic [ref=e59]: Italy diff --git a/playwriter/src/assets/aria-labels-google.png b/playwriter/src/assets/aria-labels-google.png deleted file mode 100644 index 9ab8a7f..0000000 Binary files a/playwriter/src/assets/aria-labels-google.png and /dev/null differ diff --git a/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt b/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt index 3289a00..20b2429 100644 --- a/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt +++ b/playwriter/src/assets/aria-labels-hacker-news-snapshot.txt @@ -56,11 +56,11 @@ - link "indieweb.org" [ref=e42] [cursor=pointer]: - /url: from?site=indieweb.org - text: ) - - row "780 points by 47thpresident 18 hours ago | hide | 182 comments" [ref=e43]: + - row "781 points by 47thpresident 18 hours ago | hide | 182 comments" [ref=e43]: - cell [ref=e44] - - cell "780 points by 47thpresident 18 hours ago | hide | 182 comments" [ref=e45]: + - cell "781 points by 47thpresident 18 hours ago | hide | 182 comments" [ref=e45]: - generic [ref=e46]: - - text: 780 points by + - text: 781 points by - link "47thpresident" [ref=e47] [cursor=pointer]: - /url: user?id=47thpresident - generic "2026-01-02T19:48:25 1767383305" [ref=e48]: @@ -73,69 +73,69 @@ - link "182 comments" [ref=e51] [cursor=pointer]: - /url: item?id=46468600 - row [ref=e52] - - row "2. upvote Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e53]: + - row "2. upvote Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e53]: - cell "2." [ref=e54] - cell "upvote" [ref=e55]: - link "upvote" [ref=e57] [cursor=pointer]: - - /url: vote?id=46473348&how=up&goto=news + - /url: vote?id=46469577&how=up&goto=news - generic "upvote" [ref=e58] - - cell "Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e59]: + - cell "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e59]: - generic [ref=e60]: - - link "Trump says Venezuela’s Maduro captured after strikes" [ref=e61] [cursor=pointer]: - - /url: https://www.reuters.com/world/americas/loud-noises-heard-venezuela-capital-southern-area-without-electricity-2026-01-03/ + - link "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger?" [ref=e61] [cursor=pointer]: + - /url: https://www.madebywindmill.com/tempi/blog/hbfs-bpm/ - generic [ref=e62]: - text: ( - - link "reuters.com" [ref=e63] [cursor=pointer]: - - /url: from?site=reuters.com + - link "madebywindmill.com" [ref=e63] [cursor=pointer]: + - /url: from?site=madebywindmill.com - text: ) - - row "547 points by jumpocelot 7 hours ago | hide | 1254 comments" [ref=e64]: + - row "578 points by simonw 17 hours ago | hide | 96 comments" [ref=e64]: - cell [ref=e65] - - cell "547 points by jumpocelot 7 hours ago | hide | 1254 comments" [ref=e66]: + - cell "578 points by simonw 17 hours ago | hide | 96 comments" [ref=e66]: - generic [ref=e67]: - - text: 547 points by - - link "jumpocelot" [ref=e68] [cursor=pointer]: - - /url: user?id=jumpocelot - - generic "2026-01-03T06:35:21 1767422121" [ref=e69]: - - link "7 hours ago" [ref=e70] [cursor=pointer]: - - /url: item?id=46473348 + - text: 578 points by + - link "simonw" [ref=e68] [cursor=pointer]: + - /url: user?id=simonw + - generic "2026-01-02T21:27:44 1767389264" [ref=e69]: + - link "17 hours ago" [ref=e70] [cursor=pointer]: + - /url: item?id=46469577 - text: "|" - link "hide" [ref=e71] [cursor=pointer]: - - /url: hide?id=46473348&goto=news + - /url: hide?id=46469577&goto=news - text: "|" - - link "1254 comments" [ref=e72] [cursor=pointer]: - - /url: item?id=46473348 + - link "96 comments" [ref=e72] [cursor=pointer]: + - /url: item?id=46469577 - row [ref=e73] - - row "3. upvote Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e74]: + - row "3. upvote Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e74]: - cell "3." [ref=e75] - cell "upvote" [ref=e76]: - link "upvote" [ref=e78] [cursor=pointer]: - - /url: vote?id=46469577&how=up&goto=news + - /url: vote?id=46473348&how=up&goto=news - generic "upvote" [ref=e79] - - cell "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger? (madebywindmill.com)" [ref=e80]: + - cell "Trump says Venezuela’s Maduro captured after strikes (reuters.com)" [ref=e80]: - generic [ref=e81]: - - link "Daft Punk Easter Egg in the BPM Tempo of Harder, Better, Faster, Stronger?" [ref=e82] [cursor=pointer]: - - /url: https://www.madebywindmill.com/tempi/blog/hbfs-bpm/ + - link "Trump says Venezuela’s Maduro captured after strikes" [ref=e82] [cursor=pointer]: + - /url: https://www.reuters.com/world/americas/loud-noises-heard-venezuela-capital-southern-area-without-electricity-2026-01-03/ - generic [ref=e83]: - text: ( - - link "madebywindmill.com" [ref=e84] [cursor=pointer]: - - /url: from?site=madebywindmill.com + - link "reuters.com" [ref=e84] [cursor=pointer]: + - /url: from?site=reuters.com - text: ) - - row "577 points by simonw 16 hours ago | hide | 96 comments" [ref=e85]: + - row "553 points by jumpocelot 7 hours ago | hide | 1264 comments" [ref=e85]: - cell [ref=e86] - - cell "577 points by simonw 16 hours ago | hide | 96 comments" [ref=e87]: + - cell "553 points by jumpocelot 7 hours ago | hide | 1264 comments" [ref=e87]: - generic [ref=e88]: - - text: 577 points by - - link "simonw" [ref=e89] [cursor=pointer]: - - /url: user?id=simonw - - generic "2026-01-02T21:27:44 1767389264" [ref=e90]: - - link "16 hours ago" [ref=e91] [cursor=pointer]: - - /url: item?id=46469577 + - text: 553 points by + - link "jumpocelot" [ref=e89] [cursor=pointer]: + - /url: user?id=jumpocelot + - generic "2026-01-03T06:35:21 1767422121" [ref=e90]: + - link "7 hours ago" [ref=e91] [cursor=pointer]: + - /url: item?id=46473348 - text: "|" - link "hide" [ref=e92] [cursor=pointer]: - - /url: hide?id=46469577&goto=news + - /url: hide?id=46473348&goto=news - text: "|" - - link "96 comments" [ref=e93] [cursor=pointer]: - - /url: item?id=46469577 + - link "1264 comments" [ref=e93] [cursor=pointer]: + - /url: item?id=46473348 - row [ref=e94] - 'row "4. upvote Of Boot Vectors and Double Glitches: Bypassing RP2350''s Secure Boot (ccc.de)" [ref=e95]': - cell "4." [ref=e96] @@ -184,9 +184,9 @@ - link "theregister.com" [ref=e126] [cursor=pointer]: - /url: from?site=theregister.com - text: ) - - row "424 points by Brajeshwar 23 hours ago | hide | 846 comments" [ref=e127]: + - row "424 points by Brajeshwar 23 hours ago | hide | 847 comments" [ref=e127]: - cell [ref=e128] - - cell "424 points by Brajeshwar 23 hours ago | hide | 846 comments" [ref=e129]: + - cell "424 points by Brajeshwar 23 hours ago | hide | 847 comments" [ref=e129]: - generic [ref=e130]: - text: 424 points by - link "Brajeshwar" [ref=e131] [cursor=pointer]: @@ -198,7 +198,7 @@ - link "hide" [ref=e134] [cursor=pointer]: - /url: hide?id=46465327&goto=news - text: "|" - - link "846 comments" [ref=e135] [cursor=pointer]: + - link "847 comments" [ref=e135] [cursor=pointer]: - /url: item?id=46465327 - row [ref=e136] - row "6. ParadeDB (YC S23) Is Hiring Database Engineers (paradedb.notion.site)" [ref=e137]: @@ -214,11 +214,11 @@ - link "paradedb.notion.site" [ref=e145] [cursor=pointer]: - /url: from?site=paradedb.notion.site - text: ) - - row "32 minutes ago | hide" [ref=e146]: + - row "34 minutes ago | hide" [ref=e146]: - cell [ref=e147] - - cell "32 minutes ago | hide" [ref=e148]: + - cell "34 minutes ago | hide" [ref=e148]: - generic "2026-01-03T13:53:34 1767448414" [ref=e149]: - - link "32 minutes ago" [ref=e150] [cursor=pointer]: + - link "34 minutes ago" [ref=e150] [cursor=pointer]: - /url: item?id=46476636 - text: "|" - link "hide" [ref=e151] [cursor=pointer]: @@ -239,9 +239,9 @@ - link "siliconjunction.wordpress.com" [ref=e163] [cursor=pointer]: - /url: from?site=siliconjunction.wordpress.com - text: ) - - row "65 points by jensgk 9 hours ago | hide | 23 comments" [ref=e164]: + - row "65 points by jensgk 9 hours ago | hide | 24 comments" [ref=e164]: - cell [ref=e165] - - cell "65 points by jensgk 9 hours ago | hide | 23 comments" [ref=e166]: + - cell "65 points by jensgk 9 hours ago | hide | 24 comments" [ref=e166]: - generic [ref=e167]: - text: 65 points by - link "jensgk" [ref=e168] [cursor=pointer]: @@ -253,7 +253,7 @@ - link "hide" [ref=e171] [cursor=pointer]: - /url: hide?id=46443730&goto=news - text: "|" - - link "23 comments" [ref=e172] [cursor=pointer]: + - link "24 comments" [ref=e172] [cursor=pointer]: - /url: item?id=46443730 - row [ref=e173] - row "8. upvote X-Clacks-Overhead (hleb.dev)" [ref=e174]: @@ -303,11 +303,11 @@ - link "xeiaso.net" [ref=e205] [cursor=pointer]: - /url: from?site=xeiaso.net - text: ) - - row "612 points by todsacerdoti 14 hours ago | hide | 452 comments" [ref=e206]: + - row "613 points by todsacerdoti 14 hours ago | hide | 452 comments" [ref=e206]: - cell [ref=e207] - - cell "612 points by todsacerdoti 14 hours ago | hide | 452 comments" [ref=e208]: + - cell "613 points by todsacerdoti 14 hours ago | hide | 452 comments" [ref=e208]: - generic [ref=e209]: - - text: 612 points by + - text: 613 points by - link "todsacerdoti" [ref=e210] [cursor=pointer]: - /url: user?id=todsacerdoti - generic "2026-01-03T00:15:47 1767399347" [ref=e211]: @@ -393,11 +393,11 @@ - 'cell "Ask HN: Who is hiring? (January 2026)" [ref=e264]': - 'link "Ask HN: Who is hiring? (January 2026)" [ref=e266] [cursor=pointer]': - /url: item?id=46466074 - - row "306 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e267]: + - row "307 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e267]: - cell [ref=e268] - - cell "306 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e269]: + - cell "307 points by whoishiring 22 hours ago | hide | 188 comments" [ref=e269]: - generic [ref=e270]: - - text: 306 points by + - text: 307 points by - link "whoishiring" [ref=e271] [cursor=pointer]: - /url: user?id=whoishiring - generic "2026-01-02T16:00:42 1767369642" [ref=e272]: @@ -489,11 +489,11 @@ - link "nullprogram.com" [ref=e329] [cursor=pointer]: - /url: from?site=nullprogram.com - text: ) - - row "76 points by ibobev 13 hours ago | hide | 16 comments" [ref=e330]: + - row "77 points by ibobev 13 hours ago | hide | 16 comments" [ref=e330]: - cell [ref=e331] - - cell "76 points by ibobev 13 hours ago | hide | 16 comments" [ref=e332]: + - cell "77 points by ibobev 13 hours ago | hide | 16 comments" [ref=e332]: - generic [ref=e333]: - - text: 76 points by + - text: 77 points by - link "ibobev" [ref=e334] [cursor=pointer]: - /url: user?id=ibobev - generic "2026-01-03T01:18:07 1767403087" [ref=e335]: @@ -506,69 +506,69 @@ - link "16 comments" [ref=e338] [cursor=pointer]: - /url: item?id=46471712 - row [ref=e339] - - row "16. upvote Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e340]: + - 'row "16. upvote Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e340]': - cell "16." [ref=e341] - cell "upvote" [ref=e342]: - link "upvote" [ref=e344] [cursor=pointer]: - - /url: vote?id=46475296&how=up&goto=news + - /url: vote?id=46421045&how=up&goto=news - generic "upvote" [ref=e345] - - cell "Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e346]: + - 'cell "Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e346]': - generic [ref=e347]: - - link "Profiling with Ctrl-C (2024)" [ref=e348] [cursor=pointer]: - - /url: https://yosefk.com/blog/profiling-with-ctrl-c.html + - 'link "Show HN: The ASCII Side of the Moon" [ref=e348] [cursor=pointer]': + - /url: https://aleyan.com/projects/ascii-side-of-the-moon/?lat=32.72&lon=-117.16&date=2025-12-29T14%3A24Z - generic [ref=e349]: - text: ( - - link "yosefk.com" [ref=e350] [cursor=pointer]: - - /url: from?site=yosefk.com + - link "aleyan.com" [ref=e350] [cursor=pointer]: + - /url: from?site=aleyan.com - text: ) - - row "9 points by hun3 3 hours ago | hide | discuss" [ref=e351]: + - row "6 points by aleyan 3 hours ago | hide | discuss" [ref=e351]: - cell [ref=e352] - - cell "9 points by hun3 3 hours ago | hide | discuss" [ref=e353]: + - cell "6 points by aleyan 3 hours ago | hide | discuss" [ref=e353]: - generic [ref=e354]: - - text: 9 points by - - link "hun3" [ref=e355] [cursor=pointer]: - - /url: user?id=hun3 - - generic "2026-01-03T11:13:48 1767438828" [ref=e356]: + - text: 6 points by + - link "aleyan" [ref=e355] [cursor=pointer]: + - /url: user?id=aleyan + - generic "2025-12-29T14:24:08 1767018248" [ref=e356]: - link "3 hours ago" [ref=e357] [cursor=pointer]: - - /url: item?id=46475296 + - /url: item?id=46421045 - text: "|" - link "hide" [ref=e358] [cursor=pointer]: - - /url: hide?id=46475296&goto=news + - /url: hide?id=46421045&goto=news - text: "|" - link "discuss" [ref=e359] [cursor=pointer]: - - /url: item?id=46475296 + - /url: item?id=46421045 - row [ref=e360] - - row "17. upvote Linux kernel security work (kroah.com)" [ref=e361]: + - row "17. upvote Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e361]: - cell "17." [ref=e362] - cell "upvote" [ref=e363]: - link "upvote" [ref=e365] [cursor=pointer]: - - /url: vote?id=46469623&how=up&goto=news + - /url: vote?id=46475296&how=up&goto=news - generic "upvote" [ref=e366] - - cell "Linux kernel security work (kroah.com)" [ref=e367]: + - cell "Profiling with Ctrl-C (2024) (yosefk.com)" [ref=e367]: - generic [ref=e368]: - - link "Linux kernel security work" [ref=e369] [cursor=pointer]: - - /url: http://www.kroah.com/log/blog/2026/01/02/linux-kernel-security-work/ + - link "Profiling with Ctrl-C (2024)" [ref=e369] [cursor=pointer]: + - /url: https://yosefk.com/blog/profiling-with-ctrl-c.html - generic [ref=e370]: - text: ( - - link "kroah.com" [ref=e371] [cursor=pointer]: - - /url: from?site=kroah.com + - link "yosefk.com" [ref=e371] [cursor=pointer]: + - /url: from?site=yosefk.com - text: ) - - row "126 points by chmaynard 16 hours ago | hide | 56 comments" [ref=e372]: + - row "9 points by hun3 3 hours ago | hide | discuss" [ref=e372]: - cell [ref=e373] - - cell "126 points by chmaynard 16 hours ago | hide | 56 comments" [ref=e374]: + - cell "9 points by hun3 3 hours ago | hide | discuss" [ref=e374]: - generic [ref=e375]: - - text: 126 points by - - link "chmaynard" [ref=e376] [cursor=pointer]: - - /url: user?id=chmaynard - - generic "2026-01-02T21:31:34 1767389494" [ref=e377]: - - link "16 hours ago" [ref=e378] [cursor=pointer]: - - /url: item?id=46469623 + - text: 9 points by + - link "hun3" [ref=e376] [cursor=pointer]: + - /url: user?id=hun3 + - generic "2026-01-03T11:13:48 1767438828" [ref=e377]: + - link "3 hours ago" [ref=e378] [cursor=pointer]: + - /url: item?id=46475296 - text: "|" - link "hide" [ref=e379] [cursor=pointer]: - - /url: hide?id=46469623&goto=news + - /url: hide?id=46475296&goto=news - text: "|" - - link "56 comments" [ref=e380] [cursor=pointer]: - - /url: item?id=46469623 + - link "discuss" [ref=e380] [cursor=pointer]: + - /url: item?id=46475296 - row [ref=e381] - 'row "18. upvote IQuest-Coder: A new open-source code model beats Claude Sonnet 4.5 and GPT 5.1 [pdf] (github.com/iquestlab)" [ref=e382]': - cell "18." [ref=e383] @@ -585,11 +585,11 @@ - link "github.com/iquestlab" [ref=e392] [cursor=pointer]: - /url: from?site=github.com/iquestlab - text: ) - - row "111 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e393]: + - row "112 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e393]: - cell [ref=e394] - - cell "111 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e395]: + - cell "112 points by shenli3514 10 hours ago | hide | 33 comments" [ref=e395]: - generic [ref=e396]: - - text: 111 points by + - text: 112 points by - link "shenli3514" [ref=e397] [cursor=pointer]: - /url: user?id=shenli3514 - generic "2026-01-03T04:01:03 1767412863" [ref=e398]: @@ -602,261 +602,261 @@ - link "33 comments" [ref=e401] [cursor=pointer]: - /url: item?id=46472667 - row [ref=e402] - - row "19. upvote UK company sends factory with 1,000C furnace into space (bbc.co.uk)" [ref=e403]: + - row "19. upvote Linux kernel security work (kroah.com)" [ref=e403]: - cell "19." [ref=e404] - cell "upvote" [ref=e405]: - link "upvote" [ref=e407] [cursor=pointer]: - - /url: vote?id=46442293&how=up&goto=news + - /url: vote?id=46469623&how=up&goto=news - generic "upvote" [ref=e408] - - cell "UK company sends factory with 1,000C furnace into space (bbc.co.uk)" [ref=e409]: + - cell "Linux kernel security work (kroah.com)" [ref=e409]: - generic [ref=e410]: - - link "UK company sends factory with 1,000C furnace into space" [ref=e411] [cursor=pointer]: - - /url: https://www.bbc.co.uk/news/articles/c62vx0pgyrgo + - link "Linux kernel security work" [ref=e411] [cursor=pointer]: + - /url: http://www.kroah.com/log/blog/2026/01/02/linux-kernel-security-work/ - generic [ref=e412]: - text: ( - - link "bbc.co.uk" [ref=e413] [cursor=pointer]: - - /url: from?site=bbc.co.uk + - link "kroah.com" [ref=e413] [cursor=pointer]: + - /url: from?site=kroah.com - text: ) - - row "75 points by vekerdyb 12 hours ago | hide | 32 comments" [ref=e414]: + - row "126 points by chmaynard 16 hours ago | hide | 56 comments" [ref=e414]: - cell [ref=e415] - - cell "75 points by vekerdyb 12 hours ago | hide | 32 comments" [ref=e416]: + - cell "126 points by chmaynard 16 hours ago | hide | 56 comments" [ref=e416]: - generic [ref=e417]: - - text: 75 points by - - link "vekerdyb" [ref=e418] [cursor=pointer]: - - /url: user?id=vekerdyb - - generic "2025-12-31T08:04:30 1767168270" [ref=e419]: - - link "12 hours ago" [ref=e420] [cursor=pointer]: - - /url: item?id=46442293 + - text: 126 points by + - link "chmaynard" [ref=e418] [cursor=pointer]: + - /url: user?id=chmaynard + - generic "2026-01-02T21:31:34 1767389494" [ref=e419]: + - link "16 hours ago" [ref=e420] [cursor=pointer]: + - /url: item?id=46469623 - text: "|" - link "hide" [ref=e421] [cursor=pointer]: - - /url: hide?id=46442293&goto=news + - /url: hide?id=46469623&goto=news - text: "|" - - link "32 comments" [ref=e422] [cursor=pointer]: - - /url: item?id=46442293 + - link "56 comments" [ref=e422] [cursor=pointer]: + - /url: item?id=46469623 - row [ref=e423] - - row "20. upvote Jank Lang Hit Alpha (github.com/jank-lang)" [ref=e424]: + - row "20. upvote UK company sends factory with 1,000C furnace into space (bbc.co.uk)" [ref=e424]: - cell "20." [ref=e425] - cell "upvote" [ref=e426]: - link "upvote" [ref=e428] [cursor=pointer]: - - /url: vote?id=46468517&how=up&goto=news + - /url: vote?id=46442293&how=up&goto=news - generic "upvote" [ref=e429] - - cell "Jank Lang Hit Alpha (github.com/jank-lang)" [ref=e430]: + - cell "UK company sends factory with 1,000C furnace into space (bbc.co.uk)" [ref=e430]: - generic [ref=e431]: - - link "Jank Lang Hit Alpha" [ref=e432] [cursor=pointer]: - - /url: https://github.com/jank-lang/jank + - link "UK company sends factory with 1,000C furnace into space" [ref=e432] [cursor=pointer]: + - /url: https://www.bbc.co.uk/news/articles/c62vx0pgyrgo - generic [ref=e433]: - text: ( - - link "github.com/jank-lang" [ref=e434] [cursor=pointer]: - - /url: from?site=github.com/jank-lang + - link "bbc.co.uk" [ref=e434] [cursor=pointer]: + - /url: from?site=bbc.co.uk - text: ) - - row "195 points by makemethrowaway 18 hours ago | hide | 27 comments" [ref=e435]: + - row "76 points by vekerdyb 12 hours ago | hide | 32 comments" [ref=e435]: - cell [ref=e436] - - cell "195 points by makemethrowaway 18 hours ago | hide | 27 comments" [ref=e437]: + - cell "76 points by vekerdyb 12 hours ago | hide | 32 comments" [ref=e437]: - generic [ref=e438]: - - text: 195 points by - - link "makemethrowaway" [ref=e439] [cursor=pointer]: - - /url: user?id=makemethrowaway - - generic "2026-01-02T19:39:38 1767382778" [ref=e440]: - - link "18 hours ago" [ref=e441] [cursor=pointer]: - - /url: item?id=46468517 + - text: 76 points by + - link "vekerdyb" [ref=e439] [cursor=pointer]: + - /url: user?id=vekerdyb + - generic "2025-12-31T08:04:30 1767168270" [ref=e440]: + - link "12 hours ago" [ref=e441] [cursor=pointer]: + - /url: item?id=46442293 - text: "|" - link "hide" [ref=e442] [cursor=pointer]: - - /url: hide?id=46468517&goto=news + - /url: hide?id=46442293&goto=news - text: "|" - - link "27 comments" [ref=e443] [cursor=pointer]: - - /url: item?id=46468517 + - link "32 comments" [ref=e443] [cursor=pointer]: + - /url: item?id=46442293 - row [ref=e444] - - 'row "21. upvote The Cost of a Closure in C: The Rest (thephd.dev)" [ref=e445]': + - row "21. upvote Jank Lang Hit Alpha (github.com/jank-lang)" [ref=e445]: - cell "21." [ref=e446] - cell "upvote" [ref=e447]: - link "upvote" [ref=e449] [cursor=pointer]: - - /url: vote?id=46442229&how=up&goto=news + - /url: vote?id=46468517&how=up&goto=news - generic "upvote" [ref=e450] - - 'cell "The Cost of a Closure in C: The Rest (thephd.dev)" [ref=e451]': + - cell "Jank Lang Hit Alpha (github.com/jank-lang)" [ref=e451]: - generic [ref=e452]: - - 'link "The Cost of a Closure in C: The Rest" [ref=e453] [cursor=pointer]': - - /url: https://thephd.dev/the-cost-of-a-closure-in-c-c2y-followup + - link "Jank Lang Hit Alpha" [ref=e453] [cursor=pointer]: + - /url: https://github.com/jank-lang/jank - generic [ref=e454]: - text: ( - - link "thephd.dev" [ref=e455] [cursor=pointer]: - - /url: from?site=thephd.dev + - link "github.com/jank-lang" [ref=e455] [cursor=pointer]: + - /url: from?site=github.com/jank-lang - text: ) - - row "50 points by ingve 11 hours ago | hide | 22 comments" [ref=e456]: + - row "195 points by makemethrowaway 18 hours ago | hide | 27 comments" [ref=e456]: - cell [ref=e457] - - cell "50 points by ingve 11 hours ago | hide | 22 comments" [ref=e458]: + - cell "195 points by makemethrowaway 18 hours ago | hide | 27 comments" [ref=e458]: - generic [ref=e459]: - - text: 50 points by - - link "ingve" [ref=e460] [cursor=pointer]: - - /url: user?id=ingve - - generic "2025-12-31T07:44:25 1767167065" [ref=e461]: - - link "11 hours ago" [ref=e462] [cursor=pointer]: - - /url: item?id=46442229 + - text: 195 points by + - link "makemethrowaway" [ref=e460] [cursor=pointer]: + - /url: user?id=makemethrowaway + - generic "2026-01-02T19:39:38 1767382778" [ref=e461]: + - link "18 hours ago" [ref=e462] [cursor=pointer]: + - /url: item?id=46468517 - text: "|" - link "hide" [ref=e463] [cursor=pointer]: - - /url: hide?id=46442229&goto=news + - /url: hide?id=46468517&goto=news - text: "|" - - link "22 comments" [ref=e464] [cursor=pointer]: - - /url: item?id=46442229 + - link "27 comments" [ref=e464] [cursor=pointer]: + - /url: item?id=46468517 - row [ref=e465] - - 'row "22. upvote Show HN: uvx ptn, scan a QR, get a terminal in your phone (github.com/lyehe)" [ref=e466]': + - 'row "22. upvote The Cost of a Closure in C: The Rest (thephd.dev)" [ref=e466]': - cell "22." [ref=e467] - cell "upvote" [ref=e468]: - link "upvote" [ref=e470] [cursor=pointer]: - - /url: vote?id=46472772&how=up&goto=news + - /url: vote?id=46442229&how=up&goto=news - generic "upvote" [ref=e471] - - 'cell "Show HN: uvx ptn, scan a QR, get a terminal in your phone (github.com/lyehe)" [ref=e472]': + - 'cell "The Cost of a Closure in C: The Rest (thephd.dev)" [ref=e472]': - generic [ref=e473]: - - 'link "Show HN: uvx ptn, scan a QR, get a terminal in your phone" [ref=e474] [cursor=pointer]': - - /url: https://github.com/lyehe/porterminal + - 'link "The Cost of a Closure in C: The Rest" [ref=e474] [cursor=pointer]': + - /url: https://thephd.dev/the-cost-of-a-closure-in-c-c2y-followup - generic [ref=e475]: - text: ( - - link "github.com/lyehe" [ref=e476] [cursor=pointer]: - - /url: from?site=github.com/lyehe + - link "thephd.dev" [ref=e476] [cursor=pointer]: + - /url: from?site=thephd.dev - text: ) - - row "43 points by yxl448 10 hours ago | hide | 10 comments" [ref=e477]: + - row "50 points by ingve 11 hours ago | hide | 22 comments" [ref=e477]: - cell [ref=e478] - - cell "43 points by yxl448 10 hours ago | hide | 10 comments" [ref=e479]: + - cell "50 points by ingve 11 hours ago | hide | 22 comments" [ref=e479]: - generic [ref=e480]: - - text: 43 points by - - link "yxl448" [ref=e481] [cursor=pointer]: - - /url: user?id=yxl448 - - generic "2026-01-03T04:22:29 1767414149" [ref=e482]: - - link "10 hours ago" [ref=e483] [cursor=pointer]: - - /url: item?id=46472772 + - text: 50 points by + - link "ingve" [ref=e481] [cursor=pointer]: + - /url: user?id=ingve + - generic "2025-12-31T07:44:25 1767167065" [ref=e482]: + - link "11 hours ago" [ref=e483] [cursor=pointer]: + - /url: item?id=46442229 - text: "|" - link "hide" [ref=e484] [cursor=pointer]: - - /url: hide?id=46472772&goto=news + - /url: hide?id=46442229&goto=news - text: "|" - - link "10 comments" [ref=e485] [cursor=pointer]: - - /url: item?id=46472772 + - link "22 comments" [ref=e485] [cursor=pointer]: + - /url: item?id=46442229 - row [ref=e486] - - row "23. upvote Adventure 751 (1980) (bluerenga.blog)" [ref=e487]: + - 'row "23. upvote Show HN: uvx ptn, scan a QR, get a terminal in your phone (github.com/lyehe)" [ref=e487]': - cell "23." [ref=e488] - cell "upvote" [ref=e489]: - link "upvote" [ref=e491] [cursor=pointer]: - - /url: vote?id=46472230&how=up&goto=news + - /url: vote?id=46472772&how=up&goto=news - generic "upvote" [ref=e492] - - cell "Adventure 751 (1980) (bluerenga.blog)" [ref=e493]: + - 'cell "Show HN: uvx ptn, scan a QR, get a terminal in your phone (github.com/lyehe)" [ref=e493]': - generic [ref=e494]: - - link "Adventure 751 (1980)" [ref=e495] [cursor=pointer]: - - /url: https://bluerenga.blog/2026/01/01/adventure-751-1980/ + - 'link "Show HN: uvx ptn, scan a QR, get a terminal in your phone" [ref=e495] [cursor=pointer]': + - /url: https://github.com/lyehe/porterminal - generic [ref=e496]: - text: ( - - link "bluerenga.blog" [ref=e497] [cursor=pointer]: - - /url: from?site=bluerenga.blog + - link "github.com/lyehe" [ref=e497] [cursor=pointer]: + - /url: from?site=github.com/lyehe - text: ) - - row "37 points by quuxplusone 11 hours ago | hide | 3 comments" [ref=e498]: + - row "43 points by yxl448 10 hours ago | hide | 10 comments" [ref=e498]: - cell [ref=e499] - - cell "37 points by quuxplusone 11 hours ago | hide | 3 comments" [ref=e500]: + - cell "43 points by yxl448 10 hours ago | hide | 10 comments" [ref=e500]: - generic [ref=e501]: - - text: 37 points by - - link "quuxplusone" [ref=e502] [cursor=pointer]: - - /url: user?id=quuxplusone - - generic "2026-01-03T02:38:06 1767407886" [ref=e503]: - - link "11 hours ago" [ref=e504] [cursor=pointer]: - - /url: item?id=46472230 + - text: 43 points by + - link "yxl448" [ref=e502] [cursor=pointer]: + - /url: user?id=yxl448 + - generic "2026-01-03T04:22:29 1767414149" [ref=e503]: + - link "10 hours ago" [ref=e504] [cursor=pointer]: + - /url: item?id=46472772 - text: "|" - link "hide" [ref=e505] [cursor=pointer]: - - /url: hide?id=46472230&goto=news + - /url: hide?id=46472772&goto=news - text: "|" - - link "3 comments" [ref=e506] [cursor=pointer]: - - /url: item?id=46472230 + - link "10 comments" [ref=e506] [cursor=pointer]: + - /url: item?id=46472772 - row [ref=e507] - - row "24. upvote Unix v4 (1973) – Live Terminal (unixv4.dev)" [ref=e508]: + - row "24. upvote Adventure 751 (1980) (bluerenga.blog)" [ref=e508]: - cell "24." [ref=e509] - cell "upvote" [ref=e510]: - link "upvote" [ref=e512] [cursor=pointer]: - - /url: vote?id=46468283&how=up&goto=news + - /url: vote?id=46472230&how=up&goto=news - generic "upvote" [ref=e513] - - cell "Unix v4 (1973) – Live Terminal (unixv4.dev)" [ref=e514]: + - cell "Adventure 751 (1980) (bluerenga.blog)" [ref=e514]: - generic [ref=e515]: - - link "Unix v4 (1973) – Live Terminal" [ref=e516] [cursor=pointer]: - - /url: https://unixv4.dev/ + - link "Adventure 751 (1980)" [ref=e516] [cursor=pointer]: + - /url: https://bluerenga.blog/2026/01/01/adventure-751-1980/ - generic [ref=e517]: - text: ( - - link "unixv4.dev" [ref=e518] [cursor=pointer]: - - /url: from?site=unixv4.dev + - link "bluerenga.blog" [ref=e518] [cursor=pointer]: + - /url: from?site=bluerenga.blog - text: ) - - row "155 points by pjmlp 19 hours ago | hide | 76 comments" [ref=e519]: + - row "37 points by quuxplusone 11 hours ago | hide | 3 comments" [ref=e519]: - cell [ref=e520] - - cell "155 points by pjmlp 19 hours ago | hide | 76 comments" [ref=e521]: + - cell "37 points by quuxplusone 11 hours ago | hide | 3 comments" [ref=e521]: - generic [ref=e522]: - - text: 155 points by - - link "pjmlp" [ref=e523] [cursor=pointer]: - - /url: user?id=pjmlp - - generic "2026-01-02T19:18:36 1767381516" [ref=e524]: - - link "19 hours ago" [ref=e525] [cursor=pointer]: - - /url: item?id=46468283 + - text: 37 points by + - link "quuxplusone" [ref=e523] [cursor=pointer]: + - /url: user?id=quuxplusone + - generic "2026-01-03T02:38:06 1767407886" [ref=e524]: + - link "11 hours ago" [ref=e525] [cursor=pointer]: + - /url: item?id=46472230 - text: "|" - link "hide" [ref=e526] [cursor=pointer]: - - /url: hide?id=46468283&goto=news + - /url: hide?id=46472230&goto=news - text: "|" - - link "76 comments" [ref=e527] [cursor=pointer]: - - /url: item?id=46468283 + - link "3 comments" [ref=e527] [cursor=pointer]: + - /url: item?id=46472230 - row [ref=e528] - - 'row "25. upvote Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e529]': + - row "25. upvote Unix v4 (1973) – Live Terminal (unixv4.dev)" [ref=e529]: - cell "25." [ref=e530] - cell "upvote" [ref=e531]: - link "upvote" [ref=e533] [cursor=pointer]: - - /url: vote?id=46467677&how=up&goto=news + - /url: vote?id=46468283&how=up&goto=news - generic "upvote" [ref=e534] - - 'cell "Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e535]': + - cell "Unix v4 (1973) – Live Terminal (unixv4.dev)" [ref=e535]: - generic [ref=e536]: - - 'link "Fighting Fire with Fire: Scalable Oral Exams" [ref=e537] [cursor=pointer]': - - /url: https://www.behind-the-enemy-lines.com/2025/12/fighting-fire-with-fire-scalable-oral.html + - link "Unix v4 (1973) – Live Terminal" [ref=e537] [cursor=pointer]: + - /url: https://unixv4.dev/ - generic [ref=e538]: - text: ( - - link "behind-the-enemy-lines.com" [ref=e539] [cursor=pointer]: - - /url: from?site=behind-the-enemy-lines.com + - link "unixv4.dev" [ref=e539] [cursor=pointer]: + - /url: from?site=unixv4.dev - text: ) - - row "177 points by sethbannon 20 hours ago | hide | 232 comments" [ref=e540]: + - row "155 points by pjmlp 19 hours ago | hide | 76 comments" [ref=e540]: - cell [ref=e541] - - cell "177 points by sethbannon 20 hours ago | hide | 232 comments" [ref=e542]: + - cell "155 points by pjmlp 19 hours ago | hide | 76 comments" [ref=e542]: - generic [ref=e543]: - - text: 177 points by - - link "sethbannon" [ref=e544] [cursor=pointer]: - - /url: user?id=sethbannon - - generic "2026-01-02T18:18:47 1767377927" [ref=e545]: - - link "20 hours ago" [ref=e546] [cursor=pointer]: - - /url: item?id=46467677 + - text: 155 points by + - link "pjmlp" [ref=e544] [cursor=pointer]: + - /url: user?id=pjmlp + - generic "2026-01-02T19:18:36 1767381516" [ref=e545]: + - link "19 hours ago" [ref=e546] [cursor=pointer]: + - /url: item?id=46468283 - text: "|" - link "hide" [ref=e547] [cursor=pointer]: - - /url: hide?id=46467677&goto=news + - /url: hide?id=46468283&goto=news - text: "|" - - link "232 comments" [ref=e548] [cursor=pointer]: - - /url: item?id=46467677 + - link "76 comments" [ref=e548] [cursor=pointer]: + - /url: item?id=46468283 - row [ref=e549] - - row "26. upvote Accounting for Computer Scientists (2011) (kleppmann.com)" [ref=e550]: + - 'row "26. upvote Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e550]': - cell "26." [ref=e551] - cell "upvote" [ref=e552]: - link "upvote" [ref=e554] [cursor=pointer]: - - /url: vote?id=46467651&how=up&goto=news + - /url: vote?id=46467677&how=up&goto=news - generic "upvote" [ref=e555] - - cell "Accounting for Computer Scientists (2011) (kleppmann.com)" [ref=e556]: + - 'cell "Fighting Fire with Fire: Scalable Oral Exams (behind-the-enemy-lines.com)" [ref=e556]': - generic [ref=e557]: - - link "Accounting for Computer Scientists (2011)" [ref=e558] [cursor=pointer]: - - /url: https://martin.kleppmann.com/2011/03/07/accounting-for-computer-scientists.html + - 'link "Fighting Fire with Fire: Scalable Oral Exams" [ref=e558] [cursor=pointer]': + - /url: https://www.behind-the-enemy-lines.com/2025/12/fighting-fire-with-fire-scalable-oral.html - generic [ref=e559]: - text: ( - - link "kleppmann.com" [ref=e560] [cursor=pointer]: - - /url: from?site=kleppmann.com + - link "behind-the-enemy-lines.com" [ref=e560] [cursor=pointer]: + - /url: from?site=behind-the-enemy-lines.com - text: ) - - row "128 points by tosh 19 hours ago | hide | 49 comments" [ref=e561]: + - row "177 points by sethbannon 20 hours ago | hide | 233 comments" [ref=e561]: - cell [ref=e562] - - cell "128 points by tosh 19 hours ago | hide | 49 comments" [ref=e563]: + - cell "177 points by sethbannon 20 hours ago | hide | 233 comments" [ref=e563]: - generic [ref=e564]: - - text: 128 points by - - link "tosh" [ref=e565] [cursor=pointer]: - - /url: user?id=tosh - - generic "2026-01-02T18:16:07 1767377767" [ref=e566]: - - link "19 hours ago" [ref=e567] [cursor=pointer]: - - /url: item?id=46467651 + - text: 177 points by + - link "sethbannon" [ref=e565] [cursor=pointer]: + - /url: user?id=sethbannon + - generic "2026-01-02T18:18:47 1767377927" [ref=e566]: + - link "20 hours ago" [ref=e567] [cursor=pointer]: + - /url: item?id=46467677 - text: "|" - link "hide" [ref=e568] [cursor=pointer]: - - /url: hide?id=46467651&goto=news + - /url: hide?id=46467677&goto=news - text: "|" - - link "49 comments" [ref=e569] [cursor=pointer]: - - /url: item?id=46467651 + - link "233 comments" [ref=e569] [cursor=pointer]: + - /url: item?id=46467677 - row [ref=e570] - 'row "27. upvote Ask HN: Who wants to be hired? (January 2026)" [ref=e571]': - cell "27." [ref=e572] @@ -867,11 +867,11 @@ - 'cell "Ask HN: Who wants to be hired? (January 2026)" [ref=e577]': - 'link "Ask HN: Who wants to be hired? (January 2026)" [ref=e579] [cursor=pointer]': - /url: item?id=46466073 - - row "124 points by whoishiring 22 hours ago | hide | 231 comments" [ref=e580]: + - row "125 points by whoishiring 22 hours ago | hide | 231 comments" [ref=e580]: - cell [ref=e581] - - cell "124 points by whoishiring 22 hours ago | hide | 231 comments" [ref=e582]: + - cell "125 points by whoishiring 22 hours ago | hide | 231 comments" [ref=e582]: - generic [ref=e583]: - - text: 124 points by + - text: 125 points by - link "whoishiring" [ref=e584] [cursor=pointer]: - /url: user?id=whoishiring - generic "2026-01-02T16:00:42 1767369642" [ref=e585]: @@ -884,37 +884,37 @@ - link "231 comments" [ref=e588] [cursor=pointer]: - /url: item?id=46466073 - row [ref=e589] - - 'row "28. upvote Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e590]': + - row "28. upvote Accounting for Computer Scientists (2011) (kleppmann.com)" [ref=e590]: - cell "28." [ref=e591] - cell "upvote" [ref=e592]: - link "upvote" [ref=e594] [cursor=pointer]: - - /url: vote?id=46421045&how=up&goto=news + - /url: vote?id=46467651&how=up&goto=news - generic "upvote" [ref=e595] - - 'cell "Show HN: The ASCII Side of the Moon (aleyan.com)" [ref=e596]': + - cell "Accounting for Computer Scientists (2011) (kleppmann.com)" [ref=e596]: - generic [ref=e597]: - - 'link "Show HN: The ASCII Side of the Moon" [ref=e598] [cursor=pointer]': - - /url: https://aleyan.com/projects/ascii-side-of-the-moon/?lat=32.72&lon=-117.16&date=2025-12-29T14%3A24Z + - link "Accounting for Computer Scientists (2011)" [ref=e598] [cursor=pointer]: + - /url: https://martin.kleppmann.com/2011/03/07/accounting-for-computer-scientists.html - generic [ref=e599]: - text: ( - - link "aleyan.com" [ref=e600] [cursor=pointer]: - - /url: from?site=aleyan.com + - link "kleppmann.com" [ref=e600] [cursor=pointer]: + - /url: from?site=kleppmann.com - text: ) - - row "5 points by aleyan 3 hours ago | hide | discuss" [ref=e601]: + - row "128 points by tosh 19 hours ago | hide | 49 comments" [ref=e601]: - cell [ref=e602] - - cell "5 points by aleyan 3 hours ago | hide | discuss" [ref=e603]: + - cell "128 points by tosh 19 hours ago | hide | 49 comments" [ref=e603]: - generic [ref=e604]: - - text: 5 points by - - link "aleyan" [ref=e605] [cursor=pointer]: - - /url: user?id=aleyan - - generic "2025-12-29T14:24:08 1767018248" [ref=e606]: - - link "3 hours ago" [ref=e607] [cursor=pointer]: - - /url: item?id=46421045 + - text: 128 points by + - link "tosh" [ref=e605] [cursor=pointer]: + - /url: user?id=tosh + - generic "2026-01-02T18:16:07 1767377767" [ref=e606]: + - link "19 hours ago" [ref=e607] [cursor=pointer]: + - /url: item?id=46467651 - text: "|" - link "hide" [ref=e608] [cursor=pointer]: - - /url: hide?id=46421045&goto=news + - /url: hide?id=46467651&goto=news - text: "|" - - link "discuss" [ref=e609] [cursor=pointer]: - - /url: item?id=46421045 + - link "49 comments" [ref=e609] [cursor=pointer]: + - /url: item?id=46467651 - row [ref=e610] - row "29. upvote The rsync algorithm (1996) [pdf] (cmu.edu)" [ref=e611]: - cell "29." [ref=e612] diff --git a/playwriter/src/assets/aria-labels-hacker-news.png b/playwriter/src/assets/aria-labels-hacker-news.png deleted file mode 100644 index e2f0ba5..0000000 Binary files a/playwriter/src/assets/aria-labels-hacker-news.png and /dev/null differ