diff --git a/holding/_worker.js/home.js b/holding/_worker.js/home.js index c297b6598..881dce297 100644 --- a/holding/_worker.js/home.js +++ b/holding/_worker.js/home.js @@ -198,7 +198,12 @@ export async function serveHomepageWithPrerenderedTracks(request, env, ctx) { `` + (small ? `` : "") + desktopSrc + - `${escAttr(altMap[p.stem] || ` + + // fall back to the stem (matching photos.js) rather than alt="": the + // grid tile IS the link, so an empty alt makes the nameless for + // screen readers and agents. 12 of 158 stems have no alt.json caption + // yet, and the homepage draws 12 at random, so a nameless link showed + // up intermittently (Lighthouse link-name + agent-accessibility-tree). + `${escAttr(altMap[p.stem] || p.stem)}` + `` + ``; }).join(""); diff --git a/holding/_worker.js/lib/desktop.js b/holding/_worker.js/lib/desktop.js index 063d598e5..76d316789 100644 --- a/holding/_worker.js/lib/desktop.js +++ b/holding/_worker.js/lib/desktop.js @@ -5,4 +5,4 @@ // DESKTOP_CHROME sits at the end of (icons + taskbar). nav.js adopts // both and only wires behavior. export const DESKTOP_TOP = "
"; -export const DESKTOP_CHROME = "
start⌘K
garagelwewritingreadingserendipityaroundlensmusiccoffee
"; +export const DESKTOP_CHROME = "
start⌘K
garagelwewritingreadingserendipityaroundlensmusiccoffee
"; diff --git a/holding/_worker.js/run.js b/holding/_worker.js/run.js index ecaca9a2e..54e9de264 100644 --- a/holding/_worker.js/run.js +++ b/holding/_worker.js/run.js @@ -27,8 +27,8 @@ const DESTS = [ ["updates", "/updates", "Windows Update"], ["restore", "/restore", "System Restore"], ["bot", "/bot", "AadharshBot methodology"], - ["twitter", "https://twitter.com/oddhash", "profile"], - ["instagram", "https://instagram.com/aadharsh.hif", "profile"], + ["twitter", "https://x.com/oddhash", "profile"], + ["instagram", "https://www.instagram.com/aadharsh.hif", "profile"], ["curius", "https://curius.app/aadharsh-pannirselvam", "profile"], ["beli", "https://beliapp.com/users/aadharsh", "profile"], ["spotify", "https://open.spotify.com/user/aadharsh2010", "profile"], diff --git a/holding/garage/blueprint.html b/holding/garage/blueprint.html index 26e3383d9..fc9d94bfa 100644 --- a/holding/garage/blueprint.html +++ b/holding/garage/blueprint.html @@ -509,6 +509,6 @@

What I would not touchthe soul

- + diff --git a/holding/garage/chunks.html b/holding/garage/chunks.html index d9aac1444..ae5544461 100644 --- a/holding/garage/chunks.html +++ b/holding/garage/chunks.html @@ -651,6 +651,6 @@

4 · Delta wire format & verified slices

- + diff --git a/holding/garage/cloudflare.html b/holding/garage/cloudflare.html index 064bda591..958f94638 100644 --- a/holding/garage/cloudflare.html +++ b/holding/garage/cloudflare.html @@ -497,6 +497,6 @@

The honest scorecard

- + diff --git a/holding/garage/encoding.html b/holding/garage/encoding.html index b3dc1349f..c0b2f2ad2 100644 --- a/holding/garage/encoding.html +++ b/holding/garage/encoding.html @@ -666,6 +666,6 @@

What aadhar.sh actually ships

- + diff --git a/holding/garage/gpt56.html b/holding/garage/gpt56.html index bb06ec699..5a808d2a9 100644 --- a/holding/garage/gpt56.html +++ b/holding/garage/gpt56.html @@ -205,6 +205,6 @@

What actually made it onto the lift

document.querySelectorAll("[data-mode]").forEach(function(btn){btn.addEventListener("click",function(){var d=data[btn.dataset.mode];document.querySelectorAll("[data-mode]").forEach(function(b){b.setAttribute("aria-pressed",b===btn?"true":"false")});title.textContent=d.title;copy.textContent=d.copy;rounds.textContent=d.rounds;evidence.textContent=d.evidence;handoff.textContent=d.handoff;meter.style.width=d.meter+"%";state.textContent=d.state})}); }()); - + diff --git a/holding/garage/horizon.html b/holding/garage/horizon.html index b8e797272..fa2170fd9 100644 --- a/holding/garage/horizon.html +++ b/holding/garage/horizon.html @@ -2825,14 +2825,18 @@

Declarative arrow-key navigation for a set of controls: put - focusgroup on a container and the browser gives its children a - single tab stop, arrow-key movement between them, and last-focused memory, - the roving-tabindex pattern every toolbar and menu hand-rolls in - JS. Shipped default-on in Chrome 150; no Safari or Firefox yet, where it + focusgroup="toolbar" on a container and the browser gives its + children a single tab stop, arrow-key movement between them, and last-focused + memory, the roving-tabindex pattern every toolbar and menu + hand-rolls in JS. The value is a behavior token naming the widget pattern + (toolbar, tablist, radiogroup, + listbox, menu, menubar); a bare + focusgroup is rejected with a console error and buys you nothing. + Shipped default-on in Chrome 150; no Safari or Firefox yet, where it degrades to each control being its own tab stop. Tab into the toolbar below, then use the arrow keys (in Chrome 150):

-
+
@@ -3145,7 +3149,7 @@

RFC 5861 · Cloudflare async 2026

- A Cache-Control directive (RFC 5861): + A Cache-Control directive (RFC 5861): keep serving the expired copy for a grace window while a fresh one is fetched in the background, so nobody waits on the revalidation. Cloudflare made its handling fully asynchronous in Feb 2026: the first hit after expiry used to block @@ -3708,6 +3712,6 @@

Servo alpha ~Jul 2026

- + diff --git a/holding/garage/index.html b/holding/garage/index.html index 8994bb0f9..450f898dd 100644 --- a/holding/garage/index.html +++ b/holding/garage/index.html @@ -320,7 +320,7 @@

Garage

this one nicknamed George. (Murray ran the same play on the F1: Albert & Edward.) Photo Calreyn88, - CC BY-SA 4.0. + CC BY-SA 4.0.
@@ -333,7 +333,7 @@

Garage

body onto a 96 (right) so it could test on public roads without tipping the design. Photo Jelger Groeneveld, - CC BY 2.0. + CC BY 2.0.
@@ -694,6 +694,6 @@

Garage

- + diff --git a/holding/garage/iroh.html b/holding/garage/iroh.html index 48a582759..c4f6b690f 100644 --- a/holding/garage/iroh.html +++ b/holding/garage/iroh.html @@ -423,6 +423,6 @@

Can it live on this site?

- + diff --git a/holding/garage/masonry.html b/holding/garage/masonry.html index 8bef8b659..e9dc12c6d 100644 --- a/holding/garage/masonry.html +++ b/holding/garage/masonry.html @@ -325,6 +325,6 @@

A masonry contact sheet

- + diff --git a/holding/garage/pretext.html b/holding/garage/pretext.html index bf5a9f84d..966c71f77 100644 --- a/holding/garage/pretext.html +++ b/holding/garage/pretext.html @@ -599,6 +599,6 @@

7 · Tradeoffs (why it stays "watching")

- + diff --git a/holding/garage/safari27.html b/holding/garage/safari27.html index 01b0c7155..f4c612af1 100644 --- a/holding/garage/safari27.html +++ b/holding/garage/safari27.html @@ -412,6 +412,6 @@

The talks WWDC26

- + diff --git a/holding/garage/scroll.html b/holding/garage/scroll.html index ad7e094cf..572082cb4 100644 --- a/holding/garage/scroll.html +++ b/holding/garage/scroll.html @@ -575,6 +575,6 @@

3 · The Luna scrollbar (scroll inside the b - + diff --git a/holding/garage/teardown.html b/holding/garage/teardown.html index b4533de8c..975fe3604 100644 --- a/holding/garage/teardown.html +++ b/holding/garage/teardown.html @@ -489,6 +489,6 @@

The restverified, shipped

- + diff --git a/holding/garage/tooltips.html b/holding/garage/tooltips.html index 7cdf3097a..14056d844 100644 --- a/holding/garage/tooltips.html +++ b/holding/garage/tooltips.html @@ -1367,6 +1367,6 @@

CSS Anchor Positioning shipped

- + diff --git a/holding/garage/wire.html b/holding/garage/wire.html index de85c182f..6764ee84b 100644 --- a/holding/garage/wire.html +++ b/holding/garage/wire.html @@ -763,6 +763,6 @@

The honest scorecard

- + diff --git a/holding/garage/workers.html b/holding/garage/workers.html index 9d923e50a..65c85ca0f 100644 --- a/holding/garage/workers.html +++ b/holding/garage/workers.html @@ -525,6 +525,6 @@

The honest scorecard

- + diff --git a/holding/index.md b/holding/index.md index beb441917..80f3cd1c2 100644 --- a/holding/index.md +++ b/holding/index.md @@ -1,6 +1,6 @@ # Aadharsh Pannirselvam -Researching and investing at [Archetype](https://archetype.fund). Building +Researching and investing at [Archetype](https://www.archetype.fund/). Building [this site](https://aadhar.sh) in the meantime. **Under construction.** @@ -49,8 +49,8 @@ archive is browsable at `/photos`, and machine-readable at ## Links -- Twitter: -- Instagram: +- Twitter: +- Instagram: - Curius: - Beli: - Spotify: diff --git a/holding/llms.txt b/holding/llms.txt index 3bc8b3698..7c9c2557f 100644 --- a/holding/llms.txt +++ b/holding/llms.txt @@ -150,10 +150,10 @@ aggregations. ## Identity -- [Twitter](https://twitter.com/oddhash): Day-to-day thinking out loud. -- [Instagram](https://instagram.com/aadharsh.hif): Photographs. +- [Twitter](https://x.com/oddhash): Day-to-day thinking out loud. +- [Instagram](https://www.instagram.com/aadharsh.hif): Photographs. - [GitHub](https://github.com/oddharsh): Code. -- [LinkedIn](https://www.linkedin.com/in/aadharsh-pannirselvam/): Professional profile. +- [LinkedIn](https://www.linkedin.com/in/aadharsh-pannirselvam): Professional profile. - [Spotify](https://open.spotify.com/user/aadharsh2010): My profile; individual eras live as renamed playlists. - [Curius](https://curius.app/aadharsh-pannirselvam): Reading I want to @@ -166,7 +166,7 @@ aggregations. ## Optional -- [Archetype](https://archetype.fund): The crypto-native venture firm +- [Archetype](https://www.archetype.fund/): The crypto-native venture firm where I research and invest. - [song.link](https://song.link): The redirector used in `/rn/tracks` so music links work across Spotify, Apple Music, YouTube Music, Tidal, etc. diff --git a/holding/lwe/dac.html b/holding/lwe/dac.html index 9fd55c967..6ae12610f 100644 --- a/holding/lwe/dac.html +++ b/holding/lwe/dac.html @@ -772,6 +772,6 @@ - + diff --git a/holding/lwe/drivers.html b/holding/lwe/drivers.html index 901f21707..448215c54 100644 --- a/holding/lwe/drivers.html +++ b/holding/lwe/drivers.html @@ -102,7 +102,7 @@
Learning With Errors
cones & films

-

Starter draft. The mechanism is standard driver physics; the demo is a real phase-lag model (a cone driven at one point against a film driven everywhere), not a measurement. Background paraphrased from Wikipedia and the usual headphone references.

+

Starter draft. The mechanism is standard driver physics; the demo is a real phase-lag model (a cone driven at one point against a film driven everywhere), not a measurement. Background paraphrased from Wikipedia and the usual headphone references.

@@ -142,7 +142,7 @@

That is the honest summary. Neither wins outright. A well-engineered dynamic driver can sound excellent, and a sloppy planar can sound worse than a good dynamic. The mechanism sets the tendencies; the tuning and the build decide the result.

aadharsh
-

point drive versus spread-out drive, and the rest follows. thanks.

→ planar magnetic on Wikipedia · headphones on Wikipedia · back to Learning With Errors

+

point drive versus spread-out drive, and the rest follows. thanks.

→ planar magnetic on Wikipedia · headphones on Wikipedia · back to Learning With Errors

end of first pass
@@ -307,6 +307,6 @@ - + diff --git a/holding/lwe/encoding.html b/holding/lwe/encoding.html index 814f523f8..f6f4e3e42 100644 --- a/holding/lwe/encoding.html +++ b/holding/lwe/encoding.html @@ -377,6 +377,6 @@ - + diff --git a/holding/lwe/fhe.html b/holding/lwe/fhe.html index 27ae941b4..6f3ee33b5 100644 --- a/holding/lwe/fhe.html +++ b/holding/lwe/fhe.html @@ -573,6 +573,6 @@ - + diff --git a/holding/lwe/index.html b/holding/lwe/index.html index 1f40fde22..e3d254a3c 100644 --- a/holding/lwe/index.html +++ b/holding/lwe/index.html @@ -203,6 +203,6 @@ } - + diff --git a/holding/lwe/knots.html b/holding/lwe/knots.html index 219b38b58..bf1da470f 100644 --- a/holding/lwe/knots.html +++ b/holding/lwe/knots.html @@ -320,6 +320,6 @@ - + diff --git a/holding/lwe/mpc.html b/holding/lwe/mpc.html index 2ddcc4890..edcd6b245 100644 --- a/holding/lwe/mpc.html +++ b/holding/lwe/mpc.html @@ -365,6 +365,6 @@ - + diff --git a/holding/lwe/pcrypto.html b/holding/lwe/pcrypto.html index 782a0efa1..49fd52c02 100644 --- a/holding/lwe/pcrypto.html +++ b/holding/lwe/pcrypto.html @@ -294,6 +294,6 @@ - + diff --git a/holding/lwe/tee.html b/holding/lwe/tee.html index 67e456ba4..50c6af63a 100644 --- a/holding/lwe/tee.html +++ b/holding/lwe/tee.html @@ -332,6 +332,6 @@ - + diff --git a/holding/lwe/utf8.html b/holding/lwe/utf8.html index d6ca9ee7b..66ac2e343 100644 --- a/holding/lwe/utf8.html +++ b/holding/lwe/utf8.html @@ -402,6 +402,6 @@ - + diff --git a/holding/lwe/vigenere.html b/holding/lwe/vigenere.html index ef4c05758..01310bde8 100644 --- a/holding/lwe/vigenere.html +++ b/holding/lwe/vigenere.html @@ -667,6 +667,6 @@ - + diff --git a/holding/resume.json b/holding/resume.json index cae8c054c..f41e7387f 100644 --- a/holding/resume.json +++ b/holding/resume.json @@ -10,7 +10,7 @@ "email": "resume@aadhar.sh", "url": "https://aadhar.sh", "profiles": [ - { "network": "X", "username": "oddhash", "url": "https://twitter.com/oddhash" }, + { "network": "X", "username": "oddhash", "url": "https://x.com/oddhash" }, { "network": "ENS", "username": "aadharsh.eth" } ] }, diff --git a/holding/resume.md b/holding/resume.md index 173264321..68fc21e9c 100644 --- a/holding/resume.md +++ b/holding/resume.md @@ -1,6 +1,6 @@ # Aadharsh Pannirselvam -resume@aadhar.sh · [aadhar.sh](https://aadhar.sh) (check out [/lwe](https://aadhar.sh/lwe) and the source for the site) · aadharsh.eth · [@oddhash](https://twitter.com/oddhash) +resume@aadhar.sh · [aadhar.sh](https://aadhar.sh) (check out [/lwe](https://aadhar.sh/lwe) and the source for the site) · aadharsh.eth · [@oddhash](https://x.com/oddhash) Plain-text mirror of resume.pdf (the canonical copy). Structured data lives in resume.json. diff --git a/serendipity/serendipity.js b/serendipity/serendipity.js index 24dca69de..f6dcfad27 100644 --- a/serendipity/serendipity.js +++ b/serendipity/serendipity.js @@ -1422,7 +1422,7 @@ function mcpAttendee(a) { if (a.twitter_handle) socials.x = "https://x.com/" + String(a.twitter_handle).replace(/^@/, ""); if (a.linkedin_url) socials.linkedin = a.linkedin_url; else if (a.linkedin_handle) socials.linkedin = "https://linkedin.com/in/" + a.linkedin_handle; - if (a.instagram_handle) socials.instagram = "https://instagram.com/" + String(a.instagram_handle).replace(/^@/, ""); + if (a.instagram_handle) socials.instagram = "https://www.instagram.com/" + String(a.instagram_handle).replace(/^@/, ""); if (a.website) socials.website = a.website; const o = { name: a.name,