<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kraya on despatches</title><link>https://icle.es/tags/kraya/</link><description>Recent content in Kraya on despatches</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 06 May 2026 15:22:52 +0100</lastBuildDate><atom:link href="https://icle.es/tags/kraya/index.xml" rel="self" type="application/rss+xml"/><item><title>What's a Circuit Breaker?</title><link>https://icle.es/2026/05/06/whats-a-circuit-breaker/</link><pubDate>Wed, 06 May 2026 10:53:27 +0100</pubDate><guid>https://icle.es/2026/05/06/whats-a-circuit-breaker/</guid><description>&lt;p>I&amp;rsquo;d not been interviewed very often. For my first job, sure, I sent around my CV
to a bunch of places and did a bunch of interviews.&lt;/p>
&lt;p>I then started my own company and ran that for nearly two decades, everything
largely self-taught. After that, because of the peculiar shape of my CV, and
&amp;ldquo;falling between a lot of stools&amp;rdquo; as a friend pointed out, interviews were&amp;hellip;
tricky!&lt;/p>
&lt;p>I remember one such interview a few years ago. He was good at diffusing any
anxiety and it was a pretty relaxed interview. He wanted to know if I knew
architectural design patterns - a term I hadn&amp;rsquo;t heard before. He gave me
examples, circuit breaker, pub / sub and a third one I can&amp;rsquo;t remember anymore. I
recognised pub / sub and the other one I think - but was not aware of circuit
breaker. He explained it to me - something about reducing the risk of a
downstream service failing.&lt;/p></description><content:encoded><![CDATA[<p>I&rsquo;d not been interviewed very often. For my first job, sure, I sent around my CV
to a bunch of places and did a bunch of interviews.</p>
<p>I then started my own company and ran that for nearly two decades, everything
largely self-taught. After that, because of the peculiar shape of my CV, and
&ldquo;falling between a lot of stools&rdquo; as a friend pointed out, interviews were&hellip;
tricky!</p>
<p>I remember one such interview a few years ago. He was good at diffusing any
anxiety and it was a pretty relaxed interview. He wanted to know if I knew
architectural design patterns - a term I hadn&rsquo;t heard before. He gave me
examples, circuit breaker, pub / sub and a third one I can&rsquo;t remember anymore. I
recognised pub / sub and the other one I think - but was not aware of circuit
breaker. He explained it to me - something about reducing the risk of a
downstream service failing.</p>
<p>It made sense - but I couldn&rsquo;t remember any instance where I&rsquo;d done that and I
said as much.</p>
<p>No big deal! We moved on.</p>
<p>As you may have noticed from my recent flurry of posts, I&rsquo;ve been going through
a bit of an excavation of all things kraya, and discovering little nuggets that
I&rsquo;d forgotten all about.</p>
<p>Claude code went through all of my emails, all the code repositories and put
together interesting things I had done. The purpose was mainly to pick out
things that could be good blog posts, stories, or just reminders.</p>
<p>Claude had found two circuit breakers.</p>
<p>The first one was built by the seat of my pants in 2004. There was an active
marketing campaign on megabus and the system was struggling. I&rsquo;d plumbed the
depths of the tech stack - the web servers, the database server to get every
last ounce of performance out of the system.</p>
<p>What I really needed was to slow down the deluge of people coming into the
site - just a little bit. I needed to prevent the snowball effect, and I tried a
simple way to achieve it. I wrote the following around my 23rd birthday.</p>
```php
$timestamp = time() - 120;
$sTimestamp = date("d-F-Y H:i");
$sql = "SELECT count(*) FROM tSearches WHERE Script_Start > '$sTimestamp' AND Script_End IS NULL;";

$numSearches = $dbh->getOne($sql);
if ($numSearches > 10)
    sleep(5);

$numSearches = $dbh->getOne($sql);
if ($numSearches > 10)
    sleep(5);

$numSearches = $dbh->getOne($sql);
if ($numSearches > 10)
    sleep(5);
```
<p>(The eagle eyed among you might notice a bug in the above code. It wasn&rsquo;t
resolved for years. Coding live on a production system tends to create bugs. See
if you can find it before reading on.)</p>
<p>(Regular readers may also remember a part of this story from
<a href="https://icle.es/simple-wins.md">I Know People Like You</a>)</p>
<p>The system already tracked searches - so I just needed to check it.</p>
<p>This bit of code checks to see how many of the searches that started in the last
two minutes were incomplete. Except that&rsquo;s not what it did - I forgot to
actually use <code>$timestamp</code> so it only checked the current minute&rsquo;s worth.</p>
<p>I considered failing and letting the user retry manually - but I didn&rsquo;t want to
force the user to take action unless absolutely necessary. This one waited up to
15 seconds and then let the search happen anyway.</p>
<p>If the user was still waiting after 15 seconds, might as well try and do a
search and see what happens. In hindsight, it might have been better to fail at
that point. If there were too many searches after 15 seconds, the database
server was likely already snowballing.</p>
<p>This bit of code survived through to the end of the PHP codebase apart from
minor tweaks. The Java version had layers of circuit breakers. Session limits,
rate limiters and threadpool configuration for scaling up. None of it though,
was called a circuit breaker - not by me or by the team.</p>
<p>So, have I built a circuit breaker? Thinking back, what threw me off was the
wording. I had the feeling that the circuit breaker would &ldquo;protect&rdquo; another
service.</p>
<p>In my mind, the database wasn&rsquo;t another service - it was a part of the same
service.</p>
]]></content:encoded></item><item><title>Holding the Fort</title><link>https://icle.es/2026/04/15/holding-the-fort/</link><pubDate>Wed, 15 Apr 2026 15:26:10 +0100</pubDate><guid>https://icle.es/2026/04/15/holding-the-fort/</guid><description>&lt;p>For many years, I loved my job. I was working on a production system that saw
tens of thousands of orders across the world.&lt;/p>
&lt;p>By the time it was 2015, I did not.&lt;/p>
&lt;p>I had poured blood, sweat and tears into a ticketing system that kraya built —
first for megabus, then for Polskibus. It had broken me, and we were now just
limping along.&lt;/p>
&lt;p>By 2015, we were spending 101–286 hours each month on a support contract that
paid for 60. I raised this with the client and suggested a minimum of a 100%
increase. They refused. Instead, they minimised their requests to just about 80
hours each month. Without the development work, I was now making a loss each
month providing the resources for this support contract.&lt;/p></description><content:encoded><![CDATA[<p>For many years, I loved my job. I was working on a production system that saw
tens of thousands of orders across the world.</p>
<p>By the time it was 2015, I did not.</p>
<p>I had poured blood, sweat and tears into a ticketing system that kraya built —
first for megabus, then for Polskibus. It had broken me, and we were now just
limping along.</p>
<p>By 2015, we were spending 101–286 hours each month on a support contract that
paid for 60. I raised this with the client and suggested a minimum of a 100%
increase. They refused. Instead, they minimised their requests to just about 80
hours each month. Without the development work, I was now making a loss each
month providing the resources for this support contract.</p>
<p>I could cancel the contract, but that would involve letting them have the source
code, which was otherwise kraya&rsquo;s property. There was a six month notice period
— six months of providing all the support they need to run and to migrate the
system to their team.</p>
<p>At some point, I went from taking on the challenge to holding the fort.</p>
<p>I could see that any effort to make things easier would backfire. I built them a
feature for free — they complain about one bug in it — and they need it fixed
urgently. I loosen the rules and deploy an additional server just before the
weekend, letting them know about the risks. Something goes wrong and they are
surprised.</p>
<p>The hardest thing for me to change was the belief that the client&rsquo;s wins were my
wins. If anything, the client&rsquo;s wins were my loss. It meant more unpaid work in
the support contract. It meant more complex systems to support and maintain —
while every penny was being questioned.</p>
<p>I started to say no. No, we will not deploy new servers on a Thursday because
the weekend is too close. No, we will not reduce the QA time on this bit of
functionality you want. No, we will not restore reports which could display
erroneous data.</p>
<p>It all came to a head in one specific instance where the CEO insisted on
speaking to me because they needed something deployed urgently. They needed us
to work through the evening or the weekend. I said no. They offered to pay
double. I said no. They were not happy.</p>
<p>A few months later, they cancelled the contract.</p>
<p>I remember the meeting. It was amicable and friendly. They asked if I could keep
the staff on till the end of the year - they wanted backup in case anything went
wrong during the migration.</p>
<p>I wouldn&rsquo;t want to let them go before Christmas anyway.</p>
<p>I had a brief conversation with my brother to decide what to do next. I already
knew that there was nothing left to keep running. We kept it running for three
more months until the end of December.</p>
<p>I remember going into the main office, gathering everyone around and delivering
the news. Polskibus had cancelled. We are shutting kraya down. We&rsquo;ll keep going
until the end of December.</p>
<p>I remember the Christmas party. It had often ended up being drinks, and being
out all night. It didn&rsquo;t this year - we went home after the meal. The atmosphere
was one of sadness and relief. We&rsquo;d all been through the fires and made it out
the other end. It was over.</p>
<p>It was the end of what I&rsquo;d built over 15 years.</p>
<p>I felt nothing.</p>
]]></content:encoded></item><item><title>I Chose to Keep Going</title><link>https://icle.es/2026/04/14/i-chose-to-keep-going/</link><pubDate>Tue, 14 Apr 2026 20:52:10 +0100</pubDate><guid>https://icle.es/2026/04/14/i-chose-to-keep-going/</guid><description>&lt;p>In 2008, we all watched Pivotal crash and burn. They&amp;rsquo;d taken a year and nearly
£900k to build a new ticketing system for the fringe. On launch, they realised
that it could serve only one customer at a time.
&lt;a href="https://icle.es/saving-the-fringe.md">We built an interim ticketing system for them over the weekend&lt;/a>.&lt;/p>
&lt;p>It was time for kraya to take a leap. We should take the megabus.com ticketing
system to the next level and build a distributed ticketing system that could
potentially scale infinitely.&lt;/p></description><content:encoded><![CDATA[<p>In 2008, we all watched Pivotal crash and burn. They&rsquo;d taken a year and nearly
£900k to build a new ticketing system for the fringe. On launch, they realised
that it could serve only one customer at a time.
<a href="https://icle.es/saving-the-fringe.md">We built an interim ticketing system for them over the weekend</a>.</p>
<p>It was time for kraya to take a leap. We should take the megabus.com ticketing
system to the next level and build a distributed ticketing system that could
potentially scale infinitely.</p>
<p>I&rsquo;d picked JBoss because it was backed by Red Hat - it had all these features
and capabilities - a lot of which we needed. The other option we considered was
Glassfish, but it just didn&rsquo;t have the features we needed. There were other
options but that involved prohibitive licensing fees.</p>
<p>We costed it out at £650k and a year. It was unrealistic but I could not imagine
Stagecoach paying more, or giving us more time. They wanted it for £500k and in
six months. I should&rsquo;ve pushed back, but we&rsquo;d built a booking system over the
weekend, only a few months back - this should be possible, right?</p>
<p>It wasn&rsquo;t.</p>
<p>We got a year in the end — we didn&rsquo;t ask for it, and we didn&rsquo;t know until we
were most of the way down the path. When I heard about the delay it was a mix of
relief and regret. We&rsquo;d burned through most of the budget on getting in
contractors who were leaving imminently. We could have got fewer people on
board, but as permanent staff.</p>
<p>We launched to Canada first, and that wasn&rsquo;t too bad. Then it was the US, and
the nightmare started. The UK launched last on my birthday in 2010.</p>
<p>In the intervening years, we had a budget shortfall of £150k and because we&rsquo;d
rushed to build the product, we&rsquo;d cut corners, and all the contractors had left.
We even had to let go of some of the permanent staff. I asked Stagecoach if
they&rsquo;d fund us the extra £150k as we&rsquo;d asked at the start. They said no. They
renegotiated the contract. They demanded more oversight - and increased our
reporting obligations.</p>
<p>Load testing was already a part of our process and we tested the new system
under load. We identified issues and fixed them. On paper, it looked good.</p>
<p>It wasn&rsquo;t.</p>
<p>The problem wasn&rsquo;t load per se. It was the stability of the system. It struggled
to stay up for extended periods of time. The more nodes there were, the worse it
was.</p>
<p>It was exactly the kind of problem that was hard to replicate and hard to test.
The main option we had was to think through what all it could be and to take
stabs in the dark. I put together a hit list and worked through it methodically.
Convincing Stagecoach to spend the money was sometimes harder than solving the
problem.</p>
<p>Ultimately, the one thing that pushed us over the line in terms of stability was
staggered nightly automated restart of each node.</p>
<p>I thought I was done working with
<a href="https://icle.es/it-gets-everywhere.md">software that needed regular restarts to stay functional</a>
and at first resisted this. We are running enterprise level software, and that
too on Linux. If I was comfortable with such shenanigans, I might have stayed
with Windows. But we were running out of options. It was a hail Mary - it
worked.</p>
<p>I had been working with Linux and related software for years by that point. I,
in fact had servers that had not been restarted for literal years at that point,
with services that were running just as long. A lot of these services didn&rsquo;t
even need a restart on config change - just a reload.</p>
<p>None of these services even had a paid tier. That should have been the clue.</p>
<p>I cannot imagine having to restart PostgreSQL nightly or even Apache. I still do
not understand how something slated for the enterprise market can have leaks
that would warrant a regular restart to keep it working.</p>
<p>Years later, when I looked up issues around JBoss, I realised that it was
notorious for a whole slew of problems with JGroups and clustering. I remember
scouring the internet for details on any kind of issues and coming up empty.</p>
<p>I&rsquo;d fallen into a marketing trap. JBoss was no Apache — it was the commercial
product of Red Hat. I thought all enterprise open source software would be of
the same calibre. It wasn&rsquo;t.</p>
<p>From what I understand, Stagecoach spent millions and maybe two years building
the whole ticketing system inhouse. kraya limped along for a few more years
before being shuttered.</p>
<p>The people involved, though, fortunately seem to have gotten through it largely
unscathed. It gives me a great deal of joy to see so many of the juniors I&rsquo;d
hired now CTO&rsquo;s, VP&rsquo;s, Directors.</p>
<p>I believed that every victory was ours but when something went wrong, it
belonged to me. After all, I made every choice. I chose to pursue the Java EE
ticketing system. I chose JBoss. I chose to keep going.</p>
<p>I was in a narrowing path, with fewer and fewer options.</p>
<p>I knew I was the only one holding that line - I didn&rsquo;t know that there was
another option.</p>
<p>Bit by bit, I lost all sense of what I was paying to fix these mistakes.</p>
]]></content:encoded></item><item><title>Always On</title><link>https://icle.es/2026/04/14/always-on/</link><pubDate>Tue, 14 Apr 2026 19:51:09 +0100</pubDate><guid>https://icle.es/2026/04/14/always-on/</guid><description>&lt;p>I knew as soon as my phone rang what it was about.&lt;/p>
&lt;p>It was the same every time. I would drag myself up to answer the phone - my
body, my mind screamed at me, but I had gotten good at overriding every instinct
through sheer willpower. I could hear the apologetic tone on the other side, and
I could recognise some of the voices after a while. I mustered up all of my
strength to be and sound as awake as possible. I needed to be professional even
if I was still in my underwear.&lt;/p></description><content:encoded><![CDATA[<p>I knew as soon as my phone rang what it was about.</p>
<p>It was the same every time. I would drag myself up to answer the phone - my
body, my mind screamed at me, but I had gotten good at overriding every instinct
through sheer willpower. I could hear the apologetic tone on the other side, and
I could recognise some of the voices after a while. I mustered up all of my
strength to be and sound as awake as possible. I needed to be professional even
if I was still in my underwear.</p>
<p>I had a glass of water on my bedside table. I&rsquo;d pick that up and head to my
office in the spare room. The computer was always on and always ready to go —
like me I guess. I&rsquo;d log on to the servers, and check the logs. If I can
identify which one fell out of the group, I can restart just that one. If I was
too late or if the issue had escalated, I&rsquo;d have to restart the whole cluster —
shut them all down, give them a few seconds, then bring each one up, while
keeping an eye on them. I could do it half asleep after a while.</p>
<p>Falling back asleep wasn&rsquo;t a breeze either - I was tired - exhausted - but I was
now also wired. Waking up in the morning was harder - the alarm would go off and
my body would be limp. I still remember the sheer power of will to drag myself
into the shower, then carry on with the rest of the day.</p>
<p>Of 266 incidents over about two years, I answered 156.</p>
<p>I remember one particular night, though I do not remember how many times I&rsquo;d
woken up beforehand. I was already tired.</p>
<p>megabus.com had gone offline. I got an alert. &ldquo;But someone else is on call
tonight,&rdquo; I told them. &ldquo;We already tried them twice,&rdquo; came the reply. I had to
deal with this. I had to deal with this.</p>
<p>I remember sitting at my desk at home working on fixing it. At some point,
something was different, though I don&rsquo;t remember what. While I was working on
fixing it, I remember being overcome with an overwhelming impulse to get up from
the chair and walk away — I almost imagined myself walking away. I resisted and
shut down that impulse. I fixed megabus as I had always done. In fixing megabus
though, something broke inside me, somewhere deep, in the very core of my being.
I was never the same again.</p>
<p>I analysed the system top to bottom, inside and out. I even waded through JVM
internals.</p>
<p>It got incrementally better, more stable. I think I rewrote every component that
wasn&rsquo;t the core ticketing system. In the end, what pushed it over the line were
two unexpected changes. Automated nightly restarts of each node in the cluster
and a rate limiter.</p>
<p>On the 10th December 2012, the system, now serving Polskibus, had a sale event.
We had a bank of screens on a wall with all the key stats for the system. It
looked cool, and we felt a bit like we were on a TV show. At peak, nearly 15,000
concurrent sessions — six or seven times the average. Over 30,000 bookings in a
single day, three times more than the normal amounts across all systems.</p>
<p>We watched it closely, all day. Nothing broke. Nothing screamed. Everyone
smiled, but there was no celebration.</p>
]]></content:encoded></item><item><title>Did They Have a Problem That Year?</title><link>https://icle.es/2026/04/14/did-they-have-a-problem-that-year/</link><pubDate>Tue, 14 Apr 2026 10:24:26 +0100</pubDate><guid>https://icle.es/2026/04/14/did-they-have-a-problem-that-year/</guid><description>&lt;p>2008 was a heck of a year for kraya, and for me. We were already operating
megabus.com in the UK, USA, and Canada, along with Oxford Tube, the sales
website for coach usa - all for Stagecoach.&lt;/p>
&lt;p>We were also working on the fringe website. We integrated the website with the
brand spanking new ticketing system - which cost nearly £900k.&lt;/p>
&lt;p>We were also hosting websites for Boots, Kellogg&amp;rsquo;s Food Service and dozens of
other clients.&lt;/p></description><content:encoded><![CDATA[<p>2008 was a heck of a year for kraya, and for me. We were already operating
megabus.com in the UK, USA, and Canada, along with Oxford Tube, the sales
website for coach usa - all for Stagecoach.</p>
<p>We were also working on the fringe website. We integrated the website with the
brand spanking new ticketing system - which cost nearly £900k.</p>
<p>We were also hosting websites for Boots, Kellogg&rsquo;s Food Service and dozens of
other clients.</p>
<p>All of this was held together by three or four developers, two systems
administrators and me.</p>
<p>On the 13 June (incidentally, I got married on the same date years later), as I
was just getting ready for a wild night on the town, a call comes through -
which John answers.</p>
<p>I still remember them laughing and then doing a double take &ldquo;oh, you&rsquo;re serious?
let me get Shri&rdquo;</p>
<p>It was the fringe. We&rsquo;d already known that they were having trouble with their
ticketing system. I&rsquo;d even pitched in, made suggestions - looked at their code
to try and help, but none of that was enough. I expected an update.</p>
<p>They wanted to know if we could put together an interim booking system for them
over the weekend. I wasn&rsquo;t sure. I told them I&rsquo;d speak to my team and get back
to them.</p>
<p>I wasn&rsquo;t involved with the work on the fringe up until this point. I knew very
little about it. I was focused on megabus.com. The US version of the site had a
big marketing campaign happening in a few days and that was what I was meant to
be focused on.</p>
<p>By the time I put the phone down, Chris, who had been the lead on the fringe
already had a answer. &ldquo;We can do it!&rdquo;</p>
<p>&ldquo;But how - it&rsquo;s got to take more than a weekend - right?&rdquo;</p>
<p>The fringe website was already built well and had a clean layer interfacing with
the new ticketing system. In fact, that was the bulk of the work that year.</p>
<p>So.. Chris told me - all we would have to do is to implement the functionality
within that thin layer, fattening it up.</p>
<p>He believed we could do it. I believed him.</p>
<p>I hopped in a cab, headed over to the fringe to talk it through. I didn&rsquo;t
promise them we&rsquo;d be able to get something ready by Monday, but I promised we&rsquo;d
do our best.</p>
<p>We were in the office on the weekend, writing code. I remember working on the
basket, sending diffs over email and generally having a good time.</p>
<p>I even had some megabus US fun to keep me entertained in the form of issues with
loading sheets - I was already in the office, so it was one step easier to fix.</p>
<p>One of the bits of functionality which took a surprising amount of time was the
seat allocation. None of us had to worry about that before - it was just
capacity management on megabus. For the fringe though, we had to allocate actual
seats with seat numbers and everything.</p>
<p>With the fringe we had multiple tables which all joined together (thanks
hibernate) to encode a tremendous amount of detail about the seating plans -
including their physical location on a map.</p>
<p>It was too much detail for us, so we had to simplify it all down to get it
working in the timeframe. We kept most of the rest of the structures intact to
keep the data migration easier once the ticketing system was fixed.</p>
<p>By Monday, we had each managed at the most 6 hours of sleep each of the previous
three nights. I still have vivid memories of a suit of armour that we put
together using packing material while we were waiting for bits of data or
details of logic.</p>
<p>I broke the MySQL replication at 01:24, fixed by 01:32</p>
<p>I remember the delirium setting in. Email sent to the client with &ldquo;fun fun fun
fun fun fun fun&rdquo; as the subject</p>
<p>There were random emails to my brother &ldquo;I&rsquo;m still here!&rdquo;</p>
<p>I also remember making makeshift beds with bubblewrap to get a wee nap here and
there. We were all so exhausted - pumped up on coffee and nicotine.</p>
<p>Finally at 03:35 on the Tue email to client: &ldquo;DONE DONE DONE DONE DONE NODE NODE
NODE NODE&rdquo;</p>
<p>Then at 05:33, requesting a PostgreSQL server rebuild for megabus US for their
marketing campaign.</p>
<p>At 10am on Tuesday, the fringe is finally able to sell tickets. The website
promptly fell over from the load, but we nurse it back and it sells 65k+ tickets
in the first week.</p>
<p>It would be at least two more weeks before the ticketing system is fixed and
brought back in.</p>
<p>For the work we did for them that year, and the previous one, we effectively
only charged about 30% - because that&rsquo;s all they could afford. This year, we
asked if they could put our name on the website.</p>
<p>Over the next two weeks(while megabus US was on their marketing campaign), we
fought many battles. There were 750 duplicate bookings. Numerous customer
complaints (thanks to our name being on the website) - almost all of them
blaming us for the failure of the ticketing system. People did not understand
that we put in the interim one, not the one that failed.</p>
<p>Press releases went out from the fringe - only two credited us. Both misspelt
the company name. Both called us a web design company — which, we were not, had
never been, and had no interest in becoming.</p>
<p>In truth, I wanted to be a hero - I think we all did. What we really wanted was
an acknowledgement of what we had done - which was nowhere to be found. We got
paid though - at least for a part of our effort.</p>
<p>For many years after that, I would tell people with pride - &ldquo;did you know - I
saved the fringe, back in 2008,&rdquo; which was inevitably met with something like
&ldquo;oh, did they have a problem that year?&rdquo;</p>
]]></content:encoded></item><item><title>What we Carried</title><link>https://icle.es/2026/04/13/what-we-carried/</link><pubDate>Mon, 13 Apr 2026 20:02:04 +0100</pubDate><guid>https://icle.es/2026/04/13/what-we-carried/</guid><description>&lt;p>I started my company in 2000. I was 17. I built megabus.com in 2003. I was 21.&lt;/p>
&lt;p>It started off small, and little by little, I carried more and more. I became
we, and we carried more and more. Before we realised, we were carrying a great
deal. Ultimately, though, if something went seriously wrong, it would be on my
shoulders.&lt;/p>
&lt;p>The chart does not capture the scaling of the organisation, or other departments
like tech support or hosting, which had dozens of clients.&lt;/p></description><content:encoded><![CDATA[<p>I started my company in 2000. I was 17. I built megabus.com in 2003. I was 21.</p>
<p>It started off small, and little by little, I carried more and more. I became
we, and we carried more and more. Before we realised, we were carrying a great
deal. Ultimately, though, if something went seriously wrong, it would be on my
shoulders.</p>
<p>The chart does not capture the scaling of the organisation, or other departments
like tech support or hosting, which had dozens of clients.</p>

<figure >
    
        <img src="./gantt_combined_1000.png" 
            alt="gantt chart of the main projects done by kraya through its life" />
    
    
    
        <figcaption>
            
            
            
                <p style="margin: -0.5rem 0 0 0;">
                    Data mined by Claude from my emails, issue trackers and code repos
                
                
                
                
                
                
            </p> 
            
        </figcaption>
    
</figure>


<p>The section at the top is the number of active committers for that quarter. You
can see my on my todd at the start and the rise and the fall of the dev team.</p>
<p>The very peak of it was in 2008. We
<a href="https://icle.es/saving-the-fringe.md">built a booking system over the weekend for the Edinburgh festival fringe because their brand new £800k+ system could only handle one person at a time.</a></p>
<p>There were a handful of us building it while I was simultaneously prepping and
managing the megabus US systems for a sales campaign. At the same time we were
operating megabus across the UK, USA, and Canada, Oxford Tube, Coach USA, the
Fringe website itself and numerous other smaller hosting clients like Boots,
Kelloggs Food Service, and so on.</p>
<p>We were a total of ~4 developers and two systems administrators holding all of
these together.</p>
<p>I was recently reminded of a story a friend of mine told me. Before he was my
friend, he worked with me, and one of the things we did together was one the big
megabus deployments when we migrated to a Java EE ticketing system.</p>
<p>One part of the migration was the data. I had developed a tool to migrate the
data and on the evening - everything was prepared, we were off peak, and we had
taken the site offline. He ran the script, which went on for a wee while and it
failed. It was not meant to do that.</p>
<p>The way he tells the story, he told me about the failure. I come over, look at
the errors, say &ldquo;hmmm, that&rsquo;s interesting,&rdquo; and head off to have a cigarette. A
few minutes later I go over to my desk type away furiously, then asked him to
run it again.</p>
<p>It worked, and completed.</p>
<p>I remember that night. I don&rsquo;t remember what the problem was or how I fixed it,
but I do remember that moment when I went over to see how it had failed. In the
short walk from my desk to his, I reiterated in my mind, all the possible backup
plans - with the worst case scenario being to call off the migration on that
day. We would do it another day. It would cost money, but it would be do-able. I
was ok with that.</p>
<p>I was curious as to where my limits were, so I kept pushing, until I would meet
with a wall.</p>
<p>There were no rails and there were no railings - just a cliff edge, unmarked… I
didn&rsquo;t know that - I expected a brick wall.</p>
<p>The worst of it would be only a few years later, in 2011. We built a new Java EE
ticketing system for a fraction of what it should have cost in about 30% of the
time it needed.</p>
<p>I personally responded to over 250 out of hours emergency tickets over an 18
month period. That was hard!</p>
<p>I had run off a cliff edge, and like the roadrunner in the cartoons, it took a
while before I realised there was no ground beneath me.</p>
<p>A few years after I ran off the cliff, the company shut down. A few years later,
I would start my active recovery journey through therapy. A few years later
still, when I felt ready for a leadership role, I was asked to lead a
problematic team - a role they struggled to fill for a while.</p>
<p>The team worked hard and delivered but struggled with the perception of poor
delivery. Trust was thin, stress was high and morale was low. The situation was
so bad that the week before I was supposed to start, the scrum master who was
supposed to be my guide through it all quit.</p>
<p>I was warned by multiple people that this job was loaded with problems. I took
on the job anyway, without a real guide, straight into multiple serious issues.</p>
<p>I loved it and managed to turn the whole thing around in my first week.
Delivered key items, laid the foundations of trust and improved morale. It took
a bit longer to bed everything down. Within weeks, I was asked if I would take
on leading the entire digital team.</p>
<p>It was here, many years later, I got a sense of how unusual it was for such a
tiny team to do so much.</p>
<p>It was here, many years later, I got a sense of how it is to have guardrails, to
have support, peers to lean on.</p>
<p>It was here, for the first time I realised that the job didn&rsquo;t have to be a
lonely one.</p>
]]></content:encoded></item><item><title>Whatcha Thinking?</title><link>https://icle.es/2026/04/13/whatcha-thinking/</link><pubDate>Mon, 13 Apr 2026 12:05:48 +0100</pubDate><guid>https://icle.es/2026/04/13/whatcha-thinking/</guid><description>&lt;p>I loved working on megabus. I was in love with it. My girlfriend at the time had
a habit of asking what I was thinking about when I looked deep in thought. The
answer - every single time, was inevitably megabus. She eventually stopped
asking.&lt;/p>
&lt;p>I was 22 years old.&lt;/p>
&lt;p>When I built the original prototype for megabus.com, I built it using PHP +
PostgreSQL. I put together a document detailing my reasoning for these choices.
I quoted 33 days for it, built it over six weeks and charged £13,200.&lt;/p></description><content:encoded><![CDATA[<p>I loved working on megabus. I was in love with it. My girlfriend at the time had
a habit of asking what I was thinking about when I looked deep in thought. The
answer - every single time, was inevitably megabus. She eventually stopped
asking.</p>
<p>I was 22 years old.</p>
<p>When I built the original prototype for megabus.com, I built it using PHP +
PostgreSQL. I put together a document detailing my reasoning for these choices.
I quoted 33 days for it, built it over six weeks and charged £13,200.</p>
<p>The support contract was £350/month - for one day a month. On the first day,
megabus.com sold 200 orders.</p>
<p>When megabus had its first expansion, I was up overnight bringing new servers
online and scaling it live. I loved it - my code was finally being tested.</p>
<p>Over a week, I&rsquo;d probably burned through many days of effort. I remember the
project manager specifically asking me to invoice for the extra work I put into
it. I even said that I would - except I didn&rsquo;t.</p>
<p>I&rsquo;ve had a long time to think about this - why did I not send that invoice? I
even had approval.</p>
<p>The answer, as with most things of this nature is complicated. I loved the work
and I didn&rsquo;t want it to end. I didn&rsquo;t want a potential conflict trying to figure
out what a reasonable amount was to charge. I felt that I should have done a
better job in the first place - I felt responsible that I had not told them that
scaling of this nature would not have worked without prep work.</p>
<p>I had not scaled anything before.</p>
<p>I was 22 years old.</p>
<p>I was super grateful that someone believed in me. I naively assumed that they
saw all the extra effort I was putting in and that they would reward me for it -
that they would have my back.</p>
<p>I remember adding a bunch of different bits of functionality because I wanted it
there. I didn&rsquo;t want to go through the process of quoting for it, and it getting
potentially rejected, not to mention the waiting for decisions. One key bit of
functionality I remember is adding in a percentage load column for the loading
sheets. I built it, showed it - they loved it! It went live. I did not charge
for it.</p>
<p>At this point, the vast majority of my time was spent on megabus - very little
of it actually paid for.</p>
<p>At a glance, based on the emails sent, I probably spent a minimum of 10 days
each month supporting megabus when I was charging for one day.</p>
<p>In Jan 2004 - I proposed <em>doubling</em> the contract to two days for £4,800/year. It
probably kicked in in Feb 2004. By March 2004, the site exceeded that revenue
each day.</p>
<p>In the following months, I probably spent, on average a minimum of at least
double the time I was paid for. I should have charged for it.</p>
<p>I grew the team, and the support contract based on the minimum I needed to
maintain the product - not based on the amount of time I was spending.</p>
<p>For my 28th birthday, my girlfriend at the time organised a cake which was a
image representing kraya - which was basically megabus. I felt bad that she
thought that kraya was the most important thing in my life - she was right - but
it still felt bad. kraya had other clients at the time, but my time wasn&rsquo;t
monopolised by other clients, or indeed by kraya - my heart still belonged to
megabus.</p>
<p>And it would all have been fine too, except for a grave miscalculation I made.</p>
<p>In 2010, after trying to rebuild the ticketing system for £500k, and making some
mistakes with people I trusted, kraya ended up in £150k in the hole. We needed
some money urgently.</p>
<p>I was desperate and naively, I reached out to stagecoach for help. I thought
they were my friend - that they would have my back.</p>
<p>They understandably lost a great deal of trust in my ability to manage and lead
my company. I trusted the wrong person - but that was still my mistake. They
were right.</p>
<p>I thought that I&rsquo;d built up enough goodwill that they would help me through
this. I&rsquo;d felt I would have way more than that &ldquo;in the bank&rdquo; in terms of
goodwill. I learned that professional relationships do not work that way that
dark afternoon, standing outside my office on the phone, in the rain.</p>
<p>They didn&rsquo;t make my life easier. Instead, I&rsquo;d ended up rattling the cage - they
were now panicked - realising their over-reliance on an organisation that could
disappear at any point.</p>
<p>Instead of support, I had further actions, renegotiating the contract and what
felt like punitive, and definitely invasive reporting obligations.</p>
<p>I was hurt and angry. I had poured my heart, my soul - hey, my very life into
this product that I loved.</p>
<p>Suffice it to say - I got no help - no loan, no offer of investment - though
they did suggest buying us outright - which I rejected.</p>
<p>I signed a contract under circumstances I would not wish on anyone.</p>
<p>The best I got from them was a challenge - if we were really spending more time
than we were charging for - prove it. I did! We documented every minute we were
spending - I wasted my time on spreadsheets, pointless meetings and work to try
and rebuild the broken trust.</p>
<p>We went from £300k in the hole to £200k profit within a year. We charged for a
whole year in support around 20% of what the system made in a day.</p>
<p>I was 28 years old.</p>
<p>Around the same time, I was also dealing with the operational aftermath of
trying to build a java EE ticketing system over six months for £500k. I thought
it would take a year and cost £1m. In hindsight, it needed two years and
probably three million pounds.</p>
<p>Over 18 months, I personally answered over 150 out of hours emergency calls. We
had a rota and others on call too - but I took the vast majority of these calls.
I felt bad putting others through what I knew was gruelling.</p>
<p>All of this led me down a narrower and narrower path to a serious breakdown -
though I didn&rsquo;t know enough to name it until many years later. All I knew - all
I felt was that something broke in me.</p>
<p>We managed to resolve all of the issues, but the deployment of that version kept
getting pushed.</p>
<p>Stagecoach cancelled the contract in 2012. They had started building a ticketing
system in-house two years prior - the cost of my grave mistake. I wasn&rsquo;t able to
make the meeting - I was in India, and at the same time as the meeting, I was
meeting for the first time the one who is now my wife.</p>
<p>I was 28 years old. I spent the next 15 years putting myself back together.</p>
<p>How much did it cost them to build it inhouse? If I had charged for my time from
the start, would we all have been better off?</p>
<p>I still feel something deep inside me every time I see a megabus - a sense of
pride mixed in with a deep sense of sadness - not for what I lost - but for what
could have been.</p>
<p>I am 44 years old, and I am starting again.</p>
]]></content:encoded></item></channel></rss>