A page builder owns your markup and rents it back to you.
The old zedlav.ai ran on WordPress and Elementor. It worked, and that is usually where the argument stops. The cost arrives later. Layout lives in the database as builder data, so the site cannot be read, diffed, or reasoned about outside the tool that made it.
Every page ships the builder’s runtime whether that page needs it or not. Changing one spacing rule means opening a canvas, and changing it everywhere means opening every canvas. The structure underneath is nested wrappers that exist for the editor’s benefit rather than the reader’s.
For a company that sells engineering, the site is the one artifact a prospect can inspect before signing anything. Ours was the one artifact we did not control.
Design first, theme second, in that order.
Every page is a component first
Each screen was built as a self-contained design component that opens in a browser on its own. Shared chrome is imported rather than copied, so the navigation, footer, and assistant are written once and every page inherits the same one.
The theme is a port, not a rebuild
Each component becomes a block, a template, or a pattern carrying the same structure and the same tokens. Nothing is redrawn in a second tool, so the design and the shipped site cannot drift apart the way a mockup and its implementation normally do.
Editing stays in WordPress
Removing the builder cannot mean handing someone a repository and calling it a handover. Content is edited in the native site editor, and the parts that should be composable are patterns, so a new page is assembled from pieces that already match the system.
Palette, type scale, and spacing exist as tokens in one place. A change to the accent color is one edit, and it lands on every page in both themes.
The test of a build is whether you can leave it.
A builder site is portable in theory and stuck in practice. Export it and you get markup shaped by the tool, still carrying classes that only mean something inside it. The way out is usually a rewrite, which is why so few sites take it.
This theme is plain templates, plain markup, and CSS custom properties. It runs on WordPress because that is where the content lives, and the same structure would move to another host or another CMS without a redesign. That is the whole reason for building it this way, and it applies to a client engagement exactly as it applies to us.
Light is the default and dark is the toggle. Both are correct before any script runs, and both survive JavaScript being switched off entirely.
If a theme only looks right after a script runs, the theme is not the design. It is a costume the design puts on once the page has already loaded.
Zero to production, in eight stages.
This is the sequence every site we build runs through, in order. Each stage below carries what actually happened on this one.
Before WordPress exists
Domain and DNS, a CDN in front, SSL terminated at the edge, an origin server, email on the domain, and verified access to all of it. zedlav.ai: Cloudflare proxied in front of the origin, SSL in Full Strict mode, HSTS with preload and subdomains included.
Install and harden in one pass
Default themes and plugins removed, the legacy XML-RPC endpoint blocked at the server, file permissions locked, and the hardening shipped as must-use plugins so it cannot be deactivated from the dashboard. zedlav.ai: xmlrpc.php returns 403, static assets are file-locked, and server-side cache is off so the CDN is the only cache layer.
Architecture, not a purchase
Tokens defined first, reusable blocks per section type, template parts for header, footer, archive, and single post, and a hand-written stylesheet with no framework underneath it. zedlav.ai: Reusable blocks for CTAs, stat strips, scrollspy sections, and spec rows. Light and dark from one token set, three breakpoints, one responsive padding scale.
Search signals ship with the build
Structured data and search signals ship with the first deploy rather than being retrofitted: organization schema, per-page metadata, FAQ schema where questions match real queries, and a sitemap of indexable URLs only. zedlav.ai: AI crawlers permitted by name in robots.txt, an llms.txt published for model retrieval, and IndexNow pinged on every publish.
Guidelines, not taste
Copy is written against posting guidelines, and every public claim either traces to a named source or is tagged unverified and held back. Content reaches the database over the command line, not by pasting into a browser tab. zedlav.ai: No personal names, no client identification, no internal system names, no unverified claims. Images compressed before upload, American English enforced.
Nothing ships without the checklist
Locked files are unlocked, deployed, and re-locked. The CDN cache is purged for changed URLs only. The rendered page is checked in a browser rather than trusted from a status code. zedlav.ai: Deployed output is scanned for internal terms before it counts as shipped, and every page is inspected at 1440, 768, and 375 pixels.
The site does not go dark
Response time and status are baselined, site metrics are tracked, and drift against that baseline raises an alert instead of waiting to be noticed. zedlav.ai: Crawl health checks cross-reference the sitemap against indexing status, so coverage gaps and redirect errors are found rather than reported by a client.
Better after launch, not only at it
Keyword work runs against real search volume, on-page metadata is aligned to the terms worth winning, and schema is revised as products ship and positioning moves. zedlav.ai: Schema updated the same day a new product page ships, with cascade checks catching drift between the machine-readable page list and what is actually live.
Scanned before it shipped. Sites built here go through two scanners on the way out, and this one was no exception. OWASP ZAP spiders the running site and reads the live responses; Nuclei checks it against the official template set for known CVEs, exposed files, and misconfiguration. Both land in one merged report rather than two dashboards nobody opens. How we scan and what we enforce
Under the hood.
| Platform | WordPress block theme, full site editing, no builder |
|---|---|
| Blocks | Hero, proof rows, service rows, stat strip, stack table, ticker, CTA |
| Templates | Front page, full-width page, case study, blog archive, single post, 404 |
| Patterns | Composable page sections, so a new page is assembled rather than drawn |
| Styling | CSS custom properties in one place, light and dark from the same tokens |
| Source of truth | The design components, ported to the theme rather than mocked for it |
Fonts are self-hosted, motion respects the reduced-motion setting, and tap targets hold at 44px down to the smallest breakpoint.
Stuck on a
page builder?
Zedlav builds client sites the same way this one was built. Tell us what you are running now and what you cannot change without opening a canvas.
sales@zedlav.ai →