I’m a few years into my homelab. (might go into a bit more detail about that at some point!), and I often need to ssh into one of my servers. At home, I can just do this by using a domain name like: ssh ahoy.m.example.ca ssh bread.m.example.ca I have set up Split-Horizon DNS at home using DNSMasq , so these domains resolve but only at home. When I’m outside, I use a a ‘bastion’ server that I can…
Ever since Mozilla killed its GPS location service , GPS hasn’t been very accurate for me on Linux. The system on linux that handles location on many linux systems is called Geoclue , and this system is used by for example Firefox and Gnome Maps (notably not Chrome). Based on the output of /usr/libexec/geoclue-2.0/demos/where-am-i , it uses a GeoIP database which places me somewhere in Toronto…
After building a gopher server and website , I couldn’t quite get enough of the Gopher bug, and decided to build a Gopher client in the browser. To be honest, this is actually more like a HTTP proxy for Gopher, but I might at some point turn this into a standalone client or even port it to some native platforms. Anyway, here’s a screenshot: Burrow screenshot And if you want to try it out, go to…
When I just got on the internet and spent a lot of time tinkering with Windows 98 internet settings, just to get and stay online I first learned about something called Gopher via this settings screen: Windows 98 proxy setting screen I was always a bit curious about this. At the time all major browsers supported Gopher and occasionally would run into an elusive gopher:// link, perfectly integrated…
Password managers are still the best way to manage credentials, and if you are doing things on the web, you should be using one. Increasingly, websites are using multi-step login forms. They might first ask for just an email address and only after present users with a password field. Google Login form Amazon Login form Unfortunately, this doesn’t always work well with password managers. Password…
Curveball is a server-side webframework for Node.js. I’ve been working on it for 6 years as a side-project, but it wasn’t successful and it’s time to let it go. This is a hard thing to do, because I probably have 1000’s of hours into this project, and there’s a strong sense of missed potential. I’m writing this article because my psyche requires closure in order for them to not take up space in my…
Node 23 was released this week, and the hot ticket item probably is the fact that you can now require() files that use ESM ( import / export ). This is helpful because ESM and CommonJS ( require / module.exports ) are kind of different worlds and before this change if you wanted to use a “module” from your CommonJS file, you would need to do something like: const theThing = await import ( '…
Say you have an API, and you want to communicate what sort of things a user can do on a specific endpoint. You can use external description formats like OpenAPI or JSON Schema, but sometimes it’s nice to also dynamically communicate this on the API itself. OPTIONS is the method used for that. You may know this HTTP method from CORS , but it’s general purpose is for clients to passively find out…
A new RFC was released for Structured Fields: RFC9651 . What is it? HTTP headers have been a bit of a free-for all in terms of how complex values are encoded, with many headers requiring their own mini-parser. A while back an effort was started to fix this for headers going forward, named ‘Structured Fields’. They’re called Fields and not ‘Headers’ because HTTP has both Headers and Trailers!…
One week ago on September 24th my son Kian was born, after a 5 year fertility journey with my wife Roxy. Roxy and Kian are well and I’m really excited for everything that comes next!
Over the years I’ve written several open source libraries. They’re mostly unglamorous and utilitarian, but a bunch of them obtained got a decent download count, so I thought it would be fun to try and get a grand total and show a ‘live’ download counter on my blog. This is how that looks like: My open source packages were downloaded roughly 138945563 times. Like most live counters, this number…
I’m a maintainer of several small open-source libraries. It’s a fun activity. If the scope of the library is small enough, the maintenance burden is typically fairly low. They’re usually mostly ‘done’, and I occasionally just need to answer a few questions per year, and do the occasional release to bring it back up to the current ‘meta’ of the ecosystem. Also even though it’s ‘done’, in use by a…
I just released v2.3.0 of @badgateway/oauth2-client , which I wrote because there weren’t any lean, 0-dependency oauth2 clients with modern features such as PKCE . This new version includes support for: Resource Indicators for OAuth 2.0 ( RFC8707 ). OAuth2 Token Revocation ( RFC7009 ). Hope you like it!
The React/Next.js ecosystem is spinning out of control in terms of magic and complexity. The stack has failed to stay focused and simple, and it’s my belief that software stacks that are too complex and magical must eventually fail, because as sensibilities around software design change they will be unable to adapt to those changes without cannibalizing their existing userbase. So while…
There’s been a bit of a trend recently for some companies to move to 4-day workweeks. This is making a decent amount of noise, but the actual number of companies offering this still seems pretty few and far between. It’s not hard to imagine why CEOs might feel this is risky, considering that many don’t even trust people to work from home. What I don’t see much are 80% jobs, which are 32 hour jobs,…
I read an interesting thread on Hackernews in response to a post: “Why is OAuth still hard in 2023”. The post and comments bring up a lot of real issues with OAuth. The article ends with a pitch to use the author’s product Nango that advertises support for supporting OAuth2 flows for 90+ APIs and justifying the existence of the product. We don’t need 90 browsers to open 90 websites, so why is this…
It seems like every 7-8 years I’m switching operating systems. In 2006 I first started using Apple, because it was just so damn cool to have a well working Unix-like system. (I’ll never forget you Snow Leopard). In 2015 I switched to Ubuntu. Apple’s Software seemed to hit rock bottom at this point from a quality perspective, and hardware seemed to go obsolete at a rate I hadn’t seen before. Fed up…
I maintain a few dozen Javascript libraries, and recently updated many of them to support CommonJS and Ecmascript modules at the same time. The first half of this article describes why and how I did it, and then all the hoops I had to jump through to make things work. Hopefully it’s a helpful document for the next challenger. A quick refresher, CommonJS code typically looks like this: const MyApp…
In 2019 I started Bad Gateway as a software development agency. Last year we grew all the way to 7 people. It was crazy challenging, especially with Covid in the mix; but ultimately could not get the company into a good financial state to be able to carry on. Big thanks to my co-workers and partners Ju , Becky , Phil , Michael , Siep , Richard and Syed . I’m incredibly grateful you came on this…
I’m a maintainer of several dozen open source libraries. One thing I’ve always done is maintain a hand-written changelog. Here’s an example from a12n-server 0.22.0 (2022-09-27) ------------------- Warning note for upgraders. This release has a database migration on the `oauth2_tokens` table. For most users this is the largest table, some downtime may be expected while the server runs its…
Knex recently released a new version this week (2.4.0). Before this version, Knex had a pretty scary SQL injection. Knex currently has 1.3 million weekly downloads and is quite popular. The security bug is probably one of the worst SQL injections I’ve seen in recent memory, especially considering the scope and popularity. If you want to get straight to the details: Check out the Github issue ,…
As developers we write a lot of code, but we also deal with a lot of configuration files. The three major formats I tend to use day to day are: JSON YAML .env And, they all kinda suck. JSON feels like it should never have become a format that people hand-write. So many quotes, and and configuration files need comments to tell users why certain decisions were made. .env has a specific purpose (and…
In the early 90’s, being a frisian kid obsessed with computers there weren’t a ton of ways to get access to new software or learn more about computers. The two main ways were exchanging 3.5” diskettes with friends, or go to the library. One book I remember more than others was “Windows for Kinderen” (“Windows for Kids”) by Addo Stuur. I must have been around 10 years old and was obsessed by this…
I’ve been a Twitter user and fan since 2007. With Twitter’s future looking a bit grim, I started looking around if there’s another place to go. Twitter can’t really be replaced with anything else, because everyone’s Twitter experience is unique to them and their community. For me, it’s the main way I stay in touch with my Open Source / HTTP / API / Hypermedia bubble and some friends. Losing that…
Bun is the hot new server-side Javascript runtime, in the same category as Node and Deno . Bun uses the JavascriptCore engine from Webkit, unlike Node and Deno which use V8 . A big selling point is that it’s coming out faster in a many benchmarks, however the things I’m personally excited about is some of it’s quality of life features: It parses Typescript and JSX by default (but doesn’t type…