Like sticking with copy+pasting SQL schema changes into the MySQL CLI. As that is what we’ve always done.
Like what could go wrong?
Especially when somehow GitHub decides to put the whole file into your paste buffer, and that includes DROP TABLE x; before each CREATE TABLE. And I really just wanted the final ‘CREATE TABLE’ in the schema.sql file.
Thankfully Azure provides a Point in Time recovery for MySQL (even if it took the best part of an hour to perform that restore).
]]>
My initial impressions were good – I definitely prefer the UI of going through a terminal rather than a browser (although, if only copy+paste worked the same as within a terminal, I would be even happier).
But now, I think I’ve built a self imposed prison where whatever code gets pushed to GitHub, and copilot will almost certainly want a load of semi-pedantic changes.
Does it catch bugs – yes, definitely. I just wish it was a little bit more intelligent and didn’t repeat reporting previously resolved issues after a rebase. It’s made the process of getting a PR ready for review somewhat longer, and occasionally it’s caused bugs from its suggested changes (perhaps only 1-2 a month).
Having said that, being able to give Claude something like :
“This error is being logged … [insert error message/trace] … can you investigate it and suggest a fix please?”
Is definitely a step forward. The agent does all the pesky web searches and whatever research into it, and suggests a fix. It might take it 5 minutes what could take me hours. I have noticed that the agent almost seems overly confident – In a couple of cases, what the agent suggested didn’t quite work … and a couple of days later it’s apologizing for having missing something.
Oh, and definitely don’t run it on ‘production’ – I’ve still had the latest Claude (Fable) drop the contents of a local database, and then try to apologise to me for doing so.
]]>



In most cases, I’ve found most success with sticking to a “middle of the road” configuration (i.e. trying to stick with the most common things in a field – so let’s have Laravel, specify an explicit PHP version (8.3) and tell it I want a bootstrap theme (I don’t really do npm/JS/Tailwind stuff). Where I’m still seeing pain is when I want to build on top of what it’s just generated, or explore multiple options in two branches. Eventually one of us gets into a mess, and I decide it’s wrong :). To try and help, I read “Vibe Coding: Building Production-Grade Software with GenAI, Chat, Agents and Beyond” – given it’s written by one of the authors of The Phoenix project (which I enjoyed). Unfortunately it’s too repetitive, doesn’t really go into great detail and is already too far out-of- date (published Oct 2025). I felt they could easily have cut 100 pages out of the book without there being any great loss. There were some useful nuggets of info, but the book itself felt disappointing. I guess I need to keep looking.
]]>
Hey ….Heads up: we’ll be exporting from your battery tomorrow xxxx-xx-xx from 08:00 to 09:00 to help relieve grid strain in your area.We’ll pay you £1/kWh for energy exported to the grid. You don’t need to do anything – we’ll handle this automatically and reset your settings afterwards.We’ll drop you an email letting you know how much you’ve earned as soon as we have the data (typically within 48 hours).
Thanks for helping out the grid,
]]>Axle Energy
Eventually at the start of this year I started looking again and getting a quote from e.g. heatable.co.uk which came out at £13k ish for panels and a battery (not inc scaffolding). Hmm…. I’ll wait and see I thought. Maybe the price will drop a bit more over the next year.
Fast forward a few months and Donald sticks his oar into the sea around Iran and everything goes a bit wonky and people predict bills will start to rise.
So, I know we spend roughly £1300 on electricity per year (4600kwh) and ~£800 on gas (12000kwh). I can’t do much about the cost of gas, and looked again at solar again.
Eventually, I decided to go for 19 x 450w panels (7kw fox inverter and 12kwh fox battery) through a local Bromsgrove solar installer ( https://gesolutionsuk.co.uk/ ) who did a reasonable price (somewhat cheaper than heatable and octopus, and seemed to be actually designed for my house – split over two roofs so one that faces south (ish) and a larger array on the west (ish) roof. They provided their own scaffolding, which also saved up to £1k?.
Once we decided to go for it, the installer said we’d have to wait for a G99 application. “They say it’ll take 4-6 weeks, although it’s usually quicker” he said. The next day we had the G99 sorted, followed quickly with a
“We can fit you in next Friday, Mr Goodwin”.
Crikey, shit’s getting real. “OK, make it so” I said.
Fast forward to it all being installed, and thankfully it went perfectly. I was starting to fret that the neighbours might complain, about the panels but instead got a “They look good, I might have to run a wire across to yours to steal some power while you’re on holiday!”.
The Fox android app seems pretty good (at least it’s idiot proof for me). Obviously at this time of year we generate more than we use, so we’re exporting and not buying in any electricity. I suspect my view of the app will change when we get into autumn and I want it to top up the battery on a cheap overnight tarriff, but we’ll see – perhaps I’ll have finally installed Home Assistant and Predbat at that point.
In the mean time I joined Axle Energy which might pay £10/month for not very much (well, I guess time will tell).
Aside from a few random comments like “I looked into panels on our house a bit ago, and I couldn’t see how it made sense financially…” to which I suspect my one daughter would answer “there are more costs than money involved in using fossil fuels”.
I remain a little skeptical of the solar quote’s ~6-8 year payback for the system, but we’ll see. I suspect with so many people getting solar this year that the export price will sink further so it won’t earn as much as it might otherwise have done. But if the price of electricity does rise, I’m hoping that 6-8 year payback period will be accurate.
And in the meantime, if we get a power cut, we can flip a magic switch and live in our own little bubble.
]]>For an opensource project I sometimes contribute to (postfixadmin), I used copilot to move from Bootstrap 3 to 5 a few months ago, which it did pretty well (and better than I would have been able to without spending a few hours reading upgrade docs for bootstrap migrations). This led to this short discussion here – where there was a “slop” knee jerk reaction. I was initially put off a little, and wondered if I’d made a mistake in using an LLM for the task. Thankfully someone else soon contributed a comment along the lines of “No one else contributed/bothered to create a PR… “.
More recently for postfixadmin a new contributor has stepped up (I think because the barrier to involvement is now somewhat lower) and started to submit various PRs generated via Claude.
Again, the bottleneck is on the human side (“Do we actually want to do this?”, “Should we do it like this instead?”).
While this post has been sitting in a draft state, I saw this morning that the Linux kernel has taken a fairly friendly stance towards LLMs ( https://github.com/torvalds/linux/blob/master/Documentation/process/coding-assistants.rst ) – which does leave the human being responsible for whatever they generated with their tools, which seems fair.
Will there be any humans left programming in a few years time though? Would I suggest it as a career for my children? Will LLMs result in an explosion of software (faster/cheaper to produce, possibly easy to clone what you would have paid for as a service) and software graduates etc will just become LLM herders. Will there still be a need for a developer to spec/design/manage the llm/test the code?
In 10 years time, will there just be a few grey beards, sharing a pint somewhere, saying things like “I remember coding, before there were LLMs ….. those were the days!” ?
]]>Recently, we decided to ditch using bastion ssh (jump) hosts at work, and move to use a VPN instead. This saves us from having a VM running ssh from listening for inbound connections.
Then I wondered how I could access both the work and my home tailscale networks from my laptop etc.
Initially I came across a blog/article discussing how to access two tailscale networks at once, which involved using linux network namespaces and adding various iptables rules etc. I sort of had a go, but it didn’t seem to want to work and it felt like it was going cause me trouble.
So I thought I’d probably have to keep switching tailscale networks somehow (e.g. tailscale down ; tailscale up ….–server … etc ). But this means I need to keep approving the it on the headscale side etc.
Then I saw there’s a ‘tailscale switch’ command ….
# tailscale switch --list ID Tailnet Account 0101 my.headscale.server david* 1010 some-label david.goodwin@work.corp
and switching is just a “tailscale switch some-label” or “tailscale switch my.headscale.server”
That’s a bit easier than having to reauthenticate with the appropriate tailscale network etc.
]]>Eventually, I settled on using LXC containers with a Varnish server as a HTTP frontend router. Hosting within AWS (EC2) was basically a non-negotiable requirement and there weren’t many alternatives either.
A crude web UI was added for managing sites, which was quickly adapted to have a JSON API on top. Then background tasks were added – involving a job queue (originally gearman, later on beanstalk) and some management of iptables rules.
Fast forward to 2026, and it’s still (just about) in use.
As a programmer/developer, we often don’t think too much about the distant future when creating something. We’ve got immediate deadlines, and thinking more than 2-3 years is difficult. There are plenty of uncertainties in life afterall!
Over the years, there have been multiple upgrades of various bits (Varnish, PHP, Debian release, Linux kernels etc).
I think it had between 5-8k sites at it’s peak, and I often found it amusing when I realised I was ordering/using a website hosted on it as a member of the public.
Anyway, all good things come to an end, I guess …. and finally a migration to something bigger/better/faster/shinier has begun, as this count of sites being hosted in it shows:

As I’m fairly stupid, I used wg-quick to generate the config – however when the config looks a bit like this –
[Peer]
PublicKey = cm+t2u0giNynMkcX1+afPu6SlKyLMeTe8iWKhT1FsDk=
AllowedIPs = 10.0.0.13/32
Endpoint = 192.168.122.13:51820
....
I began to find management became a problem – i.e which computer is that exactly ?
wg show does give you something a bit like this –
...
peer: cm+t2u0giNynMkcX1+afPu6SlKyLMeTe8iWKhT1FsDk=
endpoint: 192.168.122.13:51820
allowed ips: 10.0.0.13/32
...
which is sort of useful, but it still doesn’t tell me a human name. I’ve tried leaving comments in the config before, but they just get wiped out.
I’ve often thought about using TailScale, but wasn’t overly happy with the idea of some third party being involved. Eventually I came across headscale – which offers a self-hosted option for the backend (so your devices use the tailscale frontend).
After a bit of poking around over the weekend I now have this: headscale nodes list
which is a bit nicer –

I’m still pretty new to using Tailscale for a VPN, but I did at least eventually get my phone to join the network, and everything seems to work.
It’s sort of interesting that tailscale doesn’t add an entry into your routing table – but instead adds a few iptables rules in (nat) to mess around with things.
]]>Firstly, you’ll need to rebuild any VM image you have so it supports Trusted Launch. I use the Azure Compute Gallery (or whatever it’s called nowadays)
Thankfully, with the right ‘az’ cli commands you can migrate it to have this – specifically :
az vmss update -n my-scale-set -g my-resource-group --set virtualMachineProfile.securityProfile.encryptionAtHost=true
and
az vmss update -n my-scale-set -g my-resource-group --set virtualMachineProfile.storageProfile.imageReference.id="/subscriptions/xxxxxxx/resourceGroups/my-resource-group/providers/Microsoft.Compute/galleries/my-image-gallery/images/ImageWithTrustedLaunch/versions/202504.23.17" --security-type TrustedLaunch --enable-secure-boot true --enable-vtpm true
Now you just need the running images to upgrade … and you’ll be (perhaps) slightly more “secure”.
]]>