← All posts
astro web development freelancing workflow

How I Build Client Websites in 3 Days with Astro

· Mohd Hanafiah

How I Build Client Websites in 3 Days with Astro

Three days sounds aggressive. It’s not — not when your stack is tight and your process is repeatable.

I’ve shipped more than two dozen client sites in the past two years using this method. Here’s exactly how it works.

Why Astro

Before the process, the tool choice matters. Astro ships zero JavaScript by default. That single constraint forces good decisions:

  • No heavy React component trees for things that don’t need to be interactive
  • No hydration cost on initial load
  • Sub-200ms first contentful paint on a RM 20/month VPS

Clients don’t care about the framework. They care that Google ranks their site and visitors don’t leave before it loads. Astro handles both.

Day 1: Foundation

The first day is entirely setup and structure — no visible UI.

Morning: Scaffold and configure

pnpm create astro@latest client-site -- --template minimal
cd client-site
pnpm astro add react tailwind sitemap

I also set up:

  • astro.config.mjs with the client’s domain
  • Tailwind v4 CSS tokens for their brand colours
  • SEOHead.astro component that takes title, description, and structured data as props
  • BaseLayout.astro wrapping every page
  • The Cloudflare adapter (deployment target)

Afternoon: Content structure

Before writing a single line of page code, I map out:

  • Every page and its primary keyword
  • The content collection schemas (blog posts, services, testimonials)
  • The internal linking plan

This takes 2–3 hours but saves the same amount later.

Day 2: Pages

Day 2 is full-build mode. I work page by page, top of the site to bottom.

Order matters: build shared components first (header, footer, nav), then the home page, then service pages, then blog index and dynamic routes.

Each page follows the same SEO checklist:

  1. Unique title under 60 characters
  2. Unique meta description under 160 characters with a CTA
  3. One H1 containing the primary keyword
  4. Minimum 800 words of real content
  5. Internal links to 3+ other pages
  6. JSON-LD structured data appropriate for the page type

I don’t write placeholder content. Every word on every page is real, researched, and written for the human reading it — not the algorithm.

Day 3: Polish and deploy

Morning is for everything I couldn’t do while moving fast:

  • Mobile layout review on an actual phone
  • Image optimisation (Astro’s built-in <Image> component handles WebP conversion automatically)
  • Turso database setup if there’s a contact form
  • robots.txt and sitemap verification

Afternoon is deployment:

# Cloudflare Pages — connect the repo and it deploys automatically
# First push triggers a build. Subsequent pushes auto-deploy.

Cloudflare’s free tier covers almost every client site. Global CDN, automatic SSL, and edge caching for the static assets.

The real reason it’s fast

The process isn’t magic. It’s repeatable decisions removed from the critical path.

I don’t decide on my typography system per client. I use Geist Variable with the same scale. I don’t decide on my colour approach per client. I swap tokens. I don’t decide how to handle SEO per client. I have a component for that.

Every decision you make is time you don’t have on a 3-day build. Build your defaults once, ship faster forever.


Want a site built this way? Get in touch and I’ll tell you what’s possible for your project.

Written by Mohd Hanafiah

Freelance developer and automation specialist from Malaysia. I build Astro sites, Flutter apps, AI automation workflows, and coach developers.

Work with me →