Scrollbook: Building a Configurable AI Co-DM for D&D

{"type": "doc", "content": [{"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "The Problem with "AI or Nothing""}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "The D&D community has legitimate concerns about AI in creative spaces. I've heard them loud and clear: AI threatens to homogenize storytelling, replace human creativity, and reduce the art of dungeon mastering to algorithmic output. These concerns aren't wrong, they're just incomplete."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "The real problem isn't AI itself. It's the assumption that using AI means surrendering creative control."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Scrollbook is built on a different philosophy: AI should amplify your vision, not replace it."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "Architecture: Built for Flexibility First"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Scrollbook isn't an AI-first platform that grudgingly supports manual play. It's a campaign management system that happens to offer powerful AI assistance when you want it."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "The Core Infrastructure"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "At its foundation, Scrollbook is a distributed system built to handle the complexity of D&D campaigns:"}]}, {"type": "codeBlock", "attrs": {"language": null}, "content": [{"type": "text", "text": "\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Discord Interface Layer \u2502\n\u2502 (Cipher Bot + Slash Commands) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 FastAPI Microservices \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 Campaign \u2502 \u2502 Game \u2502 \u2502 AI \u2502 \u2502\n\u2502 \u2502 Logic \u2502 \u2502 Mechanics\u2502 \u2502 Service \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25bc\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 PostgreSQL + SQLAlchemy \u2502\n\u2502 (Real-time state, Multi-tenant design) \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "The key architectural decision: "}, {"type": "text", "marks": [{"type": "bold"}], "text": "AI is a service layer, not the foundation."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "Multi-Tenant Design with Granular Permissions"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Every campaign in Scrollbook operates as an isolated tenant with configurable AI permissions:"}]}, {"type": "bulletList", "content": [{"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Full Manual Mode"}, {"type": "text", "text": ": Zero AI interaction. Pure campaign management\u2014character sheets, quest tracking, session logs, inventory management"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Assisted Mode"}, {"type": "text", "text": ": AI suggests descriptions, generates NPC dialogue, proposes encounter ideas\u2014you approve or reject everything"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Co-DM Mode"}, {"type": "text", "text": ": AI handles routine mechanics (initiative, attack rolls, status effects) while you focus on narrative"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Automated Mode"}, {"type": "text", "text": ": Full AI dungeon master with real-time combat adjudication and dynamic storytelling"}]}]}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "These aren't binary switches. They're graduated controls you can adjust per-session or even per-encounter."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "Technical Deep Dive: How We Made AI Optional"}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "1. Prompt Caching Architecture"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "One of the biggest technical challenges was making AI fast enough for real-time play without making it mandatory. Our prompt caching system reduces AI invocation costs by 90% when enabled, but more importantly, it allows the system to function identically whether AI is on or off."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "When AI is disabled, the same data structures populate the UI\u2014just without generated content. Your campaign state, character sheets, and session history remain fully functional."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "2. State Management Independent of AI"}]}, {"type": "codeBlock", "attrs": {"language": "python"}, "content": [{"type": "text", "text": "# Campaign state is AI-agnostic\nclass CampaignState:\n - Characters (stats, inventory, relationships)\n - Quests (objectives, progress, rewards)\n - World State (locations, factions, timeline)\n - Session History (events, decisions, outcomes)\n - Combat Tracker (initiative, conditions, HP)\n"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Every piece of campaign data exists independently of whether it was created by you, your players, or AI. The system doesn't care\u2014it just manages state."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "3. Microservices Separation"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "The AI service is completely decoupled from core game logic:"}]}, {"type": "bulletList", "content": [{"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Campaign Service"}, {"type": "text", "text": ": Manages all non-AI operations (CRUD for characters, quests, items)"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Mechanics Service"}, {"type": "text", "text": ": Handles D&D 5e rules, dice rolling, condition tracking"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "AI Service"}, {"type": "text", "text": ": Optional layer that provides narrative generation and automated DMing"}]}]}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "If the AI service is down or disabled, Scrollbook continues functioning as a robust campaign manager."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "The Real Power: Configuration Over Convention"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Here's what this architecture enables in practice:"}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "Scenario 1: The Purist DM"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "You don't want AI anywhere near your carefully crafted campaign. Fine. Scrollbook becomes:"}]}, {"type": "bulletList", "content": [{"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Integrated character sheet management"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Automatic initiative and combat tracking"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Quest and session logging"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Searchable campaign history"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Player-accessible inventory and notes"}]}]}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Zero AI. Zero compromise on your creative vision."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "Scenario 2: The Overwhelmed DM"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "You have three hours to prep a session and you're running on empty. You turn on AI assistance:"}]}, {"type": "bulletList", "content": [{"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Generate NPC descriptions for the tavern scene"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Propose three quest hooks based on your campaign notes"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Create dynamic combat descriptions during the ogre fight"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Track all mechanical effects while you focus on roleplay"}]}]}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "The AI handles logistics. You handle the story beats that matter to you."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "Scenario 3: The Solo Player"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "You want to play D&D but don't have a group. Full automation mode gives you a complete AI DM experience with persistent campaign state, character progression, and emergent storytelling."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 3}, "content": [{"type": "text", "text": "Scenario 4: The Hybrid DM"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "You prep major story beats and boss encounters manually, but use AI to fill in random encounters, shopkeeper dialogue, and environmental descriptions. You get 80% of the benefits with 20% of the creative concessions."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "Addressing the Elephant in the Room"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": ""But isn't this just encouraging DMs to be lazy?""}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "No. It's acknowledging that different DMs have different constraints, preferences, and play styles."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Some DMs have unlimited time and love world-building every merchant's backstory. Others have full-time jobs, kids, and three hours a week to run a game. Both deserve tools that respect their needs."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Scrollbook doesn't make you use AI. It makes AI available when you need it, configurable to your comfort level, and completely removable when you don't."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": ""Won't this homogenize D&D storytelling?""}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Only if you let it. The AI in Scrollbook responds to your campaign's established lore, your NPCs, your world-building. It's trained on your inputs, not generic fantasy tropes. And more importantly, you can override, edit, or ignore any AI output."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "The campaigns created with Scrollbook are as unique as the DMs running them\u2014because you're still in control."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "The Technical Philosophy"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Building Scrollbook taught me something important: the best AI tools are the ones you forget are AI tools."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "When AI is working well, it should feel like having a really prepared assistant DM who:"}]}, {"type": "bulletList", "content": [{"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Remembers everything about your campaign"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Handles the boring mechanical bookkeeping"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Suggests ideas when you're stuck"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Gets out of your way when you're on a roll"}]}]}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "That only works when AI is a service, not a requirement. When the tool is built for DMs first, not for showcasing AI capabilities."}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "Current State and Beta Testing"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Scrollbook is currently in beta with 1,000+ users and strong engagement metrics. The infrastructure has proven stable across multi-tenant workloads, and the configurable AI approach has resonated with both AI-skeptical and AI-enthusiastic DMs."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "We're built on:"}]}, {"type": "bulletList", "content": [{"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Python/FastAPI microservices"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "PostgreSQL with SQLAlchemy ORM"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "AWS ECS for orchestration"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "link", "attrs": {"href": "http://Discord.py", "target": "_blank", "rel": "noopener noreferrer nofollow", "class": "text-blue-400 hover:text-blue-300 underline"}}], "text": "Discord.py"}, {"type": "text", "text": " for real-time integration"}]}]}, {"type": "listItem", "content": [{"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Claude (Anthropic) for AI generation with prompt caching"}]}]}]}, {"type": "heading", "attrs": {"textAlign": null, "level": 2}, "content": [{"type": "text", "text": "The Bottom Line"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "If you hate AI, Scrollbook works perfectly without it."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "If you love AI, Scrollbook offers some of the most sophisticated AI-powered DMing available."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "If you're somewhere in between, Scrollbook lets you find your own balance."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "That's not a marketing pitch. That's architectural design philosophy."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "The D&D community doesn't need to choose between rejecting AI entirely or surrendering to algorithmic dungeon mastering. We need tools that put DMs in control of how much automation they want."}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "text": "Scrollbook is that tool."}]}, {"type": "horizontalRule"}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Interested in the beta?"}, {"type": "text", "text": " Join our Discord community or check out scrollbook.app"}]}, {"type": "paragraph", "attrs": {"textAlign": null}, "content": [{"type": "text", "marks": [{"type": "bold"}], "text": "Technical deep dives:"}, {"type": "text", "text": " Follow development updates on builtbydusty.com"}]}]}
The Breeder Newsletter
Get articles like this in your inbox. No spam, no fluff, just breeder business.
No spam. Unsubscribe anytime.