Serve a single self-contained page from nginx while the marketing site is rebuilt, so the domain shows the Neuron brand rather than a stale product site. Inline the real wordmark and favicon as data URIs to keep the page free of external requests and safe under a strict CSP.
coming-soon
Static placeholder page served at neurontechnologies.ai while the site is rebuilt.
What it is
A single self-contained index.html — inline CSS, no frameworks, no build step, and
zero external network requests. The Neuron wordmark and favicon are inlined as
data: URIs, so the page renders identically offline and under a strict CSP.
Brand assets are the real masters from neuron-technologies/assets:
| Asset | Source |
|---|---|
| Light wordmark | branding/wordmarks/neuron-wordmark-on-light@2x.png |
| Dark wordmark | branding/wordmarks/neuron-wordmark-on-dark@2x.png |
| Favicon | branding/icons/neuron-icon-32.png |
Brand blue is #2996F8, sampled from the icon master.
Regenerating index.html
index.html is committed and is the file that ships. To rebuild it from updated
brand assets, re-inline the three images above as base64 data: URIs. There is no
build tooling and none is wanted — keep it a single file.
Container
nginx:alpine. Cloud Run injects PORT (8080); the nginx entrypoint runs
envsubst over /etc/nginx/templates/default.conf.template before starting, which
is how listen ${PORT} resolves. /healthz returns 200 ok. Every other path
falls through to index.html.
docker build --platform linux/amd64 -t coming-soon:local .
docker run --rm -p 8080:8080 -e PORT=8080 coming-soon:local
curl -sI http://localhost:8080/
Deploy
The image lives in Artifact Registry:
us-central1-docker.pkg.dev/neuron-785695/neuron-marketing/coming-soon:v1
neurontechnologies.ai is fronted by Cloudflare, then a GCP global load balancer
(marketing-backend-prod) with serverless NEGs pointing at three Cloud Run
services. Deploy to all three or the regions will serve different pages:
| Service | Region | NEG |
|---|---|---|
marketing-prod-us |
us-central1 |
marketing-neg-us |
marketing-prod-eu |
europe-west1 |
marketing-neg-eu |
marketing-prod-apac |
asia-northeast1 |
marketing-neg-apac |
IMG=us-central1-docker.pkg.dev/neuron-785695/neuron-marketing/coming-soon:v1
for pair in us-central1:marketing-prod-us europe-west1:marketing-prod-eu asia-northeast1:marketing-prod-apac; do
gcloud run deploy "${pair##*:}" --project=neuron-785695 --region="${pair%%:*}" \
--image="$IMG" --platform=managed --port=8080 --allow-unauthenticated \
--clear-env-vars --clear-secrets \
--cpu=1 --memory=512Mi --min-instances=1 --max-instances=10
done
--clear-env-vars --clear-secrets is deliberate: a static nginx has no business
holding live Stripe, Supabase, or Anthropic credentials. Memory must be at least
512Mi because these services run with CPU always allocated.
No DNS record or domain mapping was touched to put this page up, and none needs to be touched to take it down.
Rollback
Cloud Run revisions are immutable, so the previous application revisions still carry their own image, env vars, and secret bindings. Rolling back is a pure traffic change:
gcloud run services update-traffic marketing-prod-us --project=neuron-785695 \
--region=us-central1 --to-revisions=marketing-prod-us-00101-98x=100
gcloud run services update-traffic marketing-prod-eu --project=neuron-785695 \
--region=europe-west1 --to-revisions=marketing-prod-eu-00099-4tz=100
gcloud run services update-traffic marketing-prod-apac --project=neuron-785695 \
--region=asia-northeast1 --to-revisions=marketing-prod-apac-00077-jp8=100
Those three revisions ran image marketing:ci-047be5ae and were serving 100% of
traffic immediately before this placeholder went live.