Table of Contents

Our website redesign process: why we rebuilt instead of patched
Our previous site had grown the way most sites do, one plugin and one page builder block at a time. It looked acceptable, but under the hood it carried the accumulated weight of years: render-blocking stylesheets, redundant JavaScript, and a page builder that shipped markup no human would ever write by hand. For a sustainability marketing agency, an energy-hungry, sluggish website is a credibility problem, not just a technical one. We considered the usual route: install a caching plugin, a performance plugin, an image plugin, and paper over the cracks. But you cannot optimize your way out of a foundation that is heavy by design. Page builders trade a small amount of convenience for a large, permanent performance tax. So for this website redesign process we made the harder decision and started from a blank file.The design system
For this website redesign, we wanted the site to feel like the outdoors it champions: grounded, natural, and quietly premium. The palette is built on a deep forest ink, a fresh lime-green accent, and a supporting violet, with generous negative space so the work can breathe. The site ships in a dark, cinematic theme by default and offers a true light mode that is one tap away, with the theme choice remembered between visits. Typography is a single, self-hosted family (Inter) in a tight range of weights, which keeps the type crisp while avoiding the cost of loading multiple font files from a third party. Every design token, from color to spacing to type scale, lives in CSS custom properties, so the whole system stays consistent and is trivial to theme for light and dark at once.Architecture: a hand-coded theme, not a page builder
The heart of the project is a custom WordPress theme written by hand in PHP, CSS, and vanilla JavaScript. There is no Elementor, no drag-and-drop builder, and no library of design plugins. Each template, the homepage, the six service pages, the portfolio archive and case studies, the blog index and single post, the tools, follows WordPress’s native template hierarchy and renders exactly the markup we intend and nothing else. That discipline pays off everywhere. Assets are enqueued deliberately rather than dumped globally, so a page only loads the CSS and JavaScript it actually uses. The blog index is a real, paginated query rather than a hardcoded list, so it scales as we publish. The portfolio uses a custom post type with clean, stable URLs. Nothing is generated by a black box, which means nothing is heavier than it needs to be.Performance engineering
Speed was the non-negotiable brief for the website redesign, and it is not an accident or a plugin setting. It is the sum of dozens of small, deliberate choices.- Self-hosted fonts. Inter is served as preloaded woff2 files from our own domain with a swap strategy, so text paints immediately and never blocks rendering while waiting on a font server.
- Next-gen, right-sized images. Every image is compressed WebP with explicit width and height attributes and responsive srcset sets, so the browser downloads the smallest file that fits the viewport and never reflows the layout while images load.
- A discoverable LCP. The hero image is preloaded with a high fetch priority so the largest element on the page starts downloading in the first moments of the request rather than after the browser has parsed halfway down the document.
- Deferred analytics. Google Analytics does not load on first paint. A tiny stub queues events and the full script only loads on the first real interaction, or after a few seconds, whichever comes first. That single decision removes a large chunk of main-thread work and forced reflow from the critical path.
- No render-blocking bloat. Because there is no page builder, there is no cascade of builder stylesheets and no jQuery-heavy widget soup. Critical styles are inlined where it helps, and scripts are lean and event-driven.
Motion and interaction, without the jank
The site has a considered layer of motion: smooth scrolling, elements that reveal as they enter the viewport, and subtle depth on key sections. All of it is built on an IntersectionObserver-driven reveal system and a lightweight smooth-scroll layer, rather than a heavy animation library loaded on every page. Every effect respects the operating system’s reduced-motion preference, and touch devices get their own event paths so nothing that depends on a mouse hover silently breaks on a phone. Motion should feel effortless, and effortless is engineering, not luck.Forms with no third-party plugin
Contact, project quote, newsletter, and the resource downloads are all handled by code we wrote, not a form plugin. Each submission is protected by a WordPress nonce and a honeypot field to stop spam, posts through the platform’s own admin-post handler, and is stored as a private custom post type inside WordPress with a clean admin table, filtering, and CSV export. That means no external form service, no extra scripts on the page, no data leaving our control, and one less plugin to slow the site down or become a security liability.
