Why Foundry Works for Solo Play
Solo roleplaying means you play the hero and let dice, tables and cards stand in for the Game Master. You ask a question ("Is the bridge guarded?"), consult an oracle, interpret the answer, and write down what happened. A notebook and a handful of dice do the job. So why bring a virtual tabletop into it?
Because Foundry already holds most of what a solo player reaches for, all in one window:
- Roll Tables become oracles and random-event generators that post their answers to chat with one click.
- Journal Entries become your session log, with text pages for the story and image pages for maps and handouts.
- Cards give you a shuffled deck oracle that remembers what you have already drawn.
- Scenes, walls, lighting and fog of war let you explore a dungeon without already knowing what is round the corner.
- Character sheets from your game system do the bookkeeping: hit points, inventory, conditions.
- Macros turn the questions you ask a dozen times a session into a single button.
- The chat log is a permanent, timestamped record of every roll you made.
When Foundry is overkill. If your solo game is a journaling game, a short one-shot, or a system with no Foundry support, a notebook may serve you better. Building scenes, walls and lights takes time that a solo player could spend playing. A fair rule of thumb: use Foundry when you want tactical maps, character sheets that calculate things, or a long campaign you will return to. For a quick evening of pure storytelling, you can still use Foundry with no scenes at all: just a Journal, a couple of Roll Tables and the chat log.
The rest of this page follows the solo loop below. Each step maps onto a Foundry tool.
Setting Up a Solo World
Create the world as you would for any game (see Installation & Setup): on the Setup screen open Game Worlds, create a world, and choose your game system. Then launch it.
You are the Gamemaster (and the player)
Every new world has a Gamemaster user. Log in as that user. As GM you can create documents, edit scenes, see hidden tokens and read every journal, which is exactly what you need to build oracles and prepare maps. You will spend most of your solo time logged in this way.
The catch: the GM sees everything. A dungeon full of hidden monsters is no surprise if you can see them on the map. There are two ways round this.
- Select your character's token. When the GM controls a token that has vision, the canvas shows what that token can see, with fog of war for unexplored areas. Click empty space to deselect and you are back to the all-seeing GM view. This is usually enough.
- Add a Player user. For a stricter separation, open the Settings tab, go to user management, and add a user with the Player role, named after your character. Set a password if you like. Open a second browser (or a private window) and log in as that user. That window now shows the true player view: no hidden tokens, no GM-only journals, no secret doors.
Ownership
If you create a Player user, give it control of your character. Open the actor, choose its ownership settings, and set your Player user to Owner. The four ownership levels are None, Limited, Observer and Owner; Owner lets that user move the token, roll from the sheet and see through the token's eyes.
Do the same for journals you want the "player you" to read: a handout, a map of the region, the session log itself. Set them to Observer so the Player user can read but not edit them, or Owner if you want to write the log from the player window.
One person, two windows. A comfortable solo layout is the GM window on one screen (or one half of a screen) with the Roll Tables and Journal tabs open, and the Player window on the other showing the map. If you have only one small screen, skip the Player user and use the token-selection trick instead.
Keep the world tidy: folders called Oracles and Sparks in the Roll Tables tab, and Session Logs, People, Places and Threads in the Journal tab.
Roll Tables as Oracles
A Roll Table is a list of results, each covering a range of numbers, plus a dice formula. When you draw from the table, Foundry rolls the formula, finds the matching row and posts the result to chat. That is a solo oracle in one click.
Build a yes/no oracle (1d100)
- Open the Roll Tables tab in the sidebar and create a new table. Name it Oracle: 50/50.
- Set the table's formula to
1d100. - Add four results and set their ranges exactly as below. Each range is inclusive, so 1–5 means 1, 2, 3, 4 and 5.
- Leave each result's type as Text and type the answer.
- Save, then click the draw button on the table sheet. The answer appears in chat with the roll.
| Range (1d100) | Result | Chance |
|---|---|---|
| 1–5 | No, and… (worse than no) | 5/100 = 5% |
| 6–50 | No | 45/100 = 45% |
| 51–95 | Yes | 45/100 = 45% |
| 96–100 | Yes, and… (better than yes) | 5/100 = 5% |
With 1d100 the odds are easy to read: the number of values in a range is the percentage. "Yes" of any kind comes up 50% of the time.
Likely and unlikely questions
Not every question is a coin flip. Is a busy market crowded at noon? Probably. Make a second table, Oracle: Likely, by duplicating the first and moving the ranges:
| Result | Oracle: Likely | Oracle: Unlikely |
|---|---|---|
| No, and… | 1–3 (3%) | 1–3 (3%) |
| No | 4–25 (22%) | 4–75 (72%) |
| Yes | 26–97 (72%) | 76–97 (22%) |
| Yes, and… | 98–100 (3%) | 98–100 (3%) |
| Any yes | 75% | 25% |
A 2d6 oracle with a "twist" result
Two six-sided dice give a bell curve: middle results are common and extremes are rare. That suits an oracle where a plain answer is normal and a dramatic one is a surprise. Create Oracle: 2d6 with the formula 2d6 and these ranges:
| Range (2d6) | Result | Ways (of 36) | Exact chance |
|---|---|---|---|
| 2–3 | No, and… | 1 + 2 = 3 | 3/36 = 1/12 ≈ 8.3% |
| 4–6 | No | 3 + 4 + 5 = 12 | 12/36 = 1/3 ≈ 33.3% |
| 7 | Yes, but… (a twist) | 6 | 6/36 = 1/6 ≈ 16.7% |
| 8–10 | Yes | 5 + 4 + 3 = 12 | 12/36 = 1/3 ≈ 33.3% |
| 11–12 | Yes, and… | 2 + 1 = 3 | 3/36 = 1/12 ≈ 8.3% |
The ranges must cover every possible total from 2 to 12 with no gaps or overlaps. If a roll lands on a number no row covers, the draw finds no result.
Text or Document results. A Text result is just words posted to chat, which is right for yes/no answers. A Document result points at another document in your world or a compendium, such as a Journal Entry, an Actor or even another Roll Table. Use Document results for an encounter table whose rows link straight to the monsters, or for a "location" table whose rows link to journal pages you have already written. Drag the linked document onto the canvas or open it from the chat card.
Draw options worth knowing
- Draw with replacement. By default a table can give the same result twice. Turn replacement off and each drawn row is marked as drawn and skipped until you reset the table. That is useful for a list of clues or unique NPC names, and wrong for an oracle.
- Show the roll. The table can post its roll alongside the result. Keep this on for oracles; it lets you see whether you were close to a different answer.
- Roll mode. Draws follow your current roll mode in the chat panel. Solo, public is fine. If you also run a Player window and want the oracle hidden from "the player you", switch to a GM-only mode before drawing.
- Weight. Instead of typing ranges, you can give each result a weight and have Foundry recalculate the ranges from the weights. Typing ranges directly is clearer when you want exact, published odds.
A random event (spark) table
An oracle answers the question you asked. A good solo game also needs things you did not ask for. Two common approaches:
- Event on doubles. When you roll the 1d100 oracle, treat any double (11, 22, 33 … 99) as "something unexpected happens". That is 9 values out of 100, a 9% chance per question. (100 does not count.)
- Event on a scene check. At the start of each new scene, roll
1d6; on a 1, the scene is interrupted. That is a 1/6 chance, about 16.7%.
When an event fires, draw from a Spark table: a 1d20 table with twenty short prompts, one per value, so each has an exact 1/20 = 5% chance. Better still, make two tables, Spark: Action and Spark: Subject, and draw once from each. Twenty actions times twenty subjects gives 400 combinations ("Betray + Ally", "Reveal + Map").
| 1d20 | Spark: Action | 1d20 | Spark: Action |
|---|---|---|---|
| 1 | Arrive | 11 | Hide |
| 2 | Betray | 12 | Lose |
| 3 | Break | 13 | Offer |
| 4 | Chase | 14 | Protect |
| 5 | Collapse | 15 | Reveal |
| 6 | Delay | 16 | Steal |
| 7 | Demand | 17 | Summon |
| 8 | Escape | 18 | Threaten |
| 9 | Follow | 19 | Transform |
| 10 | Help | 20 | Warn |
Cards as a Deck Oracle
Foundry's Cards tab handles three kinds of card stack: Decks (you draw from them), Hands (cards held by someone) and Piles (face-up discards). You can deal, draw, pass and shuffle, and a deck can be imported from a compendium or a JSON file.
A deck behaves differently from a table: once a card is drawn it stays out until you shuffle it back. That gives you an oracle with memory.
- A standard 52-card deck as a yes/no oracle. Red means yes, black means no: 26/52 = exactly 1/2. A face card (12 of 52, 3/13 ≈ 23.1%) adds "and…" for extra intensity.
- Suit as a theme. Hearts for people and emotion, diamonds for wealth, clubs for conflict, spades for mystery. Draw a card for an NPC's mood or a room's feel.
- Custom prompt cards. Create a deck where each card's face carries a prompt ("An old debt", "A locked door", "A storm"). Draw one to a "Story" pile at the start of each session. Because drawn cards are gone until you shuffle, no prompt repeats until the deck runs out.
Journals as Session Logs
A solo game lives or dies by its notes. Without another player to remember that the miller owes you money, the log is the only memory the campaign has. Journal Entries are well suited to it (for the full tour, see Journals & Handouts).
One entry per session
Create a Journal Entry in your Session Logs folder for each session: Session 01: The Drowned Road. Inside it, add pages:
- A Text page for the story. Write the play in short paragraphs: the question you asked, the oracle's answer, what you decided it meant, what happened. Foundry's text editor is ProseMirror, with headings, lists and links.
- An Image page for each map or handout. A sketch of the ruined tower, a letter you found, the face of the smuggler you met.
- A Text page for "Loose Ends". Open questions and threads to follow next time.
Link everything
Drag an Actor, Item, Scene or another Journal Entry from the sidebar into a text page and Foundry inserts a link to it. Clicking the link opens that document. Your log can then say "met Hesk the ferryman" with Hesk's character sheet one click away.
The chat log keeps every roll, but it is not a story; the journal is. Copy striking oracle answers into the Text page as you go.
Keep a "Threads" entry. A single Journal Entry listing active plot threads and important characters is the solo player's equivalent of the GM's prep notes. When the oracle says something unexpected happens, a thread from this list is often the best answer.
Scenes Set Up for One
A solo scene does not need the polish of a scene you would show a group. Build what helps you play and skip the rest (Creating Scenes covers the full toolset).
Vision and fog of war
- Enable token vision for the scene and give your hero's token a sight range suited to your system. Use the token's vision mode (for example Darkvision) if your character has it.
- Keep fog exploration on, so areas you have visited stay revealed while unexplored rooms stay dark. This is what makes a pre-drawn dungeon feel unknown.
- If you play several heroes, V14's shared fog exploration option lets every explored area count for all of them.
Walls only where they matter
Walls block movement and sight. In a solo dungeon, wall the rooms and corridors you have not explored, and add doors where you want a reveal. You do not need every pillar and alcove walled. Outdoor scenes and town maps often need no walls at all.
A secret door is hidden from players but visible to the GM. If you use a Player window, a secret door is a genuine surprise when you (as GM) later reveal it.
Regions as triggers
Scene Regions are areas you draw on the map and attach behaviors to. They make a solo map react when your token walks somewhere, so you do not have to remember every trap and tripwire yourself. Draw a region with the Regions tool in the scene controls, open its configuration, and add a behavior set to fire when a token enters the area:
| Behavior | Solo use |
|---|---|
| Display Scrolling Text | Float a message over the token: "The floor creaks…" |
| Execute Macro | Run one of your macros, such as an oracle draw or an encounter check when you enter the woods. |
| Pause Game | Stop when you step somewhere important, so you can read the room description before moving on. |
| Teleport Token | A trapdoor that drops you to the cellar region. |
| Adjust Darkness Level | A room goes dark when you step on the cursed tile. |
Measured Templates were removed in V14; area shapes such as cones and circles are Regions now, so the same tool covers both traps and spell areas.
Don't over-build. Every trigger you place is something you already know about. Some solo players prefer to place no triggers at all and let the oracle decide whether a room is trapped. Use Regions for the things you would forget, not for the things you want to be surprised by.
Useful Macros
Macros live on the hotbar at the bottom of the screen (ten slots per page, five pages) and run with a click or the number keys 1–9 and 0. A Chat macro posts a fixed message; a Script macro runs JavaScript. See Macros & Automation for the basics of creating one.
The quickest oracle: a chat command
You do not need a macro at all to roll an oracle. Type in chat:
/r 1d100 # Is the bridge guarded?
The text after # becomes the roll's flavor, so the question and the answer sit together in the chat log. Put that line in a Chat macro and you have a one-click 1d100.
A one-click oracle with answer and event check
This Script macro rolls 1d100, translates it using the 50/50 ranges above, flags doubles as a random event, and posts everything to chat.
// Solo oracle: 1d100 yes/no with a random-event check on doubles
const roll = await new Roll("1d100").evaluate();
const n = roll.total;
let answer;
if (n <= 5) answer = "No, and…";
else if (n <= 50) answer = "No";
else if (n <= 95) answer = "Yes";
else answer = "Yes, and…";
// 11, 22, 33 … 99 are doubles (9 chances in 100)
const event = (n % 11 === 0 && n <= 99);
let flavor = `<strong>Oracle (50/50):</strong> ${answer}`;
if (event) flavor += "<br><em>Random event! Draw a spark.</em>";
await roll.toMessage({ flavor });
evaluate() is asynchronous in current Foundry, so it is always awaited. roll.toMessage() creates the chat message with the dice shown, which Dice So Nice! (below) will animate if you have it.
Draw from a Roll Table by name
If you prefer to keep the odds in a table you can edit, have the macro draw from it instead:
// Draw from a Roll Table in this world by its exact name
const table = game.tables.getName("Oracle: 2d6");
if (!table) {
ui.notifications.warn("No Roll Table named 'Oracle: 2d6' in this world.");
return;
}
await table.draw();
Make one copy of this macro per table (Oracle: Likely, Spark: Action and so on) and line them up on one hotbar page. The table name must match exactly, including capitals and punctuation.
Two sparks at once
// Draw an Action and a Subject spark together
for (const name of ["Spark: Action", "Spark: Subject"]) {
const table = game.tables.getName(name);
if (table) await table.draw();
else ui.notifications.warn(`Missing Roll Table: ${name}`);
}
Keybindings
Open the Settings tab and choose Configure Controls to see and rebind every keyboard shortcut from core Foundry, your game system and your modules. Check which keys your system already uses before you rebind anything.
Modules That Help
Core Foundry covers solo play on its own. A few modules make it more pleasant (all of these are verified for V14; see Modules & Add-ons for installing them):
- Dice So Nice! rolls 3D dice across the screen. Purely cosmetic, but seeing the dice tumble makes an oracle roll feel like a moment.
- Monk's Enhanced Journal adds richer journal types and organisation, handy if your session logs and NPC notes grow into a large campaign wiki.
- Monk's Active Tile Triggers adds tile-based triggers beyond what core Regions offer. Try core Regions first; reach for this only if you need something they cannot do.
Solo-specific modules exist. The community has built modules aimed squarely at solo players, including oracle and journaling tools. They change often and are not covered here; check a module's package page for its verified Foundry version before installing, and take a backup of your world first.
A Worked First Solo Session
Here is one complete loop, from an empty world to a logged session. The hero is Wren, a scout sent to find out why the ferry across the Grey River has stopped running.
- Prepare (15 minutes). Create the world and Wren's actor. Build Oracle: 50/50, Oracle: Likely and Oracle: Unlikely as 1d100 tables, plus Spark: Action and Spark: Subject as 1d20 tables. Make the one-click oracle macro and drag it to hotbar slot 1.
- Start the log. Create Session 01: The Silent Ferry in the Session Logs folder with one Text page. Write the opening situation in two sentences.
- Set the scene. Make a simple scene from a riverbank map. No walls are needed outdoors. Place Wren's token and a ferry house. Give Wren's token vision.
- Scene check. Type
/r 1d6 # Scene checkin chat. A 4: no interruption, the scene plays as expected. - Ask the first question. "Is anyone at the ferry house?" It is a working ferry, so it is likely. Draw from Oracle: Likely: a 31, "Yes".
- Ask a follow-up. "Is it the ferryman?" A fair question: press 1 for the 50/50 macro. It rolls a 44: "No". And 44 is a double, so the chat card says Random event!
- Draw a spark. Run the two-spark macro: Hide + Debt. Interpretation: the person at the ferry house is hiding from someone the ferryman owes money to.
- Play it out. Create a quick actor for the stranger, drop the token in the ferry house, and roll Wren's social skill from her sheet as your system requires. The result decides how the stranger reacts.
- Log it. In the Text page, write: the question, the answer, the spark, your interpretation, the outcome. Drag the stranger's actor into the text to link it. Add an Image page with the riverbank map.
- Close out. Add a "Loose Ends" page: Where is the ferryman? Who holds the debt? Those become the first questions next session.
That is the whole loop. Most sessions are this pattern repeated: question, oracle, interpret, play, log.
Try It in Foundry
1. Check the 2d6 oracle
A friend builds a 2d6 oracle with these rows: 2–4 "No", 5–9 "Maybe", 10–12 "Yes". What is the exact chance of each answer?
Answer
Count the ways out of 36. Totals 2–4: 1 + 2 + 3 = 6, so 6/36 = 1/6 (about 16.7%). Totals 5–9: 4 + 5 + 6 + 5 + 4 = 24, so 24/36 = 2/3 (about 66.7%). Totals 10–12: 3 + 2 + 1 = 6, so 6/36 = 1/6. "Maybe" dominates; a yes/no oracle built this way rarely answers the question.
2. Build a "Very Likely" table
Make a 1d100 table where any kind of yes comes up exactly 90% of the time, with 3% each for "No, and…" and "Yes, and…". Write the four ranges.
Answer
1–3 "No, and…" (3%), 4–10 "No" (7%), 11–97 "Yes" (87%), 98–100 "Yes, and…" (3%). Any no: 3 + 7 = 10%. Any yes: 87 + 3 = 90%. The four ranges cover 1–100 with no gaps or overlaps.
3. Fix the macro
This macro was written for an old Foundry version and no longer works. What is wrong?
const roll = new Roll("1d100").roll();
ChatMessage.create({ content: roll.total });
Answer
Roll#roll() is gone; rolls are evaluated with the asynchronous evaluate(), which must be awaited. Posting only the total also loses the dice. A working version:
const roll = await new Roll("1d100").evaluate();
await roll.toMessage({ flavor: "Oracle" });
4. A trap that tells you
You want a message to appear when your token steps onto a pressure plate in a corridor, without a module. How do you set it up?
Answer
Use the Regions tool in the scene controls to draw a small region over the plate. In the region's configuration add a Display Scrolling Text behavior (for the message) set to fire when a token enters. If the trap should also roll damage or an oracle, add an Execute Macro behavior pointing at that macro.
5. Seeing what the hero sees
You are logged in as the GM and can see every hidden goblin on the map. Name two ways to get a fair, player's-eye view.
Answer
(1) Select your hero's token: the GM view switches to that token's vision, with fog of war over unexplored areas. (2) Create a Player user, make it Owner of your hero's actor, and log in as that user in a second browser or private window.
Where to Go Next
- Journals & Handouts: more on page types, linking and ownership for your session logs.
- Macros & Automation: create, organise and extend the oracle macros from this page.
- Dice Formula Tester: try out oracle formulas such as
1d100,2d6and4dfbefore you build a table around them.