Construction, 2025–26. Build. The client of record is another agency.. Live.

East Coast construction company

I built a construction company's website and employee intranet, with one place for staff to update both.

Private build. There is no public screenshot because the app sits behind a login.

Where it started

A commercial construction company on the East Coast had a public marketing site and no intranet. The things a company that size needs internally, a staff directory, an events calendar, open jobs and applications, HR and safety and IT pages, culture stories, a suggestion box, a way for the field to request signage, otherwise live in email. They wanted an intranet, and they wanted staff to update the website and the intranet from one place instead of two.

I built both. The public site is generated from lists: each service, for each industry, in each service area gets its own page, assembled from the content rather than written one at a time. The intranet reads the same content and adds the internal pages. The client of record is another agency, which is why the company isn't named.

What made it hard

  • The client wanted one place to edit everything, so a change to a service page made from the intranet's editor has to go out to the public site.
  • The intranet is only reachable from the office or the company VPN, checked by network address. The address IT had documented for the office was wrong, so staff in the building were locked out while remote staff got in.
  • The content system quietly dropped image fields when items were updated in bulk. Found the hard way, fixed by updating one item at a time.

What I built

One editor, two sites

Nineteen content collections, eleven for the intranet and eight for the public site, sit behind one editor that's driven by configuration. The public-site collections don't appear anywhere on the intranet itself, which looks like dead code in an audit and is the whole point: staff edit the company's website from the same place they edit the lunch menu.

A locked door that tells you which key you need

The intranet checks the visitor's network address against a short allowed list before any page loads, at the network edge rather than in the app. If you're turned away, the denial page prints the address you came from, so nobody has to guess what to add to the list. When the documented office address turned out to be wrong, that page is how we found the right one. The whole check switches off by deleting one setting, which is the rollback.

What isn't measured

  • No usage numbers. The intranet isn't tracked, so how many staff use it and how often is unknown.
  • Whether the suggestion box changes anything is unmeasured. Submissions land in a collection and nobody counts them.
  • Anonymized, which means the public site can't be linked and the generated pages can't be shown ranking in search.

Built with

AstroReactWebflow CMSWebflow CloudCloudflare

See for yourself

Anonymized at the request of the agency of record. The intranet is only reachable from the company's network and the public site isn't linked.

Cameron Ameigh

Tell me what you're working on.

Send me a little about your project or the role you're hiring for. I'll tell you whether it sounds like a fit.