# Generate listings

> Fill a ZeroDirs directory with verified listings — the full pipeline from a candidates TSV to a promoted dataset. Verify every candidate exists with seed/che…

You are reading one page of the ZeroDirs documentation. ZeroDirs is a paid Astro + Cloudflare Workers starter for directory sites: every page is rendered to static HTML at build time, the site ships no client JavaScript outside `/search/`, and one file — `site.config.ts` — carries roughly 80% of the customisation.

Two things to hold on to before you act on anything below:

- `site.config.ts` is validated by a zod schema with ten cross-field rules. After any edit to it, run `pnpm check:config`; every problem is reported as `site.config.ts › <path>: <message>` and the whole file is checked at once.
- The repository ships its own `AGENTS.md` with twenty hard rules, and a machine-checked test suite behind them. If you are working inside a ZeroDirs project, read that file first — it overrides anything general you infer from this page.

Source: https://zerodirs.com/docs/agents/recipes/generate-listings/

---

<!-- DO NOT EDIT — generated from zerodirs/zerodirs .agents/skills/ by .github/docs/generate.ts (docs-sync.yml). Edit the source, not this page. -->

`.agents/skills/generate-listings/SKILL.md` — 209 lines of instruction that ship inside the starter. This page is generated from it, so it says what the skill does without republishing it.

## When an agent picks this up

The skill description, verbatim — this is the text an agent matches your request against:

> Fill a ZeroDirs directory with verified listings — the full pipeline from a candidates TSV to a promoted dataset. Verify every candidate exists with seed/check-links.mjs, write each description only from the fetched page, record provenance, lint the result with seed/check-listings.mjs, check the shape with seed/check-dataset.mjs --profile buyer, preview with ZERODIRS_DATASET, then promote with pnpm content:use. Use when asked to generate listings, write descriptions in bulk, seed a directory with content, or fill an empty directory site.

## What it walks through

1. Stage 1 — prove each candidate exists
1. Stage 2 — write each listing from its own page
1. Stage 3 — lint the prose
1. Stage 4 — check the shape
1. Stage 5 — preview without touching your content
1. Stage 6 — promote
1. Report back

## Commands it runs

```sh
node seed/check-links.mjs seed/.out/candidates.tsv --json seed/.out/links.json
node seed/check-listings.mjs seed/datasets/<slug>/listings
node seed/check-dataset.mjs seed/datasets/<slug> --profile buyer
pnpm content:use <slug> --yes
pnpm check && pnpm test && pnpm build
pnpm content:use
```

## Files it touches

`src/content/` · `public/logos/` · `src/content/schema.ts` · `site.config.ts` · `seed/datasets/ai-tools/` · `seed/datasets/ai-tools/meta.json` · `seed/datasets/ai-tools/categories.json` · `seed/datasets/ai-tools/tags.json` · `seed/datasets/ai-tools/logos/` · `seed/datasets/ai-tools/blog/` · `src/loaders/files.ts` · `seed/datasets/`

## Using it

Skills load themselves — you describe the outcome, not the skill. "Add a Compliance category with an icon and seed it" is enough for an agent that can see `.agents/skills/`; Claude Code reads `.claude/skills/`, which `pnpm skills:sync` mirrors from `.agents/` on every install. See [Working with an agent](https://zerodirs.com/docs/agents/overview/).
