<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Recaps on Loracle Blog</title><link>https://loracle.app/blog/tags/recaps/</link><description>Recent content in Recaps on Loracle Blog</description><generator>Hugo -- 0.155.0</generator><language>en-us</language><lastBuildDate>Tue, 15 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://loracle.app/blog/tags/recaps/index.xml" rel="self" type="application/rss+xml"/><item><title>Your Table Doesn't Play in English</title><link>https://loracle.app/blog/posts/your-table-doesnt-play-in-english/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +0000</pubDate><guid>https://loracle.app/blog/posts/your-table-doesnt-play-in-english/</guid><description>A German table runs a five-hour session and the recap comes back in English. We shipped that bug, and it hides in almost every tool this hobby uses.</description><content:encoded><![CDATA[<p>Picture a table in Munich. Five friends, a Thursday night, a campaign two years deep. The whole session happens in German: the threats, the bad accents, the argument about whether the paladin&rsquo;s oath covers arson. Then the recap arrives, and it reads like a BBC correspondent summarizing their game from across the channel.</p>
<p>If you play D&amp;D in German, French, Portuguese, or anything else that gets called a &ldquo;non-English market&rdquo; in a planning doc, you already know this experience. Every tool in this hobby assumes your table speaks English. Character builders, VTT interfaces, AI note-takers: English in, English out, and if your session happens to be in another language, you get whatever falls out of the machine.</p>
<p>We shipped that exact failure. This post is about the bug, the one-evening fix, and the three design decisions inside the fix that turned out to be the actual hard part.</p>
<h2 id="the-bug-we-detected-your-language-then-threw-it-away">The bug: we detected your language, then threw it away</h2>
<p>Here&rsquo;s the embarrassing shape of it. Loracle&rsquo;s transcription engine auto-detects the session&rsquo;s language. That part worked from day one: a German session produced a clean German transcript, correctly labeled <code>de</code>, sitting right there in the pipeline.</p>
<p>Then the recap stage took that German transcript and handed it to a language model with an English prompt and zero instructions about output language. So the model did what models do with mixed signals: it wrote the recap in English. Or mostly English. Sometimes it flipped a coin mid-document and your wiki got a German article with an English summary, which is somehow worse than either.</p>
<p>The data knew what language your table speaks. The pipeline ignored it. That&rsquo;s the whole bug, and I suspect it&rsquo;s the same bug inside most tools that behave this way. Language support usually exists at the transcription layer because the vendor sells it there, and then dies one function call later because nobody wrote the sentence that carries it forward.</p>
<h2 id="the-fix-took-one-evening-the-decisions-took-longer">The fix took one evening. The decisions took longer.</h2>
<p>The fix is a prompt directive, injected into every prose-generating pass in the pipeline: session recaps, entity extraction, wiki articles, the &ldquo;Previously On&rdquo; narration, narrative analysis. All five. It says, in essence: detect the dominant language of the source material and write ALL user-facing prose in that language. A German session gets a German recap. A Spanish one-shot gets a Spanish one.</p>
<p>No schema change, no feature flag, no settings toggle. Which sounds like a small ship, and in line count it was. But three decisions inside that directive are where the real product thinking lives, and each one is a place where the naive version quietly breaks.</p>
<h2 id="decision-one-structure-stays-english-prose-goes-native">Decision one: structure stays English, prose goes native</h2>
<p>A recap document has load-bearing bones. Section headings like &ldquo;The Story So Far&rdquo; get parsed by the pipeline downstream; JSON keys and entity type fields get read by code. Translate those and the machine stops understanding its own output. A French table would get a beautiful French recap that fails to render, because the parser is looking for a heading that&rsquo;s now &ldquo;L&rsquo;Histoire Jusqu&rsquo;ici.&rdquo;</p>
<p>So the directive splits the document into two layers: everything a human reads goes in the table&rsquo;s language, everything a machine reads stays pinned to English. Titles, summaries, narration, descriptions: native. Headings, keys, enums: English, exactly as specified. The reader never sees the seam.</p>
<h2 id="decision-two-never-translate-a-name">Decision two: never translate a name</h2>
<p>This one is craft, and it&rsquo;s the decision I&rsquo;d defend hardest. If your table named the villain &ldquo;Der Bleiche König,&rdquo; that&rsquo;s his name. He appears in the transcript as Der Bleiche König, the wiki article about him is written in German, and he is never, ever &ldquo;The Pale King.&rdquo;</p>
<p>Names at a table are canon in their exact spoken form. The entity graph that Loracle builds across sessions depends on recognizing the same name every time it appears; a translation pass that &ldquo;helpfully&rdquo; localizes names would fracture your cast into duplicates and betray the way your table actually talks. The rule in the prompt is absolute: entity names pass through untouched, whatever language surrounds them.</p>
<h2 id="decision-three-detect-per-session-follow-the-table">Decision three: detect per session, follow the table</h2>
<p>We could have added a campaign language setting. A dropdown, a default, a support article explaining it. We skipped it, because the transcript already tells us the truth per session, and the truth beats a setting. Tables are messy: the Brazilian group that runs one session in English because a visiting friend joined, the bilingual table that drifts. Detection follows what actually happened at your table that night. A setting only remembers what someone clicked six months ago.</p>
<h2 id="why-this-stays-rare">Why this stays rare</h2>
<p>The honest answer for why most tools don&rsquo;t do this: the market math looks bad until it doesn&rsquo;t. English-speaking players dominate the spreadsheets, i18n sounds like a translation-agency invoice, and the tables it fails are quiet about it. They just churn.</p>
<p>But TTRPG is enormous in Germany, in France, in Brazil. Those tables are recording sessions, taking notes, forgetting what happened last month, exactly like yours. The pipeline version of this feature costs a directive and some discipline about which layer speaks which language. Once your recap engine reads the session instead of assuming it, following the table&rsquo;s language stops being a feature and becomes the obvious default.</p>
<p>Your table&rsquo;s memory should sound like your table. If your paladin committed arson in German, the record of it should read that way too.</p>
<div class="loracle-callout">
<span class="callout-kicker">Spielt ihr auf Deutsch?</span>
<p><strong>Loracle</strong> records your Discord session, auto-detects the language, and writes the recap, the wiki, and the "Previously On" in it. Your NPCs keep their names. Your table keeps its voice.</p>
<p><a class="callout-cta" href="https://loracle.app">Try it with your table →</a></p>
</div>
]]></content:encoded></item></channel></rss>