2026-03-27 01:33:58
Every spring, my council publish a new bin collection calendar. These calendars are typically published as a single PDF to cover the entire region, with the information packed into a compact design. I imagine this design is for economy of printing – you can print one calendar in bulk, and post the same thing to everybody.
Here’s an example of this sort of compact diagram from South Cambridge, where breaks the county into four different regions:

For example, if your usual bin day is Thursday, your final collection of the year would be on Monday 22nd December.
This compact representation is a marvel of design, but it’s not that useful for me, a person who only lives in a single house. I only care about bin day on my street, not across the county.
For several years now, I’ve created a personalised calendar which shows when my bins will be collected, which gets printed and stuck it on my fridge. It’s a manual process, but a small amount of effort now pays off across the year.
I start by generating an HTML calendar using Python.
There’s a built-in calendar module, which lets you output calendars in different formats.
It doesn’t embed individual date information in the <td> cells, so I customise the HTMLCalendar class to write the date as an id attribute.
Here’s my script, which generates a calendar from April 2026 to March 2027:
from calendar import HTMLCalendar
from datetime import date
class PerDateCalendar(HTMLCalendar):
"""
A customised HTML calendar that adds an `id` attribute to every day
(for example, `d-2026-03-27`) and uses single-letter abbrevations for
days of the week (M, Tu, W, …).
"""
def formatday(self, day: int, weekday: int) -> str:
"""
Returns a table cell representing a single day, or an empty cell
if this is a blank space in the calendar.
"""
if day == 0:
return f'<td class="{self.cssclass_noday}"> </td>'
else:
current_date = date(self.current_year, self.current_month, day)
date_string = current_date.strftime("%Y-%m-%d")
return f'<td id="d-{date_string}">{day}</td>'
def formatmonth(self, year: int, month: int, withyear=True) -> str:
"""
Returns a table representing a month's calendar.
"""
# Store the current month/year so they're visible to formatday()
self.current_year = year
self.current_month = month
return super().formatmonth(year, month, withyear)
def formatweekday(self, day: int) -> str:
"""
Returns a table header cell representing the name of a single weekday.
"""
custom_names = ["M", "Tu", "W", "Th", "F", "Sa", "Su"]
return f"<th>{custom_names[day]}</th>"
if __name__ == "__main__":
cal = PerDateCalendar()
start_year, start_month = 2026, 4
end_year, end_month = 2027, 3
full_calendar_html = (
"<html>"
'<head><link href="style.css" rel="stylesheet"></head>'
'<body><div id="grid">'
)
current_year, current_month = start_year, start_month
while (current_year < end_year) or (
current_year == end_year and current_month <= end_month
):
month_html = cal.formatmonth(current_year, current_month)
full_calendar_html += month_html
if current_month == 12:
current_month = 1
current_year += 1
else:
current_month += 1
full_calendar_html += "</div></body></html>"
with open("bin_calendar.html", "w") as f:
f.write(full_calendar_html)
This writes a calendar to an HTML file, where each month is a table, and each day is an individually identifiable cell. Here’s a sample of the output:
<table border="0" cellpadding="0" cellspacing="0" class="month">
<tr>
<th colspan="7" class="month">April 2026</th>
</tr>
<tr>
<th>M</th>
<th>Tu</th>
<th>W</th>
<th>Th</th>
<th>F</th>
<th>Sa</th>
<th>Su</th>
</tr>
<tr>
<td class="noday"> </td>
<td class="noday"> </td>
<td id="d-2026-04-01">1</td>
<td id="d-2026-04-02">2</td>
<td id="d-2026-04-03">3</td>
<td id="d-2026-04-04">4</td>
<td id="d-2026-04-05">5</td>
</tr>
The HTML references an external stylesheet style.css, which contains some basic styles that turn the calendar into a three-column view:
#grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 3em;
width: 600px;
margin: 0 auto;
font-family: Helvetica;
}
th {
padding-bottom: 5px;
}
td {
font-size: 0.9em;
line-height: 1.4em;
text-align: center;
}
Then I can highlight the individual days for my bin collections, by targeting the <td> cells for each day using the id I created:
#d-2026-04-03,
#d-2026-04-24 {
font-size: 1.1em;
font-weight: bold;
background: black;
color: white;
border-bottom: 1px solid white;
border-top: 1px solid white;
}
#d-2026-04-10,
#d-2026-04-24 {
font-size: 1.1em;
font-weight: bold;
background: green;
color: white;
border-bottom: 1px solid white;
border-top: 1px solid white;
}
It takes less than five minutes for me to transcribe all my bin dates to the calendar by hand, and this is what the result looks like:

That fits nicely on a single sheet of paper, so I print it and stick it on my fridge. It’s easy to see when I have an off-cycle bin day, or when my next collection is going to be.
I often use this to know if I can skip a collection. I live on my own and I only generate a small amount of waste, so my bins are rarely more than half-full. I don’t think it’s worth putting out a half-empty bin, but I’ll do it anyway if I can see I’ll be away for the next few collections.
[If the formatting of this post looks odd in your feed reader, visit the original article]
2026-03-24 04:46:15
While the rest of the tech world is a firehose of generative AI discourse, last week I was in a quieter, more human room. I was back at Monki Gras, an annual London conference about the intersection between software, craft, and the tech industry.
This year’s theme was “Prepping Craft” – in a world where safety and normality are slipping away, how do we make our code, our communities, and our lives truly resilient? I loved the topic when I first heard it, and it’s only become more urgent by the day.
There was very little discussion of specific tools or technologies; instead, the event focused on the politics and human impact of the tech industry. Monki Gras has always been an interdisciplinary event, but this year it felt even more focused on humans over technology, and the politics were more pronounced than ever.
Despite the state of the world, the mood was constructive and upbeat. Everything is in a bad place, so how do we make it better?
Some particular highlights for me: Heidi Waterhouse and Kim Harrison describing how to create resilient, interdependent communities in Minneapolis and Oaxaca. Hazel Weakly gave a deeply personal, poetic talk about rebuilding a sense of self, and finding joy in your own existence. Adam Zimman made me cry when he talked about being a cis parent of a trans child, and what he learnt about supporting them. These are not talks you’d get at most tech events.
Three of this year’s talks were about trans experiences, at a time when the political winds are blowing in a transphobic direction. Some people would find that surprising, but I didn’t – Monki Gras has always felt like a safe place to be trans and to talk about being trans. I’ve always felt like I can be my full self there, and being trans at the event is a complete non-issue.
My one regret is that there’s never enough time to talk to all the cool and interesting people who attend. The community around this event is lovely, and I wish I had more time to chat. (Although after two days I was ready to collapse into bed; it’s as fun as it is intense.)
I was flattered by the number of people who expressed surprise that I wasn’t speaking this year. I did write a proposal, but James politely suggested that since I’ve spoken at the last three events in a row, I should step aside for new speakers. Months in advance, I knew it was a good call – preparing a talk is a lot of work, and it was nice to relax and just enjoy the event. Now the event is over, I’m even more glad I skipped this year.
Watching the talks made me realise that since I left social media, I’ve lost my nerve for talking about personal or political topics. I worry the talk I’d have given this year would have felt anodyne next to the other speakers, and I want to fix that. I’m inspired to be more personal and vulnerable in my public writing, and some of my talk ideas will get recycled as articles on this site. I’ve already published one (Dreaming of a ten-year computer) and there’s more to come.
Monki Gras was created by James Governor, and he and his team have done an excellent job of creating a thoughtful, inclusive event that explores the impact of tech on the world.
I’ve shared my notes and highlights below, but they’re no substitute for the real thing. If you’ve never been, I’d strongly recommend it for 2027.
Storytelling can be misused: Laura opened with the story of Percival Lowell, who successfully convinced many people that there were canals on Mars. Any criticism was deflected back to the critic – for example, if you can’t see them, it means your telescope isn’t good enough. The burden of proof was shifted from the sceptics to the claimant.
“What could somebody with bad intentions get you to believe?”
The average impact of AI shows a moderate improvement, but there’s increase variance and disparity. These tools may be enhancing individual productivity, but that isn’t leading to an impact on the P&L.
What’s the value of innovation? NASA publishes Spinoff which describes the benefits of the space race; will AI be the same?
There is no silver bullet that will help you solve human and org-level problems.
Key takeaways:
“What if the next model makes us irrelevant?” – is this fear grounded in reality, or is it a leftover from the initial shock of ChatGPT?
Focus on your impact on people.
What can you contro;?
Look for opportunities to do “cultural ratcheting”.
Numbers are scary because they are real.
Their context gives them meaning. 400 means nothing on its own, but £400.14 is the maximum universal credit you can receive per week. That’s a real and scary number.
Trust in institutions has been declining over past decades; the tech industry is part of that. (Both causing the decline in trust, and having trust decline in it.)
Ashley talked about how double-entry bookkeeping was the foundational idea that eventually led to modern accounting.
Show your working. Help people understand where your numbers come from.
Be correctable, not just correct.
“Incorrect numbers disrupt your shared reality with your user.”
Railway time was a standardised time used on the railways to deal with the fact that different places in Britain had different local timezones. This is a precursor to the timezones we have today.
GMT is centred in England. “This system had caught colonialism from its humans.”
Imagine if you had to explain the history of railway time and timezones for every timestamp you shared; it would be impossible. Timekeeping standards on modern railways treat railway time as a historical footnote, not essential knowledge, and everything works fine.
Key insight: “Cognitive debt is not failure if you keep the context window intentional.”
Extend mental models, don’t rebuild them.
Fail safe: minimise harm vs maximise accuracy. Consider what will happen when the system goes wrong, and design for safe failure. 100% accuracy is impossible; don’t forget about failures in the pursuit of perfection.
“If your site URL ends with .ai, all website bugs are now AI bugs.”
What skills should devs be focusing on? Don’t know – this talk is about strategies and techniques for discovering what developer skills are.
Acquiring a skill is different to retaining it. Once you lose achieve a level of proficiency, it’s difficult to lose skill
Skills are repeatable. This means generative AI in its current form is not a skill; it can’t be used predictably.
Teaching means guessing where the learner is, and finding out where you were wrong.
The act of saying something aloud can help you understand it. [Alex: this is the production effect.]
Sue described a swimmer Terry Law (sp?), whose attitude was: “every time I get out of water, I’ll be a better swimmer”. He took copious notes after ever swim.
Semantic waves of learning: from a high level of theory to practical implementation, and back again.
“Where do you find value in the process and not the outcome?”
Preparation means acting on incomplete information, and preserving resources to be able to do that. In Liz’s case, that meant driving several hours to renew her passport after the news broke that the Trump administration wouldn’t issue new passports for trans people – but she was able to renew an existing passport.
Trans people are under greater threat than in a long time: existentially threatening politics in the US; bathroom bans in the UK.
Liz is good at resilience engineering because it affects her personal life: runbooks for personal threats, plans for leaving her home and country, and so on. She showed us a complex risk spreadsheet she uses to track personal risk; I didn’t have time to read it in detail.
Hazel’s first memory is one of loneliness; she has about ten memories from before she was 26. She talked about dissociating as a child.
Axioms of self:
Being deaf means questioning everything I hear, and never believing my own reality.
She had to learn “normality” – a combination of being autistic, trans, and ADHD.
Our past shapes us, but it does not have to guide us.
“I have thoughts. Lots of thoughts. They never stop thinking. Never stop thunking.”
Oxygen is vital to life, but it’s also poisonous in its pure form.
Purpose:
Desires:
Reception: what impression do I want to give? What do I want others to see in myself?
Fashion and makeup: “Vanity is a gift to myself. It is permission to live in my body with joy.”
“When I give myself permission to experience my existence with joy, then I give everybody else permission to do the same.”
“I rebuilt myself into a completely different person who is far cuter, and she’s more (entertaining? everything?) and has a spark in her eye she didn’t feel possible.”
“Build that community of belonging and you will be surprised at what life and the universe of chaos will bring to you in sparkles and fits of unmitigated joy.”
Daniel started the npmx project, an alternative npm browser that’s built in part on atproto. The project grew quickly, and attracted a lot of contributors – to the point the core maintainers took a week-long break as it was gaining traction, to prevent burnout.
There aren’t 10x developers, but there are 10x teams. They iterate together, and make each other better.
atproto allows you to get something akin to federated JSON. [Alex: the best explanation I’ve seen for this so far is Dan Abramov’s article A Social Filesystem.]
Standard.site is a schema for publishing blogs on atproto.
atproto is not a USP, it’s an implementation detail.
Running an app based on atproto means less responsibility, because you don’t have to run a backend – other people can look after their data.
Enshittification comes from asymmetry of power; atproto can help to level that balance.
This talk covered a lot of material I’m familiar with, so I didn’t take many notes.
The problems facing open source maintainers: money, time, burnout, boredom, user hostility.
“The value of people isn’t cranking out code; it’s being guardians of quality and performance.”
Other bad things: losing keys, losing the vision and meaning of a brand.
“Footprints on the sand of time”, from Henry Wadsworth Longfellow’s poem A Psalm of Life.
“Why are you trying to make something resilient?”
Career resilience:
Business resilience:
Systems resilience:
Risk = severity × probability × obscurity × delay
If we’re entering a post-scarcity future, we should be more excited than scared.
“We prefer our world of toilets to open sewers. Think about this for a moment. This is a science fiction shit. You have a magic bowl where you press a button and whatever you want to get rid of is gone.”
A brief history of civilisation [Alex: reminded me of How to Invent Everything].
A heat pump and solar means that on hot days, air conditioning essentially free.
“The fruits of abundance are often captured.”
We can harness solar and improve energy infrastructure: it’s possible, but it needs work.
“It’s not as grim as we’ve always been told.” [Alex: London’s air pollution sprung to mind; it was initially projected that it would take 193 years to bring NO2 pollution to within legal levels, but it was achieved in 9 years.]
“Thought is fuel.”
There’s a crappy remote for the air conditioner and heating controllers; replace it with microcontrollers and a vibe-coded app in Python.
“Give me a context limit large enough and I can move the world.”
Mario’s grandfather is Fairchild Semiconductor, originally developed for military applications. This led to an era of compounding automations on semiconductors: modems, video games, programming.
LLMs and AI are the start of a new 50-year super cycle of compounding automation.
The person who created Mario was “not a video game designer” because that job didn’t exist yet. What new careers will be created in the era of LLMs?
We have abundant energy and cognition.
Modern warfare is different to what it used to be – widespread use of drones and automonous vehicles. But warfare is how we got the microprocessor in the first place.
We can have a positive vision for this abundance; we can counter the vision of darkness.
“We can assert a positive vision of how these strange discoveries shape our future.”
When we hear the word “prepper”, we think of a doomsday-obsessed, right-wing obsessive with guns.
Attitudes to war have changed. Many of Chad’s peers from Texas joined the military, and they can’t walk 5 minutes before somebody thanks them for their service. His father fought in Vietnam, and didn’t want to talk about it when he returned.
“In a world that feels out of control, prepping is a mechanism to assert personal control.” This takes different forms and the meaning of “prepper” and “survivalist” has changed over time, but it’s the same underlying desire.
I no longer build software; I now make furniture out of wood. The hours are long, the pay sucks, and there’s always the opportunity to remove my finger with a table saw, but nobody asks me if I can add an RSS feed to a DBMS, so there’s that :-)
Chad bought a 20-acre gold mine to turn into a self-sufficient space. He had to learn about water systems, power, sewage; he broke both wrists falling off a 12′ ladder; he had to navigate open shafts across the property (one over 150′ deep). [Alex: the pictures reminded me of Firewatch.]
This sort of living forces you to update your threat model.
Fire is scary! Half of the USA is protected by volunteer fire departments; they can’t be everywhere.
[Alex: this reminded me of the Lemony Snicket series; the concept of a volunteer fire department was completely new to me as a British reader, but I guess it would make more sense to a US-ian reader?]
After a lightning strike on the corner of his property: “A grass fire moves at 14mph. That lightning strike struck 800 feet away. That’s 39 seconds.”
We’re all prepping for something, so how do you react?
The talk was framed with art and typography from the game Silksong. It was a shared experience with their child; a way to connect with them.
Graphic of Infinite Combinations, from Seeing Gender by Iris Gottlieb.
Consider the character creator. There is no global “best”, there’s only “best for me”, the individual player. Some players even like “bad” combinations because it makes the game harder.
Act I: How I defined you. The parent defines who the child is (name, gender, pronouns) and what the child does (clothing, toys, colours).
The reality of parenting is very different to expectations, and you cannot prepare for it in theory – you need to figure it out on the fly.
About 1.7% of people are intersex, a similar proportion to redheads (although many intersex individuals will not know it themselves).
“Listen to your kid when they are young. Believe them when they tell you who they are. It can change at any time, but you should believe what they say to be their truth in the moment.”
If a kid tells you something, it means they trust you – show them that you’ve earned it.
Don’t assume that your lived experience is the same as theirs.
Act II: How I defined you to who you are.
Items you consider permanent are not. What do they want to do? Things like makeup, haircuts, friends and peers.
Picking a name. When his child first mentioned changing their name, he dropped a clanger: “Your name is the first gift I ever gave you”.
Their child’s reply is a model of grace: “You picked a name for me before you knew me. This is a chance for both of us to pick a name together now that I know and you know who I am.”
“When somebody is willing to share with you their true self, they are extending an aspect of trust to you.”
You will fail a lot. The important thing is that you keep trying.
Act III: Who I am to who I want to become.
How do I want to be seen?
“I didn’t feel it was fair to have everything that my kids were experiencing have them be the ones to explain it to me” – Adam went and found trans and neurodivergent communities to do his own learning, so he could be informed in conversations with his children (but not opinionated!).
“How can you support a human so that they feel comfortable being themselves and sharing themselves with everyone else?”
Who am I legally? Passports and paperworks.
Support vs dangers: being yourself vs being safe. For example, the family missed a bar mitzvah during the Trump administration because both children had X markers in their passports, and it was unclear if they could safely interact with TSA during that time. They now have passports that match their sex assigned at birth to make travel easier.
Knowing vs asking; failure vs trying. “Get good.”
“There are no shortcuts.”
Case study of two communities: South Minneapolis and Oaxaca.
Change is good if it comes at the pace you’re expecting; right now change is not coming at that rate.
We’re protected by the systems around us. What is it like to participate in the creation and maintenance of those systems?
What are the properties of a resilient system?
Oaxaca: mutual aid tied to local resources. Kim explained the idea of [tequio][wiki-tequio] and several other practices whose names I didn’t catch; it’s collective work for the benefit of the community, not paid work.
“If all you have is a wheelbarrow or shovel, you show up because that’s one more than nothing.”
You can be kicked out of a community, lose voting rights and similar if don’t participate.
How do you build resilient systms? Decide on shared priorities.
Wendigo spirit means taking more resources than you need, and depriving others of them (aka capitalism). This can lead to people getting kicked out of communities.
We’re bad at understanding our needs and gifts; we’re not all the same, and we need/provide different things.
Minneapolis is under ICE occupation; how do you ensure people can still fulfill their basic needs?
There are two strands of work involved:
| foot patrol | driving |
| resistance | food aid |
| “community” | child care |
| observation | delivery |
| demonstration | bus patrol |
It’s not safe to cross sides; these need to be picked up by different people.
Mutual interdependence and support. They didn’t start from zero; they ratched up, learning from previous communities, preparing to help whose next. Previous examples: George Floyd, Portland, Chicago.
What do we owe to each other? “We exist in ecosystems […] we cannot all be rugged individual martyrs.”
“Mr Rogers stold children then when scary things happen, look for the helpers.” When scary things happen, adults look for the helpers, and then go help.
“Reaching out a hand and saying ‘are you okay’ is the foundation of interdependent community” – the last words of Alex Pretti before he was murdered by ICE.
In March 2020, companies were reluctant to change plans already in motion – which seems laughable now.
Strategic planning only happens once a year, even though it’s meant to align you with customers and markets.
Customers don’t give a shit about your “planning season”.
“Why are you making a five-year plan when the world doesn’t look the same as it did five years ago?”
How do you stop companies from treating planning as a (multi)-year planning exercise?
You can’t, but you can add a quarterly review… and a monthly review… and a fortnightly review. (Flashbacks to Hazel’s makeup tutorial the previous night.)
What if more planning makes us more adaptable?
Following a plan can help us respond to change, if we plan to change. If responding to change is part of plan, we’re more likely to do it.
It’s the difference between change as threat to the plan, and change as the plan. We can frame plans as resilient, iterative, and the way we change course.
[Alex: at this point I was reminded of some career advice from a previous manager: it doesn’t matter how correct you are, if you’re annoying, you’ll be ignored.]
The way you communicate a plan
is
[as important as] the plan.
The way you communicate an idea is the idea.
“Planning is communication. Communication is craft. Let’s craft plans that make us less resistant to change.”
[If the formatting of this post looks odd in your feed reader, visit the original article]
2026-03-19 15:07:21
I love public libraries, and they’re where I get about half the books I read.
When people talk about why libraries should exist, it’s usually framing them as a social good. Libraries provide low-cost access to books and information, they’re a hub for digital literacy and access to technology, and they’re one of the few remaining third places where people are treated as citizens rather than consumers. Their role has grown from being a lender of books to being a vital community resource.
Those are noble reasons for libraries to exist, but not necessarily reasons to use them. I sometimes hear them said with a patronising tone, from people who think libraries are only for other people. To them, a library is a charity for the poor and illiterate, not a destination for the well-read.
I think this is a failure of imagination. Even though I can afford to buy my own books and you could argue I don’t “need” a library, using them has made me a happier reader.
Libraries are a cheap and safe way to me to try lots of different books, including books I’m not sure if I’ll like. Sometimes, those experiments become new favourites.
If I’m buying books in a bookshop, I lean towards the familiar, towards books like the ones I already enjoy. It’s unusual for me to get anything radically different, because I don’t want to gamble my money on a complete unknown.
Borrowing a book from the library is free, so it’s easier to try a new author or genre. I can read two chapters and return a book guilt-free if it’s not my cup of tea. But sometimes, I try something very different, and I discover a whole new collection of books to enjoy.
I found some of my favourite books and authors through library books I probably wouldn’t have picked off a bookshop shelf:
Most library books are just “fine” – I enjoy them and return them to the shelf. I wouldn’t want every book to be a massive revelation, but those discoveries happen more often because the library reduces the cost of being curious.
I love living in a house with books, but I only have so much shelf space. Libraries allow me to read lots of books without cluttering up my home.
If I buy a book, I’m also buying a future decision: when I’m done, do I keep it, gift it, or donate it? It’s not a difficult decision, but it’s just another thing to think about. It’s easy for a book to get “stuck” in my home for years, even when I don’t actually want to keep it.
When I finish a library book, there is no decision to make: I know I have to return it to the library. When I’m done, I drop it in the returns bin and forget about it. It’s an easy, safe default that keeps my home clutter-free.
I especially love using libraries for books that I know I’m only going to read once, like romance novels and murder mysteries. Once I know the ending, I’m unlikely to revisit those books unless they’re really exceptional.
I still buy books, and if I really like a library book I’ll buy my own copy – but for everything else, the library has helped refine my shelves into the set of books I really love, not just a record of everything I’ve ever touched.
As I prepare to move house later this year, I’ve been uncovering stashes of unread books. Some have followed me across multiple moves; some I’ve owned for over a decade. I used to tell myself that these books were “maturing” on my shelf, but really they were just stagnating. I’ve donated many of them to my local charity shop, because I’ve finally admitted I’ll never actually read them.
I don’t have this problem with library books, because the return period triggers a “use it or lose it” response in my brain. I have to read a book before it’s gone, or decide not to and return it. This works even though I know it’s a completely artificial deadline – if I run out of time, I can always renew or re-borrow a book – I still feel that sense of urgency.
Return periods are some form of literary placebo: the ticking clock tricks me into prioritising a book, not letting it blend into the furniture.
My “To Be Read” list is longer than ever, but most of it is now in the library’s digital catalogue rather than physical piles in my home. When I get a book, I read it quickly or not at all – and either way, it doesn’t sit around untouched for fifteen years.
Public libraries will never be my sole source of books – I have to go elsewhere for niche, specialist, and academic texts – but using them has helped me read more and find new favourites. They’re a vital social good, but I don’t use them out of a sense of civic duty. I use them because they make me a happier, more adventurous, and more prolific reader.
[If the formatting of this post looks odd in your feed reader, visit the original article]
2026-03-12 22:25:03
I want my current computer to last for a decade. That’s an eternity in the tech world, far longer than most people keep their hardware, but I don’t think it’s an unreasonable goal. Personal computers keep getting faster, but my needs aren’t changing.
I use my computer for the same fundamental tasks I did ten years ago: browsing the web, writing, editing photos, running scripts, and building small websites. Today’s computers can do all that and have power to spare. You can still push their limits with high-end tasks like video editing, 3D modelling, or gaming – but I don’t do any of those things.
I don’t need the latest and greatest, and I haven’t for a long time. Add in the expense, the hassle of upgrading, and the environmental impact of new hardware, and you can see why I’m keen to use my computers for as long as possible.
This won’t be easy. My needs might not change, but the world around me will. I won’t get software updates forever, the web is a bloated mess that becomes more resource-hungry every day, and AI may introduce unforeseen demands on my computer. I’ve had to set up my computer carefully to give it the best chance of lasting the decade.
In my first job, we sold telecoms hardware that sat in data centres for years, unmodified. We had to write software updates that would run on the machine as-is, because hardware upgrades were impossible. If a new feature needed more resources, we had to find a way to make the existing code more efficient to compensate. It was a stark contrast to cloud computing, where a more powerful machine is just a few clicks in a console. We had to be in the habit of thinking about efficiency, because there was no other option.
That habit has stuck. I try to be efficient my personal devices, and I’m very conservative about what I install – what apps, dependencies, and processes I allow to run.
I also write a lot of my own tools. If something feels slow or sluggish, I don’t have to buy a faster machine; I can look for a way to improve my code.
This might look like a process that requires discipline, but at this point it’s just my standard routine. I’ve always tried to use my computer efficiently and it’s meant my computers last a long time; it’s only with my latest purchase that I’ve made it an explicit goal.
I bought this computer as I was wrapping up my career in digital preservation, and that’s why I approached it with such a long-term mindset. In that job, I’d been designing collections to survive over decades and centuries; what seems like an eternity in tech is a heartbeat in heritage. With that mindset, trying to keep a computer for a decade didn’t seem so ridiculous – especially when I remembered that I almost did it already, with an eight-year-old iMac that was running perfectly until the desk underneath it collapsed, a calamity that would kill any computer.
Global politics is another factor; I’m keen to avoid needing to buy a new computer in the near future, because I’m not sure how easy it will be. Right now I can just walk into a high street store, but that relies on a fragile and complex supply chain that’s showing cracks.
I bought my computer in November 2024, just after Trump was re-elected as US president, and his campaign threatened heavy tariffs and trade wars. A year later, that trade uncertainty has become the status quo; his war with Iran threatens global energy markets; computer prices are rising as parts are diverted to AI data centres; and the majority of the world’s microprocessors are still built in Taiwan, under the constant shadow of a Chinese invasion. And the background to all of this is climate change, which won’t make manufacturing computers any easier.
I hope I’m wrong, and that buying a new computer continues to be as simple as it is today. But if I’m right, and they become scarce or expensive, I’ll be glad to have a device that I’m ready to use for years more, rather than be stuck with something too slow that I can’t afford to upgrade.
I’ll have to replace it eventually, but hopefully I can be patient and outlast any short-term disruptions to the supply chain. And if there are long-term disruptions, I’ll have more time to plan my next purchase.

I have a home office with a fixed setup, and my main computer is a desktop, which makes this easier – I don’t know if I could make a laptop last ten years. A desktop never moves, so it’s less vulnerable to dings and drops (assuming the desk stays standing), and there’s no internal battery to degrade or swell. I also don’t eat or drink at my desk, so there’s minimal risk of liquid damage.
I use Macs, and Apple offers three Mac desktops: the Mac mini, the Mac Studio, and the Mac Pro. The Studio and Pro are overpowered for my needs, and while that extra power would give me headroom, it would be a lot of extra expense for marginal gain. Instead, I looked at the Mac mini.
When I was buying, Apple offered two stock configurations of the Mac mini: an M4 chip with 16GB of RAM and 256GB of storage for £599, or an M4 Pro chip with 24GB of RAM and 512GB of storage for £1399. Both models got favourable reviews and seemed like good value, because they avoid Apple’s egregiously-priced upgrades.
I bought the M4 Pro rather than the base M4 – I think I’d been fine with the base M4 for now, but 16GB of RAM might become tight as macOS gets more memory hungry. I do want some headroom, I just don’t want to pay Mac Studio prices for it.
I’ve expanded the storage with a 4TB external SSD which is permanently plugged in. It was much cheaper than Apple’s upgrades, and it means I won’t run out of space any time soon. It also reduces wear on the internal SSD, which feels like the most likely component to fail.
The big question mark is software support, and I’m keeping my fingers crossed. Macs are typically supported by the latest version of macOS for six to eight years, and they get security updates for another two years after that. That should take me close to a decade, if not all the way.
For comparison, the M1 MacBook Air was released in November 2020, and I expect it will still be supported in this year’s macOS 27 release. Apple have already announced that this release will drop support for Intel Macs; it would be aggressive to drop M1 support at the same time, especially as an M1 MacBook Air was on sale at Walmart until a few weeks ago. If so, the M1 will get macOS updates until at least autumn 2027, and security updates until 2029 – a nine year span. Suddenly, running my M4 Mac mini for ten years doesn’t feel so ridiculous.
Apple’s hardware is in fantastic shape, and I absolutely believe their Mac minis can run for a decade without failing. (Maybe their hardware chief should be in charge of more things?) There’s always a risk of buying a lemon which has a manufacturing defect, but I’ve had mine for over a year and nothing has failed yet. I’m confident this machine can go the distance.

So far, it’s great – my Mac mini is a fantastic machine. It never feels slow; it’s never crashed; it takes up a tiny space on my desk; and I have enough storage that I never need to worry about cleaning up files. It’s just what I want a computer to be – an appliance I never have to think about.
You’d expect it to feel easy right now, because I’m still in the usual lifetime of this product. This will get harder over time, and the first year will be easier than the final year, but it’s still an encouraging start.
I hope that I’ve bought a decade of not having to think about hardware. Modern computers are ridiculously capable, and short of a catastrophic failure, it’s hard to imagine a reason to upgrade.
See you again in 2034!
[If the formatting of this post looks odd in your feed reader, visit the original article]
2026-03-05 16:58:35
During the COVID lockdowns, I spent long evenings at home on my own, and I amused myself by dressing up in extravagant and glamorous clothing. One dark night, I realised I could use my home working setup to have some fun, with just a webcam and a monitor.
I turned off every light in my office, cranked up my monitor to max brightness, then I changed the colour on the screen to turn my room red or green or pink. Despite the terrible image quality, I enjoyed looking at myself in the webcam as my outfits took on a vivid new hue.
Here are three pictures with my current office lit up in different colours, each with a distinct vibe:



For a while I was using Keynote to change my screen colour, and Photo Booth to use the webcam. It worked, but juggling two apps was clunky, and a bunch of the screen was taken up with toolbars or UI that diluted the colour.
To make it easier, I built a tiny web app that helps me take these silly pictures. It’s mostly a solid colour background, with a small preview from the webcam, and buttons to take a picture or change the background colour. It’s a fun little toy, and it’s lived on my desktop ever since.
Here’s a screenshot:

If you want to play with it yourself, turn out the lights, crank up the screen brightness, and visit alexwlchan.net/fun-stuff/gumdrop.html. All the camera processing runs locally, so the webcam feed is completely private – your pictures are never sent to me or my server.
The picture quality on my webcam is atrocious, even more so in a poorly-lit room, but that’s all part of the fun. One thing I discovered is that I prefer this with my desktop webcam rather than my iPhone – the iPhone is a better camera, but it does more aggressive colour correction. That makes the pictures less goofy, which defeats the purpose!
I’m not going to explain how the code works – most of it comes from an MDN tutorial which explains how to use a webcam from an HTML page, so I’d recommend reading that.
I don’t play dress up as much as I used to, but on occasion I’ll still break it out and amuse myself by seeing what I look like in deep blue, or vivid green, or hot pink. It’s also how I took one of my favourite pictures of myself, a witchy vibe I’d love to capture more often:

Computers can be used for serious work, but they can do silly stuff as well.
[If the formatting of this post looks odd in your feed reader, visit the original article]
2026-02-17 16:08:40
I have some personal Git repos that I want to sync between my devices – my dotfiles, text expansion macros, terminal colour schemes, and so on.
For a long time, I used GitHub as my sync layer – it’s free, convenient, and I was already using it – but recently I’ve been looking at alternatives. I’m trying to reduce my dependency on cloud services, especially those based in the USA, and I don’t need most of GitHub’s features. I made these repos public, in case somebody else might find them useful, but in practice I think very few people ever looked at them.
There are plenty of GitHub-lookalikes, which are variously self-hosted or hosted outside the USA, like GitLab, Gitea, or Codeberg – but like GitHub, they all have more features than I need. I just care about keeping my files in sync. Maybe I could avoid introducing another service?
As I thought about how Git works, I thought of a much simpler way – and I’m almost embarrassed by how long it took me to figure this out.
In Git repos, there’s a .git folder which holds the complete state of the repo.
It includes the branches, the commits, and the contents of every file.
If you copy that .git folder to a new location, you’d get another copy of the repo.
You could copy a repo with basic utilities like cp or rsync – at least, as a one-off.
I wouldn’t recommend using them for regular syncing; it would be easy to lose data, because they don’t know how to merge changes from different devices.
Git’s built-in push and pull commands are smarter: they can synchronise this state between locations, compare the history of different copies, and stitch the changes together safely.
Within a repo, you can create a remote location, a pointer to another copy of the repo that lives somewhere else.
When you push or pull, your local .git folder gets synchronised with that other copy.
We’ve become used to the idea that the remote location is a cloud service – but it can just as easily be a folder on your local disk – and that gives me everything I want.
Before I explain the steps, I need to explain the difference between bare and non-bare repositories.
In our day-to-day work, we use non-bare repositories.
They have a “working directory” – the files you can see and edit.
The .git folder lives under this directory, and stores the entire history of the repo.
The working directory is a view into a particular point in that history.
By contrast, a bare repository is just the .git folder without the working directory.
It’s the history without the view.
You can’t push changes to a non-bare repo – if you try, Git will reject your push.
This is to avoid confusing situations where the working directory and the .git folder get out of sync.
Imagine if you had the repo open in a text editor, and somebody else pushed new code to the repo – suddenly your files would no longer match the Git history.
Whenever we push, we’re normally pushing to a bare repository. Because nobody can “work” inside a bare repo, it’s always safe to receive pushes from other locations – there’s no working directory to get out of sync.
I have a home desktop which is always running, and it’s connected to a large external drive. For each repo, there’s a bare repository on the external drive, and then all my devices have a checked-out copy that points to the path on that external drive as their remote location. The desktop connects to the drive directly; the other devices connect over SSH.
This only takes a few commands to set up:
Create a bare repository on the external drive.
$ cd /Volumes/Media/bare-repos
$ git init --bare dotfiles
Set the bare repository as a remote location.
On the home desktop, which mounts the external drive directly:
$ cd ~/repos/dotfiles
$ git remote add origin /Volumes/Media/bare-repos/dotfiles
On a machine, which can access the drive over SSH:
$ cd ~/repos/dotfiles
$ git remote add origin alexwlchan@desktop:/Volumes/Media/bare-repos/dotfiles
This allows me to run git push and git pull commands as normal, which will copy my history to the bare repository.
Clone the bare repository to a new location.
When I set up a new computer:
$ git clone /Volumes/Media/bare-repos/dotfiles ~/repos/dotfiles
This approach is very flexible, and you can store your bare repository in any location that’s accessible on your local filesystem or SSH. You could use an external drive, a web server, a NAS, whatever. I’m using Tailscale to get SSH access to my repos from other devices, but any mechanism for connecting devices over SSH will do. (Disclaimer: I work at Tailscale.)
Of course, this is missing many features of GitHub and the like – there’s no web interface, no issue tracking, no collaboration – but for my small, personal repos, that’s fine. There’s also no third-party hosting, no risk of outages, no services to manage. I’m just moving files about over the filesystem. It feels like the Git equivalent of static websites, in a good way.
I used to throw every scrap of code onto GitHub in the vague hope of “sharing knowledge”, but most of it was digital clutter.
Nobody was reading my personal repos in the hope of learning something. They’re a grab bag of assorted snippets, with only a loose definition or purpose – it’s unlikely another person would know what they could find, or spend the time to go looking. Sharing knowledge requires more than just publishing code somewhere; you need to make it possible for somebody to find.
Extracting my ideas into standalone, searchable snippets makes them dramatically more useful and discoverable. There are single blog posts that have done more good than my entire corpus of code on GitHub – and I have hundreds of blog posts.
I still have plenty of public repos, but it’s specific libraries or tools with a clear purpose. It’s more obvious whether you might want to read it, and better documented if you do. It’s an intentional selection, not a random set of things I want to keep in sync.
For years, I’ve been using a social media site as a glorified file-syncing service, but I don’t need pull requests, an issue tracker, or a CI/CD pipeline to move a few macros between my machines – just a place to put my code. As with so many digital things, files and folders are all I need.
[If the formatting of this post looks odd in your feed reader, visit the original article]