---
title: "Engineering Notes — gCurv Technologies"
description: "Notes from building and running production software. Specific problems, what caused them, and what we changed."
lang: en
json-ld: |
  {
    "@context": "https://schema.org",
    "@type": "Blog",
    "name": "Engineering notes",
    "description": "Notes from building and running production software. Specific problems, what caused them, and what we changed.",
    "url": "https://gcurv.com/notes",
    "publisher": {
      "@type": "Organization",
      "name": "gCurv Technologies",
      "url": "https://gcurv.com"
    },
    "blogPost": [
      {
        "@type": "BlogPosting",
        "headline": "Make the SEO contract a build gate",
        "description": "Metadata regressions are silent. A build that fails on them turns a slow content problem into an immediate one.",
        "datePublished": "2026-08-24",
        "url": "https://gcurv.com/notes/make-the-seo-contract-a-build-gate"
      },
      {
        "@type": "BlogPosting",
        "headline": "Your navigation may contain no links",
        "description": "A React dropdown nav that renders buttons instead of anchors, and unmounts when closed, ships zero navigation to a crawler.",
        "datePublished": "2026-08-24",
        "url": "https://gcurv.com/notes/your-navigation-may-contain-no-links"
      },
      {
        "@type": "BlogPosting",
        "headline": "Server rendering is not a status code",
        "description": "A server-rendered page can still return 200 for a URL that does not exist. These are separate layers, and conflating them is common.",
        "datePublished": "2026-08-24",
        "url": "https://gcurv.com/notes/server-rendering-is-not-a-status-code"
      }
    ]
  }
---

[![gCurv logo](/assets/gcurv-logo-CJpRRXOD.png)gCurv ](/)

[Work](/work)[Capabilities](/capabilities)[Products](/products)[Notes](/notes)[About](/about)

[Contact us](/contact)

Notes 

# Engineering notes

Things we hit building and running our own software. Written up because we had to work them out, and the answers were not obvious.

[2026-08-24

## Make the SEO contract a build gate

Metadata regressions are silent. A build that fails on them turns a slow content problem into an immediate one.

](/notes/make-the-seo-contract-a-build-gate)[2026-08-24

## Your navigation may contain no links

A React dropdown nav that renders buttons instead of anchors, and unmounts when closed, ships zero navigation to a crawler.

](/notes/your-navigation-may-contain-no-links)[2026-08-24

## Server rendering is not a status code

A server-rendered page can still return 200 for a URL that does not exist. These are separate layers, and conflating them is common.

](/notes/server-rendering-is-not-a-status-code)

![gCurv logo](/assets/gcurv-logo-CJpRRXOD.png)gCurv 

A full live website with homepage, platform narrative, product modules, services, pricing, and an editorial blog.

[Email our team](/contact)

### Platform

-   [Overview](/platform)
-   [Products](/products)
-   [Pricing](/pricing)

### Solutions

-   [Services](/services)
-   [Industries](/platform)
-   [Blog](/blog)

### Company

-   [About us](/about)
-   [Contact us](/contact)

© 2026 gCurv. All rights reserved. [Back to top ↑](#top)