Build notes · Bytelore

The app was the easy half.

Bytelore teaches ten subjects in three-minute lessons. Building the thing that delivers a lesson took a fortnight. Having a hundred lessons worth delivering took considerably longer, and nobody warns you about that part.

Live: bytelore.co.uk →

The pitch is simple enough to fit in a sentence. Ten subjects worth knowing — AI, coding, data, cybersecurity, finance, communication, critical thinking, mental fitness, climate, entrepreneurship. Lessons you can finish while the kettle boils. A subscription, a streak, and a certificate at the end that actually means something.

What it’s actually made of

Expo and React Native, so the web app and the eventual iOS and Android builds come out of one codebase rather than three. An Express and Node back end. Supabase for the database, in the London region, with row-level security doing the access control rather than a pile of hand-written checks I would inevitably get wrong on a Friday.

Certificates are Open Badges 2.0 — a real open standard, signed JSON-LD, verifiable by anyone who receives one, and posted to LinkedIn in a tap. This mattered more to me than it probably sounds. A certificate that only your own website can vouch for is a picture of a certificate.

The bit that took the time

A three-minute lesson is a brutal format. There is nowhere to hide. You cannot pad it, you cannot waffle towards a point, and you cannot leave the useful bit until the end because there is no end — people close the tab. Every lesson has to know what it is for in the first line.

Multiply that by a hundred and the engineering starts to look like the warm-up. I had built the delivery mechanism for a product whose actual substance did not exist yet, which is a very easy trap to walk into when you enjoy the building part more than the writing part.

A UK app that charges in dollars is not a pricing bug. It is a tell.

Three letters

Payments went live and the checkout worked perfectly, which was the problem. Somewhere in the server the currency was hardcoded as usd. A British app, for British users, quoting British prices on every screen, and then handing the customer to Stripe to be charged in dollars.

It was a one-word fix. It would have been a very expensive one-word fix to find out about from a customer, and the reason it survived that long is that nothing was broken. Nothing errored. The tests, in so far as they existed, were about whether a payment succeeded, and it did.

There was a matching ghost on the bank statements. The account’s statement descriptor still carried the name of the project Bytelore used to be called, so an early customer would have seen a charge from a company that, as far as they were concerned, did not exist. That is the sort of detail that produces a chargeback rather than an email.

The domain that never got its certificate

The API was meant to live on a tidy subdomain. DNS was right, the CNAME pointed where it should, and the certificate simply never got issued — so the subdomain answered, over HTTPS, with a wildcard certificate belonging to the hosting platform.

The front end had been pointed at that tidy subdomain. Every request from a real browser failed on the certificate, silently, in a way that looks from the inside exactly like the back end being down. I pointed the front end at the platform’s own URL, shipped, and left the pretty subdomain for a day when it was not standing between customers and a payment form.

There is a lesson in there about vanity infrastructure. The subdomain was nicer. The subdomain was also the only thing in the stack that did not work.

What I’d tell a client from this

Two things, and neither is about React.

The first is that the content is the product. I can build you something that loads in under a second on a phone in a car park with one bar of signal, and it will still fail if the words on it were an afterthought. Most of the small business websites I am asked to fix do not have a technology problem. They have three sentences where they needed thirty, written by someone who was busy running a business.

The second is that the dangerous failures are the quiet ones. A site that throws an error gets fixed on Tuesday, because somebody shouts. A site that charges in the wrong currency, or sends the enquiry form to an inbox nobody has opened since March, will do that patiently for a year while you wonder why the phone has gone quiet. Before I hand anything over I send myself a message through it, and I check the money actually lands. It is not clever. It is just the check nobody does.

— Jay

Build notes · Published 2 August 2026 · Beverley · See the work →