Writing Seed Prompts

A comprehensive guide to writing effective seed prompts for Rabbithole.

Contents

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.

Warning: If you omit the color scheme from a linked page's prompt, that page may render in a completely different color scheme. If you omit the nav bar definition, the generated page may invent different nav links or drop the nav entirely. Do not rely on the LLM to "remember" anything.

What "isolation" means concretely

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

✗ Bad — vague
Use a clean, professional look with blue links and a white background.
✓ Good — specific
White background (#ffffff), black body text (#000000), Arial/Helvetica/sans-serif at 14px. Links #0000cc, visited links #551a8b. No gradients, no JavaScript, no external fonts. Code blocks: background #f4f4f4, border 1px solid #ccc, font Courier New 13px. H2 headings have a 1px solid #cccccc bottom border. Max content width 860px, centered with auto margins.

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:

  1. The visual style of the nav (e.g., "pipe-separated plain text links")
  2. The exact link labels
  3. The exact absolute URL paths

Before / After: Navigation definition

✗ Bad — incomplete
Include a navigation bar at the top with links to the main sections.
✓ Good — complete
Navigation bar: pipe-separated plain text links, font-size 13px, no bullets, no background color. Links: 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). The nav sits below the site title, separated from it by a 1px solid #ccc top border.

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

✗ Bad — assumes shared memory
Generate the "Our Team" page for the Helix Systems website, showing the leadership team as described elsewhere on the site.
✓ Good — self-contained lore
Generate the "Our Team" page for Helix Systems, a fictional B2B robotics company. The company was founded in 2019 and is headquartered in Zurich. CEO: Dr. Amara Okafor (formerly of CERN, specializes in autonomous systems). CTO: Lars Brandt (ex-Google DeepMind, 20 years ML experience). COO: Sofia Reinhardt (supply chain background, MBA from INSEAD). Company tagline: "Engineering Tomorrow." Site design: [full style spec here]. Nav bar: [full nav here].

Tips for managing lore at scale

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:

Before / After: Content scope

✗ Bad — underspecified
Generate the configuration page for the Rabbithole documentation site.
✓ Good — fully scoped
Generate the Configuration reference page for Rabbithole, an open-source Rust web server. Content: (1) Overview of the config file format (TOML), showing the path ~/.config/rabbithole/config.toml. (2) All configuration keys in a table: key name, type, default, description. Keys include: llm_provider (string), api_key (string), model (string), cache_dir (path), port (u16, default 8080), bind_address (string, default "127.0.0.1"), max_prompt_length (usize). (3) A complete example config.toml in a code block. (4) A section on environment variable overrides. Tone: plain technical documentation, no marketing language. Do not include installation instructions (that is on /getting-started.html).

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.

Note: Aesthetic anchors work because LLMs have seen these sites or discussions of them during training. More obscure sites or very recent redesigns may not be recognized. When in doubt, supplement the anchor with explicit specifications for the most important elements.

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

  1. Site name and one-sentence description
  2. Full visual style spec (colors, fonts, layout)
  3. Reference site(s) as aesthetic anchor(s)
  4. Complete nav bar (labels + paths)
  5. Any recurring lore/characters relevant to this page
  6. Specific content this page should contain
  7. Tone and depth
  8. 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:

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

When to disable or not request web tools

How to express the decision in a prompt

Use web search to find real documentation and accurate technical details about [topic]. Hotlink images from official sources where appropriate.
Do not use web search. All content should be written from the LLM's training knowledge. This page is entirely fictional.

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