Niels Leenheer

CTO of Salonhub. Creator of html5test.com, writes at nielsleenheer.com, team @FronteersConf, Google Developers Expert, Invite me to speak at your event.

2025-05-27

PSA:

If you ever want to test out your brand new smoke machine and DMX to USB convertor by using WebUSB from the browser. Just do it outside. Trust me.

2025-05-09

Conference day 4…

Did I have regrets the morning after the #btconf afterparty? Yes, yes I did.

Did I learn anything from that experience?

No, it appears that I did not.

2025-05-08

Great talk by @sitnik_en about the GDPR and privacy at #sveltesummit. Dropping facts.

We all hate cookie banners. But it isn’t the GDPR forcing it on us. It is devs deciding tracking is more important than user experience. It is *us* making the web worse.

2025-03-30

Really enjoyed #SotB #SotB2025 yesterday. Great talks and the Barbican is such amazing brutalist location.

Wandered around a bit during lunch and discovered some of the shooting locations from a Ren music video.

youtu.be/Uq3Z6D74dSA?si=b-gQlb

2025-03-25

The flight from Tromsø back to Amsterdam diverted to another airport due to bad weather. ❄️

At least I have plenty of time to do some photo editing 😅

2025-03-24

Back in Tromsø for the Northern Lights. Can’t believe my luck that I managed to catch a shooting star. 💫

2025-03-07

Enjoying the wildlife at Schiphol airport.

2025-02-15

@Kilian I used the SVG preview extension for a live split view preview. Worked perfectly.

But that is now overridden but the default SVG preview.

2025-02-15

Worst thing, apparently there is no way to disable this behaviour by default and it breaks all SVG preview extensions that do open a preview in a sidebar.

2025-02-15

VS Code now previews SVG files by default instead of showing the code editor...

How... What... Why...?

I want my code editor to show me my SVG code...

A preview is nice as a sidebar, but not as a replacement for the editor, and certainly not without an easy way to switch between the two.

2025-02-01

After a fantastic #HalfStack conference yesterday it is now time to leave Phoenix and head to Las Vegas for the next two days. ✨

2025-01-22

This evening I am dealing with two of the most complicated issues a web developer can face.

Debugging why getBoundingClientRect() returns a rect with all 0's from an event handler, while it returns a normal rect from the console.

And... getting Adobe to cancel a Creative Cloud license.

2025-01-22

Just 9 more days until HalfStack Phoenix! I’ll give a talk about one of the core principles of the web: Resilience.

A deep dive in HTML with an important message: You are allowed to experiment. Make mistakes. The web is for everybody.

halfstackconf.com/phoenix

Niels Leenheer boosted:
Karl Groveskarlgroves
2025-01-21

If you’re at a rally and someone is on stage giving Nazi salutes and nobody yanks that person off stage, then you are at a Nazi rally.

2025-01-20

Ring ring….

Hi this is PayPal. Can you tell us the e-mailaddress of your account for verification.

Me: Eh. No. I don’t think I will.

PayPal: This is for security purposes. To verify we’re speaking with the correct person…

Me: Yeah, no I can’t tell you… for security purposes.

PayPal: Oh.

To be fair. It was PayPal. I knew it was PayPal. But come on, cold calling and asking for account details over the phone…

2025-01-14

It’s Chromium only, so you need a WASM based fallback for other browsers.

But surprisingly it also does not work in Electron - which is Chromium. The API is there and “functional”, but it just doesn’t detect anything.

Perhaps it uses some proprietary Google code that does not ship in Electron.

2025-01-14

The BarcodeDetector API is a very useful addition for our app. You can basically turn every webcam into a barcode scanner.

I made this library based on it:

github.com/NielsLeenheer/Webca

Try it here:
point-of-sale.dev/barcode-scan

2025-01-14

@tomayac The same Node api is also exposed in Electron. But I think because of the integration with Chromium there are some very subtle differences.

2025-01-13

Spend an hour debugging printing to a network receipt printer from Electron. Same code worked just fine in Node itself.

Turns out the fix was adding a delay between the socket.write() call and socket.destroy() call.

2025-01-02

So this is how I spend most of my free time yesterday.

Client Info

Server: https://mastodon.social
Version: 2025.04
Repository: https://github.com/cyevgeniy/lmst