Starlight World Bible Site Tutorial

A practical capstone tutorial for building a searchable world bible, lore encyclopedia, setting guide, or campaign reference site with Astro and Starlight.

What You Are Building

In this tutorial, you will build the structure for a full world bible site. The goal is to organize fictional setting information so it is easy to browse, search, expand, and maintain.

The site can support:

The Big Picture

World overview
  ↓
Regions and powers
  ↓
Characters, factions, locations
  ↓
Storylines and timelines
  ↓
Reference pages and glossary

A world bible is not just lore storage. It is a continuity system. It helps you remember what exists, where it belongs, who is involved, and how different pieces connect.

Recommended Folder Structure

src/content/docs/
  index.md
  start-here.md

  world/
    index.md
    overview.md
    timeline.md
    technology.md
    social-order.md
    major-conflicts.md

  regions/
    index.md
    region-template.md
    europe.md
    austral-confluence.md
    atlantic-compact.md

  characters/
    index.md
    character-template.md
    example-character.md

  factions/
    index.md
    faction-template.md
    example-faction.md

  locations/
    index.md
    location-template.md
    example-location.md

  storylines/
    index.md
    storyline-template.md
    example-storyline.md

  reference/
    index.md
    glossary.md
    naming-conventions.md
    calendar.md
    tags.md

Homepage Example

Create or edit:

src/content/docs/index.md
---
title: "World Bible"
description: "A searchable reference guide for the setting, characters, factions, locations, and storylines."
template: splash
hero:
  title: "World Bible"
  tagline: "Explore the setting through regions, characters, factions, locations, timelines, and storylines."
  actions:
    - text: "Start Here"
      link: "/start-here/"
      icon: "right-arrow"
    - text: "Explore Regions"
      link: "/regions/"
      icon: "map"
    - text: "View Characters"
      link: "/characters/"
      icon: "user"
      variant: "minimal"
---

## Explore the Setting

- [World Overview](/world/overview/)
- [Regions](/regions/)
- [Characters](/characters/)
- [Factions](/factions/)
- [Locations](/locations/)
- [Storylines](/storylines/)
- [Timeline](/world/timeline/)
- [Glossary](/reference/glossary/)

World Overview Template

---
title: "World Overview"
description: "The central summary of the setting."
---

# World Overview

## Premise

## Tone and Themes

## Timeline

## Major Regions

## Recognized Powers

## Technology

## Magic or Supernatural Rules

## Social Order

## Key Tensions

## Story Architecture

Region Template

---
title: "Region Template"
description: "Reusable template for regions, nations, and major territories."
type: "region"
tags:
  - template
  - region
---

# Region Template

## Overview

## Historical Development

## Political Structure

## Economy and Infrastructure

## Society and Class

## Technology Level

## Magic or Supernatural Presence

## Major Factions

## Key Locations

## Current Flashpoints

## Narrative Use

Character Template

---
title: "Character Template"
description: "Reusable template for major and minor characters."
type: "character"
role: "TBD"
region: "TBD"
status: "active"
tags:
  - template
  - character
---

# Character Template

## Identity

## Background

## Role in the Setting

## Personality

## Goals

## Flaws

## Relationships

## Secrets

## Arc

## Notes

Faction Template

---
title: "Faction Template"
description: "Reusable template for organizations, houses, governments, companies, orders, and movements."
type: "faction"
alignment: "mixed"
scope: "regional"
tags:
  - template
  - faction
---

# Faction Template

## Overview

## Public Face

## Private Reality

## Leadership

## Resources

## Territory or Influence

## Allies

## Rivals and Enemies

## Methods

## Story Use

Location Template

---
title: "Location Template"
description: "Reusable template for cities, districts, facilities, landmarks, and points of interest."
type: "location"
region: "TBD"
locationType: "other"
tags:
  - template
  - location
---

# Location Template

## Overview

## Location Type

## Region

## Historical Context

## Political Importance

## Social Importance

## Technology Level

## Security Profile

## Key Groups Present

## Narrative Uses

## Story Hooks

Storyline Template

---
title: "Storyline Template"
description: "Reusable template for plots, arcs, seasons, and major narrative threads."
type: "storyline"
status: "planning"
tags:
  - template
  - storyline
---

# Storyline Template

## Premise

## Scope

## Region

## Main Cast

## Supporting Cast

## Central Conflict

## Themes

## Act Structure

## World Connections

## Open Plot Questions

Sidebar Configuration

sidebar: [
  {
    label: 'Start Here',
    items: [
      { label: 'Home', slug: '' },
      { label: 'Start Here', slug: 'start-here' },
      { label: 'World Overview', slug: 'world/overview' },
    ],
  },
  {
    label: 'World',
    autogenerate: { directory: 'world' },
  },
  {
    label: 'Regions',
    autogenerate: { directory: 'regions' },
  },
  {
    label: 'Characters',
    autogenerate: { directory: 'characters' },
  },
  {
    label: 'Factions',
    autogenerate: { directory: 'factions' },
  },
  {
    label: 'Locations',
    autogenerate: { directory: 'locations' },
  },
  {
    label: 'Storylines',
    autogenerate: { directory: 'storylines' },
  },
  {
    label: 'Reference',
    autogenerate: { directory: 'reference' },
  },
]

Optional Content Collections

For a simple Starlight world bible, regular pages inside src/content/docs/ are enough. For structured cards, filters, and generated indexes, create separate collections.

src/content/
  docs/
  characters/
  regions/
  factions/
  locations/
  storylines/

This lets you create dynamic character indexes, region filters, faction lists, and related-entry sections.

World Bible Schema Example

import { defineCollection, z } from 'astro:content';

const characters = defineCollection({
  schema: z.object({
    title: z.string(),
    description: z.string().optional(),
    role: z.string(),
    region: z.string(),
    faction: z.string().optional(),
    status: z.enum(['active', 'missing', 'dead', 'unknown']).default('active'),
    tags: z.array(z.string()).default([]),
  }),
});

const regions = defineCollection({
  schema: z.object({
    title: z.string(),
    description: z.string(),
    type: z.literal('region'),
    technologyLevel: z.string().optional(),
    magicLevel: z.string().optional(),
    tags: z.array(z.string()).default([]),
  }),
});

export const collections = { characters, regions };

Related Links Pattern

At the bottom of major entries, add related pages.

## Related Pages

- [Europe](/regions/europe/)
- [House Valoire](/factions/house-valoire/)
- [Main Timeline](/world/timeline/)
- [Glossary](/reference/glossary/)

World bible pages become much more useful when they cross-link to related people, places, groups, and storylines.

Recommended Tags

entry type:
  character
  region
  faction
  location
  storyline
  reference

story use:
  protagonist
  antagonist
  ally
  rival
  mystery
  flashpoint

world category:
  politics
  technology
  magic
  economy
  military
  culture
  religion
  transportation

Asset Structure

public/images/
  maps/
  characters/
  factions/
  locations/
  timelines/
  diagrams/

public/downloads/
  character-template.pdf
  region-template.pdf
  faction-template.pdf

Build Checklist

[ ] Homepage explains the setting
[ ] Start Here page exists
[ ] World overview exists
[ ] Major folders exist
[ ] Every major folder has an index.md page
[ ] Templates exist for repeated page types
[ ] Sidebar is organized by world category
[ ] Important entries cross-link to related pages
[ ] Glossary exists
[ ] Timeline exists
[ ] Maps and assets are organized
[ ] npm run build succeeds

Common Mistakes

No templates

Without templates, every page grows in a different direction. Templates keep entries comparable.

No related links

World bible entries should connect to each other. A character should link to their region, faction, storyline, and major relationships.

Too much lore on the homepage

The homepage should guide readers. Put detailed lore in the actual world pages.

Inconsistent names

Use a naming conventions page to track spelling, titles, factions, places, and terminology.

Simple Rule of Thumb

Use Starlight for the encyclopedia shell.
Use templates for repeated page types.
Use tags for grouping.
Use related links for continuity.
Use maps and diagrams for orientation.
Use indexes to make the world browsable.