# Import listings

> Bulk-import listings into a ZeroDirs directory site from a CSV or JSON file with pnpm listings:import. Covers column mapping, the dry run, the unknown-catego…

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/import-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/import-listings/SKILL.md` — 114 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:

> Bulk-import listings into a ZeroDirs directory site from a CSV or JSON file with pnpm listings:import. Covers column mapping, the dry run, the unknown-category hard error, the unknown-tag warning, logo and date rules, and slug collisions. Use when asked to import a spreadsheet, seed a directory from a data file, or re-import a corrected export.

## What it walks through

1. Always dry-run first
1. The two failure modes to know
1. Column mapping
1. Field rules
1. JSON input
1. Verify

## Commands it runs

```sh
pnpm listings:import <file.csv|file.json>
pnpm listings:import data.csv --dry-run      # always do this first
pnpm listings:import data.csv                # then write
pnpm listings:import data.csv --dry-run
pnpm listings:import data.csv
pnpm check:config       # config + the static-file budget estimate for the new count
pnpm build
pnpm check:config
```

## Files it touches

`scripts/import.ts` · `src/loaders/normalize.ts` · `site.config.ts` · `tests/fixtures/import-sample.csv` · `src/components/listing/Detail.astro` · `src/content/listings/`

## 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/).
