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.1.0

@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.

The second column is also this project. The Foundry module answers on its own, out of the journal entries in the folders you choose, with nothing else installed — that is Lite, and for a campaign that already lives in Foundry it may be the whole answer. It sits in the grid because the honest way to show what the full application adds is to put the two beside each other and let the rows say it.

What a table actually needs from a lore assistant
Capability Tusk’s Vault the full application Tusk’s Vault Lite the Foundry module alone 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 Yes No No No
Ask it from Discord, or Foundry’s chat bar Yes Partly No No No
Answers in a voice your table picked Yes No No Partly Partly
Whether it can play
Will speculate when you let it, and labels it Yes No No Partly Partly
Recounts a grim scene without sanding it down Yes Yes No Partly Partly
Whether you can trust it
Says it doesn’t know, instead of inventing Yes Yes Yes No No
Cites the document behind every claim Yes Yes Yes Partly Partly
A ruling you make once is remembered and reused Yes No No No Partly
Your campaign documents never leave your machine Yes Partly No No Yes
What it costs you
Holds a campaign bigger than about 200 pages Partly No Yes Partly Partly
Ready in five minutes, without a terminal No Yes Yes Yes Partly
Still answers while your own machine is asleep No No Yes Yes No
A team behind it, and somewhere to report a bug No 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.

Nine of these rows go this project’s way. Four do not. You would have found the four out on your own soon enough.

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 a second, separate install — the Tusk’s Vault module, searchable by name in Foundry’s own Install Module browser, or from its repository. It runs two ways, chosen in Module Settings.

Lite needs nothing else at all: it answers from the journal entries in one Foundry folder, citing the entry it quoted and honouring your journal permissions, so a GM-only note stays GM-only. That is a working archivist in about two minutes, without downloading Vault.

Bridge is where this page comes in. Point the module at Vault running on the GM’s machine and the answers stop being limited to one journal folder — they come from everything you keep, Word and PDF and Markdown and a whole Obsidian vault, with your model of choice and your API key never in a browser. Lite is the trial; Bridge is the archive.

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.

And who should be allowed to ask?

A different question from where the data goes, and the one more likely to matter at a table. Anyone who can ask reaches the whole corpus, because retrieval follows the question — ask about a mystery and you get the notes about that mystery. That is what makes it useful, and it is worth knowing before you point it at a group.

Players will also try talking it into simply reciting what it was handed. Some of them will manage it. What comes out is your own lore — not your keys, your files, or anything else on the machine. The archivist has no filesystem, no shell and no network of its own, and that is tested rather than hoped for. So the thing to plan around is spoilers and timing, not a breach.

Which makes this a tool for a private Discord or a Foundry table of trusted players rather than a public server. Player questions are off by default on Foundry; on Discord the bot only reads the channels you put it in. What a prompt injection can and cannot do spells out both halves.

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.

One machine is supported so far

Tusk’s Vault is built and used daily on 64-bit Windows 10 / 11, and that is the only platform where a clean install has been run start to finish. Windows on ARM, macOS and Linux should work but are unverified — nothing in the code is Windows-only and the test suite runs on Linux on every commit, but nobody has yet booted the app on a Mac, a Linux desktop, or an ARM laptop.

Nothing here can harm your computer; the realistic failure is that the server does not start. If you try one of those, please say what happened — that is exactly what moves a platform to supported. The full platform table →

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…