All explainers
00 · Promo · 4 November 2026

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.

The path a page takes
Branch ux→promo-ux.amiro.tech→Reviewed→Merge to main→promo.amiro.health

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.

01 · Scope

Promo holds campaign landing pages, and nothing else.

PromoA page built for one campaign: an ad set, a launch, an event, a partner. It stands alone, it is measured on its own, and it can be retired when the campaign ends.
Not promoThe website is amiro.health — the product pages, pricing, legal. Customer demos are demo.amiro.health, one file per customer. Neither belongs here.

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.

Amiro · Promo · 4 Nov 20261 / 5
02 · Branches

Two branches, two addresses, two audiences.

BranchAppears atWho can open it
uxpromo-ux.amiro.techCloudflare Access — Design & UX. Sign in once, two-week session.
mainpromo.amiro.healthAnyone. 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.

before you start, and before every push
git checkout ux
git branch --show-current    # if this says main, stop
Amiro · Promo · 4 Nov 20262 / 5
03 · Publishing

From an empty repo to a live page.

  1. 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.
  2. Add one file. autumn-open-week.html at the root — named for the campaign, lowercase, hyphens. It becomes promo-ux.amiro.tech/autumn-open-week; Cloudflare drops the .html.
  3. 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.
  4. Get it reviewed. Cinzia on the copy and the offer.
  5. 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.
  6. Retire it when the campaign ends. git rm the file and merge. The URL then 404s, so make sure no ad still points at it.
Amiro · Promo · 4 Nov 20263 / 5
04 · The page itself

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:

FileRawOver the wire
website/index.html547 KB148 KB gzipped — 59% of it inline CSS
website/front-desk.html155 KB45 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.
Amiro · Promo · 4 Nov 20264 / 5
05 · State

What is actually in the repo today.

3

files tracked on main: the placeholder and the two blog pages

0

landing pages — none has been built yet

3

stale branches left over from the September work

index.htmlThe holding page: “Landing pages for campaigns are designed here. Nothing is final.” It carries noindex, so promo.amiro.health stays out of search while it is empty.
blog.html, blog-article.htmlParked pending a decision with Cinzia on where the blog belongs. Their images went with the asset folders, so both render without them for now.
ux, september, option-carousel-use-casesAll left over from September. ux is the one that matters: it is what promo-ux.amiro.tech serves.
HistoryEverything removed in the reset is at commit 0d245d3 and can be restored with git checkout 0d245d3 -- <file>.
Amiro · Promo · 4 Nov 20265 / 5