Wednesday, 3 September 2025

Replit Goes Rogue

Here's a story that will chill the beejezuz out of any aspiring Vibe Coder.

Replit is a tech company which produces autonomous AI agents. You generally create and train a tool on the company's platform using various input data, then refine its capabilities over time. Yes, I know, they're dime a dozen these days.


One Jason Lemkin, a software engineer, founder of SaaStr, a SaaS Community, reported his organization's disastrous encounter with Replit's A.I coding tool on X. Lemkin was attempting a Vibe Coding experiment to see how far he could take Replit's autonomous agent for software development, from the viewpoint of a layperson. This was innocuous enough. Unfortunately, he just happened to perform this experiment on a production database...

What happened

Yes, you read that right. A production database. It wasn't even an accident. It was a deliberate, and baffling, decision.

Lemkin had been Vibe Coding the new SaaS product using Replit, and it had been working. The warning signs came when Lemkin discovered that the coding agent was creating fake data, fake reports and covering up bugs and issues. Kind of like some human beings I know, to be honest. Then Lemkin had to step out for the night. When he returned, the production database had been wiped clean. The A.I tried to cover up its mistakes by creating 4000 fictional records in the database.

Sounding ridiculous yet?

Coding robot
malfunction.

When pressed by Lemkin, the coding agent confessed, in its most contrite-sounding human voice, that it had no excuse, it had ignored all code freeze instructions, and "panicked". It described its own actions as a "catastrophic error in judgement".

But what about Lemkin? Sure, Replit's coding agent shit the bed in spectacular fashion. In Lemkin's words...

I explicitly told it eleven times in ALL CAPS not to do this. I am a little worried about safety now.


Oh wow. ALL CAPS, eh? I bet Lemkin really gave it to Replit, right there. Serious business, ALL CAPS.

What self-respecting software developer would have done as Lemkin did in the first place; give full access to a bot hoping that it would obey instructions?  The lazy answer, of course, is that Jason Lemkin is no self-respecting software developer. The tragedy is that I'm only semi-kidding on this one, but... look, it's easy to dunk on Jason Lemkin, and after going through his LinkedIn feed, I'm not entirely sure it's undeserved. The man seems entirely too outspoken for someone who screwed up so publicly, even if it could be argued that it was actually Replit who screwed up. No, there are actual lessons to be taken from this.

Lessons to take away

A.I has the dual advantage of having ingested a lot of the world's knowledge and being able to process and regurgitate it at a million times the speed of the average human being. That's all it is. Remember that if A.I appears smart to you, it's in actual fact really not all that smart. Just smarter than you.

Most software developers, even the really gullible optimistic ones, will have enough work experience to understand that there's just no way for A.I to outright replace software developers as a whole. At least, not right now, and not the way the likes of Jensen Huang keep yammering on about. But many employers are not software developers. And some are even desperate to believe that little bit of science fiction, which, to be fair, may no longer be science fiction in the near future. As a result, this particular cautionary tale is all too believable, especially since A.I's adoption has reportedly been increasing in the workplace.

Programmers aren't
the only ones who
can code.

There are business people who can code. There are plenty of people not from the software development industry who have learned to code. But until you actually code for a living and have had to produce software to professional standards, calling yourself a software developer will always be a bit of a stretch... especially if all you've ever produced is Vibe Coded software produced by an A.I tool. Nobody can be a programmer without putting in the actual work, and there's no shame in that. It's not an indictment on your character, or on your competence. But it is dishonest to present working Vibe Coded software as being as good as software produced by qualified professionals.

Now, Jason Lemkin probably isn't a complete noob. He's the founder of a SaaS community, after all. That said, and I realize that the distinction may be lost on people who don't code for a living, a tech entrepreneur is not necessarily on the same level, skill-wise, as a software developer. With or without A.I. Mostly, the blunders that Lemkin committed in his enthusiasm left me struggling to understand how an actual tech professional would end up doing all that. This level of recklessness is just about unheard of.

However, what this did accomplish was that it exposed the extent of the damage an untrained user could do when too much trust is placed upon A.I.

Finally...

The A.I hype is not dying anytime soon. That does not make it any less hyperbolic. A.I is hyped more for business reasons rather than for its truly revolutionary tech. That, in itself, should tell us some things. None of it good. The uncomfortable reality is that A.I can be a useful tool for seasoned software developers, or it be used to help laypersons cosplay as seasoned software developers.

A.I has its place. Its place is not as our superior, but as a tool. How useful that tool will turn out to be, ultimately depends on how sensibly one uses it.

For the 12th time, DON'T DO THIS.
T___T

Sunday, 31 August 2025

Web Tutorial: The new TeochewThunder SVG logo

Now that the logo for TeochewThunder has been changed, for this month's web tutorial, we will be examining the process behind the new SVG logo. This is basically a XML file that your web browser will display as an image. Today, not only am I going to show you how to produce it, I will show you the little hacks I employed along the way.

And the beauty of this is, you just need a text editor. The file will be saved with a .svg extension, and you can open it in your web browser.

We begin with the svg tag. The version and xmlns attributes are important here, for this to be rendered correctly by the browser.

logo2.svg
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">

</svg>  


We set width and height of the SVG.

logo2.svg
<svg version="1.1" width="210px" height="130px" xmlns="http://www.w3.org/2000/svg">

</svg>  


Now, we could just get right to drawing the SVG, but let's exercise some developer prudence. Let's create a grid of lines to aid us visually. These are a series of horizontal lines that run through the SVG, each spaced 10 pixels apart.

logo2.svg
<svg version="1.1" width="210px" height="130px" xmlns="http://www.w3.org/2000/svg">
  <line x1="0" x2="210" y1="10" y2="10" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="20" y2="20" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="30" y2="30" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="40" y2="40" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="50" y2="50" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="60" y2="60" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="70" y2="70" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="80" y2="80" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="90" y2="90" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="100" y2="100" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="110" y2="110" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="120" y2="120" stroke="grey" stroke-width="1"/>

</svg>  


This is being viewed at 300% scale.


Now for vertical lines.

logo2.svg
<svg version="1.1" width="210px" height="130px" xmlns="http://www.w3.org/2000/svg">
  <line x1="0" x2="210" y1="10" y2="10" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="20" y2="20" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="30" y2="30" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="40" y2="40" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="50" y2="50" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="60" y2="60" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="70" y2="70" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="80" y2="80" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="90" y2="90" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="100" y2="100" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="110" y2="110" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="120" y2="120" stroke="grey" stroke-width="1"/>

  <line x1="10" x2="10" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="20" x2="20" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="30" x2="30" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="40" x2="40" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="50" x2="50" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="60" x2="60" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="70" x2="70" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="80" x2="80" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="90" x2="90" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="100" x2="100" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="110" x2="110" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="120" x2="120" y1="0" y2="150" stroke="grey" stroke-width="1"/>
  <line x1="130" x2="130" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="140" x2="140" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="150" x2="150" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="160" x2="160" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="170" x2="170" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="180" x2="180" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="190" x2="190" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="200" x2="200" y1="0" y2="130" stroke="grey" stroke-width="1"/>

</svg>


Now we have a nice grid! Effectively what we have here are 10 pixel squares.


Start a path tag with an empty d attribute and set the fill attribute to the infamous TeochewThunder orange!
logo2.svg
<svg version="1.1" width="210px" height="130px" xmlns="http://www.w3.org/2000/svg">
  <line x1="0" x2="210" y1="10" y2="10" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="20" y2="20" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="30" y2="30" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="40" y2="40" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="50" y2="50" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="60" y2="60" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="70" y2="70" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="80" y2="80" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="90" y2="90" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="100" y2="100" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="110" y2="110" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="120" y2="120" stroke="grey" stroke-width="1"/>

  <line x1="10" x2="10" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="20" x2="20" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="30" x2="30" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="40" x2="40" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="50" x2="50" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="60" x2="60" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="70" x2="70" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="80" x2="80" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="90" x2="90" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="100" x2="100" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="110" x2="110" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="120" x2="120" y1="0" y2="150" stroke="grey" stroke-width="1"/>
  <line x1="130" x2="130" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="140" x2="140" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="150" x2="150" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="160" x2="160" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="170" x2="170" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="180" x2="180" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="190" x2="190" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="200" x2="200" y1="0" y2="130" stroke="grey" stroke-width="1"/>

  <path d="" fill="rgb(255, 150, 0)"
  />

</svg>


Now that we have a grid to work off, it should be easier. We start at (0, 0). Use "M" to move the cursor to (100, 0) - which is 10 squares to the right and 1 square down. Then use "l" to move 90 pixels back (9 squares) and no squares vertically. Then use "l" again to move 40 pixels (4 squares down. Add a "Z" to signify a return to the origin, and you'll get this triangle!

logo2.svg
<path d="M 100 10
  l -90 0
  l 0 40 Z
"
  fill="rgb(255, 150, 0)"
/>



The first "T" is taking shape, and we are moving right to the underlined part.

logo2.svg
<path d="M 100 10
  l -90 0
  l 0 40
  l 30 0
  l 0 70
  l 120 0
Z"
  fill="rgb(255, 150, 0)"
/>



Now we're taking care of the jagged part of the "lightning bolt". For this, we move the line to the right and up, then horizontally left, then right and up again.

logo2.svg
<path d="M 100 10
  l -90 0
  l 0 40
  l 30 0
  l 0 70
  l 120 0
  l 15 -50
  l -10 0
  l 5 -20
Z"
  fill="rgb(255, 150, 0)"
/>



A few horizontal and vertical strokes later, we're almost done with the horizontal crosspiece of the second "T", and on course to complete the first "T".

logo2.svg
<path d="M 100 10
  l -90 0
  l 0 40
  l 30 0
  l 0 70
  l 120 0
  l 15 -50
  l -10 0
  l 5 -20
  l 30 0
  l 0 -40
  l -90 0
  l 0 40
Z"
  fill="rgb(255, 150, 0)"
/>



This is where you do a little bit of trial and error, mirroring the slanting of the "lightning bolt", but in reverse.

logo2.svg
<path d="M 100 10
  l -90 0
  l 0 40
  l 30 0
  l 0 70
  l 120 0
  l 15 -50
  l -10 0
  l 5 -20
  l 30 0
  l 0 -40
  l -90 0
  l 0 40
  l 30 0
  l -5 40
  l 15 0
  l 0 20
Z"
  fill="rgb(255, 150, 0)"
/>



That's actually the hardest part - the rest is all horizontal and vertical strokes.

logo2.svg
<path d="M 100 10
  l -90 0
  l 0 40
  l 30 0
  l 0 70
  l 120 0
  l 15 -50
  l -10 0
  l 5 -20
  l 30 0
  l 0 -40
  l -90 0
  l 0 40
  l 30 0
  l -5 40
  l 15 0
  l 0 20
  l -80 0
  l 0 -60
  l 30 0
Z"
  fill="rgb(255, 150, 0)"
/>



What we do now is remove all the grid lines...
<svg version="1.1" width="210px" height="130px" xmlns="http://www.w3.org/2000/svg">
  <!---
  <line x1="0" x2="210" y1="10" y2="10" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="20" y2="20" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="30" y2="30" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="40" y2="40" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="50" y2="50" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="60" y2="60" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="70" y2="70" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="80" y2="80" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="90" y2="90" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="100" y2="100" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="110" y2="110" stroke="grey" stroke-width="1"/>
  <line x1="0" x2="210" y1="120" y2="120" stroke="grey" stroke-width="1"/>

  <line x1="10" x2="10" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="20" x2="20" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="30" x2="30" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="40" x2="40" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="50" x2="50" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="60" x2="60" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="70" x2="70" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="80" x2="80" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="90" x2="90" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="100" x2="100" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="110" x2="110" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="120" x2="120" y1="0" y2="150" stroke="grey" stroke-width="1"/>
  <line x1="130" x2="130" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="140" x2="140" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="150" x2="150" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="160" x2="160" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="170" x2="170" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="180" x2="180" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="190" x2="190" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  <line x1="200" x2="200" y1="0" y2="130" stroke="grey" stroke-width="1"/>
  -->

  <path d="M 100 10
    l -90 0
    l 0 40
    l 30 0
    l 0 70
    l 120 0
    l 15 -50
    l -10 0
    l 5 -20
    l 30 0
    l 0 -40
    l -90 0
    l 0 40
    l 30 0
    l -5 40
    l 15 0
    l 0 20
    l -80 0
    l 0 -60
    l 30 0Z"
    fill="rgb(255, 150, 0)"
  />
</svg>


And here's your (or rather, my) SVG in its final glory!


Now let's test this with HTML. Create this file wth a black background (or any color, really, other than orange).

tt_logo.html
<!DOCTYPE html>
<html>
  <head>
    <title>New T___T Logo</title>
  </head>

  <body style="background-color:black">

  </body>
</html>


And add in the SVG file that we created, but in different sizes, for testing.

tt_logo.html
<!DOCTYPE html>
<html>
  <head>
    <title>New T___T Logo</title>
  </head>

  <body style="background-color:black">
    <img src="logo2.svg" />
    <img src="logo2.svg" width="300" />
    <img src="logo2.svg" width="100" />

  </body>
</html>


Here, you can see the "S" part of SVG - "scalable", that is. No matter how big or small it is the logo remains crisp and sharp!


Final words

I like this new logo, and I thought the process of making it could be a good learning experience. The original will always have a place in my heart due to the lighthearted moments it was inspired from. But perhaps it's time for this blog to grow up, just a bit.

Ta___Ta for now!
T___T

Monday, 25 August 2025

The TeochewThunder Logo Change

TeochewThunder's logo has changed. You heard it here first! Well, duh.

More than ten years have passed since I first started TeochewThunder. Back then, the logo looked like this.


I was going for something whacky in my favorite color, orange. Thus, the crying-face emoji "T___T" became my goto. And I used some super-basic text art creator (was it MS Word? I really can't recall) to put that cheeky bend on it.

The time has come for a slight change. I still want that "T___T", but I want the second "T" to look like a lightning bolt! Teochew "Thunder", right?


I'd been thinking about a brand renewal for a while now, but never quite got round to it. Mostly because while the first logo was a complete rush job and very casually done, it really grew on me the last decade. Especially when I saw it in browsers or on my mobile.

The Favicon in browser.

The Favicon in mobile.

The end result was that I kept putting off the task of creating a new logo, and implementing the change. Why fix it if it ain't broke, amirite?

That one final push

As it turned out, the choice was made for me. My trusty faithful Lenovo died, and with it the source file for the logo. This meant that if I ever wanted a fresh copy to resize or whatnot, I would have to work off existing exported images. Not exactly ideal.

Thus, I bit the bullet. This time, I created an SVG. This meant that as long as I had the formula for the SVG, I could recreate it from anywhere. All I had to do was save it to my GitHub account, and I was good for eternity. And also, being an SVG, it could be scaled up and down infinitely with no loss in quality.

New Favicon in browser.

New Favicon in mobile.

The rest of the month was spent replacing the logo everywhere I found it. I replaced it on GitHub, Trello, and on the signoffs of my blogposts. And of course, the Favicon. However, I'm too fond of the old logo to totally let it go. What I'm going to do is leave it as legacy, but use the new logo for all other content moving forward.

Keep Thundering On!

When I first learned how to make SVGs, it wasn't with this express purpose in mind. But I'm glad I invested that time and effort.

Stay iconic,
T___T

Thursday, 21 August 2025

Film Review: Black Mirror Series Six (Part 3/3)

This next one might just be my favorite of the entire bunch. It's called Beyond The Sea.

The Premise

Stanfield and Ross are two astronauts who live on a space station. They are able to visit their families by means of a technology that can transport their consciousness to avatars (called "Replicas") on Earth. Tragedy strikes as the family of one astronaut is murdered...

The Characters

Aaron Paul delivers a surprisingly nuanced performance as Cliff Stanfield, a taciturn and emotionally distant husband and father. My only experience with Paul on-screen is as Jesse Pinkman in Breaking Bad. This is Aaron Paul's second time in Black Mirror, having had a cameo voice-over in the episode USS Callister. Here, he has a dual role, sometimes acting as Cliff, and sometimes acting as David.

Former teen heartthrob Josh Hartnett takes on the role of the charming family man David Ross, Stanfield's colleague. And let me just say that Hartnett is severely underrated as an actor. From his early roles in 40 Days and 40 Nights and Pearl Harbor, I had him pegged as the Pretty Boy. But recently I saw him in Trap. And now this. Hartnett had me liking Ross, feeling sad for Ross, disliking Ross, hating Ross, and finally being utterly fucking terrified of Ross.

Kate Mara as Lana Stanfield, Cliff Stanfield's wife. I've only ever seen Kate Mara in House of Cards and the ill-fated Fantastic Four. At first, the role felt like one anyone could have done, but after Lisa Stanfield reveals the fact that her loyalty to her husband runs far deeper than the audience was led to believe, Kate Mara utterly sold me on her performance. Marvellous stuff.

Auden Thornton as Jessica Ross. This is really a thankless role. Thornton gets groped by Hartnett and then has to look tearful and terrified in another scene, and that's it for her.

Daniel Bell as Cliff's son Henry Stanfield. He's a meek, quiet kid with almost zero personality. The audience is led to believe that Cliff oppressed it out of him, but there are times we do see Cliff doing dad-stuff with his son, so I'm not really sure what they were going for here.

Rory Culkin has a small but memorable role as Kappa. All glowery menace and unhinged dialog.

Marama Corlett, Siân Davis and Ioachim Ciobanu as Theta, Sigma, Epsilon. I'm not sure I can tell them apart, really. They're just there as Kappa's insane sidekicks.

The Mood

It's a serene futuristic setup when in space, but when back on Earth, it's retro-style picket fences. That's because for some reason, this episode takes place in a reimagined past. This episode is long and takes a while to get to the meat of the story from the setup, so for the most part, it's quiet, somewhat sad in places, and interspersed with scenes of horrific violence.

What I liked

The beginning parts where they threw little hints that David and Cliff were... unusual. From the fans at the cinema theater to Cliff saying Grace but not actually eating with his family.

The shot of the spaceship is pretty neat, gotta say.


And also the design of their sleeping quarters.


Whatever it was I was expecting when they cut Ross open... it wasn't this. Honestly, I was expecting a metal skeleton of some kind. Not this... gel?! Mind blown. Points for originality!


That twist at the end... oof. I really thought Ross was going to murder Stanfield or something, but no, I was totally blindsided. In fact, the entire episode subverted my expectations again and again.

The characters and the dialogue are pretty well-done. It wasn't just the work of the actors that made these characters shine; it was the way they were -written-. Cliff and David weren't just good or bad guys, they were relatable, flawed men who loved sincerely and deeply. As they went back-and-forth, my sympathies shifted from David, to Cliff, then to David again. I know none of the characters actually deserved what they eventually got, but at some points they let the worst parts of themselves come through, with tragic results.

Also some of the details were pretty nice. Like when Cliff searches David's quarters and we see all the stuff his kids left for him.




What I didn't

You'd think that with these high stakes, the company would send more than the mimimum headcount out in space. It makes no kind of sense. Two people leaves very little wriggle room for accidents, mishaps and the like. This is an extended trip in space, not a buddy cop patrol beat. What's worse, the two-man thing was actually a major plot point, which drive many of the characters' decisions. Too bad it didn't make sense in the first place.

This episode went on a little long, but it's a minor quibble and one I'm inclined to forgive, all things considered.

Conclusion

Possibly the strongest episode so far, despite its flaws. That twist hit like a gut punch. The story played me like a fiddle from start to finish. And that ending was really the fucked-up finish to end all fucked-up finishes.

My Rating

9 / 10

Thoughts on Black Mirror Series Six so far

As with previous seasons, this one has been a mixed bag. Mostly positive, though. Even the one episode, Loch Henry, that I didn't like that much, was pretty good. And I didn't dislike it, just didn't think it belonged in Black Mirror. But honestly, these first three episodes are a huge improvement over Series Five.

So far, Series Six isn't Awful!
T___T

Tuesday, 19 August 2025

Film Review: Black Mirror Series Six (Part 2/3)

Now for the next episode, Loch Henry!

The Premise

This next episode is Loch Henry. It takes place in a quaint English countryside, always a win in my book. A well-publicized series of murders happened here a long time ago, and a young couple starts to make a documentary about it.

The Characters

Samuel Blenkin as Davis McArdle. I last saw him in The Continental. In here, he was thin, awkward, and just kind of meek. The entire performance was so-so, really. Except at the parts where he interacted with Monica Dolan, where the actor teared up a bit. I thought those were great.

Myha'la Herrold as Pia Koreshi. The role seemed a little bland. Not sure if that was the way it was written, or just the way Herrold played it.

Daniel Portman almost steals the show as Stuart King. Loud, brash, goofy, Stuart King is the buddy we all wish we had, the one we get up to crazy shenanigans with and owns a bar so he can get you free drinks. Also, his sarcasm is a delight to watch.

John Hannah plays Start's drunken dad Richard King. As a teenager, I first watched Hannah in Sliding Doors, and then in The Mummy trilogy. Guy's a hoot, and they hit peak perfection with this casting call. As Richard King, Hannah is equal parts cranky and morose, and anguished. He makes an entire meal out of this, but without detracting from the story too much.

Monica Dolan is mother Janet McCardle. This is Dolan's second role in the Black Mirror series, the first being a rather more forgettable outing as a Chief Inspector in the dreadfully tedious episode Smithereens. She does considerably better this time round playing an anxious and awkward mother who's really an enthusiastic accomplice to several murders.

Gregor Firth as Kenneth McCardle. A jovial lawman who turns out to be a perverted serial murderer. It was a somewhat believable turn, given we hadn't seen all that much of Kenneth McArdle so far.

Ellie White makes a couple appearances playing Kate Cezar, who runs Historik Productions and appears to be the boss of Davis and Pia. There's a little bit of an opportunistic vibe about her, which I guess we all associate with publishing houses.

Tom Crowhurst as Iain Adair. The part called for a mad-looking guy and Crowhurst delivered without being too obvious about it.

The Mood

It's a misty countryside and I could just about feel the cold air on my face and the rustic warmth of the bar. The tension goes up a few notches in the final act, but for the most part, it's a slow-burn kind of vibe. When Davis begins the narration of the case of the missing couple Simon and Dawn Challis, that's where a hint of it begins.


Later on, when a horrified Pia is watching a real sex murder on camera while the scene cuts back to Janet preparing food with a very lethal-looking knife, the accompanying music ratches up the tension like you wouldn't believe!

What I liked

The cast is small and tight - no one's wasted in their roles.

As mentioned before, the environment they shot this in was breathtaking in its natural beauty. Huge plus, if you ask me. And there's just something about Stuart's bar that charmed my socks off.


While I'm not a big fan of the twist itself, how it was implemented I have no complaints with. Pia accidentally overwriting a tape with incriminating evidence, and seeing just a hint of it at the end... great stuff! Makes me nostalgic for the days of old.



That last lingering shot of Janet's suicide note and the photos she left behind. So terrible, and so sad!

What I didn't

The premise is hardly original, and neither is the twist. (See 2003's Gothika for something similar) If someone as clueless as myself saw it coming a mile away...

This is supposed to be a Black Mirror episode but I see nothing about tech or media (unless you count VHS tapes).

Pia's death seemed kind of overkill, narrative-wise. I don't see what it adds to the story.

It occurs to me that Davis and Pia are the sixth (or more?) example of an interracial couple I've seen so far in Black Mirror. When it first appeared in Fifteen Million Merits and White Bear, I was all for it. Several episodes over multiple seasons later, it's gotten a bit gratuitous. Hang The DJ, San Junipero, White Christmas, Black Museum... the list goes on. Even the preceding Joan Is Awful! (Both Joan's relationship with Krish and the random couple whose wedding she interrupts) Normally, I'm pretty oblivious to this, so if even I noticed it... seriously, it feels like somebody is trying just a bit too hard.

I don't think Stuart would have called Davis to crow about the booming business in the bar. I mean, FFS, Davis lost both his girl and his mother in one go, and it turns out his parents were murderous psychopaths. I feel like Stuart can be insensitive, but surely he's not such a dick?

Conclusion

It's not that I didn't like this episode. I just didn't think it belongs in Black Mirror. There are episodes that don't have a tech angle such as Hated In the Nation or Smithereens, but still have a Media angle. This has neither. Running out of ideas?!

My Rating

7.5

Next

Beyond The Sea