File watching with chokidar

File watchers are powerful tools. We take them for granted because they're often baked in, like Webpack rebuilding when you save a file.

Sometimes I'm in an environment without auto-reloading to my disposal. Yesterday, I was working on a CLI tool. The workflow was modify code, save changes, switch to terminal, run the tool, and look at the output. It's not that bad, but I'd prefer a shorter feedback loop.

Read more

Lessons from Atomic Habits

Last year, I read Atomic Habits by James Clear. I first heard of James Clear during Justin Jackson's Laracon 2019 talk in New York, when he quoted:

Every action you take is a vote for the type of person you wish to become.

No single instance will transform your beliefs, but as the votes build up, so does the evidence of your identity.

This is why habits are crucial. They cast repeated votes for being a type of person.

I picked up the book a while later. It was a great read and I got through it pretty quick! However, the key metric for a book like this is: did it have an impact on my daily life or mental models?

Read more

Reusable Alpine Components by Ryan Chandler

I've been using Alpine often lately. Ryan has written a lot of good stuff on Alpine, but his reusable components post is what really got me kickstarted.

You should be careful to not abstract too early. If you are finding it difficult to manage your Alpine component from the x-data attribute, this one is definitely for you.

The way this article builds up was very helpful: only use the level of abstraction you need:

  1. No abstractions
  2. Extract to a component function
  3. Use x-spread
  4. Mix in other data

The window.matchMedia API

To execute a piece of code when the viewport is a certain size, the first thing that comes to mind is adding a resize event listener to the window object. This is one way, but not always the best. Sometimes the lesser known window.matchMedia API is a better fit.

Read more

Clearing personal data from inactive accounts

Freek wrote about cleaning up inactive user data from Oh Dear:

You want to keep only as little personal data as needed for privacy reasons. You should only collect and keep the absolute minimum of data needed to run your application. This keeps your user's privacy safe and minimizes the risks for you as a company if a security breach happens.

This is a really good initiative, I can't even imagine how much data I have scattered across hundreds of trial accounts on the internet…

The Record type in TypeScript

I can't count the amount of times I've defined an object type with unknown string keys and a specific value type.

type Scores = {
[key: string]: number;
}

And despite using it all the time, I can't for the life of me remember the [key: string] syntax.

Today, my problems are solved. Apparently TypeScript has a built in Record type that does exactly that:

type Scores = Record<string, number>;

Tim MacDonald on HasOne relationships in Laravel

I've used HasOne relationships for 1:1 relationships, but those are rare. I haven't considered using them to scope down relationships, like having one default payment method in a set of n methods.

<?php
 
class User extends Model
{
public function paymentMethods(): HasMany
{
return $this->hasMany(PaymentMethod::class);
}
 
public function defaultPaymentMethod(): ?HasOne
{
return $this->hasOne(PaymentMethod::class)
->whereDefault();
}
}
 
$user->defaultPaymentMethod;

After reading Tim's post, I have a feeling there are some places where I needed this but didn't think of it at the time…

Antilibrary: the perfect excuse to buy more books

From Anne-Laure Le Cunff:

An antilibrary is a private collection of unread books. […]

The goal of an antilibrary is not to collect books you have read so you can proudly display them on your shelf; instead, it is to curate a highly personal collection of resources around themes you are curious about. Instead of a celebration of everything you know, an antilibrary is an ode to everything you want to explore. […]

An antilibrary creates a humble relationship with knowledge. It reminds us that our knowledge is finite and imperfect.

I have more unread books than read, and at some point I decided to stop buying books until I read more of the ones I owned.

After learning about the antilibrary, I lifted my own restriction and started to buy books again. The result: I've been reading more than ever.