Playing Solo in Foundry

Using Foundry's own tools to run a game for one: oracles, logs and a table that waits for you.

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:

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.

flowchart TD A["Set the scene<br/>(Scene + Journal page)"] --> B["Ask a yes/no question"] B --> C["Draw from the oracle<br/>(Roll Table or macro)"] C --> D{"Random event?"} D -- "Yes" --> E["Draw from the spark table"] D -- "No" --> F["Interpret the answer"] E --> F F --> G["Play it out<br/>(tokens, sheet, dice)"] G --> H["Log it in the session journal"] H --> B

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.

  1. 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.
  2. 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)

  1. Open the Roll Tables tab in the sidebar and create a new table. Name it Oracle: 50/50.
  2. Set the table's formula to 1d100.
  3. Add four results and set their ranges exactly as below. Each range is inclusive, so 1–5 means 1, 2, 3, 4 and 5.
  4. Leave each result's type as Text and type the answer.
  5. Save, then click the draw button on the table sheet. The answer appears in chat with the roll.
Range (1d100)ResultChance
1–5No, and… (worse than no)5/100 = 5%
6–50No45/100 = 45%
51–95Yes45/100 = 45%
96–100Yes, 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:

ResultOracle: LikelyOracle: Unlikely
No, and…1–3 (3%)1–3 (3%)
No4–25 (22%)4–75 (72%)
Yes26–97 (72%)76–97 (22%)
Yes, and…98–100 (3%)98–100 (3%)
Any yes75%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)ResultWays (of 36)Exact chance
2–3No, and…1 + 2 = 33/36 = 1/12 ≈ 8.3%
4–6No3 + 4 + 5 = 1212/36 = 1/3 ≈ 33.3%
7Yes, but… (a twist)66/36 = 1/6 ≈ 16.7%
8–10Yes5 + 4 + 3 = 1212/36 = 1/3 ≈ 33.3%
11–12Yes, and…2 + 1 = 33/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

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:

  1. 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.)
  2. 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").

1d20Spark: Action1d20Spark: Action
1Arrive11Hide
2Betray12Lose
3Break13Offer
4Chase14Protect
5Collapse15Reveal
6Delay16Steal
7Demand17Summon
8Escape18Threaten
9Follow19Transform
10Help20Warn

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.

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:

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

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:

BehaviorSolo use
Display Scrolling TextFloat a message over the token: "The floor creaks…"
Execute MacroRun one of your macros, such as an oracle draw or an encounter check when you enter the woods.
Pause GameStop when you step somewhere important, so you can read the room description before moving on.
Teleport TokenA trapdoor that drops you to the cellar region.
Adjust Darkness LevelA 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):

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.

  1. 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.
  2. 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.
  3. 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.
  4. Scene check. Type /r 1d6 # Scene check in chat. A 4: no interruption, the scene plays as expected.
  5. 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".
  6. 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!
  7. 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.
  8. 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.
  9. 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.
  10. 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