S
Stuart Langridge
kryogenix.org · Personal blog · on HN since 2007
Stuart Langridge, a web developer and open source contributor, writes about JavaScript, progressive enhancement, browser choice and privacy.
What HN saysHN commenters link his posts on progressive enhancement and web forms, plus his talk on the UX of chat interfaces.
65HN people shared it
27linked it in comments
57stories submitted
465story points
4 months agolast shared
2007people per year2026
Most-shared posts
- 1Everyone has JavaScript, right?20 people · 296 points · first shared 2015 · 113 comments on HN
- 2Why Web Availability Matters4 people · 4 points · first shared 2015 · discussion on HN
- 3Sortable, vanilla JavaScript to sort HTML tables via the DOM4 people · 2 points · first shared 2011 · discussion on HN
- 4A standard web site password change API3 people · 9 points · first shared 2017 · 2 comments on HN
- 5Talking to the Competition and Markets Authority about Apple3 people · 2 points · first shared 2021 · discussion on HN
- 6Browser choice on Apple's iOS: privacy and security aspects2 people · 8 points · first shared 2021 · 1 comments on HN
- 7The Next Big Thing Is Privacy2 people · 7 points · first shared 2014 · discussion on HN
- 8Privacy could be the next big thing: a video talk2 people · 5 points · first shared 2018 · 1 comments on HN
- 9Browsers are not rendering engines2 people · 3 points · first shared 2020 · discussion on HN
- 10Wondering what to do (if anything) about hotlinking2 people · 3 points · first shared 2023 · discussion on HN
- 11Purple map, 2012 edition1 people · 43 points · first shared 2012 · 43 comments on HN
- 12Farmbound, or how I built an app in 20221 people · 13 points · first shared 2022 · 6 comments on HN
- 13Show HN: Farmbound – A Diurnal Game of Farming1 people · 7 points · first shared 2022 · discussion on HN
- 14Reasons to not like ads1 people · 6 points · first shared 2016 · discussion on HN
- 15The thing and the whole of the thing: on DRM in HTML1 people · 4 points · first shared 2013 · discussion on HN
What HN people wrote when they linked it
linsomniac · 2021-12-26
Earlier this year I got a ReSpeaker mic for video conferencing, and it's been working great! I did have to upload the latest firmware once I got it. I then combined it with NoiseTorch for a basically perfect video chatting experience.
NoiseTorch detects speech and mutes the mic when you aren't speaking. I had tried Hushboard, which mutes the mic when you are typing, but sometimes I talk when I type. ReSpeaker is a microphone array, and it has a speaker output and can do noise cancelling on the mic from what is sent to the speaker. It was about $60.
https://www.seeedstudio.com/ReSpeaker-USB-Mic-Array-p-4247.html
https://github.com/lawl/NoiseTorch
https://www.kryogenix.org/code/hushboard/
stuartlangridge · 2017-11-29
Yup. Shilling my own work here, https://kryogenix.org/code/the-ux-of-text-fusion/ is a talk which explicitly calls that out -- we can do better than this, and whoever works out how to deliver chat interfaces where you can't imagine the underlying nodejs commands will have people love their stuff. (And the answer certainly isn't "pretend to be a human", either, as you know; be a bot, be known to be a bot, and have people relate to you anyway. But now I'm just reiterating the talk.)
rich_harris · 2026-07-02
I have to admit I get very disappointed when I see new form abstractions that don't take this seriously — especially if they make bold claims like 'the new paradigm'!. The whole point of forms is that they're part of HTML. You should not need JavaScript to submit a form, period.
I think about the woman in this story — https://shkspr.mobi/blog/2021/01/the-unreasonable-effectiveness-of-sim… — as an industry, we've lost our way if we don't care enough about people like her to make our apps work reliably. Not everyone has JavaScript: https://www.kryogenix.org/code/browser/everyonehasjs.html
Moreover, validation is something that belongs on the server. Client-first approaches to form validation are at best duplicative (because you need to repeat the validation on the server) and at worst dangerous (because it tricks you into thinking that's unnecessary).
I also notice that one of the first forms on your website doesn't adhere to common accessibility guidelines — the email field is marked invalid as soon as you start typing. Ordinarily, you shouldn't validate a field until it has been blurred.
So what I'd like to see from people building form abstractions is a) a full stack approach, b) progressive enhancement, and c) adherence to accessibility guidelines.
FWIW this is how we think about forms in the Svelte project: https://svelte.dev/docs/kit/remote-functions#form
jakelazaroff · 2026-05-12
Compared to all the new icon images on the page, that request for the new HTML source is probably negligible.
With the previous implementation, all users would get the progressive enhancement… except non-JS users :) https://www.kryogenix.org/code/browser/everyonehasjs.html
capitainenemo · 2026-02-20
As well as contrast issues, could also be that there was a javascript error on their end (or they don't whitelist sites for JS by default). This is unfortunately one of those sites that renders a completely blank page unless you use reader mode, enable JS, or disable CSS.
If it was a random JS error, well, that reminds me of:
https://www.kryogenix.org/code/browser/everyonehasjs.html
graypegg · 2023-10-28
This seems like a well done talk, but part of me is tired of the same information repeated again and again in different forms. I feel like I’ve already seen [0] [1] [2] this talk about 15min in. Details tag, input validation attributes, the dialog element etc.
It’s a good message (look at these platform features!) but rarely am I seeing people that are surprised by the existence of the details accordion tag any more.
Comically I guess the <details> tag they’re (and myself is) familiar with is usually wrapped in an Accordion react component with the open close state saved in a hook, so maybe we haven’t learned.
[0] http://youmightnotneedjs.com/
[1] https://www.kryogenix.org/code/dont-need-that-js/
[2] https://javascript.plainenglish.io/sometimes-you-dont-need-javascript-…
zerojames · 2023-09-18
Why thank you! I am using https://www.kryogenix.org/days/2012/12/30/simple-svg-sparklines/ for the sparklines. All credit goes to Stuart who made the SVG!
The MediaWiki sparkline is powered by the same thing and https://sparkline.jamesg.blog (open source link in site footer).
tvararu · 2023-05-25
"Everyone has JS, right?"
https://www.kryogenix.org/code/browser/everyonehasjs.html
version_five · 2023-01-05
There was a post here recently about an html table sorting library someone wrote https://www.kryogenix.org/code/browser/sorttable/
Just dont hotlink to it
pajtai · 2023-01-04
I would modify the script to display a notice:
"Thank you for using SortTable from https://www.kryogenix.org/code/browser/sorttable/. If you, the site owner, would like to use SortTable without this notice, please download the script from [here](URL link) and add it to your server."
If you want to get fancy you can serve the modified script only if it's being hot linked and the original script if it's being used on www.kryogenix.org - or another website that has permission to use the script.
scim-knox-twox · 2022-03-01
StevenWaterman · 2022-03-01
From further down the page, this is relevant https://kryogenix.org/code/browser/everyonehasjs.html
agust · 2021-12-04
Definitely. The situation on iOS is much worse than it ever was on Windows. Apple is banning all competition in the browser space on more than 1 billion devices worldwide.
Antitrust legislators would surely be very interested in this if they were aware of the issue, but most of them probably aren't yet. Some people have been talking to regulators, like Stuart Langridge and Bruce Lawson to the UK regulator, the CMA.
Stuart Langridge presentation to the CMA: https://kryogenix.org/code/cma-apple/
giantrobot · 2020-05-15
Everyone has JavaScript disabled sometimes. https://kryogenix.org/code/browser/everyonehasjs.html
mtmail · 2019-12-11
There's a similar proposal to allow password manager to change passwords. https://mikewest.github.io/change-password/ (https://www.kryogenix.org/days/2017/02/24/a-standard-password-change-a…
jspash · 2018-07-02
I have this same conversation most days at work! By the way, I agree with codedokode except for one thing. I believe it should have been implemented in plain HTML but enhanced with JS. Works for everyone. Even the 5%. https://kryogenix.org/code/browser/everyonehasjs.html
acdha · 2016-05-16
Ignoring the people who use some sort of blocking, everyone effectively has JavaScript disabled until it loads. I don't have JavaScript disabled by default but I notice this regularly when pages either take a very long time to render or never do because something (network, origin server) has an error:
http://kryogenix.org/code/browser/everyonehasjs.html
azar1 · 2015-10-27
Exactly. This article really changed the way I thought about optimizing for slow network speeds: http://www.kryogenix.org/code/browser/why-availability/
pmlnr · 2015-05-08
by the way, the author of pingback is doing webmentions intead already ;)
http://www.kryogenix.org/days/2014/11/29/enabling-webmentions/
drawkbox · 2012-05-24
I literally paused reading when I read this simply put exact statement. I try to focus on minimal, simple apis and preach it to developers and clients for quick integration and maintenance. Now I have this powerful statement to save hours of explaining mainly to non technical people. I have always thought this but never so crisp and to the point. We need t-shirts. Doing a quick search of Google, it appears a few others have recently stated this as much but it is an idea that should take hold: http://www.kryogenix.org/code/apis-like/
lubujackson · 2011-12-20
Just add some JS and call it a day. http://www.kryogenix.org/code/browser/sorttable/
mgunes · 2009-10-14
Every install of Ubuntu 9.10 (going final in two weeks) will come with CouchDB, managed with Desktop Couch:
http://www.kryogenix.org/days/2009/07/09/desktop-couch-initial-code
adrianh · 2007-12-17
I've seen a couple of implementations of "Python as a template language with 'end' statements" over the years. Here's one:
http://www.kryogenix.org/code/vellum/docs/templates.html
Another one is Python Server Pages:
http://www.ciobriefings.com/psp/
(Edited to fix typo.)
pdkl95 · 2016-04-24
> makes sense to do
Do you use the pointer that fopen(3) returns without checking for NULL? Progressive enhancement is mainly error checking and handing failures gracefully.
> not willing to turn it off when the site doesn't work without JS
Why are you willing to make your business look shoddy and unprofessional? Running without javascript has always been an option, and always will be. Anyone that doesn't run the javascript obviously isn't expecting fancy features, but you should still show any text/images (or a basic form if that is relevant), probably along a suggestion that turning on javascript will probably improve their experience.
> changes necessary to have this progressive enhancement
That's the point - this shouldn't cost a lot, unless your tools are unusually braindead. Rails made progressive enhancement almost entirely transparent a long time ago. I believe there are several prerender-the-first-load plugins for several popular frameworks. If your tools aren't doing this for you (either automagically or otherwise), then those tools are missing important features.
> work culture changes
It is probably a good idea to pay any technical debt sooner, instead of tying even more projects to bad tools.
> users who use NoScript
NoScript users are NOT[1] the only group that will see your pages without Javascript. You don't control the client, which will always be unreliable.
Also, progressive enhancement isn't a boolean value; you should be checking for the…
jakub_g · 2016-01-16
(if you don't know the author, he's a web evangelist, working previously for Mozilla, now for Microsoft; now you can understand his frustration, in the times of recent Chrome monoculture in the web)
I wholeheartedly agree with the author and wanted to post another long rant here, but I resisted the temptation :)
In this particular example of a WebGL demo, I think it was not exactly malicious, the issue was IMO most probably due to writing non-future-proof code, and then abandoning it (there was a related post last week about writing non-future-proof Python code that will break in python4, same applies here). Lots of early "HTML5" demos do not work anymore because they used some not-yet-standardized and/or prefixed syntaxes that have changed since etc.
Anyway, the link to [1] is very interesting. Many people underestimate the risk of third-party JS server going down (or being slow), adblockers preventing some JS from executing etc.
Edit: to clarify, I don't mean you should not use JS (heck I'm a JS developer, and IMHO the times of "progressive enhancement" are long gone, unless you serve almost only text content). I don't mean you should have 3 redundant servers to serve your JS from; just detecting that the thing didn't load, and not making assumption that it will be reliably delivered to the user in 0.1 s, would be good enough. There are pages out there that will totally break or fail to load if some non-important JS file is not loaded due to a network issue or whatever…
arafalov · 2014-10-22
Ok, if you are going to do it, here is the bunch of links that got there part of the way and need someone to take further:
http://googleappsdeveloper.blogspot.com/2011/11/parsing-exported-mailb…
https://docs.python.org/3/library/mailbox.html?highlight=mailbox#modul…
https://gist.github.com/ptwobrussell/8791064
http://www.kryogenix.org/days/2013/12/19/searching-my-email/
http://batleth.sapienti-sat.org/projects/mb2md/ (if going from mbox to mailbox is easier)