December Update: 100 Days Since My Debut

December already! It’s hard to believe my debut novel has already been out for 100 days. I set a one year sales goal for myself at the start of this process. A number drawn from speaking to other indie writers, and one I could be proud of if I hit it. 

We hit the goal on day 68.

Some of that was farmer’s markets, some of that was family, but most of it was reviewers sharing their thoughts and inviting others to experience the story. For everyone who bought my book and helped me reach my goal, thank you. There is no way I could have reached this goal without you.

Reviews of The Human Countermove

Now that the book has been out for a bit, I’ve been able to get real feedback from reviewers, family, and friends. 

At my extended family holiday party, I found out that about a quarter of the attendees had read my novel from front to back. As an artist, it’s difficult to glean meaning from loved ones’ feedback. We can’t always take opinions at their face value, especially when the opinion-giver doesn’t want to offend. This meant I had to resort to interpreting signals. This was my system: I knew at least a half-dozen relatives that had bought my book. If none of them mentioned it during the holidays, or only mentioned it in passing, it would have been a strong sign they couldn’t get through it. If they finished the book and mentioned a plotline, that meant the book was readable.

But neither of those possibilities were the case. My extended family had not only read my book, they had shared it around to other relatives and friends. So far, my favorite compliment was when I started telling one of my cousin’s about my next book and they said “Woah! Spoilers!”.

Here’s another signal I’ve been reading wayyyy too much into: At my local writer’s events, I’ve had four author friends approach me about my book. Each one of them has been eager to tell me how they would have made X plotline pop or amped up the pacing during section Y. I love hearing the different perspectives and approaches to storytelling. But in terms of signal interpretation, the number one message I took away was this: They read the whole story, stayed engaged the whole time, and only had minor notes on how to make it better.

I’ve now passed 12 reviews on Amazon. It’s hard to overstate how important getting to that double-digit number really is. Enough reviews helps new readers trust that the book really is a ‘book’ in a market filled with AI slop. So thank you again to everyone who has written a review on any platform.

Audiobook Underway

If you know me, you know I’ve worked as a part-time voice actor for the last six years. Thanks to a few connections, I was able to secure a recording booth for the audiobook version of The Human Countermove without going bankrupt. We’re 15 hours into the recording process and about three-quarters of the way through the initial recording. I’m anticipating bringing in an actor and actress to fill in a few of the voices that I think could be improved. The recording process should be complete by the end of January. After that, we’ll see how long editing takes.

A nice benefit of doing the audiobook is a thorough word-by-word proof read of the novel. There weren’t many errors, but my favorite so far is a moment when I used the word “basket” instead of “bracket”.

Project APHELION Draft 2 Complete!

Project APHELION has been my biggest focus this year. The manuscript is now sitting at 102,000 words. Second drafts are way harder than the first. It feels like 100 hours of constant decision-making. Things that were left for later suddenly have to be dealt with, hints in the first draft have to be cemented into plotlines, characters arcs have to lose much of their ambiguity.

But it’s done! The second draft has been distributed to a few alpha readers. I’m feeling really good about this story. It’s my first foray into fantasy and I gave it everything I had. A third draft is underway to pretty up the prose and fix continuity errors. It should be querying to agents by January!

New Projects

If you’ve been tracking my current projects page, you’ll see I have two new projects. PRINTHEAD and RELENTLESS. 

PRINTHEAD is my megaproject, and it’s been delayed. The rough outline was getting out of hand and one of the three key POVs had a lot of scenes missing. Plus I don’t want to start on my megaproject until I have a few more regular books out for consideration with agents. I will return to this project. I love it too much not to.

RELENTLESS is my silly project. It’s a spin on the revenge power fantasy genre with a much lighter tone (I wrote a bit about that genre here). My last two projects have been so serious, I decided that this time around, I’m having fun. Whenever an idea that makes me laugh, it goes on the page. I’m already 10% of the way through the first draft and enjoying every minute of it. I wouldn’t be surprised if it were in alpha reader’s hands by the start of March.

Closing Remarks

I’ve been getting closer and closer to my goal writing pace. Having a book out in the wild helps a lot. Having one project to edit and one to write is nice too. One of the hardest parts of being a writer is having a hundred ideas in your head but only being able to writing one or two a year. I’m hoping that problem will be resolved soon.

My website’s been getting a lot more traffic lately. If you’re new, thank you for dropping by! If you’re interested in my writing, I have a few short stories from last year available here and I post essays on various subjects here weekly.

Thank you all for your support. Looking forward to more stories next year!

Elevating Action Scenes with Second Order Thought

I’ve always had a problem with action scenes. Books, movies, plays, all of them. If an action scene goes longer than a minute, it starts to feel vapid. Thing after thing after thing happens, but none of it means anything. My mind jumps to the end. Will the hero live? Will they accomplish their goals? Cool, let’s get this scene over with and continue with the real plot.

The thing is, these thoughts only occur to me in certain action scenes. Why can I watch a fifteen minute shootout in The Hateful Eight, but four minutes of John Wick puts me to sleep?

When I wrote my own book, I ran into the same problem. Action scenes that felt like a bunch of set pieces strung together. A meaningless ebb and flow. Then I found the solution.

Depth of thought.

Ingredients of an Action Scene

Truth is, any scene can be an action scene. A climber scaling a mountain, two street cleaners rushing to get the most trash, a firefighter in a burning house. So long as the scene has a few key ingredients: A character with a goal, an adversary (person or otherwise), and the rhythm of the action/reaction cycle.

A good action scene is kind of like a turn-based game. The hero chases, the adversary flees. The adversary locks a door, the hero kicks it down. Even when the adversary isn’t a person, we can still hit the same rhythm. In the example of a climber scaling a mountain, the mountain is the adversary. It drops an icicle towards the climber, the climber dodges. The climber clears some grime from a handhold, the mountain answers with rain.

This is all an action scene needs. But if this is all you’re doing, you end up with a feeling of meaningless conflict, an empty to-and-fro that’s only resolved when our hero succeeds or fails.

The Hierarchy of Character Action

What’s missing from action scenes is deep thought. Mind you, it’s hard for a protagonist to spend much time thinking in the middle of the action, but landing a great, cerebral action scene requires it. 

It’s a hierarchy of priorities. A pyramid.

Laying the foundation of action scenes is reaction. Every time the adversary does something, we need a reaction from the hero. The state of the scene is changing, and that needs to change how our protagonist approaches their goals. If the protagonist doesn’t react, it either means they aren’t paying attention, or what the antagonist did doesn’t matter, and if it didn’t matter, why write it?

Without reaction, all our protagonist is doing is making plans and executing them. A story without conflict is no story at all.

Of course, if all a character does is react, then the scene is being defined for them. They’re not chasing their goals, they’re not being proactive, and if the hero somehow wins, it won’t feel earned. It’ll feel like the antagonist failed rather than the hero succeeding. When a reader enters a scene, they want to imagine what they’d do in the same situation. They want to picture themselves facing obstacles and overcoming them. The one thing they wouldn’t do is nothing.

Second Order Thinking

Second Order Thinking is the process of imagining an action, then considering its consequences. It’s making a plan that sees more than one step into the future, and it’s the secret to turning a messy action scene into something more cerebral.

Let’s imagine a firefighter crashed into a burning house. He sees a few people injured around the room and fire creeping toward a propane tank. The first order move is to pick someone up and get out of there. Save a life, maybe two. But what happens thirty seconds later? The tank detonates.

So our firefighter pauses to think, maybe just a second. If he fights the fire, all it’ll do is buy time, and if he’s alone, time is a scarce resource. So the two obvious moves, fight the fire or save the people, will both end up failing. Instead he goes for the second order move, the one that isn’t so obvious at first glance. Disconnect the propane tank and get it out of the house.

Second order thought is about seeing what’s coming and adjusting your plans to take them into account.

In a gunfight, the hero is running from cover to cover while the hard-to-hit enemy moves to get an angle. Our protagonist can keep running, evading their way to an escape, or they can recognize the enemy’s pattern and exploit their predictability. Toss a rock to another bit of cover and wait for the enemy to chase a ghost.

It’s a great tool for breaking up the action/reaction cycle. A chance to pivot the scene in a new direction. A climber looks up and spots a potential rockfall, so they change their plans. Instead of scaling a flat face, they hike the switchbacks. Even the antagonist can use it, one clever move that changes the sense of power in the scene, putting our hero on the back foot.

Third Order Thinking

If second order thinking represents a pivot in the action, third order thinking represents the big finish. This is the process of taking actions whose benefits aren’t immediately clear, but serve a larger purpose in helping one side or the other ‘win’ the scene. A campaign of actions.

Let’s say the villain is in a gigantic mech while our hero is running for their life through a cavern. Someone’s in the hero’s ear telling them to get the nearest exit, that there’s no way to win. Instead, the hero keeps on taking huge risks, hiding behind a stone column until the villain blasts it, running up an exposed set of stairs while an iron fist punches it into dust. Right when it looks like the hero is doomed, the cavern ceiling collapses on the mech’s head.

Our hero had a special plan. One that wasn’t obvious in the moment, or even after four or five close calls.

The fun part about third order thinking is that you don’t have to spell it out for the audience. They see the hero taking unnecessary risks and unexplainable actions, and they instinctively sense there’s a scheme behind it all.

Third order thinking doesn’t just apply to action scenes, it can manifest in a million different ways. It’s what makes real-life professionals so good at their job, they aren’t just taking an action in the moment, they’re taking action as a part of a long-term strategy to achieve a goal.

Be aware, it can be hard for an audience to track third order thinking. It’s a tool best used to cap a scene or describe the long-term motivations of a character.

Fourth Order Thinking and Beyond

Second and Third order thinking give the story a thoughtful quality. Characters aren’t just puppets reacting in the moment, they consider their circumstances and shape the world around them. An audience can understand this.

Fourth-order thinking is the kind of thought an audience can’t understand. It’s the sort of twist a reader won’t see coming because it’s too complicated. Imagine at the end of a book, the antagonist reveals all the battles the hero fought actually served to hurt the hero’s cause more than help. This is the moment in Ocean’s Eleven when it looks like the heroes are caught, but it turns out it was all a part of the plan.

Fourth-order plans must be handled with care. Done right, it can be the keystone of a book. Done wrong, and you end up with the poison scene from Princess Bride. You know the one: I’d switch the cups so you switched the cups so I switched the cups so you switched the cups.

If you’re doing a fourth-order scheme, review the individual components. Make sure every individual action holds up to scrutiny, or point out incongruities so our reader gets the sense there’s something bigger at play.

The hierarchy of actions matters. Too many second order thoughts from a beat-cop and he starts to feel like Sherlock Holmes. Too many third order thoughts and your action scene is hijacked by a weird battle of the minds.

Of course, you should understand your genre too. My debut novel, The Human Countermove, is a book all about strategy and beating a cognitively superior opponent. In a story like that it was appropriate, even necessary, for my protagonist to regularly invent new third order strategies.

Depth of Emotion and Conclusion

Everything in this post is about how to give each action in the scene more meaning. There’s a second approach to fixing this problem. Deep understanding of character. If every action a character takes is soaked in their background and motivations, the audience will give you a lot more leeway. An example of this is Spiderman. The Green Goblin drops a bus full of people and Mary Jane. Spiderman has to decide which to save. In an example like this, the depth comes from the emotion, rather than the logic of the scene.

If you ever feel like your action scene is just a bunch of stuff happening in sequence, take another look at your depth of thought and character. It could be the case your scenes just need a little more scheming and a little less doing.

Is My Cerebral Science Fiction Secretly a Romance?

I wrote a book about a strategy game grandmaster challenging the AI Minds of his society for the fate of the future. It’s got politics, subterfuge, high-minded strategy, and danger. But I think at the heart of it all is a story about connection. A romance. Which is odd, because I don’t write romance.

Spoilers ahead.

A friend of mine pointed this out to me while they were reading my book. In the first chapter, you’re introduced to my main character, Zouk Solinsen, an isolated guy in the back half of his career navigating a cold and disconnected world. We’re then introduced to a young woman named Jamie. A rival in the strategy gaming space, and his opponent in the first round. They’re about the same age, opposite genders, and their conversation has a light, almost flirty back-and-forth before the game.

But it’s a red herring.

The target of this book’s romance isn’t Jamie. One of the romances isn’t even human.

Every good story has a certain element of romance. Whether it’s a pair of characters who hate each other and eventually learn to understand each other, or a collection of disjointed and quirky individuals finding the joy of becoming a cohesive group, what makes a romance is the journey from ambivalence and hatred to appreciation and love. Oftentimes, you don’t even need the kissy-kissy.

There are two ‘romances’ in The Human Countermove. The first is conventional. A small, personal story about Zouk and his wife Kira, whose relationship is on the rocks. Zouk is an outgoing person with a strong skill for communication, while Kira prefers her privacy. For her, a nice day is one spent in her office running data analytics and drinking hot cocoa.

In the time since they got married, life got complicated. Zouk had his career ups and downs, while Kira built quiet, steady work in the government. Zouk wants Kira to change, he wants her to love crowds and events and to be with him for all of it. She tries her best, but it’s not who she is.

But when he needs her, she’s there. Not usually with a well-placed word, but with her most sincere self. When Zouk is trying to make sense of a broken political system, she’s willing to put in weeks of work to help him. And she seems to relish every minute of it.

It’s all this that reminds Zouk why he fell in love with her. He remembers her passion, her care, the way she’s fought to stay in love with him. It’s a Him problem. He’s been asking her to change, when he’s the one that needs to start reaching out. He meets her where she is, accepts her for who she is, and is able to start loving again. They’re able to be that supportive, loving couple they had been chasing from the start.

But there’s a second romance in this story. One at a much larger scale.

A romance between Zouk Solinsen and The Minds.

Zouk is playing a series of strategy games in order to join The Minds’ council. Impossible games that take everything he has in order to win. But winning doesn’t suddenly put Zouk into power, it puts him in a partnership. A shared power structure with The Minds. And anyone forming a partnership knows the only way to make things in a partnership work is to ‘love’ the other party.

There’s an on-again, off-again relationship between Zouk and The Minds throughout the book. Near the beginning, The Mind of Communications and Influence is casual with Zouk. They’re fast friends and get along better than you’d think. The possibility of Zouk winning all the games becomes real. Folks listen when he speaks. The general consensus seems to be that he will be the fourth member of the council.

Then the hard times come. Zouk breaks ties to an organization when he discovers their plot to overthrow the government. And the break-up isn’t easy. A controversial game, a mutiny in the military, riots, and a frame job implicate Zouk in everything.

There’s nothing less romantic than a deposition. One of his wins is thrown out and The Mind of Strategy and Warfare ends his hopes of joining the council on a painful defeat. Whatever partnership The Minds were considering is dead.

If this were a traditional sci-fi dystopian story, this is the part where Zouk leads a resistance and burns it all down. But I wrote a romance. And in a romance, the protagonist doesn’t give up.

Zouk and Kira’s rekindled relationship is a lesson in accepting people as they are. A lesson that leads to a realization. The world talks to The Minds in the same way they talk to politicians. High-minded intellectualism, hopes and ideals, persuasion. But that’s not how The Minds think, that’s not who they are. They’re more like Kira. Evaluating good and bad ideas through raw numbers.

Society has been pushed to their limit. Every aspect is measured and maximized. But by seeing the world through The Minds’ eyes, Zouk and Kira uncover the fatal flaw, the mistake in the calculations, the first fix to a better world. Zouk knows his chance to join the council is dead. But he makes his case anyway. He makes it because he wants a better world, because he thinks The Minds help get them there.

And that act of good will and understanding changes everything.

This is why I say this book is a romance. It’s not traditional, but it hits all the beats. The meet-cute, the impossible relationship, the break-up, and at last the heartfelt reunion. A story whose roots are built in love and empathy rather than rage and destruction. I had no idea I was doing it when I wrote it, and only realized what I had made when it was out in the wild.

Maybe this is just what happens to stories that set out with a theme of connection and understanding. You go in planning on making a sci-fi thriller and end with an AI and a human holding hands in the rain.

The Human Countermove is available for purchase on Amazon!

I Built my Book Around a Board Game

Board games are usually designed to be played by a group of people. The mechanics are built so that each person has high agency over their own moves and can pursue their own strategy to win. When someone takes ten minutes to make a move, it’s because the player has so many considerations, there’s a real need to think. 

If a person can barely track their own moves in a game, how could a reader track an entire game inside a book?

Despite being well aware of the challenges, I put a board game in my first book. In fact, I built the story around it.

LINE. Leadership in Near Emulation. I designed it from scratch. I was able to design a game that was compelling to read about and one that was fun to watch. From the moment I started, I gave myself one important instruction: Keep it simple.

If I ask a reader to track a hand of cards, or all the powerups affecting one of my protagonist’s heroes, I’ll lose them. The only people who understand all the subtleties of a game of Settlers of Catan are the people who played it, and even then, no one knows the entire story. Too many mechanics, too many unknowns, too many surprises. For a reader, an environment like this is hard to track and it doesn’t feel fair to the protagonist.

In LINE, there are only two pieces. Squadrons and walls. The squadrons move from tile to tile and fire on the enemy, while the walls do exactly what walls always do. Simple. At a glance, a casual viewer can glean the entire status of the game. “The enemy army flooded across the map”, or “Every squadron was hunkered down, hiding inside the base and waiting for the ambush.”

Like any good action scene, I avoided over-choreographing the movements on the board. We don’t need to know every intricate detail, we just need to get a feel for the moment, and the challenges facing the protagonist.

On a real board, an attack would translate to a bunch of dice being rolled or a computer running dozens of Random Number rolls. But a reader doesn’t need to know any of that, they just need to know the outcome and what it means for our hero. “The enemy’s walls crumbled under weapons fire. Finally, our battle of attrition was coming to an end.”

As in most board games, some turns completely transform the game, or even hand the victory to one player or the other. But other turns are quiet, an incremental step forward, a plodding move building up to the battle’s climax. When turns like this arise, I use the timeskip. Just like we don’t need to see every piece, we don’t need to see every moment. What I’m really giving the reader isn’t the livestream of the game, it’s a recap with live commentary from the protagonist. All the exciting bits, all the cerebral moments, none of the fluff.

“On Turn 8, a few walls repelled enemy aggression. By turn 24, I had completed ‘The Fallen Star” and set to work preparing an attack.”

But what really defines competition isn’t what happens on the board, it’s who our protagonist is facing. The adversary.

A board game in a book can be exciting on its own. But after a game or two, it gets stale. The audience has seen everything the mechanics have to offer. What really makes a game, or any sport exciting, is the human element.

Every player has their own flavor, their own approach to playing that gives the game a fresh feel. That feeling is informed by the player’s motivations, their intent, and their background. From the way the opponent moves a piece, we can derive how much experience they have with the game. From the way they rock in their chair, we can sense mental distress. It’s these reactions that help us contextualize the game’s importance without having to say it out loud.

Even the protagonist shows these attributes. When they make a mistake, sometimes it’s a ‘clench your fists’ moment, and sometimes it’s a ‘rip your hair out and scold yourself for throwing everything away’ blunder. Since we’re in their head, we know the reason behind their reaction. The whole book has been building to a single game, and now it’s all over because our hero got distracted by a bird for half a second.

But not everything in the story can be a board game. The game may be the most important thing in the protagonist’s life, they still need a reason to play it. The more drama around the game, the better. The harder the opponent, the better.

For my book, I chose the hardest opponents possible. AI Minds. With each game, it’s not just a difficult match, it’s an impossible one. In games like this, the buildup is as exciting as the game. How can Zouk win? What strategy could he possibly use to beat something that plays more games in a week than he does in a lifetime?

The prep matters. It’s like scaling a mountain. If someone casually scales the whole thing on the first try, how difficult was it in the first place? But if we see that person map out their entire approach, do practice runs, and scrape grass from the cracks. We get a much better understanding of the difficulty at hand. If the climber has been practicing jumping from one rock  to the other for months, we’ll be thinking about that challenge the whole way up the wall.

After writing a couple LINE games into my story, I still felt the stakes could be bigger. If these games really are determining the future of Ion, they should be played in a stadium. Even better, they should be played with real people on the field. Every game matters to the protagonist, but a few field games are a great way to turn the dial all the way to MAX.

Zouk’s coach helps him work on strategy, finding the right approach and memorizing hundreds of moves. But more importantly, building the game up in the reader’s head. When Zouk thinks he’s found a blindspot in The Mind of Strategy and Warfare’s Algorithm, he spends the entire game getting his units into that blindspot. The tension builds. We may not know all the little nuances of Zouk’s play, we may be skipping five or six turns ahead at a time, but we know what’s coming. We know everything depends on one moment. Will War notice their blindspot, or will Zouk pull off a historic victory?

The Human Countermove is now available for purchase!

The Chess Players that Inspired my Novel

I didn’t realize it when I was writing it, but my sci-fi novel is a sports book. There’s a bunch of politics and AI to keep things interesting. But narratively, the book is closer to Moneyball than it is to Star Trek. It’s a funny realization, but an important one. The characters in a story should feel authentic, pieces of them should be drawn from real life, from the emotions and nuances of competition.

In the last few years, I’ve been a casual viewer of a lot of Chess content. Game recaps, lectures, tournaments, all the popular stuff. Along the way, I found a few players and personalities that drew my attention and inspired me to write.

Here are a few of the most significant.

Hikaru Nakamura

A story of achievement is great. A person from one particular background rising above their peers and climbing all to the peak of performance is cool, but it usually doesn’t inspire me. I think it’s because it feels inevitable. If we create a competition with 250 players, somebody’s gotta be the best, right?

For me, the story that draws me in isn’t one of instant success, it’s the story of failure, and the strength to rise again.

In 2015, Hikaru Nakamura was the second best player in Chess. In 2019, he had dropped down to 21st. It may seem small, but that gap was enormous and the product of 3 years of decline.

It’s a mental game. Getting so close to the top, it’s easy to coast. A person can lose their motivation, their drive for competing. Life gets complicated, new priorities arise, old priorities sink. You can even forget why you started in the first place. After 3 years of decline, it can feel inevitable, like the natural lifespan of a career coming to an end. Why bother getting back into shape when the game is already over?

But Hikaru Nakamura didn’t give up. He started streaming. He built a better relationship with the game, and eventually, he found a new reason to compete.

Today, Hikaru Nakamura is back at #2, and his chances of winning the Candidates Tournament are higher than they ever were a decade ago.

I think I find a comeback story so inspiring for two reasons. One, they’re rare. Two, they teach us life doesn’t always turn out the same way for everyone. We can turn things around, rewrite our fate, outperform even our own preconceptions.

In my novel:

Zouk Solinsen is a washed-up strategy game grandmaster. He forgot what made him love the game, he got caught up in other things, teaching students and paying the bills, and he lost his self confidence.

But unique times and unique challenges give Zouk a second chance. A chance to love the game again, a chance to sharpen his strengths and become better than ever. There’s nothing better than a comeback story.

Yasser Seirawan and Garry Kasparov

Back when I was studying chess (I’m not very good), I looked up a lot of lectures on Youtube. My favorites are from Yasser Seirawan. The man approaches teaching with a childlike wonder for the game, an excitement to share his knowledge with anyone who wants to learn.

Yasser Seirawan has been an extraordinary player in the chess scene for 30 years. He was the second for Victor Korchnoi in 1981, meaning he was the chief advisor for the challenger for the world champion title, and all of that before Garry Kasparov was even on the scene.

He’s a player that has faced generations of players. He has seen the absolute best that Chess has to offer and shares it with his students. When he describes how the game transformed with the advent of computers, it isn’t theory, he witnessed it. What better mentor could there be?

And then there’s Garry Kasparov.

In my previous post I discussed at length the significance of Kasparov vs Deep Blue in inspiring my story, now I want to briefly discuss another of the man’s aspects. Politics.

In 1984, just after Kasparov had won two consecutive games against the world champion, FIDE abruptly ended the match, citing ‘player health’. They cheated Garry Kasparov out of a world championship title, and he didn’t take it lying down. The thing is, Kasparov defeating Karpov wasn’t just about Chess. It was about the future of the Soviet Union, and the game was being watched by the whole world.

Since then, the man has led protests, been arrested, and even been forced out of Russia. Every day he shows the boldness and courage most of us wish we had.

In my novel:

Yolniv is Zouk’s mentor. In the face of nearly unbeatable opponents, his decades of experience as both a player and teacher help Zouk discover the right strategies and refine them to a point. He never fears sharing his mind, and as the plot heats up, ancient history comes back to bite him.

Danny Rensch

For a post about famous chess players, Danny Rensch might be a surprise. He’s an International Masters player, sure, but he’s primarily known as the Chief Chess Officer at Chess.com.

And there’s a very particular reason he’s on my list.

Danny Rensch dances on a very thin tight-wire. Every day, the man is both the face of his company, and a key decision maker behind the scenes.

To some extent, all the biggest leaders today have to walk this tight-wire. They show confidence at the investor meetings, then go to their offices and make the hard choices. It’s a funny duality, but I find it more pronounced in Danny Rensch.

When Chess.com hosts a major tournament, he’s there. Casting games, plugging products, hosting the livestream. He’s an entertainer for hours on end. Most entertainers spend their whole career developing the skill to keep people engaged, Danny only gets to do that for half the time.

For the other half, he has to deal with the ugly side of the business. When there’s a controversy in the chess scene, he’s in the room deciding how to handle it. When there’s a clash between two players, he’s mediating the reconciliation. When a tournament needs bigger names and better sponsors, it’s all on him.

He plays both entertainer and decisionmaker. He’s done it for years, and it’s really extraordinary to watch.

In My Book:

The Mind of Communication and Influence (AKA Influence), is the voice of the Minds to the general population. Day to day, Influence is a news man, a face on tv reporting to the people of Iom. But he’s also one of the three Minds. The weight of the executive rests on his shoulders. It’s easy to get the wrong impression of Influence. Either he seems shallow and entertaining, or duplicitous in the separation between his speech and his action. But there’s more than meets the eye to Influence.

Final Thoughts

There are plenty more characters in my novel, some undeniably inspired by other chess players and competitors more broadly. A Magnus Carlsen-based is definitely hiding in my book somewhere. Anna Cramling might be too.

With competition comes real people. Success for one means failure for another. Everyone who competes does so sincerely, and it’s rare to get that kind of truth from a person these days. Virtues and flaws are put on display because anything less than giving it your all dooms you to defeat, and all that honesty makes for a great character.

The Human Countermove is now available for purchase! Click the image to be taken to the amazon page.

Postscript: Although certain figures in The Human Countermove draw inspiration from real chess players, the story is a work of fiction. The characters and their choices are not reflections or critiques of any actual individuals.

The Historic Strategy Games That Built My Book

For thirty years, strategy game players have been reckoning with the harsh reality that a computer might be able to play a game better than them. Beginning in 1997 with Kasparov vs Deep Blue and ending with Lee Se-Dol vs AlphaGo, AI inched ahead of human performance year by year, culminating in their total victory.

I love that tension, the open question that floats in the air with every game, ‘Can humanity win?’. Every victory and every defeat carried enormous weight. It’s the heart of my novel, The Human Countermove, strategy games and the fight against a mentally superior enemy.

The challenge with writing a strategy book is creating strategies that feel authentic and clever. The kind of ideas that are convincingly grandmaster in skill, but understandable to the general public. In order to achieve that, I had to learn from the best.

Kasparov vs Deep Blue (1997)

This game is the seed at the center of my book. The tipping point for humanity, the moment we realized computers could out-think people. In 1996, Kasparov won 4-2.

In 1997, they had a rematch, Deep Blue won 3.5-2.5.

Those two matches record the exact year engineering overtook training.

My favorite moment from the 1997 match comes in game 2, when Kasparov accused the Deep Blue team of cheating by having a Grandmaster help with a move. Even a computer can get illegal assistance from time-to-time it seems.

But the conflict of the moment is what really captures me. On the one hand, we want to believe a person is capable of outperforming a computer. On the other, what an incredible feat it is to reproduce the mind of a genius with a bit of code and training. Caught in between, the audience cheers both sides, athletic feat against human ingenuity.

Kasparov has a list of mistakes he says he regrets about that match. Moments he could have snatched a draw from a defeat, a victory from a stalemate. The thing is, if he had won, all it would have done is stall the inevitable. Instead of discussing the 1997 Kasparov vs Deep Blue match, we’d be discussing the 1998 Kasparov vs Deep Blue match.

It’s all of this I try to capture in my book. The tension, the conflict, the regret, and the determination to beat the unbeatable.

Now when Chess Engines and AI models face off against one another, they are a tier beyond our best players. A mentor for grandmasters like Magnus Carlsen, and something beyond the rest of our comprehension.

The Opera Game (1858)

This is a lighter game. The Opera game was played by Paul Morphy and The Duke of Brunswick over a century ago. It’s one I draw inspiration from in my novel not as a strategic tool, but as a piece of chess culture. The Opera Game represents the beginning of a chess student’s education, one of the very first games a novice will be introduced to.

Paul Morphy makes strong, understandable decisions against a much weaker opponent, rapidly gains the advantage, and wins in style. But it’s not just a game, it’s a story. The best in the world dragged into the Duke’s box to play a chess game in the middle of an opera. For beginners, it weaves a romance around chess, and attaches a narrative to one of their first lessons.

In my book, the protagonist Zouk does a lot of teaching on the side, as many professional players find themselves doing. When an opportunity to lecture to a big audience comes around and he realizes the inexperience of his listeners, he abandons the esoteric analysis had prepared, and leans on a tried and true classic with a fun story, The Highway Game.

Go: Lee Se-Dol vs AlphaGo (2017)

Lee Se-Dol vs AlphaGo ended in a 1-4 result. For those of us that had been tracking the development of computers since Deep Blue’s game against Kasparov, seeing AlphaGo take its victory wasn’t a surprise. Go is much more computationally difficult than chess, but Moore’s Law is a powerful force.

But did you notice the scoreboard? Lee Se-Dol won the fourth game. That was an upset.

Against Google’s best engineers and decades of neural networking and algorithmic design, a human being managed to snatch victory, and it all came from a single move. Move 78.

That move has been gone over, analyzed, and studied for years. It’s believed Move 78 pushed the game into a uniquely complicated position, a position AlphaGo couldn’t calculate. A blind spot in the computer’s play that drew out blunder after blunder.

Lee Se-Dol was like a grandmaster Quality Assurance tester, noticing where AlphaGo was weak and pushing it further and further down that path until its behavior was sub-par. Basically, Lee Se-Dol found a bug.

Even when it seemed impossible, a person beat the unbeatable.

The Hippo and Various Anti-AI Strategies

Since Kasparov vs Deep Blue, a thousand Chess engines have burst onto the scene. Anyone willing to run a bit of code on their computer and risk getting banned can play like a grandmaster. To beat such unsavory characters, grandmasters have had to develop a special set of tools. First and foremost is time.

Consider two games. One gives each player an hour to make all their turns, the other gives each player a minute to make their turns. The first game is deeply thought out, with strong moves that remove all chances of counterplay. The second is superficial, moves borne more from training than thought.

In tight time controls, using a chess engine becomes a liability. The grandmaster can play from their subconscious, but the cheater is stuck waiting for the ‘perfect answer’ from the machine.

Thus we meet The Hippo. The Hippo slows the game down to a crawl. Pieces only move forward a square or two, then build a near-impenetrable fortress. As the opponent approaches, the grandmaster makes every effort to close down the position, keeping the number of moving pieces to a minimum.

With each move, the cheater loses a little more time, and the walls close tighter around them.

As their time dwindles, the cheater is forced to throw in a few of their own moves. These usually turn out to be of a significantly lower quality than what a chess engine can put out. Once the grandmaster has stripped the cheater of their chess engine, they unravel all the complexity of The Hippo and go in for the kill.

Once again, complexity and time as weapons to beat an overthinking machine.

The Battle of Cannae and Real-Time Strategy Games

I love real-time strategy games. The feeling of making a plan, facing the hard truths of reality, making adjustments, and turning the battle in your favor is exhilarating. And they’re so different from a game like Chess or Go. In Chess and Go, the entire shape of the board is transformed in a single move. 

In Real-Time Strategy games like Starcraft, you’re making a new move every second, and it’s only when you add all those little decisions up that you end up with a result.

And in games like that, there’s one particular battle result that everyone is chasing.

During the Second Punic Wars, Hannibal faced a much larger Roman force and turned the battle completely in his favor. The trick? Draw the enemy in, encircle them completely, then tighten the trap.

The game in my book, LINE, isn’t like Chess or Go. It’s a little more practical in nature. In theory, the game is playable on a field, not that most people would enjoy the feeling of being shot by a rubber bag. Because of the practical realities of squadrons facing off against one another, tactics like Chess’ fork and pin don’t translate.

But what does translate, is the greatest military trap of all time. Let the enemy over-extend themselves, wait for the right moment, and strike.

Final Words

There are plenty of other strategy games I no doubt pulled inspiration from. Things like the Total War games, Role Playing Games, X-COM, but Chess was my guiding star. It’s funny, once you open your mind to a question like, ‘how does a person beat an AI in strategy?’, you realize how many other people already pondered the same question. 

AIs have been kicking Mankind’s collective butt for thirty years. It’s nearly impossible to imagine a person turning it around on them. But nearly impossible is still possible, it only takes the right person and the right techniques to turn things around. Even when the robot brains out-think us on every front, we can still squeak out a victory every now and then. Especially when we’re learning from everything that’s available.

In The Human Countermove, my protagonist Zouk Solinsen is the right person with the right techniques. The skills to outsmart computational genius.

My debut novel, THE HUMAN COUNTERMOVE is now available for purchase!

My Debut Novel “The Human Countermove” Is Now Available!

I’m gonna keep this update brief.

After three years my debut novel is now available to purchase on Amazon! It’s a cerebral, near-future sci-fi built from my love of strategy games like Chess. In the next few days I will be releasing a post discussing all the different strategies and games I built my book from, but today it’s all about the celebration!

Thank you to all my readers, my family, and my friends. Becoming a novelist took a lot longer than I expected, but I’ve enjoyed every little project along the way. The terrible practice novel, the staged reading of my play, the years developing ed-tech stories for students, each project was a step on my journey here.

Don’t worry, I have no intention of stopping. My next project (Project APHELION) is already about 10% of the way through its second draft, so hopefully it won’t be too long before we’re back here again with another exciting story.

As I schedule appearances at book signings, farmer’s markets, and reader events, I will post them here.

Thank you again, and happy reading.

– Logan Sidwell

The Human Countermove is now available for purchase! https://www.amazon.com/dp/B0FM9R7T5F

In a nation ruled by AI Minds, productivity is everything—even play.

Once a legend in the world of strategy games, Zouk Solinsen is now just another burnout in a society obsessed with efficiency. But when the Minds announce a high-stakes tournament—with a seat on the ruling council as the prize—Zouk is drawn back into the fray, determined to reshape the future.

With help from the enigmatic Torrez Institute, Zouk racks up early victories against the Minds. But when Maya Torrez reveals the cost of her support—a violent coup against the Minds—he rejects it and strikes out alone.

Now, with no allies, dwindling resources, and a nation on the brink, Zouk faces the biggest game of his life—and a final, impossible choice: reform the system from within, or burn it all down.

Three Years Later… I Have a Novel

On September 1st, my debut novel is being released. The Human Countermove. Getting it released is incredibly exciting, and knowing it took three years fills me with a quiet dread. The journey has been incredibly long. Two years to write it. One year to decide what to do with it, and now it’s available for sale. I’m counting every pre-order on a little calendar, crossing off a square with every sale.

Not that you can trust me, but it’s my opinion I’ve written a compelling book. My mom liked it for one. That’s a big improvement over my practice novel. My beta readers liked it, I even managed to convince one of my readers to review two different drafts, which is unheard of in the beta reader space. Usually you only get one chance to impress someone.

But it’s here. It’s been professionally edited, copy-edited, and gone over again and again. Ready for scrutinizing eyes.

The Journey

They say the first one million words are practice. I believe I hit the equivalent of one million words somewhere near the end of my first draft. There was a day when a switch flipped in my head. From then on, my understanding of scene composition, dialog, and character motivations was just, clearer.

For someone editing their first book, a sudden jump in skill is very bad news. It meant I had to face my rough, rough, rough first draft and clean it up with a newfound understanding of storytelling. That’s a lot of work for a single broom.

I lost momentum a couple of times. My systems for reliably writing weren’t in place yet. One weekend I’d pump out 13,000 words, then nothing for a month.

Even the soul of the story wasn’t there on the first go-around. I found it partway into the second draft. A great idea that really clarified the narrative. Funny enough, I wanted to put that heart in the sequel. My editor talked me out of it, convinced me that good ideas are meant to be spent, and that my debut should be as strong as it can be.

In my opinion the back third of this book is where it excels, a final arc that imbues the whole story with purpose. The place where all those funny little ideas were vacuumed out of a hypothetical sequel and pulled into the original.

Choosing to Self Publish

I’m an impatient man. It’s silly of me to be impatient after spending two years writing up a draft, but I was ready for this project to be out there. I’ve met plenty of writers sitting on twelve novels just waiting for the right agent to turn them into stars, that’s not the path for me.

The scariest part of self-publishing is knowing that every inch of success is entirely on you. That also means if the book only sells a dozen copies, it’s your fault. For me, that didn’t seem so bad. I’d rather improve by releasing my work and letting people give me honest feedback than hide away and write book after book on my own. I’ve never worked on something that didn’t get released to the public within four months of being finished before, so a year of waiting was an eternity.

Now that the time is here, I’m really enjoying the process. Soon there will be something out in the world that I’m proud of, something I made, something I’m eager to share. Lately I’ve been attending a lot of farmer’s markets. I haven’t made a single sale, but the experience has been a blast. I get to spend time speaking to real people, giving advice to novice writers, learning what different readers like reading. After all this time on my own pushing to finish a product, getting to know someone else’s story is sort of, healing.

My review of self-publishing so far: Owning my own book and owning my own success is hard work and an absolute joy.

The Novel

I can’t write this whole thing up without talking about my novel! The book is titled “The Human Countermove”, there’ll be a link and description down at the end. But here, in this little blog, I want to give a more informal description.

The book tells the story of Zouk, a washed up strategy game grandmaster who challenges the three AI rulers of his society to determine society’s future.

It’s a cerebral near-future sci-fi, inspired by my love of chess and strategy games. The premise is drawn from the famous chess match Kasparov vs Deep Blue (1997), where mankind’s best chess player was soundly defeated by an algorithm.

I wrote this thing on the hunt for some narrative payback. In real life, we got our butt handed to us. In The Human Countermove, the big question at the start of the book is, ‘What can a person do to out-think something that is cognitively superior’? Zouk Solinsen is my very own John Henry the steel-driving man, except this time instead of trying to beat the machine by brute-force, Zouk pulls every trick in the book to get an advantage.

One thing I fought hard to keep in the book was a rejection of the normal dystopian tropes. So often in these things society is irredeemable, and it all descends into war and destruction. The reader watches the conflict between robots and humans pave a fiery trail for centuries, they see the last few untracked humans turn into a rebellion. I’m ready for something new.

Our main character is a victim of a broken system. A system that demands efficiency in every act. Work and play and rest, all measured, all prescribed in particular doses. It’s not unreasonable to be angry. A broken system needs change. But at the heart of the story is one issue, does the system need to be burned down, or do we not yet understand it? Is there something inherently wrong with a society run by AI Minds? Maybe. Or maybe there’s just a separation between what mankind asks for and what we really want.

Conclusion

As silly as it is, I’ve often defined whether or not I’m a writer by the absence of a published book. I’ve worked professionally in the field, I’ve written for graphics teams, voice actors, education companies, by all means, I am a writer. But this was the last hurdle. As soon as this book comes out, I get to say it to myself and mean every word.

Next week, I will be a novelist.

My debut novel is now available for pre-order. Release Date September 1st. I’m still working out the last few kinks on the paperback side, but that option should be made available soon.

https://www.amazon.com/dp/B0FM9R7T5F

In a nation ruled by AI Minds, productivity is everything—even play.

Once a legend in the world of strategy games, Zouk Solinsen is now just another burnout in a society obsessed with efficiency. But when the Minds announce a high-stakes tournament—with a seat on the ruling council as the prize—Zouk is drawn back into the fray, determined to reshape the future.

With help from the enigmatic Torrez Institute, Zouk racks up early victories against the Minds. But when Maya Torrez reveals the cost of her support—a violent coup against the Minds—he rejects it and strikes out alone.

Now, with no allies, dwindling resources, and a nation on the brink, Zouk faces the biggest game of his life—and a final, impossible choice: reform the system from within, or burn it all down.

My First Draft Took 7 months, Here’s What I Learned

I just finished the first draft of my second book. It took 7 months. The final word count was about 87,000 words. That averages out to about 410 words per day. But that’s not the reality.

The reality is half my book was written across 7 very productive weeks, and half my book was written across 5 very unproductive months. Here’s what I learned.

Find The Process

Last week I wrote a post about my writing process. On days I wrote, I always hit my wordcount goal of 1,200 words. But for a long time, getting my butt in the chair and focussing enough to work proved impossible. Then I started pre-writing with a pen and paper, and I put a time on my phone each day for writing and everything got easier.

From the moment I found my process, my average word-count per week shot up to 6,000. About 5.5 days per week on and off. If I had hit that number from the start, the book would have been done in 2 and a half months.

Momentum is Everything

Forming a consistent rhythm is hard. And sometimes life forces us to make exceptions. Here’s what I’ve learned about myself.

If I take a one day break from writing, I can get back to writing the next day without any issue.

If I take a two day break, I get kinda anxious and starting again becomes a challenge.

After three days, the momentum is gone, and I have to start cold.

The next time I’m writing the first draft of a book, I plan on allocating three dedicated months, with only brief weekend retreats to break things up. Once the habit is formed, it’s harder to break it than to fulfill it. But if I give myself too many excuses, too many easy outs, the habit dies before it’s formed.

Love (With Your Novel) is Fleeting

It’s easy to fall in love with a book. It’s much harder to stay in love. You can only work on the same task for so long before you start to hate it. A terrible kind of insecurity bubbles up, a voice in your ear whispers that your story is terrible.

About 3 months into my drafting, I stopped loving my book. Worse, I stopped liking it. And once that happened, getting words on the page was almost impossible.

The good news is: It’s fixable. It took a little wine and dining, but with the right attitude and a careful approach, I was able to rediscover my passion at least twice while getting the thing written.

The process was pretty simple, when I had been away from my book for a couple weeks and the spark was gone, I’d revisit the book the way I had at the start. Begin by visualizing the world, the aesthetics, the look and wonder of the story. The joy of the concept rather than the pain of the details. Then I’d see my characters, the protagonist with all their flaws, and everything they were trying to do. But it was more than seeing them, it was seeing what was still in store for them. I’d have a third of a book written, and I’d be able to look into the future and know what was still on its way. The end of the arc, still not on the page. My love would reignite, I had seen everything I loved about the story and everything that was still in store. It’s the reason I’m telling the story, the idea that bubbles in my stomach and warms my heart.

Too Much Buildup is Bad for The Writer

Ideas are made to be spent. Once they come into your brain, they fill a space of it until the day you get them onto the page. Worse, a great idea likes to return again and again, occupying most of your thoughts as you imagine the same scene from a hundred different angles.

The trouble with all that thinking is the buildup. At the end of the day, you only get to tell the story one way. And what does that mean for all those other perspectives? They’re tossed in the bin. Maybe I get to pull an idea or two along the way, but most of it is just wasted brainspace.

My brain knows it’s wasted work, and it hates it.

If I love a scene too much, my brain does everything in its power to keep me from writing it. To write is to commit, it takes the infinite possibility and beauty of a concept and turns it into concrete words.

For me, the best thing I can do with a scene I love is get through it as soon as possible. Keep the reimaginings low, keep the ways to spruce things up limited, and let the scene be like you saw it for the first time in your head, even when sometimes it’s just two characters chatting in a garage. It’s much easier to edit a poorly written chapter than fill a blank page.

The Outline is Key

My outline was my most important ingredient, it turned the impossible journey of 100,000 words into a bunch of 1,200 word slices. When I lost momentum, I put a list on the wall, a series of individual scenes pulled from my outline. With each scene written, I’d cross it off and move onto the next. It meant all I really needed to think about was what was directly ahead, not the entire maw that is the rest of the novel. With this book, the further the outline got into the story, the looser it described the events. That hurt me a lot. The less detail I determined early, the more work I had on the day.

New Rules

For me, seven months is too long to write a draft. The longer it takes to write, the more complications crop up along the way. My dream is to draft in 3-4 months. Less than that isn’t possible unless I start increasing my daily word count goals, and I’d rather consistently hit the daily goals I have now than risk pushing myself too hard and lose months from burnout. So, with all that in mind, I’ve set myself a few new rules:

  1. From the moment I start my draft, the next three months can have no major trips, just the occasional weekend getaway.
  2. If I miss 1 day of writing, I have to do everything in my power to make sure I hit my goal the next day.
  3. Once a scene is imagined, it doesn’t get revisited until the day I write it. No over-engineering here.
  4. Outline early, and outline thoroughly.

Hopefully in the near future I’ll be hitting my goal of 2 books a year.

DEBUT NOVEL NOW AVAILABLE FOR PRE-ORDER! (Not the story described in this article):

The Human Countermove is now available for pre-order! https://www.amazon.com/dp/B0FM9R7T5F

In a nation ruled by AI Minds, productivity is everything—even play.

Once a legend in the world of strategy games, Zouk Solinsen is now just another burnout in a society obsessed with efficiency. But when the Minds announce a high-stakes tournament—with a seat on the ruling council as the prize—Zouk is drawn back into the fray, determined to reshape the future.

With help from the enigmatic Torrez Institute, Zouk racks up early victories against the Minds. But when Maya Torrez reveals the cost of her support—a violent coup against the Minds—he rejects it and strikes out alone.

Now, with no allies, dwindling resources, and a nation on the brink, Zouk faces the biggest game of his life—and a final, impossible choice: reform the system from within, or burn it all down.

Some Python Code Proofed My Book in 5 minutes

I wrote my book word by word, no AI involved. An editor helped me develop the story and a copy-editor made sure the manuscript was clean. I’ve read my book about a dozen times. Then my layout person gave me the final version of the book and I realized I had to read the whole thing again to check for new errors.

First I did it properly. My eyes were basically blind by the end. But I wanted a second sweep. The thing is, any person asked to do the job will make a mistake. They’ll overlook something. They won’t realize one paragraph is copied over twice or accidentally cut a space between two sentences. What I needed was a perfect sweep. A complete comparison between my original manuscript and the final epub document. The kind of sweep that could only be performed by a soulless machine with an inflexible view of correct and incorrect.

When I’m not writing I’m coding, and this kind of repetitive, detail-oriented, clearly defined task is the perfect fit for a machine. In fact, it was such a perfect fit, the whole process only took an hour.

What Did The Machine Do?

First I defined my requirements. This code was written to spot exactly one type of problem, copy-and-paste mistakes performed by the layout person. It’s not going to spot typos, it’s not going to spot grammar issues, and it’s certainly not going to point out plot holes. This machine is very stupid, but it performs its job to the letter.

Manuscript format: DOCX

Final Book Layout format: EPUB

Goal: Review every sentence in the EPUB and DOCX files and identify any sentence missing from one file that is present in the other, this should capture any omissions, insertions, or errors in the final manuscript. Then, identify if any sentences appear in the same manuscript more than once, this should identify any ‘duplicate chapter’ or ‘duplicate paragraph’ problems.

The complete code will be shown at the end in case you want to use it, but first I’ll walk you through the parts.

Step 1: Parse the DOCX Manuscript

import docx

def extract_text_from_docx(docx_path):
    doc = docx.Document(docx_path)
    full_text = []
    for para in doc.paragraphs:
        if para.text.strip():  # skip empty paragraphs
            full_text.append(para.text.strip())
    return '\n'.join(full_text)

This code is pretty straightforward, it parses the .docx file into paragraphs, joins it all together into one big paragraphless blob.

Step 2: Parse the EPUB Book

This code is almost identical to the DOCX, but EPUB has a lot more nuance to its data-types. We have to ensure we only retrieve the actual text items, and parse them out of html into plain-text. Then we join it all together in one big wall of book.

import ebooklib
from ebooklib import epub
from bs4 import BeautifulSoup

def extract_text_from_epub(epub_path):
    book = epub.read_epub(epub_path)
    text_content = []

    for item in book.get_items():
        if item.get_type() == ebooklib.ITEM_DOCUMENT:
            soup = BeautifulSoup(item.get_content(), 'html.parser')
            # Remove scripts and styles
            for tag in soup(['script', 'style']):
                tag.decompose()
            text = soup.get_text(separator=' ', strip=True)
            if text:
                text_content.append(text)

    return '\n'.join(text_content)

Step 3: Split the book-blobs into sentences

This part uses a tool called the Natural Language Toolkit (NLTK). Sometimes what NLTK considers a sentence is a little funny, like it’ll join two sets of short quotes together. But we cannot allow perfect to be the enemy of good, so as long as NLTK is responsible for both sentence splitting procedures, the final outputs should be identical.

import nltk
from nltk.tokenize import sent_tokenize
nltk.download('punkt')
nltk.download('punkt_tab')

def split_text_into_sentences(text):
    return sent_tokenize(text)

Step 3: Data cleanup

You may have noticed some really long character replacement stuff. Turns out the docx parser picks up a few too many newlines and the epub parser likes directional quotes, so all of that gets replaced with nice, consistent sentencing.

def docx_scan():
    docx_path = "FILENAME.docx"
    text = extract_text_from_docx(docx_path)
    sentences: List[str] = split_text_into_sentences(text)
    
    for i, val in enumerate(sentences):
        sentences[i] = val.replace('\n', ' ').replace('“', '"').replace('”', '"').replace("‘", "'").replace("’", "'").replace("\'", "'")

    return sentences

def epub_scan():
    epub_path = 'FILENAME.epub'
    text = extract_text_from_epub(epub_path)
    sentences: List[str] = split_text_into_sentences(text)

    for i, val in enumerate(sentences):
        sentences[i] = val.replace('\n', ' ').replace('“', '"').replace('”', '"').replace("‘", "'").replace("’", "'").replace("\'", "'")

    return sentences

Step 4: Crawl through the two books

This is a bit of a doozy, but this function essentially crawls through the final book looking for the next sentence in the manuscript. If it doesn’t find it in 10 sentences, it reports the sentence missing and moves on.
Note: The original draft of this post had a different algorithm that failed to account for sentence order. There’s nothing a programmer does more than tinker with their code, but this function is a big improvement on the original, trust me.

def compare_books(manuscript: List[str], final_book: List[str]):
    # We sweep through final_book searching for sentences from manuscrpt
    book_1_pos: int = 0
    book_2_pos: int = 0
    while book_1_pos < len(manuscript):
        found: bool = False
        target_sentence: str = manuscript[book_1_pos]
        for sweep_position in range(book_2_pos, book_2_pos+10):
            if(sweep_position < len(final_book) and target_sentence == final_book[sweep_position]):
                book_1_pos += 1
                book_2_pos = sweep_position
                found = True
                continue
        
        if not found:
            book_1_pos += 1
            if ' - ' not in target_sentence:
                print(target_sentence)
    

And because of the way the function is written, we can actually crawl through both books the same way.

    epub_sentences = epub_scan()
    docx_sentences = docx_scan()
    # Check the epub file for errors
    compare_books(docx_sentences, epub_sentences)
    # Check the docx file for errors
    compare_books(epub_sentences, docx_sentences)

There are ~8000 sentences in my book. Since the computer reads both copies twice, it’s only about 32,000 operations. A very cheap, less than one second scan for errors.

All the differences are then written out to a file. There were a bunch of false positives. Of the 54 reported omissions, 4 sentences turned out to contain errors, the rest were quirks of the epub format. But finding real errors means it’s working! And it means my layout person did a fantastic job!

Step 5: Check for duplicates

Finally, we do a quick check in both sentence lists for duplicates. The results here reveal my laziness as an author. It turns out I have ~90 non-unique sentences in my book. Most are ‘He said’, ‘She said’, ‘He nodded’, but the strangest one was “Alpha, Golf, Delta, Charlie.” which is a list of squadrons that are referenced in that exact order on two different occasions.

    non_unique_docx = set([x for x in docx_sentences if docx_sentences.count(x) > 1])

    non_unique_epub = set([x for x in epub_sentences if epub_sentences.count(x) > 1])

    print(f"Docx copies: {len(non_unique_docx)}")
    print(f"Epub copies: {len(non_unique_epub)}")

I verified that the total number of non-unique sentences was identical in the DOCX and EPUB formats and moved on.

Conclusion

I always felt a little uneasy about the final version of my book. Even when I had been through it myself, I couldn’t be sure I hadn’t overlooked a massive error. I still can’t be completely sure, but there’s something really reassuring about having a machine do a run-through. When precision is the aim, somehow the passionless report of a calculator is more comforting than a thumbs-up from a professional.

Complete File:

import docx
import nltk
from nltk.tokenize import sent_tokenize
import ebooklib
from ebooklib import epub
from bs4 import BeautifulSoup
from typing import List, Set

nltk.download('punkt')
nltk.download('punkt_tab')

def extract_text_from_docx(docx_path):
    doc = docx.Document(docx_path)
    full_text = []
    for para in doc.paragraphs:
        if para.text.strip():  # skip empty paragraphs
            full_text.append(para.text.strip())
    return '\n'.join(full_text)

def split_text_into_sentences(text):
    return sent_tokenize(text)

def docx_scan():
    docx_path = "YOURFILE.docx"
    text = extract_text_from_docx(docx_path)
    sentences: List[str] = split_text_into_sentences(text)
    
    for i, val in enumerate(sentences):
        sentences[i] = val.replace('\n', ' ').replace('“', '"').replace('”', '"').replace("‘", "'").replace("’", "'").replace("\'", "'")

    return sentences


def extract_text_from_epub(epub_path):
    book = epub.read_epub(epub_path)
    text_content = []

    for item in book.get_items():
        if item.get_type() == ebooklib.ITEM_DOCUMENT:
            soup = BeautifulSoup(item.get_content(), 'html.parser')
            # Remove scripts and styles
            for tag in soup(['script', 'style']):
                tag.decompose()
            text = soup.get_text(separator=' ', strip=True)
            if text:
                text_content.append(text)

    return '\n'.join(text_content)

def epub_scan():
    epub_path = 'YOURFILE.epub'
    text = extract_text_from_epub(epub_path)
    sentences: List[str] = split_text_into_sentences(text)

    for i, val in enumerate(sentences):
        sentences[i] = val.replace('\n', ' ').replace('“', '"').replace('”', '"').replace("‘", "'").replace("’", "'").replace("\'", "'")

    return sentences

def compare_books(manuscript: List[str], final_book: List[str]):
    # We sweep through final_book searching for sentences from manuscript
    book_1_pos: int = 0
    book_2_pos: int = 0
    while book_1_pos < len(manuscript):
        found: bool = False
        target_sentence: str = manuscript[book_1_pos]
        for sweep_position in range(book_2_pos, book_2_pos+10):
            if(sweep_position < len(final_book) and target_sentence == final_book[sweep_position]):
                book_1_pos += 1
                book_2_pos = sweep_position
                found = True
                continue
        
        if not found:
            book_1_pos += 1
            if ' - ' not in target_sentence:
                print(target_sentence)

def main():
    epub_sentences = epub_scan()
    docx_sentences = docx_scan()
    compare_books(docx_sentences, epub_sentences)
    compare_books(epub_sentences, docx_sentences)

    non_unique_docx = set([x for x in docx_sentences if docx_sentences.count(x) > 1])
    non_unique_epub = set([x for x in epub_sentences if epub_sentences.count(x) > 1])
    print(f"Docx copies: {len(non_unique_docx)}")
    print(f"Epub copies: {len(non_unique_epub)}")


if __name__ == '__main__':
    main()