Slices
Get a slice of my life. A personal feed of my thoughts, notes, and updates.
-
Nov 29 2025
10:10
I love Mexican food and living in London I am spoilt for Mexican restaurants. Michelin Mexican restaurants, Mexican street vendors, and everything in between.
I have been to 5 of the ‘in-between’ places and here is my ranking:
- Corrochios - Great atmosphere, authentic food
- La Chingada - Our local, super chilled
- Tacos El Pastor - Stylish, pricey
- Jalisco - Unmatched burritos
- Mestizo - Upmarket, creative menu
-
Nov 19 2025
10:42
An issue I’ve had switching to Aerospace is that typing # (on a mac) causes me to switch to workspace 3:
.aerospace.toml [mode.main.binding]alt-3 = 'workspace 3'A fix I came across was to define an empty binding mode. When switching to a new binding mode, all the previous bindings are disabled in favour of the new bindings, allowing me to type #.
To get this working I mapped Option + Backspace in the main and new mode to toggle between them:
.aerospace.toml [mode.main.binding]alt-backspace = 'mode hash'[mode.hash.binding]alt-backspace = 'mode main'I think this is currently the best solution but it would be nice to map the left and right modifier keys separately.
-
Nov 17 2025
20:24
I came across a list of monospace-styled sites. These are some of my favorites.
- https://musicforprogramming.net/latest
- https://commitmono.com
- https://owickstrom.github.io/the-monospace-web
- https://wttr.in
- https://plaintextsports.com
- https://chimbosonic.com
I like the idea of using monospace everywhere on a site but I think it only works when you go all in on the theme. ASCII art, terminal style, etc.
-
Nov 16 2025
18:15
I’ve wanted to try out D3 for a while so I thought I’d try out the
d3-geopackage and map the countries I’ve visited.It was easy to get going as it can be pulled in via a CDN:
<script is:inline src="https://d3js.org/d3.v4.min.js"></script><div id="map"></div>This gives you access to
d3which provides a comprehensive API for creatingsvg:let height = 500;let width = d3.select("#map").node().getBoundingClientRect().width;let projection = d3.geoOrthographic().scale(250).center([0, 0]).rotate([0, -30]).translate([width / 2, height / 2]);const initialScale = projection.scale();let svg = d3.select("#map").append("svg").attr("width", width).attr("height", height);Once you’ve created the base
svgyou can begin to append elements to it:let globe = svg.append("circle").attr("fill", "url(#globeGradient)").attr("stroke", "#d6d3d1").attr("stroke-width", "0.4").attr("cx", width / 2).attr("cy", height / 2).attr("r", initialScale);And add functionality via the call method:
svg.call(d3.drag().on("drag", () => {const rotate = projection.rotate();const k = sensitivity / projection.scale();projection.rotate([rotate[0] + d3.event.dx * k,rotate[1] - d3.event.dy * k,]);path = d3.geoPath().projection(projection);svg.selectAll("path").attr("d", path);}))And the result is a powerful way to visualise data without needing to get bogged down in the specifics of the implementation.
For more on the theory see Rotate the World by James Davies.
-
Nov 16 2025
16:55
Published a quick post about adding Slices to this site.
-
Nov 14 2025
17:34
Been really motivated to code recently and while I was away in Cologne I came up with a million and 1 project ideas. I wrote them all down and now have a list about 25 items long.
The first few I completed were just small tweaks to my work environment; trying out Aerospace and tmux, as well as switching to Ghostty.
Up next was starting back with learning Go. It was one of those things that I spent couple of weeks building things with, but I wasn’t coding enough in my spare time to make it stick.
And the latest has been to add an updates feed to this site, and an hour or two of coding later here we are. It is built using Astro content collections:
const slice = defineCollection({type: 'content',schema: z.object({location: z.string(),created_at: z.string().transform((str: string) => new Date(str)),updated_at: z.string().transform((str: string) => new Date(str)).optional(),is_published: z.boolean(),image: z.object({url: z.string(),alt: z.string()}).optional(),tags: z.array(z.string()).optional(),}),});No doubt I’ll be adding and tweaking this a lot over the coming months, but for now I am happy to have a place to update up this site more regularly.