<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>The Hierophant Chronicle</title>
    <id>https://www.thehierophant.world/blog/</id>
    <updated>2025-12-21T00:00:00.000Z</updated>
    <link rel="self" href="https://www.thehierophant.world/blog/feed.xml"/>
    <link rel="alternate" href="https://www.thehierophant.world/blog/"/>
    <author>
        <name>James Tomasino</name>
    </author>
    <generator>Eleventy</generator>
    <entry>
        <title>Language Lab</title>
        <id>https://www.thehierophant.world/blog/language-lab/</id>
        <link href="https://www.thehierophant.world/blog/language-lab/"/>
        <updated>2025-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Notes from building a language lab to generate names and words that are internally consistent, historically grounded, and add depth and immersion to a fictional world.]]></summary>
        <content type="html"><![CDATA[<p>I have been slowly building a language tool that behaves like a working
linguistics system. The goals are realism and traceability. I want to be able to
explain why a word looks the way it does, which structures are allowed, and how
a modern word emerges from older stages through explicit change.</p>
<p>This is a walkthrough of how the pipeline is currently structured.</p>
<script src="https://asciinema.org/a/mv8ToVOigeRNDgiJlBb3PXt7N.js" id="asciicast-mv8ToVOigeRNDgiJlBb3PXt7N" async="true"></script>
<h2>Data layout</h2>
<p>Language data lives here in this website repository, not in the language lab
tool itself. The tool runs loads these data sets when it starts up, centralizing
my language data here for future features (e.g., a glossary, a fan name
generator).</p>
<p>What's in that data? At a high level:</p>
<ul>
<li>A manifest declares which languages exist and where their files live.</li>
<li>Each language has its own profile and lexicon.</li>
<li>Optional layers include eras, dialects, and <em>ontology</em> overlays. These overlays
describe how concepts relate to one another, so the system can reason about
meaning instead of relying only on literal word matches.</li>
</ul>
<p>That structure forces discipline. If the generator produces something incorrect,
the fix usually belongs in the data rather than in the generation logic. It also
means, theoretically, the tooling gets better the more data I can shove into it.
That takes some of the pressure off of me to build our grammatical or lexical
rules like I'm Tolkein. I'm really not good at languages, so this is my
programming cheat code.</p>
<h2>The pipeline</h2>
<p>The pipeline is a sequence of constrained choices. As we move through each
stage, it reduces the space of valid outputs before the next decision is made.
We sort of narrow-in on a valid word form rather than generate it.</p>
<h3>1) Language, dialect, era</h3>
<p>The first step selects a language, an optional dialect (only when the language
declares dialects), and an era. So far I have 1 language (Thalen), 2 dialects
(Upper Thalen and Southern Thalen), and 3 eras (Ancient, Old, &amp; Modern).</p>
<p>Those choices determine:</p>
<ul>
<li><strong>phonology and phonotactics</strong>, the sounds the language uses and the rules
that govern how those sounds can legally combine</li>
<li><strong>morphology templates and constraints</strong>, the patterns used to assemble words
from smaller pieces, and the limits on which patterns are allowed</li>
<li><strong>sound change rules applied across an era chain</strong>, a list of transformations
that gradually alter pronunciation over time</li>
<li><strong>dialect specific overrides and affixes</strong>, local adjustments that reflect
regional speech or cultural variation</li>
</ul>
<p><em>(No, I didn't know most of these terms before I started this process. This is
what search engines are for!)</em></p>
<p>Era selection matters because forms are evolved forward through declared
changes. A modern output is the result of applying those changes in order, not
a fresh construction. This is my digital eTolkein methodology.</p>
<h3>2) Purpose and name classification</h3>
<p>Next comes the purpose of the word: name, place, thing, or abstract concept.</p>
<p>Names are further split into personal and family forms, since those tend to
follow different structural conventions. This choice controls which morphology
templates are allowed and which roots are filtered out. For example, roots
associated with institutions or collectives are excluded from family names
unless explicitly requested. <em>In early test all my families ended up being called
&quot;Clanguy&quot; and the like. Not great.</em></p>
<p>This step establishes expectations early so later stages are operating within
a compatible structure.</p>
<h3>3) Register, contact, orthography</h3>
<p>These are modeled as separate layers because they affect different aspects of
the output word.</p>
<ul>
<li><strong>Register</strong> represents social tone, influencing whether more formal or
everyday vocabulary is preferred</li>
<li><strong>Contact</strong> models influence from other languages, allowing borrowing rules to
activate when cultures interact. I expect this will have a greater effect as
I add new languages to the models, but I need to research more on how these
influences work: root borrowing, sound shifts, etc.</li>
<li><strong>Orthography</strong> controls how a word is written, converting an internal sound
representation into a visible spelling</li>
</ul>
<p>Keeping these layers separate allows the same underlying word to appear
differently in different contexts without changing its core structure.</p>
<h3>4) Intent and semantic grounding</h3>
<p>Intent acts as the semantic input, essentially a short description of what the
word is meant to convey.</p>
<p>The lab breaks that intent into tags, then expands those tags through an
ontology. The ontology is a network of related ideas that allows the system to
connect concepts that are close in meaning even if they are not identical.</p>
<p><em>This has been the biggest time sink in the project, and seems to have the
greatest degree of impact on the quality of the generated words. I don't think
my work here will be done for some time to come.</em></p>
<p>Roots are then scored based on how well they match those expanded tags. Matches
can occur through:</p>
<ul>
<li><strong>root identifiers</strong>, the internal labels used to track meaning</li>
<li><strong>tags</strong>, short semantic labels attached to roots</li>
<li><strong>gloss text</strong>, which is a plain-language description of what a root means,
similar to a dictionary definition</li>
</ul>
<p>Using gloss text allows the system to catch softer matches where terminology
differs but meaning overlaps. For example, “healing” can connect to “medicine,”
and “footprints” can connect to “trail,” even if those exact words are not
present in the prompt. I've been scanning thesauruses to help out here.</p>
<p>A secondary bias layer exists for culture specific themes, but it only activates
when literal intent fails to produce matches. This prevents local flavor from
overwhelming explicit prompts <em>(an early failure mode)</em>.</p>
<h3>5) Root selection with multi tag coverage</h3>
<p>When an intent contains multiple strong tags, selection favors coverage rather
than repetition. This sounds obvious, but the code didn't think so at first.
&quot;Fast-fast-fast-mcgee&quot; is not a good pattern for a name, it turns out.</p>
<p>If three or more tags score highly, the generator prefers templates that support
multi-root compounds. Roots are chosen to represent different aspects of the
intent before reinforcing a single dominant meaning.</p>
<p>This allows complex prompts to resolve into structured compounds instead of
collapsing into a repeated theme.</p>
<p>That sounds very fancy, but it just means I have a bit more variety in the
outputs that come through. If I give a long phrase for the meaning of a word
then some of the options that generate will probably be longer to try and
encompass all those ideas. I'm building it with a range of outputs though so
even when I get long versions some of the options will focus on the strongest
root and lean into that alone, keeping things short.</p>
<h3>6) Morphology and sound shaping</h3>
<p>Once roots are selected, the system proceeds through a fixed sequence:</p>
<ol>
<li>apply compounding rules and affixes defined by the language</li>
<li>run the result through the era chain sound changes</li>
<li>validate the output against phonotactic constraints</li>
<li>repair violations using minimal, constraint-aware adjustments</li>
</ol>
<p>Repair operations favor small local fixes, usually vowel insertion guided by
syllable templates, rather than broad substitutions. This keeps adjustments
aligned with the language’s internal logic. For instance, a root ending in
a hard consonant butting up against the next root beginning with another hard
consonant would make for an impossible pronunciation, so I squish in a vowel
between them. Even these fixes I've managed to export into the language data
itself, so those patterns can be regional or belong to the dialect rather than
the whole planet.</p>
<h3>7) Ranking and output</h3>
<p>The generator produces a batch of candidates, then filters taboo roots and
structurally broken forms. Results are scored, deduplicated, and returned as
five options.</p>
<p>Earlier entries emphasize broader semantic coverage and longer compound words, while
later entries lean toward the dominant intent and shorter words. This ordering
gives me a range to choose from when selecting my match.</p>
<h2>Validation and debugging</h2>
<p>A validator runs across all language data to catch schema errors, missing
references, and unreachable forms. One enforced rule checks that proto
roots can reach their modern forms through the declared era chain. This has
turned out to be a huge help since I'm not very consistent in what I shove in
the system. Once it starts running it actually corrects even my source data to
a degree.</p>
<p>At this point the lab produces results that are explainable at every step. I can
validate each one, see where things are going haywire, and course correct. Once
I begin generating content I feel meets a quality threshold, I've built in
tooling to save those words back into the master data to further train future
generation.</p>
]]></content>
    </entry>
    <entry>
        <title>A Living Wiki</title>
        <id>https://www.thehierophant.world/blog/a-living-wiki/</id>
        <link href="https://www.thehierophant.world/blog/a-living-wiki/"/>
        <updated>2025-12-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A look at how the evolving world of Mortum Caelum is being reorganized through the Constellation, an automated 3D living wiki that links maps, lore, and notes to keep decades of world-building consistent and easier to explore.]]></summary>
        <content type="html"><![CDATA[<p>Keeping track of Mortum Caelum has been a challenge these past two decades. I've
used tools like Storyist, paper notebooks, and most recently a giant collection
of markdown files with folders like &quot;characters&quot; and &quot;nations&quot;. As the story
grew and my concepts for the world became more developed those notes would shift
out of sync. It was so hard to throw away old ideas, even when they were left
dangling, remnants of some other story that might have been.</p>
<p>I'm looking at some complex rules for ritual magic here which will not make
their way into this book. I have over 15,000 words written about a war with
Qartago (the second one, actually) which is being removed. Qartago, by the way,
was the old working name for <a href="/map/#nation:qadashur">Qadashur</a>. The Hierophant
was exploring a different genre at the time.</p>
<p>And these words aren't all for naught. There are character sketches in here who
will transpose into this new reality and find life in a slightly different
shape. I have set-pieces and theatrical moments which can be borrowed. In the
war files I worked out many types of ship that traverse the Ioma, all of which
can journey onward.</p>
<p>The difficulty of managing it all is still there, though. So I set out to try
something new. I've created the <a href="/constellation/">Constellation</a>, a living wiki
built of the interconnected ideas across this site: in the map, in the
world-building, in these blog posts, and even in the calendar. The natural ways
these things link together is graphed in 3D and the nodes are clickable to
explore. The format is a little strange and it may seem less intuitive than many
wiki's you're used to but this has two big advantages for me.</p>
<ol>
<li>
<p>I don't need to do anything to update it. The node graph builds automatically
based on the site content I add. It will grow and evolve as my writing does.
That's far more maintainable than using something like wikipedia's MediaWiki
software.</p>
</li>
<li>
<p>And it allows me to visually see segments that aren't connecting. Are they
old fragments of language or novelty? Are they ideas which I haven't
developed enough to find connection? It's a framework for me to constantly
improve the world.</p>
</li>
</ol>
<figure class="post-figure"><picture><source type="image/webp" srcset="/api/images/blog/assets/images/a-living-wiki.png?fm=webp"><img src="/blog/assets/images/a-living-wiki.png" alt="Constellation" loading="lazy"></picture><figcaption>
Constellation</figcaption>
</figure>
<p>I'll continue to evolve the interface for this as well as time permits. Maybe
there's a way to make it easier to browse, or get those labels to feel more
natural. In the meantime, play around with it if you feel like exploring new
places. The way the map portion came together has been great.</p>
<p>I'm nearly done with my present focus area: renaming the world's locations.
I have all the names and rough profiles in place. I'll be moving over to the
graphical portion of the map next in order to sync it with this new vision.
Slowly but surely the sources are becoming more trustworthy. That will give me
so much to lean on as I move forward.</p>
]]></content>
    </entry>
    <entry>
        <title>Giving a Voice</title>
        <id>https://www.thehierophant.world/blog/giving-a-voice/</id>
        <link href="https://www.thehierophant.world/blog/giving-a-voice/"/>
        <updated>2025-11-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Added a text-to-speech pipeline to the Chronicle so posts can be listened to; the first version uses a stock voice with hashes + blobs, with plans for a custom vocal model and space for manual recordings when stories deserve it.]]></summary>
        <content type="html"><![CDATA[<p>I've been wanting the Chronicle to speak back, not just because it's fun tech, but because hearing a voice changes how a story lands. For readers who can't (or don't want to) stare at a screen, audio is a softer doorway into the work. For me, it's a way to keep pushing the project's accessibility forward while giving myself another systems challenge to chew on.</p>
<p>This initial version leans on a straightforward pipeline: take the post content, hash it, send it to a text-to-speech provider, and stash the resulting MP3 in &quot;Netlify Blobs&quot;. My blog engine reads a simple map to know when a post has audio, and a special back-end function streams it to the page. If the words haven't changed, the hashes stay put and nothing regenerates. If they do, a quick sync updates the blob and the map, and Bob's your uncle.</p>
<p>Right now the voice is a stock default model because it let me move fast and get something working. The next step is training a local model on my own voice so the Chronicle sounds like me instead of a robot queen. And for the stories that matter most (short fiction, readings of lore, or anything that wants a human performance) I'm keeping the pipeline flexible enough to drop in manually recorded audio whenever that feels right.</p>
<p>It's a small thing, but hearing the world speak makes it feel more alive, and it keeps the door open for everyone who prefers to listen in.</p>
<p>Did you listen to this post? What do you think?</p>
]]></content>
    </entry>
    <entry>
        <title>Mapping the Stars</title>
        <id>https://www.thehierophant.world/blog/mapping-the-stars/</id>
        <link href="https://www.thehierophant.world/blog/mapping-the-stars/"/>
        <updated>2025-11-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How Mortum Caelum grew from pencil sketches into a living atlas and why rebuilding the map to honor real constellations matters to The Hierophant.]]></summary>
        <content type="html"><![CDATA[<p>Mortum Caelum translates to “dead sky,” but it never felt lifeless to me. It was
the sky where the departed climbed, a second geography suspended over the first.
That became the seed for The Hierophant: a night canopy so crowded with history
that its constellations cast shadows on the world below. Water signs stretched
into oceans, legendary hunters hardened into nations, and every myth became a
draft for a new culture.</p>
<h2>Going beyond the surface</h2>
<p>Those early drafts lived in sketchbooks long before The Hierophant’s plot found
them. I’d trace constellations, shade in continents with colored pencils, and
then set loose whatever campaign or speculative idea I was toying with. The
setting cycled through fantasy bestiaries, prehistoric survival epics, even
science projects. It waited, patient and unused, until the book’s central theme
clicked: What happens after death?</p>
<p>Once I started comparing afterlife calendars, the map came alive. Forty-nine
days in the Tibetan Book of the Dead, forty for Eastern Orthodox judgement,
seventy for an Egyptian embalming, thirty for Jewish sheloshim, eleven for the
śrāddha rites in parts of India. Every tradition marked time differently, but
each assumed similar tiers of nearness to the sacred. My notes circled a common
intuition:</p>
<blockquote>
<p>The layered afterlife and cosmological systems arise from the suspicion that
reality is stacked in ascending degrees of closeness to the sacred, Mircea
Eliade’s ladder between the sacred and the profane, and that the soul’s journey
is an upward movement through each chamber of truth.</p>
</blockquote>
<p>So what does that first chamber look like? Religions have been sketching it for
millennia.</p>
<table>
<thead>
<tr>
<th>Tradition</th>
<th>Phrase</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mesopotamian</td>
<td>Šamû šaplû</td>
<td>The lower heaven</td>
</tr>
<tr>
<td>Ancient Hebrew</td>
<td>Raqia</td>
<td>Lowest vault of heaven</td>
</tr>
<tr>
<td>Zoroastrian</td>
<td>Asman girda</td>
<td>The round sky</td>
</tr>
<tr>
<td>Ancient Greek</td>
<td>Aither hypatos</td>
<td>The lower aether</td>
</tr>
<tr>
<td>Ancient Egyptian</td>
<td>Pet</td>
<td>Where the sun travels</td>
</tr>
<tr>
<td>Vedic / Puranic</td>
<td>Bhur-loka</td>
<td>The lowest world</td>
</tr>
<tr>
<td>Islamic</td>
<td>As-sama ad-dunya</td>
<td>The nearest heaven</td>
</tr>
<tr>
<td>Cree</td>
<td>Atchakosak Kiskinohamâkewin</td>
<td>The star world</td>
</tr>
<tr>
<td>Ojibwe</td>
<td>Giiwedinong</td>
<td>The north sky</td>
</tr>
<tr>
<td>Lakota</td>
<td>Mahpiya</td>
<td>The visible sky (akin to Pet)</td>
</tr>
<tr>
<td>Diné</td>
<td>Yádiłhił</td>
<td>The lowest emergence sky</td>
</tr>
<tr>
<td>Yolŋu</td>
<td>Wangarr Djulpan</td>
<td>The star camp in the sky</td>
</tr>
<tr>
<td>Tiwi</td>
<td>Murrakupupuni</td>
<td>The sky world above</td>
</tr>
</tbody>
</table>
<p>And the list keeps going. I’m drawn to how broad the consensus is: no matter the
language, people keep pointing to a lowered sky that doubles as a waiting room.
That common thread is the compass I keep following.</p>
<h2>Mapping accuracy</h2>
<p>Trading colored pencils for a digital atlas created its own headache. The map
begged for a “show me the stars” toggle, but my ancient coordinates were… guess
work. Teenage me converted right ascension and declination into latitude and
longitude on a TI-83, which was fine for doodles and terrible for precision.</p>
<p>So I tore it apart.</p>
<figure class="post-figure"><picture><source type="image/webp" srcset="/api/images/blog/assets/images/mapping-the-stars.jpg?fm=webp"><img src="/blog/assets/images/mapping-the-stars.jpg" alt="Star Mode" loading="lazy"></picture><figcaption>
Star Mode</figcaption>
</figure>
<p>I rebuilt the math from scratch, piped in modern star catalogs, and wrote a
converter that projects celestial coordinates onto the Mercator grid that
Leaflet expects. Then I nudged continents across 190 degrees of longitude,
reshaped coastlines, and started reconciling the geography with lore I’ve added
over the last few years. It’s messy right now, but useful mess often is.</p>
<p>If you poke <a href="/map">the map</a> today you’ll catch it mid
renovation: shorelines half-drawn, city labels migrating, mountains waiting for
their ridgelines. Hit the “S” key anyway. Star Mode still works, and seeing the
constellations flood the world never gets old.</p>
]]></content>
    </entry>
    <entry>
        <title>What&#39;s in a Name</title>
        <id>https://www.thehierophant.world/blog/whats-in-a-name/</id>
        <link href="https://www.thehierophant.world/blog/whats-in-a-name/"/>
        <updated>2025-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A look inside the naming evolution of Corvus, from Coptic placeholders to the living Lokhan tongue. How a world finds its voice through sound, ritual, and the slow art of making names mean something.]]></summary>
        <content type="html"><![CDATA[<p>Today I finally retired Abawok / Kavalek, the working name for the constellation
Corvus. Here's the old naming development notes:</p>
<ul>
<li>Abawok - <em>Coptic: Corvus - Crow - Abwk</em>
<ul>
<li>Abowk - <em>Algorab - Crow - Abowk</em></li>
<li>Brusoot - <em>Kraz - Chariot - Brusoot</em></li>
<li>Kepeh - <em>Alchiba - Tent - Covered Space - Kepeh</em></li>
</ul>
</li>
<li>Nahrina - <em>Minkar - Nostril - Face - Nahrina</em></li>
<li>Tinh - <em>Gienah - Wing - Tinh</em></li>
</ul>
<h2>Picking a language</h2>
<p>Originally I'd leaned into Coptic as the linguistic root for my working names
in this region. There wasn't any particular reason for that. Languages weren't
high on my list of focus areas for a long time, and so I just distributed them
around the globe and thought it good enough for the time.</p>
<p>I knew I wanted some historical depth to my place names. They would grow and
change with the history, but what that history was still needed to be worked
out. How can you work out a place's history until you know its environment,
ecology, staples, relationships with neighbors? Like everything else in The
Hierophant, I was trapped by the systems thinking. I needed to understand it all
in order to understand the parts.</p>
<p>The language had to follow the same arc. Using Coptic phonetics as filler never
matched the society I was sketching, so I built a Lokhan sound set that serves
the culture: aspirated <code>kh</code>, tight s/z/l clusters, clipped vowels,
final-syllable stress. Those rules grew out of the civic rituals, so the sounds
and the institutions reinforce each other. Once the morphemes started earning
their keep (<code>lokh</code> + <code>-var</code> for the nation, <code>val</code> for harbors, <code>-rel</code>/<code>-vyr</code>
for edges and glides), the names started coming together.</p>
<h2>Giving it life</h2>
<p><a href="/map/#nation:lokhavar">Lokhavar</a> fits. The new
write-up leans into the feather lexeme that runs through
the Lokhan language, so the Feathers Circle, the Kelresh Belt, and the Lokhfire
Nights all feel like they belong to the same place. I finally wrote down the
Mask Houses, Sazrel, Lazkhor, Velrun, and let them anchor the politics instead
of leaving the archipelago implied.</p>
<p>Oh! I should note here that this is an archipelago. This is one area where my
graphical map is lagging behind the text. The block of land appears quite solid,
but this whole region is a network of thousands of islands. That's going to take
some work.</p>
<p>Getting the name right also meant giving the cities their due. Valokh now steps
down basalt terraces into the parliamentary harbor, Zavrel gets its equinox
chariot launches, Kelresh has those geothermal arcades drying reed-wool, Nasrel
holds court in its acoustically tuned basins, and Talvyr keeps watch from the
glider ramps. Each city got its own page so the map labels aren’t pointing at
ghosts anymore.</p>
<p>Will the story ever travel here? It's not likely. My current plotting keeps most
of the story along the Ioma. So why bother?</p>
<p>Well, it's a part of the system. People are from there. Trade is from there.
I may encounter characters is my book who spent time there. And even if it
remains a distant speck, now it's a living speck.</p>
<h2>Cleanup</h2>
<p>Now comes the hard part. After I've done the renaming I need to go back through
all of my other notes and find references to the old names, systems, cities,
rituals, etc. I need to update the balance of the system to take in those
changes. This is the one space I have allowed myself to dip into that dreaded
evil, AI. I don't want it to touch the generation of my world in any way. This
is my brain's work. This is my passion, my dreams. But double-checking thousands
of notes across multiple projects that might reference things in passing? Yeah,
cool, go ahead and scan away little robot.</p>
<p>In this case it was really helpful in identifying some issues with the calendar
system I'd started for this area. Two of them, actually. I was able to cut some
threads, remove old ideas, and just smooth over the rough spots.</p>
<p>It's never perfect, though. I can't blame the LLM for this, but this book has
gone through so many iterative ideas, settings, and growths, that my notes
sometimes have some true nonsense in them. Did you know at one point I had an
evolutionary extension of neanderthals in here? Or that the story went steampunk
for a good two weeks? I think I still have an airship reference in the atlas
somewhere I'll need to clean up eventually.</p>
<p>Once I have all of my nations and cities properly named I can do a clean
run-through of everything with a red pen. It shall be glorious.</p>
<p>Just a few more to go.</p>
]]></content>
    </entry>
    <entry>
        <title>Charting Constellations into Nations</title>
        <id>https://www.thehierophant.world/blog/charting-constellations-into-nations/</id>
        <link href="https://www.thehierophant.world/blog/charting-constellations-into-nations/"/>
        <updated>2025-11-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Mapping Mortum Caelum means translating constellations into continents, using geometry and a bit of poetry to make a fictional world feel real.]]></summary>
        <content type="html"><![CDATA[<p>Over the last two work sessions I've been learning how to coax a fictional world
map into existence with the care a cartographer gives coastlines and an
astronomer gives constellations. The nations of Mortum Caelum have always traced
their roots to the stars, so my aim was to take the sky’s geometry and bend it
into believable land. That path led through a few false starts, a handful of
stubborn equations, and at last a geometric solution that feels both rigorous
and lyrical.</p>
<h2>From stars to borders</h2>
<p>I began by pulling in the official constellation boundary tables from the
International Astronomical Union. Those are the straight lines that divide the
sky by right ascension and declination. My mapping library, Leaflet, can draw
polygons, so the first plan was simple: convert those celestial coordinates into
Mortum Caelum’s world grid and use them as national borders. Easy, right?</p>
<p>Early trials used affine transforms and polynomial fits. (Yes, I had to look
those up and ask ChatGPT to explain them.) On paper they worked, but the map
looked wrong. Some nations stretched like pulled dough while others shrank to
crumbs, and the edges refused to sit comfortably against the terrain. It was the
classic case of a model that is technically correct but visually false. I tried
to use offsets to force it, but no matter how I poked things didn't line up.</p>
<h2>Grounding the sky</h2>
<p>So I reversed course. Instead of forcing the sky onto the land, I let the land
speak first! Each nation and city already had latitude and longitude anchors
from worldbuilding notes I wrote decades ago, so I built polygons that wrapped
around those points. The first pass used convex hulls (the mathematical version
of pulling a tight rubber band around a set of pins) but overlaps and gaps
quickly appeared where borders met like puzzle pieces that didn't quite fit.</p>
<p>The breakthrough came with a Voronoi approach. Imagine every city sending out
a signal and every spot on the map pledging allegiance to whichever signal is
nearest. By computing that pattern and merging cells belonging to the same
nation, I ended up with a complete tiling of the map. No overlaps, no empty
space, and every settlement resting safely inside its own borders. Huzzah!</p>
<p>Cleaning and trimming those cells into GeoJSON gave me a working political layer
that Leaflet renders in real time. Watching the shapes lock together like
stained glass was its own quiet reward.</p>
<h2>Refinement and rhythm</h2>
<p>This round of work built on last session’s improvements: faster load times,
better label avoidance (so they don't overlap when cities are close to one
another), smoother panel animations. There is still polishing to do, especially
along the coasts. For now the sea boundaries spill to a broad bounding box so
that every nation touches water. In a later pass I’ll draw the maritime lines by
hand, guided by the printed sketches in ancient notebooks. Oh, and I should
probably do something about the poles. Things get goofy at the extremes.</p>
<h2>Why this matters</h2>
<p>None of this labor is about perfection in code. It’s about creating a world that
feels inhabited. Readers will never check if a Voronoi tessellation defined
a border or if I adjusted an outline with polynomial regression, but they will
sense whether the geography holds weight. The mix of astronomy, geometry, and
storytelling is what makes Mortum Caelum breathe, and the map should honor that.</p>
<p>Now a single command can regenerate every border. Add a city, run the script,
and the land rearranges itself around the newcomer, a quiet, almost magical act
of creation. It may seem an indulgent effort, but each small calculation ensures
that when someone zooms in to explore, they meet a landscape tended with
patience, curiosity, and a trace of wonder.</p>
<figure class="post-figure"><picture><source type="image/webp" srcset="/api/images/blog/assets/images/map-constellation-borders.jpg?fm=webp"><img src="/blog/assets/images/map-constellation-borders.jpg" alt="Voronoi-derived national borders alongside their guiding constellations" loading="lazy"></picture><figcaption>
Voronoi-derived national borders alongside their guiding constellations</figcaption>
</figure>
]]></content>
    </entry>
    <entry>
        <title>A Home for Notes</title>
        <id>https://www.thehierophant.world/blog/a-home-for-notes/</id>
        <link href="https://www.thehierophant.world/blog/a-home-for-notes/"/>
        <updated>2025-11-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Turning the site into an independent workshop where documenting The Hierophant’s making is as essential and self-published as the book itself.]]></summary>
        <content type="html"><![CDATA[<p>This site was always meant to be the working table for <em>The Hierophant</em>, the
spot where you can watch the world arrive piece by piece. I spent the last day
giving that table sturdier legs. I finally have a place to migrate the endless
piles of notes, an interactive map to better explore the setting, and this blog
to record the progress.</p>
<p>From the start I said the process should be as enjoyable as the book itself, and
that promise finally has a home. The blog is alive, wired through <a href="https://www.11ty.dev/">Eleventy</a>
so I can log the strange detours, lore fragments, and production notes in real
time. Running the pipeline feels as ordinary as making tea, and that ritual is
what keeps the documentation flowing instead of stalling behind “someday I’ll
write about this.”</p>
<p>I have always insisted I don’t need a publisher because I am a marketer by
trade, so this stretch of work doubled as a reminder: I can build the entire
runway myself. Cleaning the tooling, tuning the watchers, tightening the <a href="https://netlify.com/">Netlify</a>
deploys, these are the quiet systems that let me ship on my own terms. The
layout refinements, from the Ioma-stars image to the non-sticky header and
palette-friendly cards, make the whole space feel authored, not borrowed.</p>
<p>The <a href="https://www.thehierophant.world/#connect">CRM sign-up</a> flow had to match that independence. I designed the form,
double opt-in messaging, and stitched together a private broadcast system so
every message stays personal and under my control. Testing the send and seeing
it land felt like setting up a press of my own: no third-party gatekeepers, just
a direct line to the readers who want to follow along.</p>
<p>None of this is flashy work, but it clears the path for curiosity to keep
moving. Now the site can keep pace with whatever notes, sketches, or lore pages
come next, and I can keep proving that building a world, and sharing how it’s
built, belongs as much to the maker as the finished book.</p>
<hr>
<p>The next content project is with the <a href="/map/">Atlas</a>. I've completed the naming of five of the
twenty regions in my world. That work has involved crafting unique cultural
history, ecology, and mythological influences to stub out a proto-language for
each. Then I apply that language to the source-meanings of the nations and then
their major cities. It's slow work moving from tentative placeholder names I've
been using for years, but it also feels like a puzzle piece being slotted
perfectly.</p>
<p>Once I've completed the exercise for all the places in the atlas, I need to go
back and work on their names for one another. Languages! Yeesh. These aren't my
strong-suit, so it's taking a while. I'm determined not to accept boring fantasy
names, though.</p>
<p>Keep an eye on that atlas content. I'll send out a Dispatch email when we hit
a completion milestone. Until then, back to the forge.</p>
]]></content>
    </entry>
    <entry>
        <title>Why I’m Building a World</title>
        <id>https://www.thehierophant.world/blog/why-im-building-a-world/</id>
        <link href="https://www.thehierophant.world/blog/why-im-building-a-world/"/>
        <updated>2025-11-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A look at the art and curiosity behind building the world of The Hierophant.]]></summary>
        <content type="html"><![CDATA[<p>Every world begins with a small act of curiosity. For me, <em>The Hierophant</em> is that curiosity taking shape. I am not chasing a career or an audience or a deadline. I am building something because it asks to exist. The book, the languages, the maps, the strange little tools that live here on the site, all of it comes from the same impulse to make, to see, to share.</p>
<p>This is a space for process. I want to show every corner of the work, from sketches and prototypes to lore and logic. Some days that means writing about theology or ecology. Other days it means building a calculator that translates a fictional calendar or a map that breathes like a living continent. It is all part of the same story.</p>
<p>I am building a world piece by piece, because that is the kind of art I love most. It does not need to serve anything but wonder. If you are here, welcome. Stay as long as you like. Explore. The doors are open.</p>
]]></content>
    </entry>
</feed>
