Writing Seed Prompts
A comprehensive guide to writing effective seed prompts for Rabbithole.
1. The Isolation Problem
The most important thing to understand about Rabbithole is that every page is generated in complete isolation. When a visitor clicks a link, Rabbithole looks up the stored prompt for that URL and makes a brand-new LLM call with only that prompt as context. There is no shared memory, no session state, no conversation history. The generator producing /about.html has never seen /index.html.
This has a profound implication: whatever you want to appear consistently across the site must be explicitly re-stated in every single prompt you write. If you want every page to use a dark green sidebar, you must say "dark green sidebar" in every prompt. If your site features a fictional character named Professor Wexler, every page that should mention him must include a brief description of who he is. If you omit a detail, the generator will invent something — or omit it entirely.
The seed prompt is the only prompt you write directly. Every other page on the site is generated from a prompt that you produce as part of the ---MAPPINGS--- output at the bottom of each generated page. Each of those prompts will in turn produce new pages, each generating new mappings — and so on. The seed prompt is therefore the root of a tree of context propagation. Every imprecision at the root echoes and amplifies as the site grows.
What "isolation" means concretely
- The generator sees only the prompt string you provide.
- It does not see any HTML from other pages.
- It does not see the URL it is generating (unless you include it in the prompt).
- It does not see the mappings you wrote for other pages.
- Pages are permanently cached after the first generation — you do not get a second chance.
2. Visual Style Specification
Visual consistency is almost entirely determined by how precisely you describe the design in every prompt. Vague descriptions produce inconsistent pages. Specific, technical descriptions produce cohesive ones.
What to specify
| Element | What to say | Example |
|---|---|---|
| Background color | Exact hex code | #ffffff white background |
| Text color | Exact hex code | #000000 black body text |
| Link color | Hex for both normal and visited | Links #0000cc, visited #551a8b |
| Font family | Named font stack | Arial, Helvetica, sans-serif |
| Font size | Pixel or em value | 14px body, 13px nav |
| Code blocks | Background and border | #f4f4f4 bg, 1px solid #ccc |
| Headings | Style treatment | H2 with 1px solid #ccc bottom border |
| Layout width | Max-width constraint | max-width 860px, centered |
| JavaScript | Explicit allow/deny | No JavaScript |
| Gradients / shadows | Explicit deny if unwanted | No gradients, no box shadows |
Naming a real reference site is often the most efficient single thing you can do. A phrase like "plain minimal HTML like gcc.gnu.org" conveys 20 design decisions at once, including: white background, plain black text, no decorative images, small fonts, monospace code blocks, and pipe-separated navigation. Reference sites are aesthetic anchors — see Section 6 for more.
Before / After: Color specification
3. Navigation Structure
Navigation bars are one of the most visible elements of site coherence. If you do not specify them precisely, each generated page will invent its own nav links, use different labels, or omit the nav entirely.
You must include all of the following in every prompt:
- The visual style of the nav (e.g., "pipe-separated plain text links")
- The exact link labels
- The exact absolute URL paths
Before / After: Navigation definition
Note that you must include both the human-readable label and the absolute URL path. A generator that only knows "Getting Started" will have to invent a path, and may use /getting_started.html, /start.html, or /guide/ — all of which will be different pages than the one you intended.
Nav placement reminder
Also specify where the nav appears. Common choices: immediately below the site title/header, or at the very top of the page before the title. Be explicit. "Include a nav" is ambiguous about position; "nav bar immediately below the site title, before page content" is not.
4. Recurring Characters and Lore
For content-heavy or fictional sites, you may have characters, organizations, terminology, world-building details, or narrative events that should appear consistently across pages. Because each page generator knows nothing about any other page, any lore you want repeated must be carried forward in prompts manually.
Think of each prompt as a self-contained creative brief. If your site is a fictional company called "Helix Systems" with a CEO named Dr. Okafor and a tagline "Engineering Tomorrow," every page that should reference that must include those facts explicitly.
Before / After: Lore propagation
Tips for managing lore at scale
- Keep a short "lore block" — 3–5 sentences summarizing the most important recurring facts — and paste it into every prompt verbatim.
- For very large sites, create a
/lore.htmlpage and reference the facts there, but also include the facts inline (generators cannot fetch other pages). - Distinguish between facts that must be consistent (character names, URLs) and facts that may vary (specific plot details on a leaf page).
5. Content Scope
Each prompt must describe precisely what content the page being generated should contain. Do not leave this to the LLM's discretion unless you genuinely do not care what it generates.
Content scope has several dimensions:
- Topic: What is this page about?
- Depth: Is it a broad overview, a deep technical dive, a FAQ?
- Structure: Sections, headings, tables, code examples, lists?
- Tone: Technical, friendly, formal, satirical?
- What to exclude: What should NOT appear on this page?
Before / After: Content scope
Depth calibration
Specify how long or detailed you want the page to be. Terms like "comprehensive," "brief overview," "one paragraph," or "at least 5 code examples" all communicate expected depth. Without guidance, LLMs tend toward medium-depth content that may be too shallow for a technical reference or too long for a landing page.
6. Aesthetic Anchors
An aesthetic anchor is a real website, design era, or visual style that the LLM can pattern-match against. A single well-chosen anchor can replace dozens of individual style specifications, because the LLM has seen countless examples of that site or style during training.
Effective aesthetic anchors
| Anchor | Implied style |
|---|---|
gcc.gnu.org |
Plain white background, black text, minimal HTML, pipe-separated nav, no CSS flourishes, monospace code, academic tone |
man7.org (Linux man pages) |
Narrow layout, heavy use of <pre>, section headers in bold, no color |
| phpBB default theme (early 2000s) | Blue/gray tables, beveled borders, small icons, forum-post layout |
| GeoCities (mid 1990s) | Tiled background images, bright clashing colors, animated GIFs, heavy use of horizontal rules, star/sparkle decorations |
| Craigslist | Bare-bones HTML, tiny fonts, dense link lists, no images, purple visited links |
| Hacker News | Orange top bar, plain beige background, compact text, upvote triangles, dense comment threads |
| Wikipedia (2004 era) | Light gray sidebar, serif body font, blue links, infobox tables, footnote citations |
| MSDOS prompt | Black background, white or green monospace text, no graphics |
Aesthetic anchors are most powerful when combined with specific overrides. For example: "styled like gcc.gnu.org, but with a dark navy (#001f3f) header bar and white header text." This gives you the anchor's overall feel with targeted customization.
7. Prompt Length
When writing seed prompts and the linked-page prompts within ---MAPPINGS---, err heavily on the side of verbose.
The cost of a longer prompt is trivial: a few hundred extra tokens. The cost of an underspecified prompt is a page that looks nothing like the rest of your site, or that generates wrong content — and since pages are cached permanently, you cannot regenerate without clearing the cache.
Minimum viable information per prompt
- Site name and one-sentence description
- Full visual style spec (colors, fonts, layout)
- Reference site(s) as aesthetic anchor(s)
- Complete nav bar (labels + paths)
- Any recurring lore/characters relevant to this page
- Specific content this page should contain
- Tone and depth
- Any explicit exclusions ("do not include X")
For linked pages, item 4 (the full nav) is especially critical. Omitting the nav in a linked-page prompt is one of the most common reasons sites fall apart visually after the homepage.
Recommended prompt length
For a typical documentation or content site:
- Seed prompt (homepage): 200–500 words. This is the root prompt you write by hand.
- Linked page prompts (in MAPPINGS): 150–400 words each. These are generated by the LLM, but you can guide how much context to include by example in the seed prompt itself.
- Deep leaf pages: 100–200 words is acceptable if the style and nav are fully specified.
For fictional or highly styled sites, prompts may need to be longer to carry the creative context.
8. Web Tools Decision
Rabbithole's LLM may have access to web search and web fetch tools. Whether to use them — and when — is an important prompt-level decision.
When to enable web tools
- Real-world factual content: If your page should contain accurate, current information (API documentation, news, product specs), enable web tools so the generator can look things up.
- Images: Web tools allow the generator to find and hotlink real images from the web. Useful for product pages, reference pages, or any page where images matter.
- Research-heavy pages: Technical deep-dives, comparison tables, or citation-heavy content benefit from web search.
When to disable or not request web tools
- Pure fiction: If your site is entirely fictional, web search may introduce real-world facts that break the fiction.
- Performance-critical generation: Web tool calls add latency. For simple pages, it may not be worth it.
- Purely structural pages: Navigation hubs, index pages, or style showcases don't need real-world data.
How to express the decision in a prompt
9. Common Mistakes and How to Fix Them
Mistake 1: The nav disappears on inner pages
Cause: The linked-page prompt says "include a nav bar" without specifying which links.
Fix: Copy the full nav specification (labels + paths) into every linked-page prompt verbatim.
Mistake 2: Color schemes drift page by page
Cause: The seed prompt says "blue and white theme" without hex codes. Each generator interprets "blue" differently.
Fix: Always use hex codes. Include them in every prompt, not just the seed.
Mistake 3: Characters have different names on different pages
Cause: Character names were defined in the seed prompt but not propagated to linked-page prompts.
Fix: Create a short "lore block" and include it in every prompt that references characters.
Mistake 4: Linked pages don't match the stated URL
Cause: The prompt for a linked page doesn't tell the generator what URL it is generating, so internal links it creates may point to wrong paths.
Fix: Include the page's own URL in its prompt: "You are generating the page at /about.html."
Mistake 5: Pages are too short / lack real content
Cause: The content scope in the prompt was vague ("write about the history of X").
Fix: Enumerate specific sections, topics, or data points you want covered. Specify depth explicitly.
Mistake 6: Font renders differently
Cause: Prompt says "use sans-serif fonts" without naming the specific font.
Fix: Always name fonts explicitly: "Arial, Helvetica, sans-serif" or "Georgia, 'Times New Roman', serif".
Mistake 7: Links on generated pages point to non-existent URLs
Cause: The generator invented link targets that have no corresponding MAPPINGS entry, or MAPPINGS entries that have no corresponding <a href>.
Fix: In your seed prompt, remind the LLM: "Every local <a href> must have a corresponding MAPPINGS entry."
Mistake 8: JavaScript appears despite being unwanted
Cause: The prompt didn't explicitly prohibit it.
Fix: Add "No JavaScript" explicitly to the style spec. If you want truly static pages, also add "No external CSS frameworks, no Google Fonts, no CDN links."
Mistake 9: The seed prompt produces a great homepage but poor linked pages
Cause: The seed prompt is detailed, but the MAPPINGS prompts it generates are too brief.
Fix: In your seed prompt, instruct the generator: "Each linked-page prompt in MAPPINGS must be at least 200 words and must include the full style spec and full nav."
Mistake 10: The generated page ignores instructions selectively
Cause: Very long prompts with many competing instructions. LLMs sometimes drop low-priority or late-appearing instructions.
Fix: Put the most critical constraints (style, nav) early in the prompt. Use ALL CAPS or bold-equivalent phrasing for must-follow rules.
10. Minimal Viable Seed Prompt Template
The following template is a starting point for any new Rabbithole site. Fill in the bracketed fields. You can expand any section — this is the minimum that will produce a reasonably consistent multi-page site.
[SITE NAME]: [One-sentence description of what this site is / does].
Source code: [GitHub URL or "private"]. Live at: [URL or "localhost"].
DESIGN (apply to ALL pages):
- Style: Plain, minimal HTML like gcc.gnu.org. No JavaScript. No external CSS.
No gradients. No box shadows. No Google Fonts. No CDN links.
- Background: #ffffff. Body text: #000000.
- Font: Arial, Helvetica, sans-serif. Body: 14px. Nav: 13px.
- Links: #0000cc. Visited: #551a8b.
- Code/pre: background #f4f4f4, border 1px solid #ccc, font Courier New 13px.
- H2: bottom border 1px solid #cccccc.
- Content max-width: 860px, centered.
- Footer: border-top 1px solid #ccc, GitHub link.
NAVIGATION (include on every page, pipe-separated, below site title):
[Label1] (/) | [Label2] (/path2.html) | [Label3] (/path3.html) | ...
LORE / CONTEXT (repeat in every linked-page prompt):
[2-4 sentences describing the site's purpose, any fictional universe, key
terminology, or recurring entities that should appear consistently.]
HOMEPAGE CONTENT:
[Describe the specific sections, headings, content, and data that should
appear on the homepage. Be specific about what each section contains.]
LINKED PAGE PROMPTS:
Each prompt in ---MAPPINGS--- MUST include:
1. The full DESIGN block above (verbatim or equivalent).
2. The full NAVIGATION block above (verbatim).
3. The LORE block above (verbatim).
4. The specific content for that page.
5. The URL path of the page being generated.
Prompts must be at least 150 words. No short prompts.
WEB TOOLS: [Yes — use web search for real data and images. / No — do not
use web search; all content is fictional or from training knowledge.]
Extended example: Using the template for a documentation site
RABBITHOLE: An open-source Rust web server (github.com/ajbt200128/rabbithole,
live at isarabbithole.com) that dynamically generates entire websites on the
fly using LLMs. Each page is generated by an LLM in complete isolation using
only the stored prompt string — there is no shared memory between pages.
DESIGN (apply to ALL pages):
- Style: Plain minimal HTML like gcc.gnu.org. No JS. No external CSS. No
gradients. No shadows. No CDN links.
- Background: #ffffff. Text: #000000.
- Font: Arial, Helvetica, sans-serif. 14px body, 13px nav/footer.
- Links: #0000cc. Visited: #551a8b.
- Code/pre: background #f4f4f4, border 1px solid #ccc, Courier New 13px.
- H2: 1px solid #cccccc bottom border.
- Max content width 860px, centered with auto margins, padding 20px 24px.
- Footer: 1px solid #ccc top border, GitHub link to
github.com/ajbt200128/rabbithole.
NAVIGATION (pipe-separated, below header, font-size 13px):
Home (/) | Getting Started (/getting-started.html) |
Architecture (/architecture.html) | Configuration (/configuration.html) |
Web Tools (/web-tools.html) | Deployment (/deployment.html) |
Examples (/examples.html) | About (/about.html)
LORE: Rabbithole is a Rust web server. When a URL is requested, it looks up
a stored prompt for that URL and calls an LLM (e.g. Claude or GPT-4) to
generate the full HTML page on the fly. Pages are permanently cached after
first generation. Seed prompts are the root of all page generation.
HOMEPAGE CONTENT: [describe homepage sections here]
MAPPINGS prompts: Each must be 150+ words and include full DESIGN, NAVIGATION,
and LORE blocks. Include the target URL path at the start of each prompt.
WEB TOOLS: Yes — search for accurate technical details where needed.
Further reading
- Architecture — How Rabbithole stores and retrieves prompt mappings
- Getting Started — Running your first Rabbithole server and writing your first seed prompt
- Examples — Full worked examples of seed prompts for different site types
- Configuration — LLM provider settings that affect generation quality
- Web Tools — Configuring search and fetch tool access for page generators
- Prompt Patterns — Reusable patterns for common site structures
- Troubleshooting — Diagnosing inconsistency and fixing bad cached pages
- Seed Prompt Examples — A library of community-contributed seed prompts