Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
8e7d20a
Replace the placeholder brand mark with the Execil wordmark
Abuubkar Sep 7, 2026
558ba50
Lift the badge off the letterforms it touches
Abuubkar Sep 7, 2026
47eb3ad
Revert "Lift the badge off the letterforms it touches"
Abuubkar Sep 7, 2026
7fddbab
Separate the badge from the letterforms with a knockout ring
Abuubkar Sep 7, 2026
28b5990
Add responsive hero images and update hero section with new layout
Abuubkar Sep 7, 2026
128d444
Keep the hero picture's head in frame and cap its height on tablets
Abuubkar Sep 8, 2026
13e0384
Keep non-canonical hostnames out of the index
Abuubkar Sep 8, 2026
d1b223b
Point Organization.logo at a logo, and redraw the OG card's lockup
Abuubkar Sep 8, 2026
baf88e9
Fit the description to a result, and let the 404 say what it is
Abuubkar Sep 8, 2026
446f15c
Preload the hero picture, and describe the FAQ to crawlers
Abuubkar Sep 8, 2026
7f7e379
Let the header use the width it has, and line it up with the page
Abuubkar Sep 8, 2026
b69f584
Lift the badge off the wash, light its dot, and grow the eyebrow
Abuubkar Sep 8, 2026
e43ee82
Copy: provider range, the last trust point, and 13 weeks
Abuubkar Sep 8, 2026
8a7dbca
Second pass: breakpoint, table columns, hero padding and three details
Abuubkar Sep 8, 2026
3035369
Clear the nav highlight when no section is in the band
Abuubkar Sep 8, 2026
323e88a
Table label column to 30%, sources to sm, findings to md, faster pulse
Abuubkar Sep 8, 2026
9f82453
Cut the comments back
Abuubkar Sep 8, 2026
3a8382d
Nav highlight by chapter range, not intersection band
Abuubkar Sep 8, 2026
a9cd647
Sonar pulse on the badge dot
Abuubkar Sep 8, 2026
b8b7909
Badge dot xs
Abuubkar Sep 8, 2026
784776f
Pulse 1300ms to 1800ms
Abuubkar Sep 8, 2026
e55a025
Sharpen the logo rasters, the favicon and the header wordmark
Abuubkar Sep 8, 2026
3711286
Cut the badge ring into the letter paths instead of masking
Abuubkar Sep 8, 2026
06cded9
Favicon cross thinner and longer
Abuubkar Sep 8, 2026
44103aa
Legal: breach deadline, transport, advertising, children, Turnstile
Abuubkar Sep 8, 2026
220fcd5
Header, hero and copy pass
Abuubkar Sep 8, 2026
5c08716
Rasterise the wordmark for og.png and logo.png instead of redrawing it
Abuubkar Sep 8, 2026
12c7a62
LinkedIn Page logo and cover
Abuubkar Sep 8, 2026
2a4ab70
Table: one header row on narrow screens, not a label on every cell
Abuubkar Sep 11, 2026
820f5c4
Ignore Python bytecode from the brand generators
Abuubkar Sep 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,7 @@ dist-ssr/
# OG image render font — a TTF from the Satoshi kit, used only by
# scripts/og-image.py because Pillow cannot read WOFF2. Not shipped.
scripts/.og-font/

# Python bytecode from the brand-asset generators
__pycache__/
*.pyc
2 changes: 1 addition & 1 deletion CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Vocabulary for the Execil landing-page effort. Glossary only; decisions live in

- **Execil** — the brand. A medical billing and revenue cycle management service for independent US practices. The `name` prop in the design canvas.
- **RCM (Revenue Cycle Management)** — the full billing lifecycle a practice runs to get paid: eligibility, credentialing, coding, claim submission, payment posting, AR follow-up, denials, patient statements, reporting.
- **Practice** — the customer. An independent medical practice with 1–20 providers.
- **Practice** — the customer. An independent medical practice with 20+ providers.
- **Provider** — a clinician in a Practice who bills payers. Providers must be credentialed and enrolled before payers will pay for them.
- **Payer** — an insurer or program that pays claims.
- **Specialty** — a medical field (Primary Care, Behavioral Health, …). Execil assigns coders by Specialty.
Expand Down
20 changes: 20 additions & 0 deletions public/_headers
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,23 @@

/fonts/*
Cache-Control: public, max-age=31536000, immutable

# Keep every non-canonical hostname out of the index. The Worker's own
# `workers.dev` subdomain stays enabled by choice (issue #34) and preview
# aliases from non-production branch builds live on the same domain, so both
# serve the whole site. The prerendered canonical already points at execil.net;
# this is the stronger signal that costs nothing.
#
# Absolute-URL rules are matched host-first, and `:name` is a placeholder for
# one label — so this covers `execil.<subdomain>.workers.dev` and every
# `<alias>-execil.<subdomain>.workers.dev` preview alike. Ports and protocols
# are ignored during matching.
https://:worker.:subdomain.workers.dev/*
X-Robots-Tag: noindex, nofollow

# Applies to asset responses only, which is every prerendered page. Deliberately
# not HSTS: that one is a lasting commitment for the apex and every subdomain,
# so it belongs to a decision rather than a commit.
/*
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
69 changes: 69 additions & 0 deletions public/brand/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Brand assets

Two directions were drawn from client-supplied reference images. **`cross-dot/`
is the chosen one** and is what the site ships; `plus-split/` is kept for
reference and is not referenced by any code.

Every file is real vector outlines — Satoshi Variable instanced at the weight
below and converted to paths. There is no font dependency at render time and no
`<text>` element, so the marks render identically wherever they land.

## cross-dot — in use

"Execil" at wght 900, with the tittle of the "i" replaced by the cross badge.

| file | use |
| ------------------------------ | ------------------------------------------------------- |
| `execil-wordmark.svg` | primary, with the MEDICAL BILLING tagline |
| `execil-wordmark-reversed.svg` | on `ink900` — white letters, `teal600` badge |
| `execil-wordmark-mono.svg` | `currentColor` throughout, one-colour contexts |
| `execil-wordmark-notag.svg` | no tagline — small sizes, where it cannot be read |
| `execil-mark.svg` | badge alone. Shorter, heavier cross so it survives 16px |

`src/base/Wordmark.tsx` carries the same geometry inline, so the letterforms can
take `currentColor` and the badge can take theme tokens. It is the component
that renders in the header and footer; these files are for anything outside the
app — email signatures, decks, the client's own use. **They are two copies of
one drawing: change one and change the other.**

`public/favicon.svg` is `execil-mark.svg` fitted to a 32×32 box, with a heavier
cross so it survives 16px.

### Clearance

The badge replaces the tittle of the "i", so it sits against the letterforms
rather than against the page — and at `teal700` it separates from `ink900` by
only 2.74:1, which at header size reads as one dark mass rather than as a mark.

It is separated by space instead. A ring 20% of the badge radius wide is cut
out of the letter paths themselves, so the ground shows through around the
badge on any surface. It used to be an SVG mask; Chrome rasterises masked
content through an intermediate surface and the header wordmark came out
soft. Narrower than about 15% stops registering at
28px; wider than about 25% starts eating the stem of the "i".

## social/ — LinkedIn Page

`scripts/social-images.py` writes these. Sizes are LinkedIn's own
recommendations, not the 300x300 and 1128x191 figures that are all over the web
and out of date.

| file | size | use |
| -------------------- | -------- | -------------------------------------- |
| `linkedin-logo.png` | 400x400 | Page logo. 268x268 is LinkedIn's floor |
| `linkedin-cover.jpg` | 1512x256 | Page cover |

The logo is the badge, not the wordmark: LinkedIn shows it at roughly 60px in
the feed, where "Execil" set across 400px would be about 50px wide. It is
opaque white behind the mark rather than transparent, because LinkedIn renders
the logo over both light and dark surfaces.

## plus-split — not in use

"+ execil" lowercase at wght 900, cut by a diagonal two-tone split through the
"c", with the name stacked alongside. Kept at the client's request.

Note the reversed variant is compromised: the palette's brightest teal is
`teal600`, which lands about 3.3:1 on `ink900`, so the accent falls back to
`teal100` and reads as pale mint rather than teal. Adding a brighter teal to the
ramp would fix it.
5 changes: 5 additions & 0 deletions public/brand/cross-dot/execil-mark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 24 additions & 0 deletions public/brand/cross-dot/execil-wordmark-mono.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions public/brand/cross-dot/execil-wordmark-notag.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
24 changes: 24 additions & 0 deletions public/brand/cross-dot/execil-wordmark-reversed.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading