Back to work
2026·Corporate · Water Treatment EngineeringPRODUCTION

AQUA FLEX

Water treatment engineering, built without inventing a single claim.

Corporate site for a Lahore water-treatment company running since 1995. Nine routes covering commercial and domestic RO systems, how treatment actually works, services, references, the team, contact, and an interactive plant selector — built around the constraint that almost nothing about the business had been documented.

AQUA FLEX — live site screenshot
Duration
1 week
Team
Solo full-stack + client-supplied content
My role
Lead engineer / designer
Client context

Numbers about the client's business — useful context, not my engineering output.

Established
1995
Years in business
30+
Client references
7
Team size
10
My engineering output

Numbers I produced — measurable, attributable to the work I did.

Lighthouse performance
96–99
Measured on production across four pages
Accessibility / Best Practices / SEO
100
All three, all four pages, zero failures
Cumulative layout shift
0.000
JS shipped
216 KB gzipped
Responsive checks passed
70/70
10 routes across 7 widths, 320px to 1440px
Hosting cost / month
$0 (Vercel free)
What I built

My specific scope on this project — separate from anything the client team supplied.

The story

From brief to production system.

Challenge

The client supplied a phone number, an address, seven client names with their sectors, ten staff names, two portraits and two hand-drawn process diagrams. That is it. No capacities, no project photography, no prices at the start, no certifications. Every gap on a site like this is an invitation to write plausible copy — a fake case study, a stock photo under a real client's name, an invented response time. Doing that would have handed the business claims it could not honour.

Solution

Built every surface so that missing information degrades honestly instead of being filled in. Prices live in one module and render their call to action until the business verifies a figure. Service intervals stay unpublished because they depend on the water. The plant selector recommends a starting category and says three times over that design comes from an analysis. Social icons render as decoration — not dead links — until a real URL exists. A written claims audit records the evidence behind every public statement, and the nine that were removed for having none.

Outcome

Live on its own domain with nine routes, 100 on accessibility, best practices and SEO across every page measured, zero dead links, and zero horizontal overflow from 320px up. Every published claim traces to a supplied file or written confirmation, and the handoff document tells the client exactly what is still needed to fill the remaining gaps.

Real constraints

The boundaries that shaped the build.

Honest tradeoffs

What I chose, and what I gave up.

Decision

Typography-led client references instead of illustrated case-study cards

What we gave up

Visual richness on the strongest credibility page. A stock plant photo under a real client's name implies that equipment is theirs, which is not mine to imply — so the references are set in type until real site photography is cleared.

Decision

Structured WhatsApp messages instead of a form backend

What we gave up

A lead database and submission analytics. There was no mail service to post to, and a form that silently goes nowhere is worse than none — this way the visitor reads the exact message before it sends, on the channel the market already uses.

Decision

A stated experience label rather than one computed from the founding year

What we gave up

Self-updating copy. A site that quietly becomes '32 years' next January is a site nobody is checking; the figure is stated once and reviewed deliberately.

Process · 1 week

How it shipped, week by week.

Phase 1
01 / 5

Design system + homepage

Built the token system, the contrast gate, header, footer and homepage before any other page existed, so every later route inherited one visual language.

Phase 2–3
02 / 5

Product and process pages

Commercial, domestic, how-it-works and services. The treatment explorers were built as accessible tab patterns rather than bespoke widgets.

Phase 4–5
03 / 5

Proof, people and conversion

References, the team presentation, contact, and the plant selector with its rule engine. Every claim on these pages had to trace to something the client supplied.

Phase 6
04 / 5

Claims audit + production hardening

Audited every public statement against the evidence, removed nine unverifiable claims, added SEO, structured data, sitemap and robots, and fixed the accessibility defects Lighthouse surfaced.

Phase 7
05 / 5

Brand + domain

Vectorised the official logo into a derived variant system, then migrated the canonical origin from the Vercel alias to aquaflexpk.com — DNS, certificates, redirects and every absolute URL.

Inside the system

What it does. How it's built.

Features

  • Interactive 9-stage treatment process explorer, keyboard-operable
  • Eight-step plant selector with an explainable recommendation
  • Domestic system pricing with cartridge and component price list
  • Requirement form that composes a structured WhatsApp enquiry
  • Client reference grid with sector filtering
  • Team presented as departments, with initials where no portrait exists
  • LocalBusiness schema with confirmed opening hours
  • Branded 404, sitemap and robots

Architecture

  • 01Next.js 16 App Router, Server Components by default
  • 02Client JS only where something is genuinely interactive — header, two process explorers, reference filter, contact form, selector
  • 03Tailwind v4 @theme design tokens, no component library
  • 04Single-source data modules: company, clients, team, pricing, products
  • 05Contrast gate reads the palette from globals.css so it cannot drift
  • 06next/image with priority on the LCP hero, lazy below the fold
  • 07Static generation for all nine routes
  • 08Vercel edge hosting, custom domain via Namecheap A + CNAME records
Stack
Next.js 16React 19TypeScriptTailwind CSS v4Server ComponentsTurbopacknext/fontJSON-LDWhatsApp deeplinksVercel
From the codebase

Annotated excerpts.

01 · The rule that stops a price ever being guessed. Anything unverified renders its call to action instead of a number — never Rs. 0, never TBD, never an estimate.
src/data/pricing.tstypescript
export function formatPrice(
  key: string,
  fallbackLabel = "Request Current Price",
): string {
  const p = pricing[key];

  if (!p || !p.verified || p.type === "quote" || p.amount === undefined) {
    return fallbackLabel;
  }

  if (p.type === "range" && p.maxAmount !== undefined) {
    return formatRupees(p.amount) + " – " + formatRupees(p.maxAmount);
  }

  if (p.type === "starting-from") {
    return "From " + formatRupees(p.amount);
  }

  return formatRupees(p.amount);
}
02 · The selector's recommendation engine. Deliberately simple, because the result screen explains its own reasoning back to the visitor — and TDS never decides the category on its own.
src/data/plant-selector.tstypescript
export function recommend(a: SelectorAnswers): Recommendation {
  const reasons: string[] = [];
  const caveats: string[] = [];
  const litres = a.demand ? toLitresPerDay(Number(a.demand), a.demandUnit) : null;

  // An installed plant changes the question entirely.
  if (a.hasExisting === "yes") {
    reasons.push("There is already a treatment system installed");
    caveats.push(
      "Whether it is serviced, modified or replaced depends on what is " +
        "installed and how far it is from what is now needed.",
    );
    return { category: categories["service-upgrade"], reasons, caveats };
  }

  const processUse = a.purpose === "process" || a.purpose === "boiler";
  const isIndustrial =
    a.application === "industrial" ||
    processUse ||
    (litres !== null && litres >= INDUSTRIAL_FROM);

  // Nothing to go on: say so rather than guessing a category.
  if (!isIndustrial && a.application !== "home" && a.source === "unknown") {
    caveats.push("A test of the supply is the sensible first step.");
    return { category: categories["analysis-first"], reasons, caveats };
  }

  // ...source and TDS qualify the answer; they never decide it alone.
}
Other projects

Continue browsing

Have a project like this in mind? Let's talk.

Send me a brief and I'll respond within 24 hours.

← Home© 2025 Ali RazzaqContact →