Landing pages live in promo.
The repo is empty on purpose — there are no campaign pages yet. This is what belongs there, how one gets published, and the rule that keeps the live site out of harm.
Repo: github.com/Amiro-health/promo. The domain, project and access rows are in handbook/cloudflare.md; the branch rule is in handbook/for-designers.md.
Promo holds campaign landing pages, and nothing else.
Through September promo drifted into being a second copy of the website: the same module pages, diverging from the originals every time either side was edited. It was emptied on 4 October and the website kept the pages. If a page you are about to add also exists on amiro.health, it is the website's, not promo's.
Two branches, two addresses, two audiences.
| Branch | Appears at | Who can open it |
|---|---|---|
| ux | promo-ux.amiro.tech | Cloudflare Access — Design & UX. Sign in once, two-week session. |
| main | promo.amiro.health | Anyone. Public, indexed by Google unless the page says otherwise. |
Work on ux. Never push to main. Main is what the public sees, and a push lands there in about a minute. Work reaches it by a deliberate merge, agreed with Yerzhan — not at the end of a working session.
git checkout ux git branch --show-current # if this says main, stop
From an empty repo to a live page.
- Start on ux.
git checkout ux. If ux is still the stale August branch, reset it first:git checkout ux && git reset --hard origin/main && git push --force-with-lease. - Add one file.
autumn-open-week.htmlat the root — named for the campaign, lowercase, hyphens. It becomespromo-ux.amiro.tech/autumn-open-week; Cloudflare drops the.html. - Push and look at it.
git push origin ux, then open the ux URL about a minute later. Check it at desktop width and on a phone. - Get it reviewed. Cinzia on the copy and the offer.
- Merge to main. Done deliberately, together — never as the last act of a session. A minute later it is at
promo.amiro.health/autumn-open-week. - Retire it when the campaign ends.
git rmthe file and merge. The URL then 404s, so make sure no ad still points at it.
One file, under thirty kilobytes.
Every visit to a campaign page is a cold first visit from an ad. There is no second page and usually no second visit, so a shared stylesheet has nothing to amortise against — you would pay a render-blocking round trip to fetch it and never collect the cache benefit. Inlining is the right call here for that reason, and only that reason: a multi-page site with real navigation is exactly where shared CSS pays off, which is why the website keeps its own.
Which makes size, not inlining, the thing to watch. Measured on 4 November:
| File | Raw | Over the wire |
|---|---|---|
| website/index.html | 547 KB | 148 KB gzipped — 59% of it inline CSS |
| website/front-desk.html | 155 KB | 45 KB gzipped |
| a landing page | — | under 30 KB gzipped |
- One self-contained HTML file per campaign, under 30 KB gzipped. Only the CSS this page uses. Building one by copying a website page ships a design system built for ten pages to a visitor who will see one.
- Images on Cloudinary, not in the repo. Preload the hero image, lazy-load the rest, and let Cloudinary serve AVIF or WebP. Never base64 a binary into the file.
- Fonts self-hosted as a subset woff2. Fetching Inter from fonts.googleapis.com blocks the first paint on two extra connections. The placeholder already self-hosts its one face at 8.8 KB.
- Tracking after first paint. On most landing pages the tag manager is the single heaviest thing on the page. It loads last, never in the critical path.
- Nothing private. Main is public and the ux URL is gated, not secret. No customer names, prices, contracts or internal notes, comments included.
- Brand from the website — ink
#180600, cream#faf7ec, yellow#fdf05b, Inter with Jeju Myeongjo for display. Copy the wordmark SVG rather than redrawing it. Check the page at about 1360px and at a phone width before the merge.
What is actually in the repo today.
files tracked on main: the placeholder and the two blog pages
landing pages — none has been built yet
stale branches left over from the September work
noindex, so promo.amiro.health stays out of search while it is empty.0d245d3 and can be restored with git checkout 0d245d3 -- <file>.