"""Page copy: how-to, article sections, example intro, FAQs. One H1 lives in the hero.""" HOW_TO_HTML = """

This free DnD quest generator writes adventures for the person who has to run them: the Dungeon Master. Instead of a one-line premise, every result is a complete, runnable quest — a hook, a quest giver with something to hide, a clear objective, three complications that force real decisions, a twist, an antagonist, a reward scaled to your party's level, and two hooks showing where it leads next. It works for 5e and the 2024 rules, runs right on this page, and needs no signup.

  1. Pick a quest type, or don't. Every field is optional. Choose Rescue, Heist, Mystery, Faction Politics — or type your own — and the generator builds the arc around it. Leave it blank for a surprise.
  2. Tell it who's playing. Party level scales the danger and the treasure; party size shapes how the opposition is built. A level-4 party of three gets a very different quest than a level-12 party of six.
  3. Set the scope. One-shot quests resolve in a single night with the twist firing by the midpoint. Short arcs give each complication a session of its own. Campaign threads resolve the quest but point both follow-up hooks at something bigger.
  4. Anchor it to your table. Add a setting, a quest giver idea, or a tie-in to a player character — "the rogue's old guild" is enough — and the quest is written into your campaign instead of beside it. Then generate, copy the Markdown or download the file, and hit Regenerate until it feels right. Surprise Me rolls a type, level, tone, and scope for you.
""" INCLUDES_HTML = """

Most quest tools hand you a premise: "retrieve the amulet from the ruins." That is the easy five percent. The hard part is everything the premise doesn't answer — who wants the amulet and why they're lying about it, what goes wrong at the ruins, and what the party actually gets for the trouble. Every quest this tool generates includes the parts a premise leaves out:

""" EXAMPLE_INTRO_HTML = """

Here is a complete, unedited output from this generator. The inputs were: quest type "Rescue", party level 4, scope "Short arc (2-3 sessions)" — everything else left blank.

""" RUN_AT_TABLE_HTML = """

A generated quest earns its place the moment your players start making choices inside it. A few habits turn a good sheet into a good session:

""" FAQS = [ ( "How do you write a D&D quest?", "Start with three questions: what does the party think they're doing, what is " "actually happening, and what goes wrong in the middle? The gap between the " "first two is your twist; the answers to the third are your complications. Add " "a quest giver with a reason to shade the truth and a reward worth the risk, " "and you have a quest instead of an errand. This generator produces all of " "those parts in a structured sheet you can run directly.", ), ( "What makes a good side quest?", "A good side quest is short, self-contained, and leaves a mark. It should " "resolve in a session or two (use the One-shot scope), touch at least one " "thing the party already cares about — a place they've been, a faction " "they've met, a PC's past — and end with a small permanent change: a new " "contact, a new enemy, a rumor that turns out to matter. Side quests fail " "when they're disconnected filler; the tie-in field exists to prevent " "exactly that.", ), ( "How long should a quest take to play?", "Match scope to appetite. A one-shot quest fills one session of three to four " "hours: hook and travel in the first hour, complications in the middle, twist " "and finale in the last. A short arc runs two to three sessions with roughly " "one complication anchoring each. Campaign threads resolve like a short arc " "but leave both follow-up hooks pointing at something larger. If your table " "plays shorter sessions, cut travel first — never the twist.", ), ( "How do I scale a quest to my party level?", "Scale three things: the opposition, the stakes, and the reward. Swap the " "antagonist's stat block up or down a challenge tier and adjust their " "henchmen count before touching anything else — the story usually survives " "intact. Set the party level input and the generator does this for you, " "sizing the antagonist suggestion and the treasure to your tier.", ), ( "How is this different from a random encounter generator?", "An encounter is one scene; a quest is a multi-scene arc. A random encounter " "generator answers \"what happens on the road tonight?\" — one fight, one " "hazard, one strange meeting. A quest generator answers \"what is this whole " "adventure about?\" — hook, objective, complications, twist, antagonist, and " "payoff across multiple scenes or sessions. They pair well: use our encounter " "generator, linked below, to fill the travel between this quest's beats.", ), ( "Can I tie quests to character backstories?", "Yes — it's the single highest-impact input on the page. Put a phrase like " "\"the rogue's old guild\" or \"the cleric's missing mentor\" in the tie-in " "field and the quest is built to intersect that history: the quest giver, the " "twist, or the antagonist will connect to it. Backstory-linked quests get " "player buy-in for free, because the hook is aimed at a person instead of a " "party.", ), ( "What rewards should a quest give at each level?", "As a rule of thumb for 5e: tier 1 (levels 1-4) quests pay tens of gold up to " "a couple hundred, tier 2 (5-10) pays hundreds, tier 3 (11-16) pays " "thousands, and tier 4 (17-20) pays tens of thousands — or things gold can't " "buy: titles, strongholds, favors from the powerful. Mix in non-monetary " "rewards early; a minor magic item or a standing favor is remembered long " "after the coin is spent. Generated rewards follow this curve based on the " "party level you set.", ), ( "Does it work with both 5e (2014) and the 2024 rules?", "Yes. Quests are rules-light by nature — the output references SRD-style " "stat blocks by name (Bandit Captain, Spy, Thug) and standard skill checks, " "all of which exist in both the 2014 and 2024 rulesets. Whichever monster " "book you own, grab the block with the matching name and run it as written.", ), ]