Production-ready local directory template on Astro 6 + Tailwind v4, Airtable as the CMS, deploys to Cloudflare Workers.
Ships as a working restaurant guide, but "restaurants" is just a config value. Edit src/site.config.ts and the same codebase becomes a salon, gym, or mechanic directory. No component touched, no route rewritten.
Directory listings live in Airtable. The build fetches every table, resolves links to URL slugs, self-hosts images, and renders static HTML. Fast, cheap, no live DB calls.
The one-config idea
Generic primitives - Item, Taxonomies, optional Tier. What they mean lives in one config file:
item: { singular: 'Place to Eat', slugBase: 'place' },
taxonomies: [
{ key: 'cuisine', label: 'Cuisine', slugBase: 'cuisine' },
{ key: 'area', label: 'Area', slugBase: 'area' },
],
To turn it into a hairdresser directory: Cuisine → Specialty, Place → Salon, rename matching Airtable tables. Done.
Features
- One config file controls the entire vertical (labels, URLs, SEO copy)
- Airtable as the CMS - non-technical-friendly
- Filterable listings + "Open now" toggle
- Detail pages with gallery, map, hours, action buttons
- Map view via MapLibre + OpenFreeMap (no API keys)
- Static search via Pagefind
- 3 Airtable-wired forms (submit, contact, newsletter) with built-in spam protection
- MDX blog
- Full SEO: OG, Twitter cards, JSON-LD, sitemap
- Build-time image self-hosting (Airtable URLs expire)
- Optional CSV bulk-import script
- Live demo + complete docs incl. vertical-conversion walkthrough
Live demo: https://localfinds-directory.websiterating.com/
Landing page: https://www.websiterating.com/tools/localfinds-astro-directory-template/
Documentation: https://www.websiterating.com/tools/localfinds-astro-directory-template/docs/