Tusk's Vault

Free · Open source · Runs on your own machine

Ask your campaign anything

Point it at your D&D, Pathfinder or Call of Cthulhu notes and ask from Discord, Foundry's chat bar, or any MCP client. You bring the model — Vault does the wiring: finding the passages that bear on the question, holding the model to your notes, and citing the file every claim came from.

Which means you can ask it daft questions and still trust the answer.

Install it See what comes back

  • MIT licensed
  • No account
  • No subscription
  • Zero telemetry
  • v1.0.1

@Tusk who's the party member least fit to be the ship's captain?

Bryn Tallow. He cannot swim, has twice refused to board a boat — once at Dunmar, once at the Kelmoor quay — and gets sick on still watersource 1, which makes him the least seaworthy of the four regardless of any question of leadership.

  1. 1Party.md
A daft question, answered from the file it came out of. That is the whole trick: it is funny because it is true to your campaign.
I

Why this exists

The answer that sounds right is the dangerous one

My campaign notes were spread across six documents, two of which contradicted the other four. Players asked me the same questions between sessions — who was that merchant, what did we actually agree to, whose brother is the king — and I answered from memory, badly, and sometimes differently than last time.

The obvious fix is to ask an AI, and it fails in a specific way: a general chatbot handed your setting answers every question confidently, including the ones your documents say nothing about.

@Tusk what was the innkeeper at Greywater called?

A general chatbot

Her name was Mira Ashdown, and she had run the Drowned Lantern since her father passed.

No source. Nothing in your notes says this.

Tusk's Vault

I am unsure about this detail. I have recorded this as a lore gap for the DM to clarify.

Refused, and added to Lore Gaps

Both read like an answer. Only one of them is one — and at the table, in front of everyone, the citation is the only thing that tells you which.

So the whole design is one idea: it may only tell you what your documents say, and it must show you where it got it. Answer a logged gap once and that answer is reused from then on.

Nobody needs this until the evening a player asks something specific and four people remember it four different ways. Then it is the only thing you want.

II

When it doesn't know

The best thing it does is admit defeat

Any assistant can answer a question your documents cover. The one that decides whether you can trust it at the table is the question they don't — and the useful behaviour there is to stop, say so, and remember that you were asked.

  1. Wednesday, in a channel

    Someone asks

    “Whose brother is the king?” — a question your notes never actually settled.

  2. Two seconds later

    It says it doesn't know

    Not a guess dressed as an answer. A fixed phrase, so nobody mistakes it for canon.

  3. Same moment

    The gap is logged

    The question lands in your dashboard, waiting for the one person who can settle it.

  4. Once, ever

    You answer it

    One sentence from you. That ruling is now part of the archive, cited like any document.

and every later phrasing of that question — however differently it is asked — gets your answer

The archive gets better every time it admits it doesn't know something. That only works because it is willing to admit it.

A ruling recorded this way is cited like any other source, so six months later nobody has to remember whether it was decided or imagined. What people actually ask it →

Real questions, real citations, and one refusal, against a corpus written to be published. See the answers in full →

III

How it compares

Why not use something that already exists?

Often you should. Most people arrive here having already pasted their notes into ChatGPT — good software, and for a question your documents genuinely answer it will usually answer correctly. The trouble is the question they don't.

NotebookLM is the closest comparison, and on its own ground it is better than this. Google's budget, excellent retrieval, exact citations, nothing to install. If you are working alone through a pile of documents, use it. The difference is not quality — it is what the two things are built for.

What a research notebook isn't trying to do

  • Put the answer where the whole table sees it
  • Turn up in Discord, or Foundry's chat bar
  • Sound like your table
  • Guess — and label the guess
  • Read a cruel scene back as written

What this one charges you for that

  • Node, Git and a terminal to begin
  • A machine that has to stay awake
  • A folder corpus that stops near 200 pages
  • One maintainer, and no support desk
Neither column is a failing. The left one is a tool built for a reader alone with a PDF; the right one is the bill for being built for a table instead.
What a table actually needs from a lore assistant
Capability Tusk’s Vault NotebookLM Google, in the cloud ChatGPT / Claude a general assistant Obsidian + AI plugins notes you already keep
At the table
Everyone at the table sees the answer Yes No No No
Ask it from Discord, or Foundry’s chat bar Yes No No No
Answers in a voice your table picked Yes No Partly Partly
Whether it can play
Will speculate when you let it, and labels it Yes No Partly Partly
Recounts a grim scene without sanding it down Yes No Partly Partly
Whether you can trust it
Says it doesn’t know, instead of inventing Yes Yes No No
Cites the document behind every claim Yes Yes Partly Partly
A ruling you make once is remembered and reused Yes No No Partly
Your campaign documents never leave your machine Yes No No Yes
What it costs you
Holds a campaign bigger than about 200 pages Partly Yes Partly Partly
Ready in five minutes, without a terminal No Yes Yes Partly
Still answers while your own machine is asleep No Yes Yes No
A team behind it, and somewhere to report a bug No Yes Yes Partly

Which is the honest shape of it. This is not a better NotebookLM — it is a worse one, pointed somewhere NotebookLM is not pointed. Keep theirs for research; use this when the question is being shouted across a table. Campaign wikis and your own GM are not in that grid at all, because neither is a thing you ask — both, and the case for using them instead, are in the full comparison.

A grid where one column ticks every row is a grid whose rows were chosen by whoever owns that column. The four this one does not win are there so the nine it does are worth something. Read those four first.

IV

How it works

Four stages, and one of them is the point

A question goes in one end. Stage two is the one you cannot configure away, and the reason the answer at the far end can be trusted.

  1. Find what bears on the question

    Reads a folder on your disk — PDF, DOCX, Markdown, plain text — or an Obsidian vault, read-only, nothing moved. Passage-level retrieval then picks out the parts that matter, so a large campaign is not a large bill.

  2. Force the rules on top

    Cite every claim; refuse rather than invent. The block is force-appended to every prompt, so editing the system prompt — or picking a persona — cannot remove it.

    The reason this exists

  3. Ask your model

    Gemini, ~400 models through OpenRouter, a Claude subscription, or one running on your own machine. Swappable mid-campaign.

  4. Check what came back

    A refusal is labelled rather than served as content in the archivist's voice — and the question it could not answer lands in your dashboard as a lore gap.

The corpus travels with every question, so every cloud request pins a zero-data-retention routing floor. How the retrieval pipeline works →

V

Ask it anything

Not every question is a lookup

Most of what gets asked at a table is not "when did Dunmar fall". It is an argument two players are having, or a joke someone wants settled with evidence. Those work — and they work for the same reason the serious ones do. It can only answer from what you wrote down, and it shows you where.

@Tusk who's most likely to start a tavern fight?

Roswyn Kett is the likeliest — she has already put one person in the water after an argument with the harbourmaster at Kelmoor, and has since been barred from the Ninefold Rest twice (and readmitted twice)source 1.

  1. 1Party.md
Nobody wrote "Roswyn starts fights" anywhere. It read two incidents and drew the obvious conclusion — then told you which file they were in.

@Tusk would Ser Alric get on with Vesper?

Unlikely, and pointedly so. Vesper has read every surviving account of the fall of Dunmar, and corrects people who have not — including, on one occasion, Ser Alric Vanesource 1. Ser Alric would not discuss Dunmar when the party found him at the Ninefold Restsource 2, and refuses to speak of the siege at allsource 3. A scholar who has already corrected the Grey Knight on the one subject he won't touch is not a natural friend for him.

  1. 1Party.md
  2. 2Sessions.md
  3. 3Houses.md
Three files, joined into one answer about two people who have never shared a scene. This is the kind of thing a table argues about for twenty minutes.

And it doesn't have to sound like a librarian

A persona replaces the whole voice, and the citation rules survive it. Same question, same corpus, same sources — two of the eight that ship:

@Tusk who's least fit to be the ship's captain?

The Archmage

Ah, a question of seamanship, not of secrecy — this one the chronicle answers plainly. Bryn Tallow is the least fit hand to stand at the helm. He cannot swim, and has twice refused to board a boat at all — once at Dunmar, once at the Kelmoor quay — and takes ill even on still water. A captain who will not set foot on his own ship is no captain at all.

Cited Party.md

The Sellsword

Bryn Tallow, and it ain't close — the poor bastard can't swim, gets sick on still water, and has flat-out refused to board a boat twice, once at Dunmar and once at the Kelmoor quay. Roswyn's the only one of the four who's ever actually crewed a boat, so hand her the wheel instead.

Cited Party.md

Same facts, same file, same refusal to invent. Only the register moved. The rest of the answers, in full →

And you decide whether it's allowed to guess

"Who would lose a duel to a chicken" is not in anybody's notes, so by default it is refused like any other question the documents don't answer. Turn on Speculative Mode and it will reason from what the chronicle establishes about each character — then cite the evidence it used and tag the conclusion, so a guess can never be mistaken later for something you wrote down.

@Tusk which of them is most likely to lose a duel to a chicken?

Speculative Mode off — the default

I am unsure about this detail. I have recorded this as a lore gap for the DM to clarify.

Refused. It isn't in your notes.

Speculative Mode on

Bryn Tallow — he's the one party member who's never drawn a weapon in any recorded session, can't swim, and has twice refused to even board a boat because still water makes him sick. A creature this jumpy and non-combative would fold against a chicken's raw aggression before a blade ever cleared its sheath.

Cited Party.md, tagged [speculation]

The evidence is real even when the conclusion isn't — and it says which is which. A factual question still gets the refusal, whichever way the switch is set.

Being recorded

A video walkthrough is on the way

Install to first cited answer, start to finish — including the moment it refuses one.

Until it lands, the setup guide walks the same path in writing.

VI

Getting a session in

Three ways in, one answer

A lore assistant nobody opens is a lore assistant nobody uses, so it answers where the question already gets asked.

  • Discord
  • Foundry VTT
  • MCP client
one corpus one rule block
cited answer or a refusal
The surface only decides where the question comes from and who sees the reply. Persona, corpus and citation discipline are identical on all three.

Discord@mention the botCited answer

In your campaign Discord

Between sessions, which is when most of the questions actually arrive. Mention the bot and the answer lands in the channel, citations and all, where everyone can see it — so the same question doesn't get asked three more times that week.

Wants a bot token. You paste one string; the rest is derived.

Set up Discord

Foundry VTT/tusk your questionCited answer

Mid-session, in the chat bar

Type /tusk and the answer posts into the chat log without anyone leaving the game. A per-world access mode decides whether players may ask at all, and whether the answer is whispered to them or posted for the table — because not every answer is one the party should have.

Wants the companion module. Pairs in one click.

Set up Foundry

The third route needs no setup screen at all: any MCP client — Claude Code, Claude Desktop, anything speaking the protocol — can pair and ask directly. What people actually ask it →

And it doesn't have to be a campaign. Nothing in the machinery knows what a campaign is — it indexes a folder, cites what it finds, and refuses what isn't there. Point it at a handbook or a wiki export and you get the same bot.

The prompts, the citation styles and the refusal wording all assume a GM and a table. Everything else is a happy accident.

VII

What it costs

A question, not a month

Tusk's Vault is free. The only money involved is whatever your chosen model charges for the tokens, and a single question is a very small number of them — one retrieval-augmented request, not a generation pipeline. Gemini's free tier covers most home games outright, and a local model costs nothing at all.

On a Claude plan you already pay for

$0

On Gemini's free tier, which covers most home games

$0

On a model running on your own machine

$0

Through one OpenRouter key, a session of questions

pennies

A campaign wiki subscription, every month, whether you play or not

$5-15

Tusk's Vault

only when you played

A wiki subscription

every month, regardless

Twelve months, for a table that played through eight of them and lost four to scheduling. The four gaps are the whole difference: a subscription bills them, and a per-question cost doesn't exist to bill.

The full cost breakdown →

VIII

What leaves your machine

You're handing this your whole campaign

Years of somebody's worldbuilding, and often things said at a table that were never meant to leave it. So it's worth being exact about where everything goes. Almost all of it stays on the machine you installed it on.

Your machine

  • Every campaign document
  • The index built from them
  • Your rulings and lore gaps
  • The embedding model, running locally
  • Your API keys, encrypted

The model you chose

  • Reads those passages
  • Writes the answer
  • Pinned to keep nothing
Choose a model that runs on your own machine and the right-hand side disappears entirely — nothing leaves at all.
  • No account, no sign-up, no licence check.
  • No telemetry, no analytics, nothing phoning home. Ever.
  • Keys encrypted at rest and tied to the machine — copying the file elsewhere gains nothing.
  • Cloud requests pin a zero-data-retention floor, because the corpus travels with the question.
  • MIT licensed, every line readable, including the setup scripts.

One person, one Windows PC, no support desk — which is why the feedback button sits next to the coffee one in the app. Telling me what broke gets it seen; it does not promise the fix sticks. The unvarnished version is here.

So what happens if I stop?

Worth asking of anything you hand years of worldbuilding. The answer splits cleanly.

Stays yours

  • Your documents — the same folder, never converted or imported
  • Your rulings and gaps — readable JSON, sitting beside them
  • The code — MIT, fork it or hand it on
  • Your install — nothing runs on my servers, so there is nothing to switch off

No export step, because nothing was ever captured.

Stops

  • Fixes — known issues stay known issues
  • Adapting — Discord or a provider changes something and nothing follows it
  • Dependency triage — advisories stop being watched

This is how it would actually die: drift, not deletion.

A real risk, but a differently shaped one. A hosted tool fails by making your material inaccessible on someone else's schedule. This fails as a tool that stops improving, next to a folder that never depended on it.
IX

Questions

The ones people actually ask

Does it make up lore when it does not know?
No — that is the whole point of the design. A canonical rule block is appended to every prompt at assembly time, so citation discipline is structural rather than configurable. When the answer is not in your documents the bot emits a fixed refusal phrase, and the question is logged in the dashboard's Lore Gaps tab so you can answer it once and have that answer reused afterwards.
Do my campaign documents get uploaded anywhere?
Your documents stay in a folder on your machine. Only the question and the snippets that answer it are sent to whichever model you chose, and if you run a local model through Ollama then nothing leaves the machine at all.
What does it cost to run?
The software is MIT-licensed and free forever. The only cost is the model you pick: Google Gemini's free tier covers most home games, OpenRouter is pay-as-you-go at roughly $0.60 to $4 per three-hour session, a Claude Pro or Max subscription costs nothing extra, and a local model through Ollama costs nothing at all.
Do I need to be technical to run it?
You need to be comfortable installing Node.js and running a script. On Windows there is a one-file installer that prints its whole plan and asks before it changes anything; on macOS and Linux it is a clone and one command.
Can players use it, or only the GM?
Both, and how much players can see is yours to set. In Foundry VTT there is a per-world access mode controlling whether players may ask at all, and answers can be whispered rather than posted publicly.
What file formats can it read?
PDF, DOCX, Markdown, plain text, JSON, YAML, CSV, HTML and RTF. It can also read an existing Obsidian vault directly, strictly read-only, without you having to move or copy anything.
Does it work with Foundry VTT?
Yes, through a companion module that pairs with your running Vault in one click. You ask with /tusk in the chat bar and the answer posts into the chat log, whispered or public depending on the world's access mode.
How is this different from asking ChatGPT about my campaign?
A general chatbot will answer every question confidently, including the ones your documents say nothing about, and the invented answer reads exactly like a real one. Vault cites the document behind every claim and refuses when it has no source, which is the behaviour that makes it usable at the table.
Does it only work for tabletop campaigns?
That is what it was built and tuned for — the prompts, citation styles and refusal wording all assume a game master and a table. But nothing in the machinery knows what a campaign is. It indexes a folder of documents, answers with citations, and refuses when the folder does not cover the question, so pointing it at a handbook, a wiki export, a set of house rules or any other body of documents gives you the same behaviour over those instead.
X

Start

Two things, then one command

You need Node 20 or newer and Git. That is the whole requirement — no Python, no Docker, no database, no admin rights, and no paid key: a free Gemini tier covers most home games, and a local model costs nothing at all.

Install it Connect it to Discord

Getting started 3

  • Choosing a providerTusk's Vault talks to four kinds of model. You pick one from the Home tab and can change it whenever you…
  • InstallationThis guide takes you from "nothing installed" to "the bot is answering in Discord". Pick the section that…
  • UninstallingVault ships an uninstaller that removes everything it created without touching your campaign documents. This…

Asking from your table 2

  • DiscordMost campaign questions don't arrive at the table. They arrive on a Wednesday, in a channel, three days after…
  • Foundry VTTVault can answer questions typed into Foundry's chat bar. This document covers how that works, what it costs…

Your lore 2

  • Obsidian vaultVault reads your campaign from one of two places: the Tusks-Lore folder — documents you upload through the…
  • Tusk's Tomes--- Vault is only as good as what you feed it, and the hardest campaign material to produce is a record of…

Privacy & safety 2

  • PrivacyTusk's Vault is local-first by design. This page is the data answer: what stays on your machine, what travels…
  • Security PolicyThanks for taking the time to help keep Tusk's Vault safe. This document does three things:

Help 2

  • FAQShort answers. Where a question has a page of its own, this points at it rather than repeating it — two…
  • Known issuesHonest list of what doesn't work yet, what's a limitation by design, and how to file a bug. If something here…

About Tusk's Vault 8

  • Code of ConductTusk's Vault is a small project maintained by one person. This is short on purpose — a four-tier enforcement…
  • ComparisonHonest comparison to the tools TTRPG groups actually use today. Every claim here is verified against the…
  • ContributingFirst — thank you. Tusk's Vault is a community-shaped project, and the contributions that matter most aren't…
  • DependenciesEvery package Vault depends on, with the rationale for each choice. Skip to Why these choices for the…
  • How it's builtHow Tusk's Vault turns "an @-mention in Discord" into a cited, source-grounded answer. This page is written…
  • RoadmapWhat's next in Tusk's Vault, and why. What already works is in the README and the docs — this page is the…
  • Use casesFor TTRPG Game Masters and players who want to keep track of what goes on during sessions. What people…
  • What it costsVault itself is free. MIT-licensed, no subscription, no account, no telemetry, no paywalled features. The…

Docs 1

  • DocumentationTusk's Vault is a local-first lore assistant for tabletop campaigns. You point it at the notes you already…