RSSAmplifier

Blog

Ben Silverman

My personal website!

bensilverman.co.ukRSS feed ↗26 posts

Latest posts

I sense another rewrite coming on

Feeling the itch to redo my website again. I’ve been getting increasingly interested in the whole IndieWeb thing and like the idea of really making this the home for all of my Stuff. I already have a page for the movies I’ve watched (see if you can find it) but that data still originates over on Letterboxd. The biggest problem I have with the whole POSSE ( P ublish on your O wn S ite, S yndicate E…

Vertical Tabs

So it turns out Firefox and Chrome both support vertical tabs now. I first tried using vertical tabs back when Arc Browser was popular—and hadn't yet experienced the massive vulnerability that probably(?) contributed to its discontinuation back in 2025—and I really liked them. I was a bit sad to have to go back to horizontal tabs at the top of screen and tried extensions like Tree Style Tabs and…

Who will I be in 75 days?

If you're reading this after the 20th March, 2026, I'll be a completely different person...I think? Or maybe I'll be me, but better? Or the same person in almost every day but very slightly different in one extremely important but equally intangible factor? Who knows! To elaborate, my girlfriend and I (and a friend of ours) will be attempting 75 Soft this year, and I'm interested and excited to…

Advent of Code 2025 - Day 11

Finally some more graph traversal! Read the full prompt. Part 1 Simple breadth-first search for Part 1. We want to know how many routes are possible to get from the start to the finish. function partOne() { const paths = []; const queue: Array<Array<string>> = [["you"]]; while (queue.length > 0) { const path = queue.shift()!; const node = path[path.length - 1]; if (node === "out") {…

Advent of Code 2025 - Day 10

A bit of linear programming on my birthday, how lovely! Read the full prompt. Part 1 My idea for solving Part 1 was to represent the lights as a Set of numbers, and then use the use newly available symmetricDifference method to toggle the lights on and off. Doing setA.symmetricDifference(setB) will return numbers which are in either setA or setB , but not both . So for a set of lights lights :=…

Advent of Code 2025 - Day 9

The hardest Part 2, I think! Read the full prompt. Part 1 The idea is we have a bunch of points on a grid, and need to find which pair of points would create the largest rectangle (imagine them defining opposite corners of a rectangle). The first thing that tripped me up was realising that these coordinates weren't on a continuous plane, and we needed to take into account the "size" of the point…

Advent of Code 2025 - Day 8

Coincidentally, also the day I put my own Christmas lights up! Read the full prompt. Part 1 & 2 I'll cover both parts at the same time today because you basically just need to do the same thing for each, but Part 2 requires you to do it for longer. To summarise today's problem, you're given a list of Christmas light IDs, and a map of which lights connect to which. When you connect two lights…

Advent of Code 2025 - Day 7

I think this was my favourite day of Advent of Code this year. Very interesting puzzle with some super satisfying solutions once you give it a bit of thought (or a lot of thought, in my case). Read the full prompt. Part 1 So we've got a beam that's being fired down through a Christmas tree-shaped structure of "beam splitters" and we need to count how many times the beam gets split as it makes its…

Advent of Code 2025 - Day 6

Oh how I envy Python's zip() function... Read the full prompt. Part 1 I think today's trickiness was mainly from figuring out what the question wanted you to do, and how it code something that Did It Correctly. Unfortunately, JS doesn't have a great standard library of array functions for stuff like this, so I resorted to writing my own transpose() function and using it to swap the rows and the…

Advent of Code 2025 - Day 5

Ingredient management! We need to figure out which ingredients are fresh, and which aren't. Read the full prompt. Part 1 It's easy enough to write a bruteforce solution for Part 1 and check every ingredient to see if it lies within one of the given ranges of fresh ingredients. const freshRanges = ranges.map<Range>(r => { const [lower, upper] = r.split("-").map(Number); return { lower, upper } });…

Advent of Code 2025 - Day 4

Toilet paper meets Sokoban...sort of. We have to look through all of the rolls of toilet paper on a grid and work out which can be removed, which will be when there are fewer than 4 rolls of toilet paper in the adjacent positions around each roll. Read the full prompt. Part 1 I didn't really have any clever solution for this. I just iterated through each roll in the grid and counted how many…

Advent of Code 2025 - Day 3

An appearance from the Duracell Bunny today, as we compare batteries! Read the full prompt. Part 1 My approach for today was to split up each line of input into an array of digits and then scan through each array, gradually selecting the next largest number available to produce the greatest final result. We store the indices of each largest digit of the number to allow us to skip over sections of…

Advent of Code 2025 - Day 2

Thank god I know how to regex...otherwise this would've been painful. Read the full prompt. Part 1 Part 1 of Day 2 asks for us to take an interval and calculate how many numbers within that interval are made up of some sequence of digits repeated exactly twice (e.g. 11 and 22 in the range 11-22 ) import { bench, run } from "mitata"; import { readInput } from "../utils"; const P1_REGEX =…

Advent of Code 2025 - Day 1

Advent of Code is nearly over for this year and I thought I would try and do some quick write-ups of my solutions, mainly as a bit of fun and to help me improve my writing a little bit. So far it's been quite a good level of difficulty, with nothing outstandingly horrendous, but a few which have been challenging. I don't know whether the plan is to scale Days 1-12 in such a way that Day 12 is as…

Texting myself the weather every day

Opening the Weather app every morning is too much effort, but you know what isn't? Writing a recurring job to query an API every morning and send you the results in an SMS, delivered right to your doorstep phone! Come with me as we embark on my short, little journey through this very process. Version 1: A Zapier "Zap" Version 1 of this service was simply just a "zap" on Zapier . Very easy to…

Styling Astro with Radix Colors

I'm rewriting my website again—this time with Astro—and gave myself the challenge to do it all with vanilla CSS instead of Tailwind, because I was getting a little too dependent. One of the things I instantly missed was having access to a collection of high-quality colour palettes right at my fingertips. Luckily, I'm a big fan of Radix and remembered they released their "colors" package to provide…

I don't need a second brain...do I?

Just watched Maggie Appleton demo how she uses Tana to organise all her stuff and felt a weird mix of awe and FOMO? I don't collect anywhere near enough data in my day-to-day life to need much of a system to organise it but I kinda wish I did? I love the idea of a Second Brain, all connected together to help me work better and organise my thoughts and interests. On the other hand, maybe it's just…

Hello submodules!

I've put all my website content into its own private repo and am loading it as a Git submodule now, thanks to help from some helpful guides ! The plan is to start using Obsidian to create and edit content, then push it to GitHub with the Obsidian Git plugin and hopefully everything just updates. I'm not quite sure whether changes to the submodule will trigger the "parent" repo's GitHub Action to…

Prefetching considered harmful

I've been trying to get prefetching working in an app I'm building at the moment, but Firefox has been consistently ignoring my wishes and only fetching on click. I looked in my about:config and, lo and behold, prefetching behaviour had been disabled. I didn't remember doing that? I turned it back on but it still didn't work. I checked about:config again, and it was disabled again . What?? To keep…

Developing browser extensions seems hard

I'm building myself a bookmarks/read-it-later website to replace Instapaper and one requirements is saving links to it via a browser extension. (I also need to write an iOS app but that's another kettle of fish). I didn't think it would be too bad: it's just JavaScript right? The problem lies in that there doesn't seem to be any form of intellisense for the WebExtensions API, so I have to spend…

Do your tests fail?

Posting this mainly as a reminder to myself. It's probably not enough to write a unit test, check that it passes, and continue on with your day. You should also check that it can fail too. Make it expect something that's slightly different from what you really want and see if it blows up in your face. Otherwise, you might've just written the unit test equivalent of a yes-man and it won't really…

How to make Vercel play nice with Remix and Keystatic

TL;DR If you just want the code: export async function loader() { const reader = createReader(process.cwd(), keystaticConfig); // This is the important line! console.log( fs.readdirSync(path.join(process.cwd(), "app", "content/posts")) ); const posts = await reader.collections.posts.all(); return json({ posts }); } I recently posted about how I decided to rewrite my website , choosing to use…

Rewriting my website

Just a quick note that, since writing this post, I rewrote my website again . I guess some things are never constant. I'm even thinking about starting it from scratch for a third (fourth?) time because I'm never happy with it and I don't know what I want. I recently decided to completely rewrite my website. My old one sat, unchanged, for almost 3 years and I never really put much effort into…

Using next-themes with Stitches and Next.js

I've been building my website with the help of an amazing CSS-in-JSS solution called Stitches . If you haven't heard of it before I would definitely recommend taking a peek at their website and giving it a try because I almost instantly converted across from styled-components . This isn't a post all about how great I think Stitches is, as much as the dev team would probably love it, though.…

Creating a reusable media query function

In short // mixins.js const breakpoints = { sm: "640px", md: "768px", lg: "1280px", }; export const media = (size = "sm") => `@media screen and (min-width: ${breakpoints[size]})`; Explanation So it turns out you can't use CSS variables with media queries , which is a bit of a bummer. The main reason you might want to do something like this is to create a bunch of reusable media query mixins for…

An ExpressJS Quickstart

In this post we're going to cover how to create your own local web server using the express package . It's a pretty straightforward process, so let's begin! This is a crosspost of an article I wrote over on the Yordevs website a few weeks ago. Setting up our project If you haven't already, set up a new Node project. From there we just need to install express with the following command: npm install…