Homepage
The front door. The homepage establishes identity, signals liveness, and surfaces recent work. It uses a different header treatment than interior pages — a nameplate at display scale rather than a breadcrumb navigation.
Current homepage
Structure
The homepage assembles four sections inside the <main> element:
-
Nameplate —
<span class="name">Alex Priest</span>at 2.5rem Signifier. Not a link (the reader is already home). Rendered in the site header withview-transition-name: nameplateso it morphs into the smaller 1.1rem breadcrumb nameplate when navigating to interior pages. -
Intro section —
<section class="intro">containing prose paragraphs and a live indicator.margin-bottom: var(--space-xl); padding-bottom: var(--space-lg).- Paragraphs at 1.05rem Signifier,
--text-2,line-height: 1.6. The first paragraph is promoted to 1.1rem in--textwithline-height: 1.55— the same lede convention as article pages. - The intro content is managed as an Astro content collection entry (
pages/home), rendered through<Content />.
- Paragraphs at 1.05rem Signifier,
-
Live indicator —
<p class="live-indicator">with a breathing Signifier asterisk (<span class="live-asterisk">). The asterisk animates with a 4s ease-in-out infinitebreathekeyframe (opacity from 1 to 0.15 and back). Accent-colored. Accompanied by the current local time in Austin, TX, populated by client-side JavaScript. Gated behindprefers-reduced-motion: no-preference. -
Content sections — Recent writing, shortlist, and links, each introduced by a section label.
-
Newsletter signup —
<section class="newsletter">with an email input and subscribe button, grid-aligned to the two-column layout above.
Recent writing
Full-width section below the intro.
.section-label“Recent writing” +.section-subtitle“Essays and reflections” (Montreuil, 0.8rem,--text-2).- A
<PostList>component rendering the five most recent published writing posts. The first post receives a.latest-mark. .home-section-morelink: “All writing ->” in Montreuil 0.8rem,--text-2, transitions to--texton hover.
Two-column grid
Below recent writing, shortlist and links sit in a <div class="home-columns"> — a CSS Grid with grid-template-columns: 1fr 1fr and gap: calc(var(--space-xl) * 1.5). Collapses to a single column at <=600px, where the post lists are hidden (.home-column-list { display: none }) to keep the mobile homepage concise.
Shortlist column:
- Section label “The Shortlist” + subtitle “Recommendations, loosely themed”.
- A
<PostList>with the five most recent shortlist items, titles stripped of the “Shortlist ” prefix. - “All shortlist ->” link pinned to the bottom with
margin-top: auto.
Links column:
- Section label “Links” with a
.live-dot— a 6px accent-colored circle with a 3spulseanimation (opacity 1 to 0.3). Gated behindprefers-reduced-motion. - A
<ul class="home-link-list">with the three most recent links. Each<li>contains:- Title link (
<a>to external URL) in Signifier with weight-shift hover (400 to 500, accent). - Permalink glyph (
<a class="link-permalink">using✦, 0.65em,--text). - Optional “Must read” marginalia (same treatment as link post pages, desktop only).
- Domain name (
<span class="link-domain">, Montreuil, 0.75rem,--text-3).
- Title link (
--uibottom borders between items.- “All links ->” link pinned to the bottom.
Newsletter signup
Below the two-column grid, a newsletter section invites subscription. The .newsletter-row uses the same 1fr 1fr grid and gap as .home-columns, so “Subscribe →” aligns horizontally with “All links →” in the right column.
.section-label“Newsletter” +.newsletter-blurb(same treatment as.section-subtitle).- Email input with bottom-border-only styling (Signifier, 0.9rem). The input extends
var(--space-xl)into the grid gap to close the visual distance to the button. - “Subscribe →” as a text-link button (Montreuil, 0.8rem,
--text-2→--texton hover) — same pattern as section navigation links. - Status message below:
--accentfor success,--redfor error.
The form posts to /api/subscribe, a Vercel serverless function that proxies the Beehiiv API. See Controls → Newsletter signup form for full specs.
Exploration directions
Two future homepage concepts documented during the design audit. These represent exploration directions, not current implementations.
The Folio
Table-of-contents approach. The homepage as a title page that immediately orients.
The idea: strip the homepage to structured navigation. A clear hierarchy of content sections — writing, shortlist, links, books, media, now — each with a one-line description and the most recent entry date. Minimal prose, maximum wayfinding. The reader knows exactly what exists and where to find it within seconds.
This draws from the front matter of a printed book: title page, table of contents, then content. The current homepage intro could move to /about, letting the front door function as pure architecture.
Characteristics:
- Nameplate at display scale (unchanged)
- Section links as the primary content, not preview lists
- Each section shows title, description, and latest-updated date
- No preview content, no post lists on the homepage itself
- The reader clicks through to browse, rather than scanning previews
The Broadsheet
Multi-column editorial grid. The homepage as a newspaper front page.
The idea: use a multi-column layout with mixed-scale typography to surface multiple content streams simultaneously. A lead article at large scale, secondary items at medium scale, a links sidebar, a “what I’m reading/watching” strip. Visually rich, closer to an editorial publication than a personal blog.
This draws from broadsheet newspaper layout: headline hierarchy, column rules, mixed-scale entries that let the eye choose where to land. The homepage becomes a curated edition rather than a chronological list.
Characteristics:
- Multi-column CSS Grid with asymmetric column widths
- Lead item with larger title typography (1.5-2rem)
- Secondary items at standard scale
- Vertical column rules using
--uiborders - Dense information display — more content visible above the fold
- Requires careful responsive breakpoint work to collapse gracefully
Code example
HTML structure of the current homepage:
<body>
<div class="scroll-progress" aria-hidden="true"></div>
<div class="site-wrapper">
<header class="site-header">
<span class="name" style="view-transition-name: nameplate;">Alex Priest</span>
</header>
<main id="main">
<section class="intro" data-animate>
<div class="prose">
<!-- Rendered from content collection: pages/home -->
<p>First paragraph at 1.1rem in --text color.</p>
<p>Subsequent paragraphs at 1.05rem in --text-2.</p>
</div>
<p class="live-indicator">
<span class="live-asterisk" aria-hidden="true">*</span>
It's <span class="live-time"></span> in Austin, TX.
</p>
</section>
<section>
<p class="section-label">Recent writing</p>
<p class="section-subtitle">Essays and reflections</p>
<ul class="post-list">
<li>
<a href="/writing/post-slug">
<span class="title">Post title</span>
<span class="latest-mark">Latest</span>
<span class="date">Feb 15, 2026</span>
</a>
</li>
<!-- ... more posts -->
</ul>
<p class="home-section-more">
<a href="/writing">All writing -></a>
</p>
</section>
<div class="home-columns">
<section>
<p class="section-label">The Shortlist</p>
<p class="section-subtitle">Recommendations, loosely themed</p>
<div class="home-column-list">
<ul class="post-list">
<!-- Shortlist items -->
</ul>
</div>
<p class="home-column-link">
<a href="/shortlist">All shortlist -></a>
</p>
</section>
<section>
<p class="section-label">Links <span class="live-dot"></span></p>
<p class="section-subtitle">Reading from around the web</p>
<ul class="home-link-list home-column-list">
<li data-animate>
<a href="https://example.com" target="_blank" rel="noopener">Link title</a>
<a href="/links/link-slug" class="link-permalink">✦</a>
<span class="link-domain">example.com</span>
</li>
<!-- ... more links -->
</ul>
<p class="home-column-link">
<a href="/links">All links -></a>
</p>
</section>
</div>
<section class="newsletter" data-animate>
<p class="section-label">Newsletter</p>
<p class="newsletter-blurb">...</p>
<form class="newsletter-form" id="newsletter-form">
<div class="newsletter-row">
<input type="email" placeholder="your@email.com" required />
<button type="submit">Subscribe →</button>
</div>
<p class="newsletter-status" id="newsletter-status"></p>
</form>
</section>
</main>
<footer class="site-footer">
<!-- Colophon: nav groups, copyright, settings -->
</footer>
</div>
<aside class="side-rail" aria-label="Navigation">
<!-- Book-spine nav links -->
</aside>
</body>