Rebuilding Leeds Web Services with Astro and Cloudflare Pages

How I replaced a small contact-link page on Vercel with a full Leeds Web Services site built with Astro and deployed through GitHub and Cloudflare Pages.

Cover for Rebuilding Leeds Web Services with Astro and Cloudflare Pages

5 min read


For a while, leedswebservices.com was little more than a contact page. It used a LittleLink-style layout with a short introduction and a stack of buttons pointing visitors toward email and other places they could find me.

That was enough when the site only needed to act as a digital business card. It was not enough to explain what Leeds Web Services does, the clients I work with, or the kind of problems I can help solve.

I recently replaced it with a full static site built in Astro and moved the deployment from Vercel to Cloudflare Pages.

Giving the site a real job

The old page was not broken. It was simply too small for the business it represented.

Leeds Web Services covers more than one-off website builds. My work includes WordPress development, redesigns, content migrations, hosting, analytics, security, performance, and the ongoing WebOps work that keeps a site useful after launch. A list of contact buttons could not communicate that very well.

The new homepage has distinct sections for services, selected work, how I approach a project, and the person behind the business. It also gives visitors several clear ways to get in touch without turning every part of the page into a sales pitch.

The selected-work section currently points to three publishing projects:

  • Retrofit Home, a WordPress publication build with an imported archive, editorial workflows, advertising, forms, and analytics.
  • Retrofit Magazine, where the work included a new theme, homepage, navigation, issue workflow, and advertising placements.
  • Roofing Magazine, which I support through ongoing maintenance, performance work, security, and hosting operations.

Those examples do a better job of explaining Leeds Web Services than a general claim that I build websites.

Building it with Astro

The replacement uses Astro 7 and produces a completely static site. There is no application server, database, or client-side framework behind the homepage. Astro turns the page and stylesheet into files that Cloudflare can serve directly.

For now, the project is intentionally small. The homepage is one Astro page with a global stylesheet. I did not add React, a component library, or a large CSS framework just to build a one-page site. If the site grows, Astro gives me room to split the layout into components and add content collections without changing the basic deployment model.

I also wanted the new design to feel like its own site instead of another template with the logo swapped out. The visual system uses a warm paper background, dark green, and a sharp lime accent. Serif headlines sit beside practical sans-serif body copy, and the layout moves between open editorial sections and denser service cards.

The page now includes the small details the contact-button version did not need:

  • A canonical URL and complete Open Graph and social-card metadata.
  • A custom favicon and share image.
  • Semantic page sections and accessible navigation labels.
  • A skip link, visible keyboard focus styles, and reduced-motion handling.
  • Responsive layouts for the service, project, process, and about sections.
  • Response headers for content-type protection, referrer handling, permissions, and framing.

None of those features is especially complicated by itself. Together, they make the site feel finished and give it a better foundation for future changes.

Moving the deployment to Cloudflare Pages

The previous version lived on Vercel. The new site is stored in GitHub and deployed through Cloudflare Pages, using the same general workflow I now use for my blog and resume.

The repository’s main branch is the source of truth. When a change reaches that branch, Cloudflare runs the Astro build and publishes the generated dist directory. The custom domain remains leedswebservices.com, but the infrastructure behind it is now consistent with my other static sites.

The build uses pnpm and Node.js 24.15.0. I pinned the Node version in the repository so the build environment and package-manager requirements stay aligned. Keeping that setting with the code should make future builds more predictable.

Because the site is static, it does not need a Cloudflare Worker. Pages serves the generated HTML, CSS, and images directly. That keeps the setup simple and avoids adding runtime infrastructure to a site that does not need it.

A better starting point

This rebuild was not about turning a small business site into a large application. It was about giving the site enough structure and content to represent the work accurately.

The next update might add a longer project case study, a dedicated services page, or a better contact form. Those additions can happen when the content calls for them. The current version already answers the questions the old page left open: what Leeds Web Services does, what kind of work I have completed, and how someone can start a conversation.

The LittleLink-style page served its purpose. The Astro site gives Leeds Web Services somewhere to grow.


Share this post