Knowledge Updates
Observations while developing web applications and creating great software.
-
Habits decide your future
-
The Fish of Theseus ↗
Fish 4.0 completes the move from C++ to Rust.
Fish is a fantastic shell with tab completions, syntax highlighting, autocomplete, and lots more. It’s been my daily driver for at least 5 years now. If you depend on Bash scripts you can use Bass to load them.
Great tooling makes development fun — very important in a hobby project:
We need to get one thing out of the way: Rust is cool. It’s fun.
It’s tempting to try to sweep this under the rug because it feels gauche to say, but it’s actually important for a number of reasons.
For one, fish is a hobby project, and that means we want it to be fun for us. Nobody is being paid to work on fish, so we need it to be fun. Being fun and interesting also attracts contributors.
Rust also has great tooling. The tools have really paid a lot of attention to use, and the compiler errors are terrific. Not even “compared to C++”, they just actually rule. And as we have tried to pay attention to our own error messages (fish has a bespoke error for if it thinks a file you told it to run has Windows line endings), we like it.
And it is easy to get that tooling installed –
rustup
is magic, and allows people to get started quickly, with minimal fuss or root permissions. When the answer to “how to upgrade C++ compiler” is “find a repository (with root permissions), compile it yourself, install some other repository or a docker image”, it is amazing how the Rust answer can just be “use rustup”.Rust has great ergonomics – the difference between C++’s pointers (which can always be NULL) and Rust’s Options are apparent very quickly even to those of us who had never used it before. We did have a backport of C++’s optional, and liked using it, but it was never as integrated as Rust’s Options were.
Great tools lead to great projects.
While we’re talking about shells, you might want to try Ghostty, Berkeley Mono, and Fastfetch to kick off 2025.
-
Upcoming CVE for End-of-Life Node.js Versions ↗
The Node.js Project will soon issue a CVE for EOL versions of Node.js such as Node.js 16 — which is still downloaded 11 million times per month.
You can run
is-my-node-vulnerable
to check if you are using an EOL version of any version with a CVE issued to it.npx is-my-node-vulnerable
These versions are supported as of this writing:
- Node.js 23 (Current)
- Node.js 22 (LTS)
- Node.js 20 (Maintenance LTS)
- Node.js 18 (Maintenance LTS)
Why issue a CVE? Node.js aims to warn users by issuing a CVE:
- Raise Awareness: Inform users that running EOL versions exposes their applications to potential vulnerabilities.
- Encourage Upgrades: Prompt organizations and developers to update to actively supported Node.js versions.
- Improve Security: Reduce the number of applications running outdated and unsupported versions of Node.js.
-
95% Conviction ↗
Neil Panchal of U.S. Graphics, who recently released the excellent Berkeley Mono 2.0 typeface for professionals:
Not a fan of “building in public” culture. You end up creating an average of all loud opinions, burn yourself to mediocrity by pleasing everyone—sacrificing originality. The end result will be made by the people for the people, not by the artist.
Feedback is useful if it is objective. It kills if it is subjective. Accept/Ignore either, it will chip away at your conviction.
I think a good operating scheme is 95% conviction, 5% feedback. Or may be even 99%.
In 1993, Steve Jobs recalled working with Paul Rand to create the NeXT brand:
I asked him if he would come up with a few options, and he said, ‘No, I will solve your problem for you. And you will pay me.’
Via X
-
React Hook Form vs. Formik ↗
This discussion on X favors React Hook Form over Formik due to Formik falling behind with features and performance. Also some goodies for why native form handling isn’t yet good enough: you cannot style native validation errors.
The preference for React Hook Form isn’t too surprising as it’s also supported by Vercel.