Innocently Macabre

by Ajinkya Goyal

An interplay of worldly merriment and twisted secrets, distilling the wonders of the cosmos for your perusal

The Crescent of Fools and Forgotten Time

Urban Fantasy · Heist

Lucille Carmine is not one to relinquish her hold on someone once her wicked talons have sunk into them, as Jayce all too painfully learns once more. He’s pulled into her employ again, Lott jumping in after his best friend, tasked - under extreme duress, of course - to retrieve The Liminality Paradox.Previously thought to have been nothing more than a bedtime story, Jayce and Lott find themselves unwillingly heading to The Crescent of Fools and Forgotten Time, right into the heart of The Fool’s domain, a place where time and space lose all meaning, where everything that has ever happened is happening all at once and where nothing ever happens all the same. A place where the ends of the universe could be nothing more than a hop, skip, and a jump away, but the five feet in front of you could stretch out to infinity and beyond. A place where the insane rule sovereign and the sane are grinded to a dust, folded into the ripples of the Crescent.All to steal an artifact of untold power for one of the most dangerous overlords of the criminal world, and to lay even more unchecked power at her feet for her to abuse.

↝↝✧✧↝↝

Ever wanted to be in the director's seat? Well, click the button below to read the full script, leave your honest opinions, and decide whether you want the movie made!
(Psst your honest opinion is that you love the movie)
The winner of this competition gets their film fully funded and produced!

Now They Call Me the Plague

Gothic · Historical Fiction · Fantasy

As the fright death sweeps the land, leaving a trail of lifeless sacrifices, a Dream desperately claws their way back to the Dreaming, having spent eternity trapped in the conscious realm.The infestation’s merciless wake piques Trance’s macabre curiosity, spurred forth by his discovery of a ship that sails across the tumultuous currents of Nightmares and Dreams. They drag Eda, their retired-from-the-seas best friend, along with them as they set sail on the adventures of multiple lifetimes, unwittingly getting themselves irreversibly entwined with fates and forces far beyond their comprehension.Now They Call me the Plague is gothic historical fiction set against the backdrop of the golden age of piracy. All that remains to be seen is how many more will fall at the altar of an unforgiving death.

Anna, Version One

Horror

Before we begin, I should make it clear that this story takes place in the early 1960s, when aeroplane rules were a lot laxer. One could brandish a cigar, or holster a pistol, or even brandish a cigar while holstering a pistol. Now, consider if you will, the thoughts of one James Augustus McCoy, as he goes airborne in a helm of metal, held together by nothing more than nuts and bolts, and is rocketed to well over twenty thousand feet in the sky, at speeds faster than any other passenger vehicle can even attempt.His nightmare treads the razor edge between the possibility that it’s merely James’ psyche feeling especially cruel, or that what he thinks he sees hanging off the edge of the plane is real.

Frozen Summer

Gothic · Sci-Fi · Slipstream

“When hell freezes over” is supposed to be a terrifying conditional. The last straw. The final stand. The second before everything goes to shit.But hell freezes over quite often. I’ve seen it happen. I’ve made it happen.What you should be afraid of is summer being iced out. The sun blinks blue, trees shed in one fell swoop with leaves shattering on impact, and lakes become aquatic prisons for anyone unfortunate enough to have been taking a dip. When summer freezes, then plunges further still, is when you should run.Drop everything, turn around, and run. Don’t look back, don’t blink, don’t stop. Run until you can’t possibly put another foot forward, until the ground gives out from beneath you, then run some more.Beware the Frozen Summer and the horrors it brings.

Due North

Fantasy meets slice of life

Steadman Hirsch, premier and proudest realtor in all of Due North, stood in front of his latest job-well-done. Handy job, real estate. Supported his lifestyle quite well, what with everyone always welcoming him in with open arms and big, teeth-baring smiles.This particular listing was a particular brand of fantastic. 8 Brook Way. Oh, if these walls could talk! (The fact that some of these walls could, in fact, talk, had no bearing on Steadman Hirsch’s use of the expression, for he was born with a rare condition preventing him from recognising any sort of irony whatsoever.)There was the siren who turned 8 Brook Way into the hottest karaoke bar in the entire town, the witch who fireproofed the place for her litter of dragons, the harpy who added the marble cornices on the house’s back end, the oread who turned the entire house inside out and built a wildlife sanctuary like none other, the satyr who quite appreciated the oread’s work, the – oh, no matter! The house would soon show it all to the new residents! They’re out-of-towners so there’d be an adjustment period, yes, but he was confident they’d pick it up quickly.

In the Eye of the Beholder

Horror

Aditya Singh woke up a little past nine o’clock, feeling as if he was going to explode. The room’s colours shone brighter than they ever had before, and he suddenly regretted conceding to yellow wall paint. His head throbbed violently, almost as if his body was warning him of something terrible to come.He looked over to his husband, still calmly asleep next to him, and thought of waking him up. He wasn’t sure how that would help, but Kurt had always soothed him before. Ultimately, he decided to let him sleep. No point in bothering two people over a feeling. He got up and headed to the bathroom, hoping a splash of cool water would make him feel a little better, then made his way downstairs. If he couldn’t get any more sleep in, he figured might as well get an early start on his day, even if the very notion did make his doggedly night owl self internally groan.Once the pot of coffee had been set to brew, Aditya got his phone out and scanned through it. SMS had nothing but the usual ensemble of restaurants, delivery services, and shopping sites advertising some sort of perpetual sale. His email consisted of some promotional stuff; a couple newsletters from writers he followed; and an email from his editor from the night before, reminding him about today’s brunch with the publishing house.At that moment, a sharp pain shot through his head and his phone fell to the shelf. He leaned on it for a moment, nursing his temples until the pain subsided.“What the fuck was that?” he said in a frightened whisper. He’d had headaches before, but this wasn’t like those. It lasted for a fraction of the time but packed pain tenfold and then some. He cupped his coffee tight with trembling hands, inhaling and exhaling slowly, trying to keep the pain at bay.

Someone Has to Leave First

Tragedy

Twenty years ago, I knew someone. Friend feels far too hollow to describe us, and family feels too obligatory. We were just us. We cared fiercely for one another and there was not a single line I wouldn’t have crossed for her. There are few I didn’t, and had we endured, I’m sure that number would have been whittled down to zero.She gave just as much as I did; the moment I was concerned, whatever shred of caution she still allowed herself to retain was immediately discarded – buried in the ground, not thrown in the wind, where it could come around and settle on her again. She took risk after gamble after hazard and stopped at nothing for me.It’s hard to describe her without sounding magnanimous, but that’s just how large a person she was. We were a modern-day Greek tragedy. When we were together, the rest of the universe fell away and nothing mattered except the way the other felt, what they said, and what they didn’t say. It was like we spun into one – an incredibly dangerous one for whom limits were far too mundane a concept to even consider.Some people are like the moon and stars – perfect compliments for one another. We were both suns. We burned with an intensity few others could fathom and contained multitudes only the other understood.

A Flicker

Horror

Do you ever feel like a shark? Like if you’d stop moving for even a second, if you stopped distracting yourself for but a moment, it would get too much, and you’d drown under the weight of it all?


It was a mistake. It was my fault, but I didn’t mean for any of it to happen. I couldn’t possibly have known it would happen. It was just meant to be something to do for fun.
Our story begins, as most do, with a group of people. Three friends – three children – with little to do on a summer afternoon, until one of them noticed the date. Friday the thirteenth, the night before Halloween.For you see, our story begins, as only the best do, with a little island. An island outside of time and independent of space. Where time is fluid instead of linear, where nothing ever happens and where everything is happening all at once. One merely needs to look. Poke a few bears, turn over the right stones, and you’ll find what you’re looking for.

Within and Without

Speculative Thriller

A dying last breath undoes the past half-century in a grapple betwixt psychology and loyalty, curiosity and peril, possibility and morality, throwing Liam’s world into disarray, as he moves to destroy the one place he had sworn never to enter


Liam stepped hesitantly into the study, feeling a strange sense of detachment despite his many years in this house. He had been with Mr Device for over fifty years and had enacted each command to the T for every one of them. He was on amicable terms with the entire Device family and there wasn’t a place on the grounds he couldn’t go, nor a facility he couldn’t use. Except the study. The one thing Mr Device had absolutely insisted on was the study being off-limits to everyone else.
But that changed last night. Last night Mr Device had died. He chose to pass on these grounds, in the comfort of his own home, rather than in an impersonal hospital bed, even if his name was on the golden plaque on the ward label. He lay surrounded by his children and grandchildren, muttering words of encouragement and solace to them with his final breathes. In the end he dismissed everyone but Liam and beckoned him closer.

Three Rooms Down

Horror

A deep stirring in my stomach woke me up earlier than I had planned. Per usual, my eyes were droopy, and my limbs weren’t feeling all too inclined to function. They clung tightly to my form, refusing to leave my side for but a second. I stayed curled up in the spiral that I like to sleep in. My mind though, my mind was more alert than it had ever been – morning or night. Something disturbing was afoot, I could feel it in every bone of my body.Then it hit me. My sister, lying on her bed, three rooms and a mahogany door away, was dead. I knew because I didn’t hear her clambering down the steps at two in the morning for her “mandatory pre-morning glass of milk” that apparently does wonders for the body as soon as you enter deep sleep around the three o’clock mark. There was no screeching of the old joints of the kitchen door. No noise of the suction of the fridge as she opened and closed. There was no sloshing of the milk as it hit the edges of her cup that resounded through the entirety of this surprisingly acoustic house. But that wasn’t the only reason I knew. There’s one thing I haven’t yet told you.

Every story ever told really happened.

Stories are where memories go when they’re forgotten.If you've got eyes and ears in the right places, you're likely to come across rumours of a man who will find these memories.He’ll go off a-hunting, foraging for the stories you’ve forgotten.I bring them home and show the world, distilling them into pretty little glass vials for you to peruse the wonders of the cosmos.Take a look. Have your pick.

If you’d like to keep up to date with the preparation of new brews, let me know and I’ll be in touch. As a thank you, I'll send over a copy of Frozen Summer: Stories From the Dark and Twisted Crevices of the Universe!

About Me ⇢

About Me

Hey, I’m Ajinkya. I pull stories from the dark and twisted crevices of my mind to entertain and enthral and wander its greener tropics for less horrifying pieces.Basically, speculative and gothic fiction with smatterings of fluff and angst thrown in for good measure in true innocently macabre fashion. I probably spend more time thinking about stories than I do writing them, and even more time daydreaming about projects I haven't even begun yet.I am an award-nominated writer, and have written short stories, collections, screenplays, comics, and am working on several longer works at the moment, including a full length novel and a feature film! You can find a complete archive here.I attempt a stab at the mortifying ordeal of being known here, on Tumblr, Instagram, and Ko-fi. To keep up with my work, subscribe to my newsletter and follow me on these platforms.As a little thank you, I'll send over a copy of I'll send over a copy of Frozen Summer: Stories From the Dark and Twisted Crevices of the Universe if you do!

Writing

I am a Goodreads-recognised author, an Odd Directions Featured Writer, and a Medium Top Writer. I have been published in Creepy Pod, The Junction, The Ascent, Lit Up, The Writing Cooperative, and more.Frozen Summer: Stories From the Dark and Twisted Crevices of the Universe is a collated edition of speculative horror which I send to every single subscriber as a thank you!For all my other work, click below.

Due North

Fantasy · Slice of Life

Water horses, sentient houses, disappearing cats, grave whisperers, semi-dead grave robbers, minotaurs, bearotaurs, satyrs, dryads, sirens, and more! Slice-of-life meets fantasy to bring you the secretive, wondrous, and oddity-rich town of Due North.


Frozen Summer

Stories from the dark and twisted crevices of the universe

Gothic · Sci-Fi · Slipstream

“When hell freezes over” is supposed to be a terrifying conditional. The last straw. The final stand. The second before everything goes to shit.But hell freezes over quite often. I’ve seen it happen. I’ve made it happen.What you should be afraid of is summer being iced out. The sun blinks blue, trees shed in one fell swoop with leaves shattering on impact, and lakes become aquatic prisons for anyone unfortunate enough to have been taking a dip. When summer freezes, then plunges further still, is when you should run.Drop everything, turn around, and run. Don’t look back, don’t blink, don’t stop. Run until you can’t possibly put another foot forward, until the ground gives out from beneath you, then run some more.Beware the Frozen Summer and the horrors it brings.


Where should I send your copy?

In the Eye of the Beholder and Other Short Stories

Stories pulled from the darkest and most twisted recesses of the mind. They certainly have no business existing in the realm of reality, but the forbidden fruit has always been a tempting mistress.
Here are just a few of the fruits you will taste.
Consider if you will, the thoughts of James Augustus McCoy as he goes airborne in a helm of metal, held together by nothing more than nuts and bolts, and is rocketed to well over twenty thousand feet in the sky. His thoughts tread the razor edge between the possibility that it's merely James's psyche feeling especially cruel, or that what he thinks he sees hanging off the edge of the plane is real.Corden chances upon a little girl during his travels who warns him of the Vânător, a being that prowls the dark recesses of the forest come nightfall. Naturally, he brushes this off as local superstition and continues on into the forest, heading for the next town. But night is coming and all superstitions have an origin...Aditya Singh is killed. Shot by his own driver, with his husband taken as collateral. But matters don't end there. He wakes up again and again, reliving his pain, his death, through the eyes of someone else associated with his murder.Humans are plucked from their homes and reprogrammed to be killers operating at the discretion of their handlers and the manilla folders that hit their desks. One killer is sent to her home, tasked with taking care of her own husband and child. But instinct is a unique thing and the brain a powerful force.Children have overactive imaginations. They see things that aren't there, hear noises that have no source. But sometimes, they're right. Don't look out on the highway at night.

Innocently Macabre Presents:
Micro Monday

Start your week off right: a micro to flash length piece delivered right to your inbox, every other Monday.

function submitHandler(event) { event.preventDefault(); var container = event.target.parentNode; var form = container.querySelector(".newsletter-form"); var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); var loadingButton = container.querySelector(".newsletter-loading-button"); const rateLimit = () => { errorContainer.style.display = "flex"; errorMessage.innerText = "Too many signups, please try again in a little while"; submitButton.style.display = "none"; formInput.style.display = "none"; backButton.style.display = "block"; } // Compare current time with time of previous sign up var time = new Date(); var timestamp = time.valueOf(); var previousTimestamp = localStorage.getItem("loops-form-timestamp"); // If last sign up was less than a minute ago // display error if (previousTimestamp && Number(previousTimestamp) + 60000 > timestamp) { rateLimit(); return; } localStorage.setItem("loops-form-timestamp", timestamp); submitButton.style.display = "none"; loadingButton.style.display = "flex"; var formBody = "userGroup=micromonday&mailingLists=&email=" + encodeURIComponent(formInput.value); fetch(event.target.action, { method: "POST", body: formBody, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }) .then((res) => [res.ok, res.json(), res]) .then(([ok, dataPromise, res]) => { if (ok) { // If response successful // display success success.style.display = "flex"; form.reset(); } else { // If response unsuccessful // display error message or response status dataPromise.then(data => { errorContainer.style.display = "flex"; errorMessage.innerText = data.message ? data.message : res.statusText; }); } }) .catch(error => { // check for cloudflare error if (error.message === "Failed to fetch") { rateLimit(); return; } // If error caught // display error message if available errorContainer.style.display = "flex"; if (error.message) errorMessage.innerText = error.message; localStorage.setItem("loops-form-timestamp", ''); }) .finally(() => { formInput.style.display = "none"; loadingButton.style.display = "none"; backButton.style.display = "block"; }); } function resetFormHandler(event) { var container = event.target.parentNode; var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); success.style.display = "none"; errorContainer.style.display = "none"; errorMessage.innerText = "Oops! Something went wrong, please try again"; backButton.style.display = "none"; formInput.style.display = "flex"; submitButton.style.display = "flex"; } var formContainers = document.getElementsByClassName( "newsletter-form-container" ); for (var i = 0; i < formContainers.length; i++) { var formContainer = formContainers[i] var handlersAdded = formContainer.classList.contains('newsletter-handlers-added') if (handlersAdded) continue; formContainer .querySelector(".newsletter-form") .addEventListener("submit", submitHandler); formContainer .querySelector(".newsletter-back-button") .addEventListener("click", resetFormHandler); formContainer.classList.add("newsletter-handlers-added"); }

Support my writing!

My writing is entirely reader-supported, so I'd be thrilled if you sign up as a paid member and help ensure its continued existence!Annnnnd I may or may not slip a couple of for-your-eyes-only book bundles under the table as a little thanks ;) You also get access to a constantly-added-to host of stories and scripts and bundles!

Sign up and snag yourself a free copy of Frozen Summer, a speculative horror novel!

function submitHandler(event) { event.preventDefault(); var container = event.target.parentNode; var form = container.querySelector(".newsletter-form"); var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); var loadingButton = container.querySelector(".newsletter-loading-button"); const rateLimit = () => { errorContainer.style.display = "flex"; errorMessage.innerText = "Too many signups, please try again in a little while"; submitButton.style.display = "none"; formInput.style.display = "none"; backButton.style.display = "block"; } // Compare current time with time of previous sign up var time = new Date(); var timestamp = time.valueOf(); var previousTimestamp = localStorage.getItem("loops-form-timestamp"); // If last sign up was less than a minute ago // display error if (previousTimestamp && Number(previousTimestamp) + 60000 > timestamp) { rateLimit(); return; } localStorage.setItem("loops-form-timestamp", timestamp); submitButton.style.display = "none"; loadingButton.style.display = "flex"; var formBody = "userGroup=website&mailingLists=&email=" + encodeURIComponent(formInput.value); fetch(event.target.action, { method: "POST", body: formBody, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }) .then((res) => [res.ok, res.json(), res]) .then(([ok, dataPromise, res]) => { if (ok) { // If response successful // display success success.style.display = "flex"; form.reset(); } else { // If response unsuccessful // display error message or response status dataPromise.then(data => { errorContainer.style.display = "flex"; errorMessage.innerText = data.message ? data.message : res.statusText; }); } }) .catch(error => { // check for cloudflare error if (error.message === "Failed to fetch") { rateLimit(); return; } // If error caught // display error message if available errorContainer.style.display = "flex"; if (error.message) errorMessage.innerText = error.message; localStorage.setItem("loops-form-timestamp", ''); }) .finally(() => { formInput.style.display = "none"; loadingButton.style.display = "none"; backButton.style.display = "block"; }); } function resetFormHandler(event) { var container = event.target.parentNode; var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); success.style.display = "none"; errorContainer.style.display = "none"; errorMessage.innerText = "Oops! Something went wrong, please try again"; backButton.style.display = "none"; formInput.style.display = "flex"; submitButton.style.display = "flex"; } var formContainers = document.getElementsByClassName( "newsletter-form-container" ); for (var i = 0; i < formContainers.length; i++) { var formContainer = formContainers[i] var handlersAdded = formContainer.classList.contains('newsletter-handlers-added') if (handlersAdded) continue; formContainer .querySelector(".newsletter-form") .addEventListener("submit", submitHandler); formContainer .querySelector(".newsletter-back-button") .addEventListener("click", resetFormHandler); formContainer.classList.add("newsletter-handlers-added"); }

Support my writing!

My writing is entirely reader-supported, so I'd be thrilled if you sign up as a paid member and help ensure its continued existence!Annnnnd I may or may not slip a couple of for-your-eyes-only book bundles under the table as a little thanks ;) You also get access to a constantly-added-to host of stories and scripts and bundles!

Sign up for a streamlined, curated feed of the things I've written, and never miss a single piece!

function submitHandler(event) { event.preventDefault(); var container = event.target.parentNode; var form = container.querySelector(".newsletter-form"); var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); var loadingButton = container.querySelector(".newsletter-loading-button"); const rateLimit = () => { errorContainer.style.display = "flex"; errorMessage.innerText = "Too many signups, please try again in a little while"; submitButton.style.display = "none"; formInput.style.display = "none"; backButton.style.display = "block"; } // Compare current time with time of previous sign up var time = new Date(); var timestamp = time.valueOf(); var previousTimestamp = localStorage.getItem("loops-form-timestamp"); // If last sign up was less than a minute ago // display error if (previousTimestamp && Number(previousTimestamp) + 60000 > timestamp) { rateLimit(); return; } localStorage.setItem("loops-form-timestamp", timestamp); submitButton.style.display = "none"; loadingButton.style.display = "flex"; var formBody = "userGroup=romance&mailingLists=&email=" + encodeURIComponent(formInput.value); fetch(event.target.action, { method: "POST", body: formBody, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }) .then((res) => [res.ok, res.json(), res]) .then(([ok, dataPromise, res]) => { if (ok) { // If response successful // display success success.style.display = "flex"; form.reset(); } else { // If response unsuccessful // display error message or response status dataPromise.then(data => { errorContainer.style.display = "flex"; errorMessage.innerText = data.message ? data.message : res.statusText; }); } }) .catch(error => { // check for cloudflare error if (error.message === "Failed to fetch") { rateLimit(); return; } // If error caught // display error message if available errorContainer.style.display = "flex"; if (error.message) errorMessage.innerText = error.message; localStorage.setItem("loops-form-timestamp", ''); }) .finally(() => { formInput.style.display = "none"; loadingButton.style.display = "none"; backButton.style.display = "block"; }); } function resetFormHandler(event) { var container = event.target.parentNode; var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); success.style.display = "none"; errorContainer.style.display = "none"; errorMessage.innerText = "Oops! Something went wrong, please try again"; backButton.style.display = "none"; formInput.style.display = "flex"; submitButton.style.display = "flex"; } var formContainers = document.getElementsByClassName( "newsletter-form-container" ); for (var i = 0; i < formContainers.length; i++) { var formContainer = formContainers[i] var handlersAdded = formContainer.classList.contains('newsletter-handlers-added') if (handlersAdded) continue; formContainer .querySelector(".newsletter-form") .addEventListener("submit", submitHandler); formContainer .querySelector(".newsletter-back-button") .addEventListener("click", resetFormHandler); formContainer.classList.add("newsletter-handlers-added"); }

Support my writing!

My writing is entirely reader-supported, so I'd be thrilled if you could drop a coin or two into my tip jar and help ensure its continued existence!Annnnnd I may or may not slip a couple of for-your-eyes-only book bundles under the table as a little thanks ;) You also get access to a constantly-added-to host of stories and scripts and bundles!

Sign up and snag yourself a free copy of Frozen Summer, a speculative horror novel!

function submitHandler(event) { event.preventDefault(); var container = event.target.parentNode; var form = container.querySelector(".newsletter-form"); var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); var loadingButton = container.querySelector(".newsletter-loading-button"); const rateLimit = () => { errorContainer.style.display = "flex"; errorMessage.innerText = "Too many signups, please try again in a little while"; submitButton.style.display = "none"; formInput.style.display = "none"; backButton.style.display = "block"; } // Compare current time with time of previous sign up var time = new Date(); var timestamp = time.valueOf(); var previousTimestamp = localStorage.getItem("loops-form-timestamp"); // If last sign up was less than a minute ago // display error if (previousTimestamp && Number(previousTimestamp) + 60000 > timestamp) { rateLimit(); return; } localStorage.setItem("loops-form-timestamp", timestamp); submitButton.style.display = "none"; loadingButton.style.display = "flex"; var formBody = "userGroup=medium&mailingLists=&email=" + encodeURIComponent(formInput.value); fetch(event.target.action, { method: "POST", body: formBody, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }) .then((res) => [res.ok, res.json(), res]) .then(([ok, dataPromise, res]) => { if (ok) { // If response successful // display success success.style.display = "flex"; form.reset(); } else { // If response unsuccessful // display error message or response status dataPromise.then(data => { errorContainer.style.display = "flex"; errorMessage.innerText = data.message ? data.message : res.statusText; }); } }) .catch(error => { // check for cloudflare error if (error.message === "Failed to fetch") { rateLimit(); return; } // If error caught // display error message if available errorContainer.style.display = "flex"; if (error.message) errorMessage.innerText = error.message; localStorage.setItem("loops-form-timestamp", ''); }) .finally(() => { formInput.style.display = "none"; loadingButton.style.display = "none"; backButton.style.display = "block"; }); } function resetFormHandler(event) { var container = event.target.parentNode; var formInput = container.querySelector(".newsletter-form-input"); var success = container.querySelector(".newsletter-success"); var errorContainer = container.querySelector(".newsletter-error"); var errorMessage = container.querySelector(".newsletter-error-message"); var backButton = container.querySelector(".newsletter-back-button"); var submitButton = container.querySelector(".newsletter-form-button"); success.style.display = "none"; errorContainer.style.display = "none"; errorMessage.innerText = "Oops! Something went wrong, please try again"; backButton.style.display = "none"; formInput.style.display = "flex"; submitButton.style.display = "flex"; } var formContainers = document.getElementsByClassName( "newsletter-form-container" ); for (var i = 0; i < formContainers.length; i++) { var formContainer = formContainers[i] var handlersAdded = formContainer.classList.contains('newsletter-handlers-added') if (handlersAdded) continue; formContainer .querySelector(".newsletter-form") .addEventListener("submit", submitHandler); formContainer .querySelector(".newsletter-back-button") .addEventListener("click", resetFormHandler); formContainer.classList.add("newsletter-handlers-added"); }

Support my writing!

My writing is entirely reader-supported, so I'd be thrilled if you could drop a coin or two into my tip jar and help ensure its continued existence!Annnnnd I may or may not slip a couple of for-your-eyes-only book bundles under the table as a little thanks ;) You also get access to a constantly-added-to host of stories and scripts and bundles!

Check your inbox!

I've sent you a link that'll take you to your exclusive copy of Frozen Summer. I hope you like it, and if you do, I hope you'll consider supporting my writing!My writing is entirely reader-supported, so I'd be thrilled if you sign up as a paid member and help ensure its continued existence!Annnnnd I may or may not slip a couple of for-your-eyes-only book bundles under the table as a little thanks ;) You also get access to a constantly-added-to host of stories and scripts and bundles!

Story Index

Now They Call Me the Plague

As the fright death sweeps the land, leaving a trail of lifeless sacrifices, a Dream desperately claws their way back to the Dreaming, having spent eternity trapped in the conscious realm.Rattled by the victims being left permanently contorted in fear, Trance is on the hunt for an escape more feverously than ever. They stumble across a ship otherwise concealed from prying eyes that sails across the tumultuous currents of Nightmares, and along with Eda, sets sail on adventures of multiple lifetimes, unwittingly getting themselves irreversibly entwined with fates and forces far beyond their comprehension.Now They Call me the Plague is gothic historical fiction set against the backdrop of the golden age of piracy. All that remains to be seen is how many more will fall at the altar of an unforgiving death.


The Crescent of Fools and Forgotten Time

Lucille Carmine is not one to relinquish her hold on someone once her wicked talons have sunk into them, as Jayce all too painfully learns once more. He’s pulled into her employ again, Lott jumping in after his best friend, tasked - under extreme duress, of course - to retrieve The Liminality Paradox.Previously thought to have been nothing more than a bedtime story, Jayce and Lott find themselves unwillingly heading to The Crescent of Fools and Forgotten Time, right into the heart of The Fool’s domain, a place where time and space lose all meaning, where everything that has ever happened is happening all at once and where nothing ever happens all the same. A place where the ends of the universe could be nothing more than a hop, skip, and a jump away, but the five feet in front of you could stretch out to infinity and beyond. A place where the insane rule sovereign and the sane are grinded to a dust, folded into the ripples of the Crescent.All to steal an artifact of untold power for one of the most dangerous overlords of the criminal world, and to lay even more unchecked power at her feet for her to abuse.