Installation
Indexa ships as a complete Astro project, not as an npm package or an integration you register. You clone the repository, install its dependencies and start editing — there is no theme layer between you and the markup, and nothing is hidden inside node_modules. Every component, token, icon and animation is a file in src/ that you own from the first commit.
It is a car marketplace: 109 pages built from a typed dataset of 69 vehicle records, three browse hubs, a ten-post analysis blog, twelve information pages, a favourites dashboard and six application shells. All of it is static HTML — there is no database, no API key and no account to create.
Requirements
Node 22.13 or newer, and pnpm. The floor is set by pnpm 11 (pinned in packageManager), not by anything in the source, and it is enforced by engines in package.json — an older Node fails the install rather than the build.
node -v # v22.13.0 or newer
pnpm -v # 11.9.0 is pinned
If you prefer npm or yarn, delete pnpm-lock.yaml and packageManager first. Nothing in the code depends on pnpm; the lockfile and the pin do.
Install and run
pnpm install
pnpm dev # http://localhost:4321
That is the whole setup. The site runs on its own content with no configuration — the placeholder domain builds, the demo data renders, and every page works offline. You can read the entire site before deciding whether to buy into its structure.
Two addresses are worth opening first. http://localhost:4321/ is the home page, eight sections over the car index. http://localhost:4321/examples/ui is the dev-only primitive catalog: all 37 UI primitives in every variant on one page. That route exists in astro dev only — it emits no paths in a production build — and it is the fastest way to see what you already have before you write a component.
What to change first
Seven values carry demo content. None of them break a build, which is exactly why they are worth a list.
| What | Where | Why it matters |
|---|---|---|
SITE_URL |
your host’s build env | Feeds canonical, OG, JSON-LD, the sitemap, robots.txt and llms.txt. A production deploy throws if it is unset — see Deployment |
| Brand name, title, description | src/config/siteData.json.ts |
Every <title>, the OG tags, the JSON-LD Organization and WebSite |
author.email, author.twitter |
src/config/siteData.json.ts |
Demo values on the reserved .example TLD |
sameAs |
src/config/siteData.json.ts |
Empty on purpose — the profile URLs that disambiguate your Organization |
| Index status figures | src/config/navData.json.ts |
The header’s 14:00 refresh time and 452,681 record count are editorial placeholders |
| Company number | src/config/navData.json.ts |
The footer’s registration line is fictional |
| Terms and privacy copy | src/config/legalData.json.ts |
Placeholder copy. Have it reviewed; it is not legal advice |
Then public/og.jpg (the 1200×630 social image), public/favicon.svg and public/favicon.ico.
Verifying a change
pnpm lint && pnpm check && pnpm build && pnpm test && pnpm wiki:lint
The build is the real check: content-schema and config mistakes surface there with the entry named. pnpm test runs every *.test.ts under src/ with Node’s type stripping — no framework, no fixtures — and fails if it finds none, so a check cannot go missing unnoticed. Commands covers what each link in that chain actually catches.
Where to go next
Project Structure explains the three-tier composition every page follows, which is the one idea that makes the rest of the codebase predictable. If you are here to change how it looks, go straight to Colors & Theming — the palette is six hex values in one file.