Labs · Lorebook merger
Five half-finished lorebooks.
Merge them into one — without the déjà vu.
Every long-running world accumulates books: the one from the card, the one you wrote, the one a friend exported. Drop them all here — duplicates get grouped by content similarity plus key overlap so you pick what stays, shared trigger words get flagged before they double-fire at runtime, and out comes one clean SillyTavern-format book. ST-family entries pass through untouched.
Drop every lorebook you want to merge (multiple at once is fine)
SillyTavern / Chub / Risu / Agnai / JanitorAI / embedded character books · parsed in your browser, never uploaded
Parsing, dedupe and export all happen in your browser — books are never uploaded or stored. Refresh and it's gone.
Where this tool comes from
The parser is the same five-platform dialect layer that powers our Lorebook Migration Doctor — format detection and per-platform field mapping traced to each platform's open-source implementation (read 2026-07). Duplicate detection uses character-trigram Jaccard similarity plus trigger-key overlap as dual criteria, with thresholds locked by a 74-assertion golden self-test that includes real multi-hundred-entry community books and a 'same book, two versions' simulation (350 entries, 20 mutated — all 350 pairs recovered, mutated ones via the fuzzy path).
The export path is verified by round-trip: merged JSON is re-parsed by the same SillyTavern-1.18-aligned World Info parser that runs our trigger simulator, and every semantic field must survive the trip. ST-source entries additionally skip rebuilding entirely — the original entry objects are passed through with only uid/displayIndex renumbered, which the self-test locks field by field (depth, role, automationId, foreign extensions).
What it can't do
Similarity is textual, not semantic: two entries that describe the same fact in completely different words won't be grouped — skim the collision list for same-key survivors, that's where those usually surface. Thresholds (90% alone / 55% + key overlap) are deliberately conservative; the tool would rather miss a fuzzy duplicate than silently merge two entries that only look alike.
Merging normalizes non-ST sources onto the ST entry template. Risu decorators stay in the content text but Risu-only fields (mode, activationPercent), Agnai priority and Janitor min_messages are converted or dropped exactly as the Migration Doctor documents — run your source books through it first if you want the itemized list. Book-level settings (scan depth, budget, recursive scanning) are not merged; set them on the target platform.
FAQ
How does it decide two entries are duplicates?
Two criteria, applied together. Near-identical text (character-trigram similarity ≥ 90%) is grouped no matter what the keys say — that catches the classic 'same book, two versions' case. Moderately similar text (≥ 55%) is only grouped when the trigger keys also overlap (≥ 50% of the smaller key set), so two genuinely different entries that merely mention the same nouns don't get force-merged. Entries with the same keys but unrelated content are deliberately NOT treated as duplicates — they land in the key-collision list for you to judge instead.
What happens to entries when I export the merged book?
Entries that came from SillyTavern or Chub exports pass through as the original JSON objects — depth, role, automation IDs, inclusion groups, even foreign extension blobs stay byte-identical; only uid and displayIndex are renumbered. Entries from Risu, Agnai, JanitorAI, NovelAI or embedded character books are rebuilt on the standard ST entry template from their parsed semantics (embedded books recover depth/role/automation_id from extensions). The export card tells you exactly how many entries took each path.
Why does it warn about trigger-word collisions instead of fixing them?
Because a shared key isn't automatically wrong. Two entries triggered by the same word might be deliberate layering (one describes the city, one describes its politics) — or they might be two books that each wrote the same lore, which doubles your token spend and can contradict itself. Only you know which. The tool lists every shared key with the entries involved; if you want same-key entries to fire one at a time, give them the same inclusion group in SillyTavern.
Which formats can I feed it?
SillyTavern World Info exports, Chub lorebooks (dual-written WI + V2), RisuAI exports ({ type: 'risu' }), Agnai memory books ({ kind: 'memory' }), JanitorAI JSON-editor entry arrays, V3 lorebook files, character cards with embedded books, and NovelAI lorebooks — the same parser family as our Lorebook Migration Doctor. The merged output is always SillyTavern World Info format, the closest thing the hobby has to a lingua franca.
Is anything uploaded?
No. Parsing, duplicate grouping, collision checks and the export all run in your browser. The page works offline once loaded; refresh and everything is gone.