Release: Alignment Adjustment (Return to the Otherworld 2)

And here we go again. Return to the Otherworld continues with its second installment, Alignment Adjustment.

Things have changed.

The other world isn’t the same, nor are those whose lives have been touched by it. To truly understand how best to live in this new land, those who came from another must accept that first impressions are not everything. Only by recognizing their mistakes will they have the chance to avoid them in the future.

For the second expedition, readjustment is a necessity. Now that they have begun to dive deeper into the cultural waters of this world, they can no longer deny their place in it. Some may not like that place. Some may struggle with the preconceived notions of their new neighbors, their friends and lovers. But even that forces them into the mold they so desperately wish to escape.

Not a lot happens in this one, I’ll admit. It’s more getting things set up, moving people around, and a lot of character interaction. The expedition was gone for nearly a year, after all. It’ll take time to get back in the saddle.

As ever, Otherworld stories are Patreon exclusives for the time being. That means you can head on over to my Patreon and pick up Alignment Adjustment for a pledge of $3/month. And the list of things you can get for that low price keeps on growing.

Coming up next is Part 3 of the series, Waters Rising. Look for it soon, and remember to keep reading!

Milestone

Sometimes, I wonder if I should even be alive today.

Those aren’t the words of someone who has lived through tragedy, who overcame adversity he initially thought too much to bear. No, they’re the common refrain of survivors’ guilt, and they stem from a very pivotal moment in my life.

A little over five years ago, my cousin died. Joey was 35, and I saw him as a big brother. And I do mean big. He was 6’5″, and he weighed over 400 pounds—the latter most certainly contributed to his death in the opening days of 2014. Today, March 15, is the day when my current age will match that which he attained, and the last years (coinciding with my best writing output) have often seen me question whether I am worthy of that. He was the better man, in my opinion, so why should I be the one who keeps on living?

I know that’s the wrong way to think about it. I really do. Deep in my mind, I recognize the fallacy, yet my emotional side comes out, and…well, that’s my problem. Depression, as J.K. Rowling so eloquently said it, is the “absence of being able to envisage that you will ever be cheerful again. The absence of hope.” A “very deadened feeling.” And I understand those words perfectly.

A lot has happened to me over the past year. Some things I never imagined, some places my mind has never truly explored. I don’t like all of them, and there are a few thoughts, a few words, a few actions I wish I could take back. My mental state has taken a toll on my own health, as well as my relationship with my family. That, for me, is the worst. As I state in the acknowledgments of all my books, family comes first. In my opinion, that is the only right way to look at the world. If we forsake our family, then who are we?

They don’t make it easy, I’ll admit. Too many members of my family are Trump fanatics. Not merely Republicans, or conservatives, but the kind who see through glasses tinted by one man’s verbal wanderings. While I’m far from liberal on many issues, I have been tarred with that brush on repeated occasions. Here in the South, in a rural part of Tennessee, “liberal” is a dirty word. A political slur, rather than a racial one. Like any epithet spoken in anger, it hurts, and that hurt piles on top of the ones I already endure. But I can forgive. I must, to be the man I want to be. Family comes first.

One of my larger problems is that, in a lot of cases, there’s nobody else on the list after them. Since last May, I’ve managed to come out of my shell a bit, but I remain incredibly introverted. Nearly 800 posts on the fediverse (@mikey@toot.love, if you’re wondering) don’t change that. The three and a half months I spent trading texts with a woman I met online don’t change that. It’s part of my nature, as surely as my intelligence, rationality, and, apparently, depression.

To keep the darkness at bay, I write. Since I first reached the deepest depths, I’ve become a bit of a machine. Five stories done in 2015, eight (I think) in ’16. Twenty completed in 2017. I’ve written about three million words since my cousin’s passing, because I really don’t have any other creative outlets. Nor do I have a vent for my frustrations, my rage at the injustice of a world that would take away one of the most important people in my life.

I write. And in that writing, I tell my own story. Not for nothing are some of my favorite characters like me. Shade, protagonist of Nocturne, embodies my idealism, my personal disdain for extremism. Lucas, the character from my free novella “Fallen”, is my inner skeptic. And it seems like all my works have an intelligent, insecure man who really just wants to get away from it all. Alex in the Otherworld series, Asho in the Hidden Hills books, Porter in The Linear Cycle…the list goes on, and it probably will as long as I continue down this path. “Write what you know,” the advice goes, and I have taken that lesson to heart.

Can I change? I honestly don’t know. I’ve tried, and I’ve seen rays of sunlight pierce the darkness. For the second half of last year, I wrote far less than in the prior six months; this I owe to the influence of the woman I mentioned earlier. At no other time in my adult life had anyone ever confessed genuine interest in me, and…that made me feel good. It blew away the dark clouds for a time.

But the end of that time left me sinking further. Barely two months ago, I seriously questioned the purpose of continuing in this world. In the end, though, I did find one: family. Because family comes first.

If this stream of consciousness is hard to read, don’t worry. It was hard to write, too. But I needed to get these words out there, if only so there would be a record outside my own mind of what I’m going through. It’s why I write. It’s why I keep going. At this point, I don’t care if anyone ever reads my stories, or subscribes to my Patreon, or buys the books I submit to Amazon. The stories exist. They’re my escape, my salvation. When I’m writing, I can forget all the bad things in my life. I forget the good, too, but there’s never enough of that.

My hope, though, is that today will mark a change, in outlook if not in fortune. I have reached a milestone, and now I enter an uncharted phase of my life. The past is the past, the future unknown. For now, I look to the present, to each new day as it comes. Maybe that’ll work.

Thank you.

Themis Dev Diary #3

This will be a much quicker post than the last two, and there’s a very good reason for that. You see, I’ve never implemented a spec before. ActivityPub isn’t the easiest, from what I can tell, and it’s exposed quite a few…deficiencies in my design for Themis. So, at the moment, I’m spinning my wheels a bit.

The crux of the issue is the way the spec expects me to communicate. ActivityPub uses activities for that (duh). These are objects with a number of properties, one of which is an ID. These have to be globally unique, and the easiest way to do that is to tie them to the originating server. So the server at example.com, for instance, can make IDs of the form example.com/activity/1234: the last number is different for each new activity, and it probably comes from the autogenerated database key. (An alternative is UUIDs, which I use elsewhere in Themis. Flake IDs—what Pleroma uses—are another option, if you’re looking for something that can be sorted chronologically, which is required by certain parts of the spec.)

So far, not so bad. But the AP spec wants these IDs to be URIs. And that means I have to format them properly. The problem is, a URI has a few necessary components. I have to account for subdomains, for instance. And the difference between HTTP and HTTPS, because somebody might use the former (I am for my dev instance, so why not?). Let’s not forget nonstandard ports, either. Listening on 80 or 443 requires root privileges on Linux, and NestJS defaults to 3000.

Putting all that together proves that my initial idea of just storing an origin host name alongside the names of groups and users is, to put it mildly, inadequate. Yesterday, I added a new Server object, which will store every part of a URI except the path. Hopefully, that’ll be enough to make ID generation a lot easier. And let’s also hope I don’t break too much in the process.

Anyway, once I get that done, I’m thinking the rest of ActivityPub will be relatively simple. Not easy, mind you, but I actually have made some progress on implementing the client-to-server portion of the spec, which is something even Mastodon isn’t doing. Give me a few more weeks, and I think I’ll be ready for Alpha 6. Until then, keep your fingers crossed that I don’t screw this up too much.

🖼🗣 : the emoji conlang, part 4

🖼🗣 is becoming quite the little language. In the first three parts, you saw the basic outline of how we can take the wide array of emoji characters available in Unicode and contort them into a hieroglyphic script for modern times. Now, we’ll take another step by looking into the many ways in which we can construct new words from the building blocks we’ve been given.

Derivation

First of all, we need to make a distinction between the two different types of combining we can do. Derivation is mostly a grammatical process; it turns nouns into verbs, for example. Almost all languages have at least some derivational processes, and they tend to fall into a few major categories. 🖼🗣 is no exception, so we’ll look at these now. Later, we’ll turn to compounding, where we take individual words and combine them to create something new.

All of the script’s derivations are suffixes. We’ve already met a few, but here’s a complete list. (Note that tense markers, the plural and singular markers, and others like those are considered inflectional, so they’re not listed here.)

  • 〰 – This sign converts a word into an adjective. Usually, it’s a “quality” adjective: a 🧒 (child) is young, so 🧒〰 means “young”.

  • ▪ – This sign forms diminutives. These are “small” forms of words (typically nouns or adjectives) that indicate a lesser degree or amount: 🏙 “city” becomes 🏙▪ “town”, and ❄ “cold” turns into ❄▪ “chilly”.

  • ◼ – This sign changes an adjective or verb into a noun representing something to do with them. So we might turn 🍴 “to eat” into 🍴◼ “meal”, because a meal is something you eat.

  • ⬛ – The opposite of ▪, this sign creates superlative or augmentative forms. Linguistically, those are two different things, but they both pertain to an increase of a quality. With adjectives, ⬛ forms a superlative: 💪 “strong” becomes 💪⬛ “strongest”; this is really an inflection rather than a derivation. When used on a noun, however, the connotation is slightly different: 🌧 “rain” can become 🌧⬛ “torrent, flood”.

  • 🔻 – This marks a negative or inverse connotation. Usually, there’s already another word available, but using this suffix means you’re focusing on what something is not. An example might be 👍 “good” becoming 👍🔻 “not good”. It’s not quite the same as 👎 “bad”, but it’s close.

  • 🔺 – This is the counterpart to 🔻. It marks a positive connotation, which you may think has little use, but it can also function as an intensifier, a bit like “definitely” or (in colloquial speech) “literally” in English.

  • ➡ – As we have seen in previous parts, this forms verbs from other words. No examples needed here, because you should already get the gist.

These are the main derivations in 🖼🗣. Others do exist, but they have more specialized meanings, and they’re probably better analyzed as compounds, which we’ll get to right now.

Compounding

Most vocabulary in the script is formed by compounding. This process, much more general (yet also a bit more idiosyncratic) than derivation, allows us to express essentially any concept through a combination of 🖼🗣 symbols. The rules are a little involved, so pay close attention.

General compounding rules
  1. Any lexical symbol can be used in a compound. Those with a purely grammatical function (such as the derivational affixes above) aren’t allowed, except in very specific circumstances. (These form what’s called a closed class of words, and they don’t really concern us here.)

  2. The minimum number of symbols is 2, but the only upper limit is imagination. Realistically, however, most compounds will have at most 4 symbols.

  3. One element of the compound is the head, while the rest are considered modifiers. (Linguists note that the head element isn’t necessarily the semantic head, but it usually is.)

  4. The head determines the part of speech of the compound. Thus, compounds with heads that are nouns will be nouns themselves.

  5. Verb compounds are head-initial, while all others are head-final.

Noun-noun compounds

Compounds of multiple nouns are probably the easiest to understand. Almost all of them tend to denote specificity. In other words, the modifiers define a specific type of the noun represented by the head. We’ve already seen 🐕🏠 “doghouse”, for instance, but here are a few more:

  • 🐦🛁, “birdbath”
  • 🚲🛣, “bike path”
  • ✋🔫, “handgun”
  • 📰📄, “newspaper”

Simple enough, right? These are mostly English-oriented, but the same principles are common across many languages.

Adjective-noun compounds

These are almost the same as the noun-noun compounds above, but the modifier is an adjective instead:

  • 💨🛣, “fast lane”
  • ♨🛁, “hot tub”
  • 🤓☎, “smartphone”

Again, there’s not much to it.

Adjective-headed compounds

When an adjective is the head, the modifiers shift the base meaning toward their own. It’s a little hard to explain in prose, so we’ll try a few examples instead:

  • 🌹🔴, “rose red”
  • 🏛👴, “ancient”
  • 👿🖤, “devilish”

Unlike nominal compounds, these are often less transparent, but that’s okay.

Verb-headed compounds

Verbal compounds are the hardest. For one thing, they’re “inverted”, with the head coming first. For another, pinning down their meaning isn’t easy. In general, more active verbs tend to form compounds whose meanings are related to the head, while “static” verbs function a lot more like adjectives.

  • 🏃💨, “sprint”
  • 🤝💬, “introduce”
  • 👐🆓, “donate”

Moving on

Part 5 of this series will be a chance to pause and take stock. Instead of grammar and word-building, I’ll provide a lot more vocabulary, roots and compounds alike. I hope to see you then!

Themis Dev Diary #2

It’s been a few weeks, and this project of mine is still moving along. Maybe not as fast as I would like, but I am making progress. Since the last post, I’ve spent much of my coding time working on what I consider the biggest feature of Themis: filtering. Here, I want to talk a little bit about what I mean, and why it’s so important.

My computer, my rules

Today, essentially every discussion platform is moderated. What that means depends on the place, but let’s boil it down to its essence. Moderation is censorship, plain and simple. Sometimes it’s necessary, sometimes it serves a purpose, but a moderated community is one that has decided, either by collective choice or external fiat, to disallow certain topics. More importantly, the administrators of the platform (or their anointed assistants) have the power to remove such content, often without debate or repercussion.

Removing the users that post the prohibited content is the next step. If online communities were physical, such suspensions would be the equivalent of banishment. But a much larger site like Facebook or Twitter, so integrated into the fabric of our society, should be held to a higher standard. When so much in our lives exists only in these walled-off places, banning is, in fact, more akin to a death sentence.

It is my strong belief that none of this is necessary. Except in the most extreme cases—automated spamming, hacking attempts, or illegal content that disrupts the infrastructure of the site—there really isn’t a reason to completely bar someone from a place simply because of what others might think. Themis is modeled on Usenet, and Usenet didn’t have bans. True, your account on a specific server could be locked, but you could always make a new one somewhere else, yet retain the ability to communicate with the same set of people.

This is where Facebook, et al., fail by design. Facebook users can only talk to each other. You can’t post on Twitter timelines unless you have a Twitter account. On the other hand, the “fediverse” meta-platform of Mastodon, Pleroma, etc., returns to us this ability. It’s not perfect, but it’s there, which is more than we can say for traditional social media.

Out of sight, out of mind

But, you may be thinking, isn’t that bad? If nobody wants to see, say, propaganda from white supremacists in their discussions, then how is discussion better served by allowing those who would post that content to do so?

The answer is simple: because some people might want to see that. And because what is socially acceptable today may become verboten tomorrow. Times change, but the public square is timeless. As the purpose of Themis is to create an online public space, a place where all discussion is welcome, it must adhere to the well-known standards of the square.

This is where filtering comes in. Rather than give the power of life and death over content to administrators and moderators, I seek to place it back where it belongs: in the hands of the users. Many sites already allow blocklists, muting, and other simple filters, but Themis aims to do more.

Again, I must bring up the analogy of Usenet. The NNTP protocol itself has no provisions for filtering. Servers can drop or remove messages if they like, but this happens behind the scenes. Instead, users shape their own individual experiences through robust filtering mechanisms. The killfile is the simplest: a poster goes in, and all his posts are hidden from view. Most newsreader software supports this most basic weapon in our arsenal.

Others go the extra mile. The newsreader slrn, for instance, offers a complex scoring system. Different qualities of a post (sender, subject text, and so on) can be assigned a value, with the post itself earning a score that is the sum of all filters that affect it. Then, the software can be configured to show only those posts that meet a given threshold. In this way, everything a user doesn’t want to see is invisible, unless it has enough “good” in it to rise above the rest. Because there are diamonds in the rough.

Plans

The score system works, but it’s pretty hard to get into. So, by default, Themis won’t have it. But that doesn’t mean you can’t use it. The platform I’m building will be extensible. It will allow alternative clients, not just the one I’m making. Thus, somebody out there (maybe even me, once I have time) can create something that rivals slrn and those other newsreaders with scoring features.

But the basics have to be there. At the moment, that means two things. First is an option to allow a user to “mute” groups and posters. This does about what you’d expect. On the main group list (the first step in reading on Themis), muted groups will not be shown. In the conversation panel, posts by muted users will not be shown, instead replaced by a marker that indicates their absence. In the future, you’ll have the option to show these despite the blocks.

Second is the stronger filtering system, which appears in Alpha 4 at its most rudimentary stage. Again, groups and users can be filtered (posts themselves will come a little later), and the criteria include names, servers, and profile information. As of right now, it’s mostly simple string filtering, plus a regex option for more advanced users. More will come in time, so stay tuned.

In closing

This is why I started the project in the first place, and I hope you understand my reasoning. I do believe that open discussion is necessary, and that we can’t have that without, well, openness. By placing the bulk of the power back in the hands of the users, granting them the ability to create their own “filter bubbles” instead of imposing our own upon them, I think it’s possible. I think we can get past the idea that moderators, with all their foibles and imperfections, are an absolute necessity for an online forum. The result doesn’t have to be the anarchy of 4chan or Voat. We can have serious, civil conversations without being told how to have them. Hopefully, Themis will prove that.

Release: The Second Crossing (Return to the Otherworld 1)

It’s a new year, and that means it’s time for a new season in the Otherworld. 2019 brings Return to the Otherworld, a new eight-part series following the further adventures of those who have visited this strange land, those who stayed behind a year ago, and the new faces seeking their first opportunity to glimpse the alien world for themselves.

Opening up this time is The Second Crossing:

A year ago, eleven college students stumbled into another world by virtue of an accident. An unforeseen, yet ultimately beneficial, accident. Now, they plan to return, this time with purpose.

New faces will join them. Old friends will welcome them. Enemies will show themselves. And the second crossing will test this expedition in ways they never anticipated. What new discoveries await? What new dangers lurk on the other side of the strange, inexplicable portal between worlds?

None can say, but the students and their companions know one thing for sure: they must return to the other world.

It’s going to be a fun ride, and you can see it all through the year over at my Patreon. All I ask is a simple pledge of $3/month, which gets you access to Return to the Otherworld and the previous series, as well as much more. How can you go wrong?

Look for Alignment Adjustment in six weeks. Until then, have fun and keep reading!

Release: Beyond the Horizon (Orphans of the Stars 2)

Let’s get back to space. Back to the future, even.

They were lost, but they found themselves. Now, they will find a piece of their past that brings about a new chapter in humanity’s future.

Seventeen children inherited a ship, a mission, a legacy. Few among them truly understand what it means to be an officer, an engineer, or a medic. Youth is bold, however, bold and adventurous. Thus, the immature crew of the Innocence yet believe they know what they are doing. They believe they can navigate not only the endless void of space, but also the turbulent waters of life, a life marked by their shared history.

Something lurks out among the stars. Something turned these young people into orphans, into the last survivors of Marshall Colony. Only they have seen the truth and lived to speak of it. Only they are prepared to find what lies beyond the horizon.

I was really excited when I released Innocence Reborn last year. Rarely have I ever felt so good about a book, like it had so much promise. Maybe I consider Nocturne my best work, but Innocence Reborn was by far the most fun.

That’s all I ask from the Orphans of the Stars series. It’s my chance to have fun, to show that space opera and science fiction can still be fun. Whatever you think about our future, the one I’ve created in these books is bright. In my darker times, it’s one of the few lights that shines through. In better days, it outshines the sun.

You can head on over to my Patreon if you want to check this one out. It’s currently in the Serious Reader tier, which requires only a monthly pledge of $3. A cup of coffee, a small meal, or the future. It’s your choice.

And, in case you’re wondering, I’m already planning out Part 3 of Orphans of the Stars, tentatively titled Time in the Sun. Keep watching this space for more info on that.

🖼🗣 : the emoji conlang, part 3

As we have seen, 🖼🗣 is perfectly capable of writing simple sentences using nothing but emoji along with standard English punctuation. In this post, we’ll delve a little deeper into the script, focusing first on verbs.

Preliminaries

Before we get started, let’s add in a few more simple words. All of these are verbs that represent actions, and I’ve tried to choose those best suited to “dynamic” phrasing.

  • 🛬 – to come
  • 💃 – to dance
  • ✈ – to fly
  • 🛫 – to go
  • 👊 – to hit
  • 🤗 – to hug
  • 😆 – to laugh
  • ⛹ – to play
  • 🏃 – to run
  • 💺 – to sit
  • 🏊 – to swim
  • 💼 – to work
  • ✍ – to write
  • 🔥➡ – to burn
  • 🚗➡ – to drive
  • 💕➡ – to love

Of course, most nouns can be “verbalized” by adding the ➡ suffix. In most cases, the resulting word can be interpreted in one of two ways. It’s either an action that uses the root noun (e.g., you drive a car), or one that is caused by the root (fire burns).

Adjectives can also take ➡, but their meaning is a lot simpler. Most of the time, the verb created is one that represents being in a specific state. Thus, 😃➡ translates as “to be happy”. Those are far more regular than verbs derived from nouns, but not nearly as flashy, so we don’t really need a list yet.

The usual suspects

🖼🗣 verbs express actions. As in English, they can also express when an action occurs. In other words, verbs have tense.

You’re probably expecting a table showing the different tenses in the script, because that’s what most language-learning texts offer right about now. But hold on just a minute. This is a little different. We don’t just have a simple three-way distinction, because 🖼🗣 combines tense and the linguistic notion of aspect into a single marker. So let’s slow down and take these things one at a time, since they can trip you up if you’re not careful.

First off, the present tense is simply the lack of any other marker. It’s the default. (Linguists can argue the point that non-finite verbs are also unmarked, but we’ll ignore them.) Also, the present tense here is best interpreted as the “imperfective” or “progressive” kind. That’s more in line with typical English speech, which is what 🖼🗣 tries to follow. Thus, a phrase like ♂ ✍ should read as “he is writing” rather than “he writes”. Obviously, that’s not set in stone, but it’s a good rule of thumb.

Next up, we have your basic past and future tenses. These are ◀ and ▶, respectively, and it’s not hard to get the symbolism. As opposed to the present, you can assume both of these are “perfective” by default: ♂ ✍◀ “he wrote”, ♂ ✍▶ “he will write”.

Here’s where it gets tricky. If you’re familiar with both English and Romance languages such as French or Spanish, you’ll also know the perfect tenses. They’re the “have” forms of an English verb, or the separate conjugations in Latin, or however you like to look at them. They’re hard to explain without resorting to linguistic nastiness, so I’ll keep it simple. A verb in a perfect tense refers to an action that took place before the time it’s talking about. It talks about something that, from the point of view of the verb, has already finished.

For 🖼🗣, we’ve got a trio of perfect markers. Each simple tense has a corresponding perfect form, and they look similar enough to the basics that you can almost imagine they fit. ⏯ marks the present perfect (“he has written”), ⏮ the past perfect (“he had written”), and ⏭ the future perfect (“he will have written”).

Last are two linguistic aspects that English doesn’t mark in a simple way. Other languages do, however, and two emoji perfectly fit the bill for them. Rather than use the technical terms, I’ll describe them more informally. ⏺ marks an action that is beginning (“he is starting to write”), while ⏹ says that an action is ending (“he isn’t writing anymore”). As you can see, these aren’t easy to translate, but the concepts aren’t too hard to grasp.

Combining the tense and aspect markers works just fine. You can use one of each, and the order doesn’t matter. Add in the adverb 🚫 “not”, and you can express some fairly complex ideas in just a few symbols. 🤳 🚫 ✍⏭⏹ “I will not have stopped writing”. Wow.

Back to pronouns

About that last example, though. You’ll notice I used 🤳 as the first-person pronoun. Last time, as you may recall, I mentioned that this is an acceptable substitute, and now it’s time to explain why.

Any 🖼🗣 pronoun can take 🤳 as a suffix meaning “-self”. (Get it? Because it’s a selfie.) Most of the time, you’d use this as the object of a phrase: ♀ 👀 ♀🤳 “she sees herself”. But that’s a little repetitive, so there are other ways. Placing this “reflexive” pronoun as the subject lets you say the same thing in a more concise way: ♀🤳 👀.

So far, so good. But the other meaning for 🤳 is as an “intensifier”. Those of you who know Spanish may recall that subject pronouns are optional in that language. Indeed, using them regularly is one of the hallmarks of beginner speakers. But when they do appear, it’s usually to indicate emphasis. In effect, they say that I’m doing this, not somebody else.

While our emoji script doesn’t allow omitting most pronouns, the emphatic use of 🤳 works just fine. And that’s our loophole to let us use 🤳 as an acceptable alternative to 👁️‍🗨. Language geeks rejoice.

We’ve also got a few other pronouns to cover before we go. These are the indefinite sort, and they’re all formed as compounds using 🔳 “some”. Thus, you have the following:

  • 🔳◻ – something
  • 🔳👤 – someone/somebody
  • 🔳📍 – somewhere
  • 🔳⌛ – sometime
  • 🔳〰◼ – somehow

Moving forward

So that about wraps it up for this one. Next time around, I promise we’ll get more into making actual sentences. We’ll also go a little deeper into what makes up words, including some of the more regular compounding constructions. 👀▶ 💮 🔜!

Themis Dev Diary #1

Yesterday, I quietly released the second alpha of my current long-term software project, Themis. For the moment, you can check out the code on my Github, which has returned to life after lying dormant for three years. I’m developing this one in the open, in full view of all the critics I know are lurking out there, and I’ll be updating you on my progress with dev diaries like this one.

The Project

First off, what is Themis? Well, it’s hard to explain, but I’ll give it a shot. What I mainly want to create with this project is a kind of successor to Usenet.

We have a lot of discussion platforms nowadays. There’s really no shortage of them. You’ve got proprietary systems like Facebook, Twitter, and Disqus; old-school web forums such as vBulletin, XenForo, and the more modern NodeBB; open, federated services like Mastodon and Pleroma; and the travesty known as Discourse. No matter what you’re looking for, you have options.

Unless you want the freedom, the simplicity, and the structure Usenet brought to discussions so long ago. That’s what Themis aims to recapture. My goal is to make something that anyone can install, effectively creating their own node (instance, in Mastodon parlance) that connects (federates) with all the others.

So far, that’s not too different from most of the “fediverse” platforms, but here’s the kicker. While Mastodon, Pleroma, GNU Social, and Misskey all focus on a flat, linear timeline in the vein of Twitter, Themis will use a threaded model more akin to newsgroups. Or Reddit, if you prefer. (Yes, there’s Prismo as the federated counter to Reddit, but bear with me.)

Also, while the current drama on most any platform is about banning, filtering, and censorship, I want to make Themis a place where speech is free by default. Rather than hand all the power to server admins, who can implement blocklists, filter policies, etc., Themis is going to be focused on user-guided filtering. If you don’t want to see what a certain user says, then you block that user. If you don’t like a specific topic, you can hide any threads where it’s discussed. And so on.

In my opinion, that’s a more viable model for open discussion. Rather than skirt around sensitive topics out of the fear of “deplatforming”, we assume that users are adults, that they have the maturity to know what they like and don’t like. The filtering system will need to be robust, powerful, and precise, but the key is that every part of it will be in the user’s hands. Yes, admins will still have the ability to ban problematic users (only on their server, of course) and remove posts that may violate laws or rules, but these should be the exception, not the rule.

Also, Themis is group-oriented. Every post falls into at least one group (crossposting isn’t implemented yet, but I’m getting there), and every group contains a set of threads. This will also fall into the filtering system, and here’s a place where admins can steer the discussion. A “tech” group on example.social, for instance, would follow the rules of that server, and it might have an entirely different “feel” to the tech group on themis-is-awesome.tld. Configuration will allow admins to make groups intended only for local users, or invite-only, or moderated in the classic “all posts must be approved” style.

Where we are now

At the moment, most of this is a distant dream. I won’t lie about that. Themis is at a very early alpha stage, and there’s a lot of work left to even get it feature-complete, much less in a state worthy of release. To make matters worse, I’m not entirely sure how possible it is. I’m working alone, and I’m not the best programmer out there.

I’m giving it a shot, though. In only six weeks, I’ve gone from nothing more than a skeleton app in a framework I’d never even used to something that actually runs (albeit only on localhost). As of the 0.0.2 release, you can create an account, log in, view posts, add new ones, and reply to existing ones. The group creation functionality isn’t there yet, authentication is…haphazard at best, and the admin section is next to nonexistent. But that’s what alphas are for. They’re for getting all these pieces into place, even if there are a lot more of those pieces than you first anticipated.

What’s next

As I said, Themis isn’t even close to beta yet. I’ll likely put out quite a few more alphas in the coming weeks. The third release, if all goes well, will add in an admin control panel, plus the necessary scaffolding for site settings, preferences, and other configuration stuff. Alpha 4, in my vague mental outline, will fix up the posting functionality. Future milestones include group creation, filtering (a big one!), network optimization, and so on.

The beta releases, assuming I make it there, are all about getting Themis where I want it to be. That’s when I plan to start adding in federation, even better filtering, ActivityPub support, and an NNTP gateway, among others. (In case you’re wondering, I don’t have the slightest idea how to do half of that. And here I thought I’d be reading fiction in 2019! Nope, looks like specs instead.)

In my wildest dreams, all this somehow works out, and I can make a stable 1.0 release on October 1st. Stay tuned to see how that pans out.

If you want to help with Themis, or just take a look at it, check it out here. For the techies out there, it’s written in Typescript, using NestJS for the back end, Vue for the interface, TypeORM as a database abstraction layer, Axios for HTTP, Passport and JWT for authentication, and a whole bunch of other libraries I can’t remember right now. The project is entirely open source, under the MIT license (not AGPL, as so many other fediverse projects are), and I promise I’ll take a look at all serious suggestions, issues, bug reports, and advice.

Whatever the future holds, I’ll call this venture well worth it. Maybe I’ll burn out and fade away. Maybe I’ll change the world as much as Gargron and Lain are doing. I don’t care what the outcome is. I’ve found a passion, and this is it.

2018: a recap

So it’s another year in the books. 2018 is ending, and I think that’s something we can all be thankful for. No matter what you believe, no matter where you live, no matter who you are, this one’s been a wild ride. For me, that’s especially true. I’ve done a lot this year that I didn’t think I’d ever do, and you can probably figure out some of that by reading between the lines on my posts the past few months.

But now we have to look forward to 2019, the year of the future. (Seriously. Blade Runner is set in 2019. PKD couldn’t write some of what’s happened in real life lately, though.) Other places can give you some idea of what to expect in the wider world, but this post will let you know what it means for me.

First off, my main resolution for the coming year is to finish all the stories on my list. To start, that’s 6 Otherworld “bridge” novellas, which shouldn’t be too much of a problem. (I sometimes wonder if I could write one in my sleep. The way the words come to me when the mood is right, it’s not that far-fetched.) On top of those, I’ve got a pair in the Modern Minds series, Orphans of the Stars #3 (tentative title: Time in the Sun), Endless Forms #3 (confirmed title: Change of Heart), and a Nanowrimo story to be named later. All told, expect about 500,000 words of output on that front.

That’s about half of what I wrote in 2018, and an even smaller fraction of my massive 2017 output. Why the steep drop? Because I’ve got other projects I’m working on right now, most of which have little to do with writing. As they tie in to what the new year means for Prose Poetry Code, I’ll deal with all of it together.

If you’ve noticed the last few weeks, I’m working on a new conlang. Well, it’s not technically a conlang. More of a conscript, you might call it. Earlier in the year, I asked myself whether I could make a hieroglyphic or ideographic script using only emoji. The answer can be found in the 🖼🗣 or “Pictalk” series, which I’ll be extending throughout 2019, mostly at 5-week intervals.

That’s a side project, as language work tends to be for me. My “day” job, I hope, will involve programming. (I’m looking for work, and I’ve already signed up for at least one freelancing site.) That’s right. It’s time to put the “code” back in Prose Poetry Code. While I’m working on what I’m calling Project Themis, I’ll add in a dev diary every now and then. Don’t expect these to be regular—I’m not that dedicated. But this is a project I’m really passionate about right now, one I hope I can get into a stable state very soon. If all goes well (don’t count on it), I want a full 1.0 release on October 1st.

The more sporadic “whatever I feel like writing” posts will still be here, but not nearly as common. Maybe one a month, if that. Mostly, what you’ll see here in 2019 are those two series and release announcements. Unless I hit it big, of course. In that case, I’ll have a lot more free time.

Whatever the new year brings, I hope you all enjoy it, and I hope it turns out great for everyone. Just remember one thing: keep reading!