# Recipes

> The 10 agent skills that ship with the starter — what each one changes, which commands it runs, and when an agent reaches for it.

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/

---

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

The starter ships **10 agent skills** in `.agents/skills/`. Each is a procedure an agent follows instead of improvising: which file to edit, which rule it will trip, which command proves it worked. `pnpm skills:sync` copies them to `.claude/skills/` on every install, so Claude Code and Codex both see the same set.

These pages are generated from the skill files themselves — the descriptions below are the exact text an agent matches on.

| Recipe | What it does |
| --- | --- |
| [Add category](https://zerodirs.com/docs/agents/recipes/add-category/) | Add a category to a ZeroDirs directory site. |
| [Add listing field](https://zerodirs.com/docs/agents/recipes/add-listing-field/) | Add a custom per-listing field to a ZeroDirs directory site via listing.customFields in site.config.ts, put the value in a listing's extra frontmatter, and surface it on the detail page. |
| [Configure accounts](https://zerodirs.com/docs/agents/recipes/configure-accounts/) | Set up submitter accounts on a ZeroDirs directory site — features.accounts, sign-in by emailed link, "Continue with Google" through a Google Cloud OAuth client (GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET via pnpm cf:secrets, the redirect URI with its trailing slash), what the /account/ page shows, how the submit form changes, and how to verify or switch it off. |
| [Configure email](https://zerodirs.com/docs/agents/recipes/configure-email/) | Configure transactional email for a ZeroDirs directory site — the submitter receipt, the admin notification and the approval mail. |
| [Generate listings](https://zerodirs.com/docs/agents/recipes/generate-listings/) | Fill a ZeroDirs directory with verified listings — the full pipeline from a candidates TSV to a promoted dataset. |
| [Go live](https://zerodirs.com/docs/agents/recipes/go-live/) | Take a ZeroDirs directory site from a local checkout to a running site on Cloudflare, one question at a time — pnpm cf:setup for the first deploy (Worker name, custom domain or workers.dev, D1, R2, migrations, deploy, admin secret), then the steps it leaves to the owner (D1 as the build source, Workers Builds and the Deploy Hook, email, payments) and how to verify each. |
| [Import listings](https://zerodirs.com/docs/agents/recipes/import-listings/) | Bulk-import listings into a ZeroDirs directory site from a CSV or JSON file with pnpm listings:import. |
| [New pSEO template](https://zerodirs.com/docs/agents/recipes/new-pseo-template/) | Add a programmatic-SEO page template to a ZeroDirs directory site. |
| [New theme](https://zerodirs.com/docs/agents/recipes/new-theme/) | Add or customise a theme preset in a ZeroDirs directory site. |
| [Plan directory](https://zerodirs.com/docs/agents/recipes/plan-directory/) | Turn a niche idea into a ZeroDirs directory plan — a candidates TSV of real product names and URLs, plus proposed categories and tags blocks for site.config.ts. |

## The two-stage content pipeline

Two of these are halves of one job. `plan-directory` turns a niche into a candidates list of real names and URLs and stops there — it is forbidden from writing descriptions. `generate-listings` takes that list, verifies every URL resolves, writes each description **only** from the fetched page, records where each fact came from, and lints the result before anything reaches `src/content/`. The split exists because that is the point where a language model would otherwise invent products.
