lefteros_by SomniusX
EL ↗Say hello

LEFTEROS / PERSONAL NOTES

ShadowRealms AI 0.23 to 0.28: the chronicle so far

18 October 2026 / Lefteris Iliadis / SomniusX

ShadowRealms AI 0.28: the chronicle so far

On 17 October, the same day the post about the voice went out, ShadowRealms AI, my local AI Storyteller for World of Darkness chronicles, went from 0.22.1 to 0.28.0. The first release, 0.23, closes the loose end from the voice post: cloud voices, for whoever wants them. The other five are one thing: the chronicle so far. A chronicle’s chat written up as a story, night by night, by the local model, the way minutes are written from a meeting’s recording.

The idea came from RecMeets: if I can get minutes out of a meeting, I can get “what happened so far” out of a chronicle that has been running for months. A Storyteller coming back after two weeks, or a player who missed two nights, doesn’t want to reread three hundred messages.

The chronicle so far

Chronicle settings has a new panel. Press Update, and the model writes the chat up as a story, one room and one night at a time. A night is a run of messages in one room with no gap over six hours (the Storyteller can change the gap, from two to twenty-four). Each night gets a title, two to four paragraphs, and a list of what happened, where every event points back to its messages. Above it, a digest of the whole chronicle: in short, the story so far, the open threads.

  • In Greek, by Krikri. A Greek chronicle is written by Llama-Krikri 8B, with instructions in Greek (English instructions gave English text, even when I asked for Greek). An English one is written by whatever model LM Studio has loaded. The chronicle’s language is set when you create it.
  • Checked. Message numbers must exist, names must be the chronicle’s own, the language and the alphabet must be right, and botches and criticals are always listed. A night that doesn’t fit the model’s context is split in two, never cut.
  • Only what changed. Each night has a hash of what the model sees. The next Update rewrites only the nights that changed.
  • Live. It says first how long it will take, then shows “Night 3 of 12”, a progress bar, tokens and tokens per second, and Cancel. It waits for ten quiet minutes in the chronicle before it starts, so it doesn’t take the graphics card from the Storyteller while you play.

Two views, and the idea that matters most

The story is written from what the players could read: no hidden rolls, no closed rooms, no Storyteller notes. The Storyteller has a part of their own, behind a toggle, with what the players didn’t see. Table talk (out of character) is kept apart and exported only when you ask for it. That rule, a player sees only what they could have seen, runs through everything that follows.

Minutes on paper

The minutes export as Markdown or PDF, either as the story (the digest and each night in short) or as the full minutes: every night whole, with message numbers, who, where, which threads, which rolls. For the whole chronicle, the last N nights, or (since 0.26) a date range, with the days in the Storyteller’s timezone.

The PDF has two looks:

  • The character sheet. Black ink on white, the sheet’s double frame and sigil, headings between hairlines, Cinzel and EB Garamond, Greek included. The sheet’s frame, sigil and fonts became a shared module, so the two match exactly.
  • Horror. A light stained paper that keeps the text easy to read, a double blood-red frame with thorned corners, splatters in the margins and drips from the top of the first page. The paper is one image per paper size; everything else is vector, so Greek text can still be selected and searched.

Both in A4 or Letter, and in colour or for print: horror in black and white is a white page with the frame, thorns and blood in black and greys, for the printer at home. The footer on every page says “Written by ShadowRealms AI” and points to the app’s page, in the file’s language. No model name, no server, no version.

The Storyteller has the last word

The model writes well, but it doesn’t know what you meant. Since 0.25 the Storyteller can edit the whole story in one Markdown box. The written text is kept apart: story exports use the edited copy and say so in the footer, while the minutes always stay the written record. When the story is written again after an edit, the panel asks: “Keep my edit” or “Start from the new one”.

The story also translates into the other language, Greek to English or the other way, by the same translator as the chat, with the names protected: Ελένη stays Ελένη. The translation is saved, and the panel says when it has fallen behind the story. Every export comes out in both languages.

And one small thing that helps a lot: “Session ended here”. The Storyteller marks a message from its menu, everyone sees a thin “— end of session —” line under it, and the next Update cuts the nights there. Because a six-hour gap isn’t always the end of a session.

Previously on…

Version 0.27 is the first that gives the chronicle so far to the players. When you open a room after twelve hours or more away, a card above the chat (a bottom sheet on phones) tells you that room’s nights since you were last there, and the story so far in short. Like the “Previously on…” of a series. In Greek, «Προηγουμένως…».

  • It is built only from the players’ view: no hidden rolls, no closed rooms, no player names, nothing meant for the Storyteller’s eyes, and no model call. It is what has already been written.
  • Jump to the start of each night scrolls the chat to its first message, loading older ones when needed.
  • Read it reads the card aloud with your own voice settings, even with listening off. Never on its own.
  • Close it and it stays closed for that room until your next long absence. A button in the header shows it whenever you want.

Cloud voices (0.23)

In the voice post I wrote that there were no cloud voices. There are, since the next day, but off by default. The admin turns them on, Google Gemini, free or paid tier, with a plain note beside it: on the free tier Google may use the text to improve its products, on the paid tier it doesn’t. Then each chronicle decides for itself whether to use them. The narrator gets a Gemini voice, characters map by gender, and if Gemini doesn’t answer, the local voice says the line and the error goes to voice health. On my own server they stay off: the local voices are enough for me.

For whoever runs it (0.28)

  • Settings per chronicle: the night gap, table talk in exports by default, the nightly run, and the writer model, from the ones the AI panel lists. A cloud model as the writer can only be set by an admin, with a warning that the whole chat leaves the server.
  • Nightly run, off by default: at 05:00 the chronicles with new messages are updated one at a time, with the same rules as Update.
  • Writer health next to voice health: runs and failures today, seconds per night, the last error, what is running and what is queued.
  • Archives. When a chronicle is deleted, its minutes and the full transcript of every room are saved first; if they can’t be written, the chronicle isn’t deleted. A page for admins lists them, and the Storyteller finds their own for 30 days.

What’s still open

All of this was tested on test chronicles and on my own chronicle that’s running now. The real test, though, is a chronicle that runs for months: how well Krikri keeps the threads over sixty nights, and how often it needs the Storyteller’s edit. Screens will come when I have something to show without sharing my friends’ game. We’ll see.

Every change, one by one, is in the CHANGELOG, how the chronicle is written is in docs/CHRONICLE.md, and the app itself is on the ShadowRealms AI page.