Skip to content

Project tour

You unzipped the theme, ran npm install, ran npm run dev, and now you have a folder full of files. This page is the map.

my-theme/
├── astro.config.mjs # Astro + integrations config
├── package.json # Dependencies + npm scripts
├── tsconfig.json # TypeScript settings
├── netlify.toml # Netlify deploy config
├── vercel.json # Vercel deploy config
├── README.md
├── LICENSE.md
├── CHANGELOG.md
├── public/ # Static assets served at /
│ ├── favicon.svg
│ ├── og.png
│ ├── robots.txt
│ └── team/, gallery/, blog/, …
└── src/
├── pages/ # File-based routes
├── layouts/ # Page-level wrappers
├── components/ # The section library
├── content/blog/ # Markdown blog posts
├── content.config.ts # Content collection schema
├── config/
│ ├── site.ts # The config file you'll edit most
│ ├── menu.json # (some themes) navigation
│ └── social.json # (some themes) social links
└── styles/
└── global.css # Design tokens + Tailwind base

Astro’s file-based router. Every .astro file here is a URL.

src/pages/index.astro → /
src/pages/about.astro → /about/
src/pages/blog/index.astro → /blog/
src/pages/blog/[slug].astro → /blog/getting-started/ (one per blog post)

You’ll edit these to: add a page, rename one, remove a page you don’t need. See Customize → Pages.

Wrapper components that set up <html>, <head>, fonts, analytics, SEO meta. Every page imports Layout.astro and renders its body inside.

<Layout title="Pricing">
{/* …page content… */}
</Layout>

You’ll edit these to: add custom head scripts, change the favicon, modify the default OG image generation logic.

The section library — Hero, Pricing, FAQ, Testimonials, Team, Gallery, Carousel, Tabs, and ~20 more. Each is one self-contained .astro file.

You’ll edit these to: change a section’s visual design, add a new section, remove one you don’t use. See Customize → New sections.

Markdown blog posts. Each .md file becomes a URL at /blog/<filename>/ via src/pages/blog/[slug].astro.

You’ll edit these to: write posts. Drop a new .md file in here with frontmatter and it shows up on /blog/. See Writing blog posts.

The Zod schema for blog frontmatter. Defines what fields each post must have.

You’ll edit this to: add a new frontmatter field (like tags or featured). See Frontmatter reference.

The control room.

  • site.ts — the big one. Site name, navigation, brand, SEO, analytics, contact form, newsletter, footer, team, comparison, gallery, carousel, tabs, map. Edit this for most config tasks. See site.ts reference.
  • menu.json — (some themes) navigation links, in JSON. If your theme imports from here, edit it; otherwise it’s vestigial.
  • social.json — (some themes) social link URLs, in JSON. Same story.

CSS design tokens (brand color, surfaces, fonts, easing curves) plus Tailwind base. The single file that shapes every component’s look.

You’ll edit this to: repaint the theme, change typography, add new utility classes. See Brand colors & fonts.

Static assets served as-is at the matching URL. Logo, favicon, OG image, team photos, gallery images.

You’ll edit this to: swap the favicon and OG image, add product screenshots, add team photos.

After running npm run build:

  • dist/ — the deployable static site. Cloudflare / Vercel / Netlify reads from here.
  • node_modules/ — installed dependencies.
  • .astro/ — Astro’s cache. Safe to delete.

In rough order of impact:

  1. src/config/site.ts — change site name, nav, brand color, SEO. 80% of customization happens here. → site.ts reference
  2. src/styles/global.css — change the brand color globally if needed. → Brand colors & fonts
  3. public/ — swap the favicon, OG image, and any team / gallery photos. → Images & media
  4. src/pages/ — delete pages you don’t need (e.g. customers.astro if you don’t have any yet).
  5. src/content/blog/ — add your first post. → Writing blog posts
  6. src/components/ — only when you need to change a section’s visual design.
  • astro.config.mjs — unless you’re changing the build target or adding a Vercel/Netlify adapter.
  • tsconfig.json — Astro’s defaults are fine.
  • package.json — only edit scripts (rarely) or dependencies (when adding a library).
  • netlify.toml / vercel.json — only if you’re tuning deploy-host behavior.