Skip to content

Link session logs

Nerthus.Core (until cutover). This page describes the frozen system that runs today and is deleted at cutover. Replaced by: not yet written.

A session log is the transcript of what actually happened at the table. This page shows you how to point a session at its transcripts, how the tool archives them into the repository, and what it can read out of them. When you are done, the transcript is readable alongside the session forever, even if the site you copied it from goes dark.

Three different things share the word 'log'

A session log is the copy-paste or recorder export of what was said and done in-game. That is the only kind you ever deal with. The Discord messages the tool sends players are delivery, not logs. The tool's own internal operational logs are a separate mechanism you never touch.

1. Copy the transcript URL

Transcripts live outside the repository. They sit on krisaphalon.ct8.pl, Pastebin, or Google Docs. Copy the URL of each transcript that belongs to the session.

2. Add the URL under - Logi:

Write a - Logi: block in the session's metadata and put the URL on a bullet under it:

### 2026-07-01, Eraster rozmawia z Tussalem, Anward

Eraster spotkał się z Tussalem w jego willi w Thuzal. Wypili herbatę i zjedli obiad.

- Lokacje:
    - Thuzal/Rezydencja Tussal
- Logi:
    - https://nerthus.pl/logizsesjierasteraztussalem
- PU:
    - Eraster: 0.2
    - Lord Tussal: 0.2

One URL per bullet. Several logs for one session are fine and common - a recorder export alongside a chat copy-paste, or one transcript per part of a long evening. Give each its own bullet:

- Logi:
    - https://nerthus.pl/logizsesjierasteraztussalem
    - https://krisaphalon.ct8.pl/get/2026-07-01_Eraster_rozmawia_z_Tussalem_Anward

Two sessions may point at the same URL. Each transcript is fetched only once, however many sessions link it. The session header and the other metadata blocks are covered in Record a session.

3. Fetch the transcripts

Fetching writes to the repository, so it is a deliberate step. It never happens because someone opened a page. Someone runs the fetch, and the tool downloads every linked transcript it has not already archived.

Each transcript is archived under nerthus.logs/ — in repozytorium-transkryptow, or in the lore checkout on a host whose archive has not moved yet — as two files: the raw text (.log) and a parsed version (.json). Both are committed with the rest of the repository. Once that commit lands, the log is readable alongside the session without visiting the third-party site again. The repository, not the outside host, is the durable home of the transcript.

4. Read the transcript back

One call fetches whatever is missing and hands you the session with its transcripts parsed:

Get-NerthusSessionLog -Header '2026-07-01, Eraster rozmawia z Tussalem, Anward' -FetchMissing

Nothing about this is manual. If you looked at a session and saw only URLs, you were reading the wrong surface: Get-NerthusSession (GET /sessions/{header}) carries the - Logi: URLs and nothing else, while Get-NerthusSessionLog (GET /sessions/{header}/logs) is the structured one. It gives you the transcript's metadata, the locations the party moved through, and every line with its speaker resolved to an entity.

Each transcript comes back in one of four states:

State What it means What to do
Fetched Archived and parsed; Parsed carries the lines and the location segments Nothing
NotFetched Linked in the session but never pulled Run the call above with -FetchMissing
Failed A fetch was attempted and did not land; Error says why Read the next section
PermanentlyFailed The same error came back as many times as the tool is configured to retry, so it stopped trying Read the next section - nothing retries this one on its own

Get-NerthusSessionLogStatus (GET /logs/status) answers the same question for the whole repository at once - how many transcripts are archived, how many failed, and which host each failure came from.

What the tool reads out of a transcript

The tool decides a transcript's format by looking for [HH:MM] timestamps.

A chat transcript is a copy-paste from the game, timestamps and all:

[20:14] [Lokalny] Eraster: Dziękuję za zaproszenie, Lordzie.
[20:15] [Lokalny] Lord Tussal: Herbata stygnie. Siadaj.

A recorder export is the JSON a narrator's log recorder produces, and it is what the krisaphalon.ct8.pl links hold.

A prose transcript is a hand-written narrative summary, with no timestamps:

Eraster przybył do rezydencji o zmierzchu. Lord Tussal czekał już przy stole.
Lord Tussal: Herbata stygnie. Siadaj.

All three yield who spoke. The tool reads the name in front of the colon and matches it against the entities the world knows. A prose transcript with no such names yields no speakers, because there are none to read - the narration is archived either way.

The tool also reads the places the party moved through and turns those movements into doors between locations, which belong to Locations.

When a line is narration instead of speech

Polish narration uses colons too, so a sentence can look exactly like a speaker:

[14:55] Sytuacja wyglądała następująco: Riv trzymała za rękę Ren w efekcie mając możliwość ją natychmiast obezwładnić, lub coś innego zrobić.
[23:07] [Lokalny] Poza Ernestem, najemnicy Anwarda nazywali się następująco: Kusznik Tomasz, Łucznik Ryszard, Zbrojny Roman i Zbrojny Stefan.

Nobody is called Sytuacja wyglądała następująco. The tool keeps lines like these whole and credits them to no one. It looks first at how often the name appears: a real speaker says several things over an evening, while a sentence like this one is written once. On a line stamped with a time or a channel like [Lokalny], a name that appears only once in the transcript, runs to three words or more, and either does not look like a name or contains a verb is read as narration.

Short names are safe there. Anward and Karendar stay speakers however the rest of the line reads.

A line carrying neither a time nor a channel is judged on the name alone, and there length is no protection: a name that reads as a verb becomes narration however short it is. Otrzymano: is one word and is filed as narration. If that ever costs you a real speaker, give the character an @alias, or add them if they have no entry yet.

A name the world already knows also stays a speaker, however unusual it looks:

[16:44] [Lokalny] palatyn Atropos Regius: bardziej wyszukanych rozrywek, wymagających importowania drogich rzeczy zza granicy…

That line is credited to Atropos Regius, because the NPC exists. Adding a missing character, or an @alias on an existing one, is how you rescue a speaker the tool did not recognize - Add and edit entities covers both.

Keep asides out of the name

An aside in brackets between the name and the colon costs you the attribution:

[00:05] Nemera (już bliżej swojego legowiska): Hah, pan biolog się jak panienka nie folgował…

The tool reads Nemera (już bliżej swojego legowiska) as the whole name, finds no one called that, and files the line as narration. Bibliotekarka Nemera is not credited with having said it. Write the aside after the colon instead:

[00:05] Nemera: (już bliżej swojego legowiska) Hah, pan biolog się jak panienka nie folgował…

If a fetch fails

Some transcript hosts sit behind a login wall, and many ct8.pl links now do. A URL behind a login wall cannot be fetched.

A failed log is recorded and retried later on its own. It never blocks the rest of the batch, so the other transcripts in the same run still land. You do not need to change the session when a fetch fails.

Retries do not go on forever. A URL that keeps failing the same way is eventually marked permanently failed and stops being retried, which is what separates "the host was briefly down" from "this link needs a human". GET /logs/status reports the two separately, and names the sessions that lose content when a transcript stays unreachable.

A log that fetched successfully once stays in nerthus.logs/ even if its source later disappears. That is the whole point of archiving it.

  • Record a session - the session header, the body, and the other metadata blocks.
  • Locations - the location tree, and the doors the tool derives from fetched transcripts.
  • Add and edit entities - creating the character an unrecognized speaker needs, and the @alias that reaches an existing one.