Back to Projects
web-developmentFeatured

Building a Scalable Company Website for an HVAC & Ventilation Business — A Fullstack Case Study

How I developed a scalable HVAC and ventilation website for a client using Next.js, Express.js, and PostgreSQL, with CI/CD via GitHub Actions and Docker.

Building a Scalable Company Website for an HVAC & Ventilation Business — A Fullstack Case Study

Technologies Used

Next.jsExpress.jsPostgreSQLDockerNginxGitHub ActionsCloudflareVPS Hosting

Project Links

The Project

A client running an HVAC and ventilation solutions company reached out to get a proper website built — something that actually represented what they do, not just a template with their logo slapped on it. They wanted a place to showcase their products, services, past projects, and customer testimonials, plus a way for potential customers to reach out directly through the site instead of relying only on phone calls and emails floating around.

One thing the client was clear about from the start: he wants to expand the business going forward, so the site couldn't just work for today's scale — it had to hold up as the company grows.

That single requirement shaped a lot of my technical decisions.

Why I Picked This Stack

Backend — Express.js I went with Express for the backend because it gives me full control over how the API is structured. No hidden magic, no fighting a framework's opinions when the client's needs don't fit the mold. Since scalability was a real requirement here and not just a buzzword the client threw around, I designed the backend architecture with that in mind from day one — clean separation of concerns, modular routes, and a structure that won't turn into spaghetti when new features get bolted on later.

Frontend — Next.js For a business website like this, SEO and page load speed matter a lot — this is how the client actually gets customers. Next.js gave me server-side rendering out of the box, which matters when your product/service pages need to rank on Google. It also made structuring dynamic pages (individual project pages, service pages, etc.) straightforward.

Database — PostgreSQL Relational data, structured content (products, services, testimonials, completed projects, customers, inquiries) — Postgres was the obvious fit. It's reliable, it scales well, and it plays nicely with the kind of relational data a business site like this generates.

What's Actually Inside It

This isn't just a static "About Us" site. There's a proper backlog/admin system built in so the client can manage:

  • Products
  • Services
  • Testimonials
  • Completed projects
  • Customers
  • Inquiries

That last one — the inquiry handling system — was important. Instead of the usual "send us an email" dead end, inquiries submitted through the site get captured, stored, and managed properly on the backend, so the client isn't losing potential leads in some inbox somewhere.

Deployment & DevOps

I didn't want to just build the site and hand over a zip file — I set up a proper deployment pipeline for it:

  • Dockerized the whole application, so environments stay consistent between local dev and production. No "works on my machine" problems.
  • GitHub Actions handles CI/CD — push to the right branch, and it builds and deploys automatically.
  • VPS hosting instead of a generic PaaS, since the client wanted more control and room to scale infrastructure later without being boxed in.
  • Nginx as the reverse proxy in front of the app.
  • Cloudflare handles DNS and adds a layer of security on top.
  • Locked down the VPS firewall and added other server-level security measures to keep the usual automated attacks and probing away.

None of this is flashy from the client's point of view — they just see a fast, working website. But it's the difference between a site that holds up under real traffic and one that falls over the first time something unexpected happens.

The Result

The client now has a website that actually reflects the scale of the business he's building — not just where it is today, but room for where he wants to take it. Products, services, testimonials, and completed projects are all managed through a proper backlog instead of hardcoded pages, and every inquiry that comes through the site gets captured instead of falling through the cracks.

This project is a good example of what I enjoy doing — taking a client's real business needs (not just "make it look nice") and translating them into an architecture that's built to last, not just built to launch.

fullstack-developmenthvac-websiteclient-projectportfoliocase-study