And we'll see here in a minute if I've just borked my instance...
Upgraded elasticsearch to 9.X and node.js to 22... and rebuilding...
If this instance goes splort, at least I'll have something to do this weekend.
And we'll see here in a minute if I've just borked my instance...
Upgraded elasticsearch to 9.X and node.js to 22... and rebuilding...
If this instance goes splort, at least I'll have something to do this weekend.
The pain when trying to imagine something running as a CLI program that's a good POSIX-y citizen but also does complicated dynamic async stuff internally. #Nodejs has a stupid tcsetattr stomp. #Python's async story feels weak. Got curious about #Elixir/#Erlang relatively speaking, looked at erl_signal_server to see about cleaning up on SIGINT instead of triggering emulator break, but it's not in the handleable list! --erl +Bd allows classic immediate exit, but not cleanup. Argh.
🥳 New module release: Hetzner Cloud OpenAPI Client
https://codeberg.org/small-tech/hetzner-cloud-openapi-client
This is an OpenAPI client for Node.js generated from the official Hetzner Cloud OpenAPI specification using Massimo.
Recently, while reviewing the code for Catalyst¹, I realised that the Hetzner library I was using was deprecated. The only other client library listed on Awesome Hetzner Cloud for JavaScript was updated seven years ago². So I did a bit of research and discovered that Hetzner has an official OpenAPI specification (useful little things that you can generate documentation as well as working client code from). I also discovered Massimo³, a lightweight and easy to use OpenAPI client generator.
So, anyway, a few minutes later, I had a working Node.js client generated but I thought I’d take a little more time to make it into a module in case anyone else wanted to use it.
In the process, I also created a simple web app example with Kitten⁴ where you can enter your Hetzner API key in a web interface, have it persisted to the default Kitten database⁴ and then carry out a simple call to list your servers. It’s 99 lines of code, including comments, in a single file. (Because Kitten loves you.)
The example uses the new/advanced class and event-based way of working with Kitten so you might find it interesting for that reason too (I haven’t had the chance to document this workflow properly yet). It also showcases Kitten’s Streaming HTML⁵ workflow, as well as its built-in support for semantic default styles and its first-class Markdown support.
You can see the source code for the Kitten example here:
https://codeberg.org/small-tech/hetzner-cloud-openapi-client/src/branch/main/example/index.page.js
The cool thing is that because the client is generated from the official Hetzner OpenAPI specification, it’s one command to update it should the specification change and you can be sure it matches exactly what’s in the API documentation.
Enjoy!
💕
¹ https://catalyst.small-web.org
² https://github.com/hetznercloud/awesome-hcloud#javascript
³ https://massimohttp.dev/
⁴ https://kitten.small-web.org/tutorials/persistence/
⁵ https://kitten.small-web.org/tutorials/streaming-html/
#Hetzner #HetznerCloud #API #OpenAPI #Massimo #NodeJS #JavaScript #servers #hosting #VPS #Kitten #SmallWeb #SmallTech
From the PyInfra talk by @wowi42
https://fosdem.org/2026/schedule/event/VEQTLH-infrastructure-as-python/
The "Norway problem" in yaml: If you write "Country: NO", it is interpreted as "Country: false"
"Is there a Norwegian in the room? How do you feel about it? Exactly!"
Une nouvelle lib TypeScript pour travailler avec les PDF en Node.js ou Bun. Elle permet notamment de gérer les formulaires, les signatures, etc.
Elle ambitionne également de générer des PDF à partir de HTML dans le futur.
Une nouvelle lib TypeScript pour travailler avec les PDF en Node.js ou Bun. Elle permet notamment de gérer les formulaires, les signatures, etc.
Elle ambitionne également de générer des PDF à partir de HTML dans le futur.
So guess who wrote a convoluted date comparison conditional instead of using `Temporal.ZonedDateTime.compare()` like an intelligent human being and ended up hitting an edge case where future scheduled calls started getting cleaned off the database instead of past ones?
I’ll give you a hint: has two thumbs and his name is Aral 🤦♂️
Anyway, just restored things from yesterday’s backup and sent a direct message to everyone scheduled for a Gaza Verified video verification call apologising for the confusion and explaining what happened.
Moral of the story: stick to the Temporal API and use its methods if you’re implementing anything even remotely non-trivial involving dates, especially if there are timezones involved. (You can use a Temporal API polyfill in Node.js – I’ve been using temporal-polyfill.)
Now I’m going to expire for the evening.
💕
#GazaVerified #TemporalAPI #calendars #dates #timezones #JavaScript #NodeJS
Does anyone have experience using the i18n node.js package? I could really use some help fixing this issue with incorrect language being detected:
https://github.com/jointhefediverse-net/jointhefediverse.net/issues/99
#node #NodeJS #i18n #internationalization #WebDev #WebDevHelp
🥳 Multiple major releases today
• @small-tech/auto-encrypt v5.0.0 (https://codeberg.org/small-tech/auto-encrypt#readme)
• @small-tech/auto-encrypt-localhost v10.0.0 (https://codeberg.org/small-tech/auto-encrypt-localhost/#readme)
• @small-tech/https v6.0.0 (https://codeberg.org/small-tech/https/#readme)
These releases bring short-lived certificates, IP Address (IPv4 and IPv6) support, and ACME Renewal Information (ARI) support to Auto Encrypt and @small-tech/https, implement a consistent asynchronous API across all three packages, and include loads of little fixes and code quality improvements.
This brings us very close to getting Web Numbers¹ support implemented natively in Kitten².
OCSP support is removed from Auto Encrypt and Windows support is dropped from all three packages as Microsoft is complicit in Israel’s genocide of the Palestinian people³ and Small Technology Foundation⁴ stands in solidarity with the Boycott, Divestment, and Sanctions (BDS) movement. Furthermore, Windows is an ad-infested and surveillance-ridden dumpster fire of an operating system and, alongside supporting genocide, you are putting both yourself and others at risk by using it.
Enjoy!
💕
🇵🇸 To support families facing genocide in Gaza, consider donating to them via Gaza Verified: https://gaza-verified.org/donate/
¹ https://ar.al/2025/06/25/web-numbers/
² https://kitten.small-web.org/
³ https://www.bdsmovement.net/microsoft
⁴ https://small-tech.org/
#SmallWeb #SmallTech #AutoEncrypt #AutoEncryptLocalhost #https #TLS #NodeJS #web #dev #ACME #LetsEncrypt #WebNumbers #Kitten #BDS #Palestine #Gaza #FreePalestine
The creator of #NodeJS claims "the era of humans writing code is over".
Finally! We can stop writing #JavaScript! 😜
The creator of #NodeJS claims "the era of humans writing code is over".
Finally! We can stop writing #JavaScript! 😜
🇵🇸 @small-tech/cross-platform-hostname module deprecated
https://www.npmjs.com/package/@small-tech/cross-platform-hostname
The release of version 1.1.0 deprecates and removes support for this small module that normalised hostname reporting between Linux/macOS and Windows.
We no longer support Windows as Microsoft is complicit in Israel’s genocide of the Palestinian people¹ and Small Technology Foundation² stands in solidarity with the Boycott, Divestment, and Sanctions (BDS) movement³.
Windows is an ad-infested and surveillance-ridden dumpster fire of an operating system and, alongside supporting genocide, you are putting both yourself and others at risk by using it.
When supporting Linux/macOS, just use the built-in os.hostname() which works the same way on both platforms.
¹ https://www.bdsmovement.net/microsoft
² https://small-tech.org/
³ https://www.bdsmovement.net/
#SmallTechnologyFoundation #crossPlatformHostname #npm #module #deprecation #BDS #Microsoft #Windows #NodeJS #web #dev #FOSS #SmallTech #SmallWeb #israel #genocide #Gaza #Palestine #FreePalestine #techIsPolitical #codeIsPolitical
🥳 @small-tech/auto-encrypt-localhost version 9.0.1 released
Automatically provisions and installs locally-trusted TLS certificates for Node.js https servers (including Polka, Express.js, etc.) As used in Kitten¹
This is a housekeeping release:
• Add TypeScript type definitions.
• Improve code quality; fix all type warnings.
• Update dependencies and remove all npm vulnerability warnings.
Enjoy! 💕
¹ https://kitten.small-web.org
#SmallTech #SmallWeb #AutoEncryptLocalhost #TLS #web #dev #NodeJS #JavaScript #SmallTechnologyFoundation
🥳 @small-tech/syswide-cas v7.0.2 released
Enables Node.js to use custom Certificate Authorities (CAs) alongside the bundled root CAs.
https://codeberg.org/small-tech/syswide-cas#readme
• Drops legacy Node support
• Is now ESM
• Improved code quality
• Added TypeScript type information
Full change log: https://codeberg.org/small-tech/syswide-cas/src/branch/main/CHANGELOG.md
Enjoy!
💕
#SmallTech #releases #syswideCAs #TLS #NodeJS #CertificateAuthorities
Caught a bug over the holidays so I’m mostly resting, feeling sorry for myself, and taking the time to at least carry out some mindless housekeeping tasks (updating dependencies, etc.) on some of my Node modules.
Released updates to the following packages yesterday:
Tape-based Node.js testing:
• Tap monkey (https://codeberg.org/small-tech/tap-monkey)
• tap-out (https://codeberg.org/small-tech/tap-out)
• esm-tape-runner (no changes; just migrated to Codeberg: https://codeberg.org/small-tech/esm-tape-runner)
Let’s Encrypt:
• Node Pebble (https://codeberg.org/small-tech/node-pebble)
Enjoy! 💕
#NodeJS #SmallTech #tape #testing #tapMonkey #tapOut #esmTapeRunner #LetsEncrypt #NodePebble #npm #modules
So I’m teaching a friend who doesn’t have any development knowledge how to get started with Small Web development and I thought it would be a good opportunity to start creating and sharing the course on the Kitten web site, one lesson at a time.
Here’s the link:
https://kitten.small-web.org/course
It’s a work in progress that I’ll be adding to along with our lessons but the draft of the first one, on setting up your development environment (which I whipped up in the pub last night, so expect typos) is here:
https://kitten.small-web.org/course/setting-up/
Please feel free to follow along and file issues if you have thoughts for improvements, etc.
The Setting Up lesson will actually likely end up being the second one with the first being a theoretical one on Small (peer-to-peer) Web development and how it is similar to and differs from Big (centralised) Web development.
Enjoy!
💕
#SmallWeb #Kitten #SmallTech #web #dev #course #education #HTML #CSS #JavaScript #NodeJS