Marketing website for Willmore Lumber, a family-run lumber mill in Idaho with 50+ years in business. Built as a fast, mobile-friendly static site to showcase products, services, pricing, and customer reviews.
Live site: willmorelumber.com
- Next.js App Router with static export (
output: "export") for fast loads and simple hosting - Fully responsive navigation — desktop toolbar with nested menus, mobile drawer with collapsible sections
- 15+ content pages for products (rough-cut lumber, beams, flooring, siding, etc.) and services (custom cuts, delivery)
- Interactive carousels (Swiper) on the home page for product showcase and customer testimonials
- CI/CD via GitHub Actions — build on push to
main, deploy to GitHub Pages with a custom domain - SEO & PWA basics — page metadata,
robots.txt, web app manifest, and optimized images (WebP where possible)
| Framework | Next.js 15 (App Router) |
| UI | React 19, Material UI 6 |
| Language | TypeScript |
| Carousels | Swiper |
| Hosting | GitHub Pages |
| CI | GitHub Actions |
- Dark-themed MUI design system with custom palette and typography (Roboto via
next/font) - Reusable layout components (
Nav,Footer,DefaultPageWidth,ContactUs,BusinessHours) - Product gallery with lazy-loaded images and link to a full Google Photos album
- Google review integration — carousel of testimonials plus link to leave a review
- Accessible navigation patterns (drawer focus management, active route highlighting)
src/
├── app/ # App Router pages (one route per product/service)
├── components/ # Shared UI (nav, footer, showcase, reviews, etc.)
├── hooks/ # Client hooks (e.g. Swiper configuration)
└── theme.ts # MUI theme
public/ # Static assets (images, icons, manifest)
.github/workflows/ # Deploy pipeline
Prerequisites: Node.js 20+
# Install dependencies (npm or pnpm)
npm install
# Run the dev server
npm run devOpen http://localhost:3000.
| Command | Description |
|---|---|
npm run dev |
Start dev server (Turbopack) |
npm run build |
Production static build → out/ |
npm run start |
Serve production build locally |
npm run lint |
Run ESLint |
Pushes to main trigger .github/workflows/nextjs.yml, which:
- Installs dependencies and runs
next build - Uploads the static
out/directory as a Pages artifact - Deploys to GitHub Pages
The custom domain is configured via src/CNAME (willmorelumber.com).
This is a real-world project built for a local business — not a demo template. The content, photography, and customer reviews reflect an operating lumber mill. The goal was a maintainable, performant site that works well on phones (many customers browse on-site or in the field) without the overhead of a CMS or backend.