Ville Vanninen's Avatar

Ville Vanninen

@sakamies

Senior dev at OP Minimalism, accessibility, ethical tech Best of: OP KevytyrittΓ€jΓ€, Gridlover πŸ³οΈβ€πŸŒˆπŸ³οΈβ€πŸŒˆπŸ³οΈβ€πŸŒˆ pumpula.net

136
Followers
362
Following
86
Posts
07.10.2024
Joined
Posts Following

Latest posts by Ville Vanninen @sakamies

Gaming & culture in general has at least historically had a lot of and really nice open osuuskuntas. I'm not quite in the scene any more but it wasn't that long ago that I would have wholeheartedly recommended this too, might still be a thing!

06.03.2026 18:53 πŸ‘ 3 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Node: normalize() method - Web APIs | MDN The normalize() method of the Node interface puts the specified node and all of its sub-tree into a normalized form. In a normalized sub-tree, no text nodes in the sub-tree are empty and there are no ...

Today I learned there's a native node.normalize() method. Insanely useful at least when dealing with contenteditable=plaintext-only. Will fix a whole tree at once so there are no broken apart or empty dangling text nodes. developer.mozilla.org/en-US/docs/W...

10.02.2026 19:57 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Whoops, I did think of darkmode but then forgot to implement. Thanks! Fixed it.

09.02.2026 22:02 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
The gentle software manifesto Let's be human to each other, even when our tools can be inhuman.

In these times it's good to have a north star, so I wrote a manifesto. Trying to take some poetic licence here, might be a little clumsy at times. I'd welcome any discussion! pumpula.net/manifesto/

09.02.2026 21:12 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Had the bright idea that my mom could do her website content in google docs. I'd just fetch it as markdon, split some pages and render with eleventy. I had no idea word processors could go totally bananas in so so many ways, but also markdown is the pinnacle of human achievement.

08.02.2026 19:46 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Really tempted to apply! Would be right up my alley. But I'm super duper happy in my current job. I wish there was time in the world to lend help with all the good things. πŸ™ˆ

22.01.2026 13:24 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0
Video thumbnail

It's been below -20C for over a week now. Just about everything looks incredible every second of the day.

10.01.2026 14:21 πŸ‘ 5 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Oh hey one more thing, if you happen to be using Sketch or any other very mac native creative apps, they can save some hidden time machine save history right on your drive and all that's dynamic too, so it just accumulates until it's auto-flushed or turned off. Had this with Sketch back in the day.

06.12.2025 09:27 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

It's all somehow dynamic nowadays. I seem to have about 50-80 gigs free on any given day regardless of how much actual stuff I have. Maybe it's some caches or automatic shuffling of whatever stuff between cloud and computer. I had the same thing with a 256 drive and now my 512 drive so just ugh.

05.12.2025 09:59 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Whaht, that's amazing!

03.12.2025 11:54 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Ahh now I get it. Your solution looks brilliant!

27.11.2025 13:07 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

If you need guaranteed globally unique keys that refer to certain objects, maybe a Map() with Symbol() keys? Now that I wrote that, sounds rather convoluted, but maybe. The key wouldn't be derived from the object, so kinda same to just compare the objects themselves.

26.11.2025 21:21 πŸ‘ 0 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Not directly really I think. You could use strict equality to tell them apart, but I'm guessing that's not exactly what you're looking for? Like `obj1 = {a: 1}; obj2 = {a: 1}; obj1 === obj2` would be false because they're not the same reference. What kind of use case are you looking at?

26.11.2025 21:11 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Good old Company Portral. Good luck with the corporate malware, it's a thing to behold. We have a huge list of weird forced stuff on startup. Each for reasons but oh boy it's quite something.

22.11.2025 19:21 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Didn't even see the double duty P until looking at it for a few seconds, totally read it as porvoon peruna like normal. πŸ™ˆ

03.11.2025 07:47 πŸ‘ 3 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

IE 8 is the oldest I can test so I guess that's what I'd call support. I don't see why it wouldn't work down to Netscapes of yore though.

26.10.2025 06:01 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Case insensitivity does make it so much easier to block regular names and such, but yeah it should really be toggleable for acronyms. Haven't muted ice yet either exactly because of that. 😩

25.10.2025 08:40 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Ugh they're horrible. I switched to the spray kinda thing. Intuitively I'd think spraying it directly to my membranes would work better than melting a tablet in the mouth, but I dunno. I'll try anything to make flu shorter though, I'm just miserable when I'm sick.

22.10.2025 08:13 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

In super short: Using ML(+LLMs) in our team for legit statistical analysis, not the hyped use cases. I hate chatgpt etc, make me feel dumber, but still been useful. Dealing with onslaught of generated stuff, trying to guard against thoughtlesness. So far efficiency gains offset by efficiency losses.

20.10.2025 16:32 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

This spurred some thoughts and this would be a great blog post if I had a blog. Looks like I can't message you directly, would you mind if I reply privately via message or some other way?

20.10.2025 16:13 πŸ‘ 1 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Some day I'll stop fighting windmills, but not today.

14.10.2025 14:45 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Can you believe I'm doing prompting workshops at work? My first advice: "Please don't, you human brains are so much better at all of this and your thoughts matter." But it's already happening anyway so I'm trying my best to defuse any bombs before they go off.

14.10.2025 14:44 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Loading spinner (radial + conical gradient) ...

Nothing too glamorous, but managed to delete a lot of old code at work with this. The old loading spinner one was an svg file and a bunch of other stuff, now it's just a couple css gradients. codepen.io/sakamies/pen... Also you know @keyframes spin {to {rotate: 1turn}} is like poetry.

10.10.2025 07:34 πŸ‘ 5 πŸ” 0 πŸ’¬ 0 πŸ“Œ 1

Saw a 100% generated frontend refactor go verbatim into production. The file had now doubled in size, had a big block of js that did literally (not figuratively) nothing and custom styles because why use our own styles. πŸ€·β€β™‚οΈ My responsibility but didn't catch it in time. This will become exhausting.

18.09.2025 14:29 πŸ‘ 4 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

Got the magazine and thoroughly enjoying it. In the middle of everything seeming to go faster and faster, it feels delightfully slow, just like a great cup of coffee. I read it with my morning coffee, about twice a week, just to savour it. Thank you!

11.09.2025 08:11 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Yup, I have list too. And really, I've noticed that if I have to code react in vscode for a whole day, I do end my day in a foul mood even if the work itself was reasonable.

29.08.2025 16:42 πŸ‘ 2 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

"hot sauce" or something to add rocket fuel to the yes, I think most important effect of the game. πŸ˜„

29.08.2025 13:38 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Good old noclip.

29.08.2025 13:31 πŸ‘ 2 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0

Had an actual real summer vacation for the first time in my adult life and didn't do anything on my computer. It was glorious.

29.08.2025 13:19 πŸ‘ 8 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0

In the spirit of qwop, here's a horrible name suggestion before you even ask. Qwertyuiop! Sorry πŸ˜…

02.08.2025 11:19 πŸ‘ 5 πŸ” 0 πŸ’¬ 1 πŸ“Œ 0