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:
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:
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:
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.
Related¶
- 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
@aliasthat reaches an existing one.