> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.outpost.pub/llms.txt
> Use this file to discover all available pages before exploring further.

# Homepage Curation

> Choose which posts fill your homepage's featured spots from inside Outpost, without hand-editing tags in Ghost.

export const PlanStatus = ({tier, status, beta, deprecated}) => {
  const variants = {
    luna: {
      bg: "#8340B9",
      color: "#ffffff",
      border: "1px solid #8340B9"
    },
    voyager: {
      bg: "#6B2FA0",
      color: "#ffffff",
      border: "1px solid #6B2FA0"
    },
    "space-station": {
      bg: "transparent",
      color: "#8340B9",
      border: "1px solid #8340B9"
    },
    "all-plans": {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    labs: {
      bg: "transparent",
      color: "#a16207",
      border: "1px solid #a16207"
    },
    beta: {
      bg: "transparent",
      color: "#a16207",
      border: "1px solid #a16207"
    },
    "invite-only": {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    bespoke: {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    "outpost-hosted": {
      bg: "transparent",
      color: "#525252",
      border: "1px solid #a3a3a3"
    },
    deprecated: {
      bg: "transparent",
      color: "#b91c1c",
      border: "1px solid #b91c1c"
    }
  };
  const chip = (variant, label) => {
    const s = variants[variant] || variants["all-plans"];
    return <span key={variant + ":" + label} style={{
      display: "inline-flex",
      alignItems: "center",
      padding: "0.15rem 0.55rem",
      fontSize: "0.7rem",
      fontWeight: 700,
      letterSpacing: "0.05em",
      textTransform: "uppercase",
      borderRadius: "3px",
      lineHeight: 1.4,
      whiteSpace: "nowrap",
      backgroundColor: s.bg,
      color: s.color,
      border: s.border
    }}>
        {label}
      </span>;
  };
  const tierLabel = {
    "luna": "Luna",
    "voyager+": "Voyager+",
    "voyager-luna": "Voyager + Luna",
    "space-station+": "Space Station+",
    "all-plans": "All plans"
  };
  const tierVariant = {
    "luna": "luna",
    "voyager+": "voyager",
    "voyager-luna": "voyager",
    "space-station+": "space-station",
    "all-plans": "all-plans"
  };
  const statusLabel = {
    "labs": "Labs",
    "invite-only": "Invite-only",
    "bespoke": "Bespoke",
    "deprecated": "Deprecated",
    "outpost-hosted": "Outpost Hosted"
  };
  return <span style={{
    display: "inline-flex",
    gap: "0.4rem",
    flexWrap: "wrap",
    alignItems: "center",
    margin: "0 0 1.25rem 0"
  }}>
      {tier && chip(tierVariant[tier], tierLabel[tier])}
      {status && chip(status, statusLabel[status])}
      {beta && chip("beta", "Beta")}
      {deprecated && chip("deprecated", "Deprecated")}
    </span>;
};

<PlanStatus tier="voyager-luna" status="labs" />

Homepage Curation lets you decide which post appears in each featured spot on your homepage — your hero carousel, a "Don't miss" rail, an editor's-pick block — and swap those posts whenever you like, all from one screen in Outpost.

Each spot is tied to a Ghost tag, and the post you pick gets that tag. You don't have to touch tags yourself: you pick a post, click **Publish**, and your homepage updates.

<Note>
  Homepage Curation only appears when your active theme is built to support it. It's a theme feature first — your theme decides which homepage spots are curatable. If you don't see it, your theme doesn't define any curated spots yet.
</Note>

***

## Before you start

Two things need to be true for Homepage Curation to show up:

* **Your theme supports it.** The theme's manifest has to declare the homepage spots (theme authors do this once — see the [Theme Manifest Reference](/themes/manifest-reference#homepage-curation-section)). Outpost reads this from your theme's last known-good manifest, so a bad theme upload won't take the feature offline.
* **Your plan includes it.** Homepage Curation is an advanced-plan feature. If your plan doesn't include it, you'll see a message instead of the curation screen.

***

## Where to find it

In the left menu, open **Posts → Homepage Curation**. The menu item only shows when your active theme defines curated spots.

The screen is organized into **sections** (the regions your theme defines, like "Featured" or "Most Read"), and each section holds one or more **slots** — the individual spots a post can fill.

***

## Curate a slot

<Steps>
  <Step title="Open a section">
    Pick the section you want to work on. Each section lists its slots, and shows which post currently fills each one.
  </Step>

  <Step title="Pick a post">
    Click an empty slot — or **Replace** on a filled one — to open the post picker. Use the **Recent** tab to choose from your latest posts, or the **Search** tab to find a post by title or author.
  </Step>

  <Step title="Review your changes">
    Your picks are staged, not live yet. Outpost tracks them as unsaved changes (you'll see a count like "2 unsaved changes across Featured") and warns you if you try to leave the page before publishing.
  </Step>

  <Step title="Publish">
    Click **Publish changes** to apply everything at once. Your homepage updates to show the posts you chose. (You can also press <kbd>⌘/Ctrl</kbd> + <kbd>S</kbd>.)
  </Step>
</Steps>

To empty a spot, use **Clear** on the slot and publish. To throw away staged picks without applying them, use **Discard**.

<Tip>
  Publishing applies your staged changes as a batch, so your homepage doesn't shuffle around one post at a time while you're still deciding.
</Tip>

***

## Fixing drift

A slot is meant to hold exactly one post. If more than one post ends up carrying a slot's tag — say someone added the tag by hand in Ghost — Outpost flags it as **drift** and shows a "Tag conflict" notice on that slot, with a count of the extra posts.

Click **Clean up extras** to resolve it. Outpost keeps the most recently published post in the slot and removes the tag from the others, so the slot holds a single post again.

***

## Working alongside other editors

Homepage Curation is built for teams curating the same front page:

* **No accidental clobbering.** While you're saving a slot, it's briefly locked so two people can't overwrite each other.
* **Conflict awareness.** If a slot changed since you opened the page, Outpost won't quietly overwrite it — your change is flagged as a conflict and you're asked to reload and try again.
* **Safe swaps.** When you replace a post in a slot, Outpost tags the new post before untagging the old one, so the slot never briefly goes empty if something fails mid-swap.

***

## See what changed

Every homepage change — publishing, swapping a slot, clearing one, cleaning up drift, or a failed swap — is recorded in your [Activity Log](/features/activity-log), so you can see who curated what and when.

***

## Related features

<CardGroup cols={2}>
  <Card title="Theme Manifest Reference" icon="file-code" href="/themes/manifest-reference#homepage-curation-section">
    For theme authors — how to declare curatable homepage sections and slots in your theme's manifest.
  </Card>

  <Card title="Trending Posts" icon="arrow-trend-up" href="/features/trending-posts">
    Show your most-read posts automatically, based on real reader activity.
  </Card>

  <Card title="Activity Log" icon="list-check" href="/features/activity-log">
    Review who changed what across your publication, including homepage curation.
  </Card>

  <Card title="Ghost Integration" icon="ghost" href="/integrations/ghost">
    How Outpost connects to Ghost to read your posts and manage tags.
  </Card>
</CardGroup>

***

## FAQ

<AccordionGroup>
  <Accordion title="Why don't I see Homepage Curation in my menu?">
    The feature only appears when your active theme defines curated homepage spots in its manifest, and your plan includes the feature. If your theme doesn't declare any sections, there's nothing to curate yet — ask your theme developer, or see the [Theme Manifest Reference](/themes/manifest-reference#homepage-curation-section).
  </Accordion>

  <Accordion title="Do I need to edit tags in Ghost?">
    No. That's the point — you pick posts in Outpost and it manages the underlying Ghost tags for you. Editing those tags by hand in Ghost is what causes "drift," which Outpost can clean up for you.
  </Accordion>

  <Accordion title="When do my changes go live?">
    When you click **Publish changes**. Until then, your picks are staged as unsaved changes and your live homepage stays as it was. Outpost warns you if you try to leave the page with unpublished changes.
  </Accordion>

  <Accordion title="What is drift, and is it safe to clean up?">
    Drift is when more than one post carries the same slot's tag, so the slot has competing posts. Cleaning up keeps the most recently published post in the slot and removes the tag from the rest. It only changes that slot's tag — it never deletes or unpublishes a post.
  </Accordion>

  <Accordion title="Can more than one person curate at the same time?">
    Yes. Outpost briefly locks a slot while it saves and flags conflicts if a slot changed since you loaded the page, so two editors won't silently overwrite each other.
  </Accordion>

  <Accordion title="Where can I see what was changed?">
    Every publish, swap, clear, and drift cleanup is recorded in your [Activity Log](/features/activity-log).
  </Accordion>
</AccordionGroup>
