fix(blog): capitalize post headings, center body, tighten heading rhythm#100
Conversation
The long-form posts were authored with all-lowercase `##` section headings — the lowercase aesthetic belongs to the chrome (the `field notes_` index title, `.meta` labels), not to in-body section titles, where it reads as a mistake. Capitalize the first letter of each lowercase heading across the three posts (acronym/proper-noun headings like `IPFS …`, `L2s: …`, `Filecoin …` are untouched). Also center the MDX reading column within the wide Frame instead of pinning it to the left edge (`margin-inline: auto` on `.prose`; text stays left-aligned, header and prev/next nav stay full-width), and tighten the space above headings (`.prose h2` 2.4em → 1.7em, `.prose h3` 2em → 1.4em). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Deploying website with
|
| Latest commit: |
d0c3367
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://8c7e8a46.website-70y.pages.dev |
| Branch Preview URL: | https://polish-blog-headings-centere.website-70y.pages.dev |
There was a problem hiding this comment.
Pull request overview
Polishes long-form blog post presentation by standardizing section heading capitalization and improving the MDX reading layout/typography so posts read more cleanly within the site’s Frame layout.
Changes:
- Capitalize
##section headings across the three existing blog MDX posts (leaving acronym/proper-noun headings unchanged). - Center the
.prosereading column viamargin-inline: autowhile keeping body text left-aligned. - Reduce top spacing before
.prose h2/.prose h3to tighten heading rhythm.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| content/blog/00-what-were-building.mdx | Capitalizes section headings for consistent in-body presentation. |
| content/blog/01-why-now.mdx | Capitalizes section headings for consistent in-body presentation. |
| content/blog/02-decentralized-cdn-graveyard.mdx | Capitalizes a section heading for consistent in-body presentation. |
| app/globals.css | Centers the .prose column and tightens h2/h3 vertical spacing within MDX bodies. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Code Review
This pull request centers the reading column in the global CSS and updates blog post headings from lowercase to sentence case. Feedback suggests that centering the column may cause horizontal misalignment with the header on desktop and that the explicit top margins on headings should be scoped to avoid breaking existing spacing logic for first-child elements. Additionally, further capitalization is recommended for consistency in the blog post headings.
|
|
||
| .prose { | ||
| max-width: 68ch; | ||
| margin-inline: auto; /* center the reading column within the wide Frame */ |
There was a problem hiding this comment.
Centering the .prose column while keeping the post header and navigation "full-width" (as noted in the PR description) will likely create a significant horizontal misalignment on desktop. If the header text is left-aligned within the 1280px Frame, its left edge will be much further left than the centered 68ch body column. Consider either centering the header content as well or constraining the entire article container to the reading width to maintain a consistent vertical axis for the reader's eye.
There was a problem hiding this comment.
Already addressed in 6130fe7: the post masthead (meta line, <h1>, tags) is centered too, so the header and the centered .prose column now share the same vertical axis. The "← field notes" back-link stays flush-left as nav chrome.
| margin-block-start: 1.7em; | ||
| } | ||
|
|
||
| .prose h3 { | ||
| font-size: var(--fs-lead); | ||
| font-weight: 600; | ||
| letter-spacing: -0.01em; | ||
| line-height: 1.2; | ||
| margin-block-start: 2em; | ||
| margin-block-start: 1.4em; |
There was a problem hiding this comment.
The explicit margin-block-start on .prose h2 and .prose h3 applies even when the heading is the first child of the container. This breaks the spacing logic established by the "lobotomized owl" selector at line 865 (.prose > * + *), which correctly omits top margin for the first element to avoid double-padding against the container's top.
For h3, the value 1.4em is identical to the base spacing, making the declaration redundant for non-first children and buggy for the first child. For h2, the override should ideally be scoped to non-first children (e.g., using .prose > * + h2 or :not(:first-child)).
References
- Avoid using redundant selectors or declarations in CSS when the desired layout can be achieved more efficiently through source order or existing rules.
There was a problem hiding this comment.
Fixed in cab29ba. .prose h3's margin-block-start (which equalled the base 1.4em) is removed, and .prose h2's larger gap moves to .prose > * + h2 so a first-child heading no longer gets a stray top margin — mirrors the .prose > * + * rule and wins it on specificity. (No rendering change for current posts, since every body opens with a lede paragraph.)
| Result: every byte we deliver is verified by the receiving client at line rate. We do not need a separate proof-of-delivery oracle. The retrieval problem Filecoin had to design a whole sub-protocol around — proving you delivered the right bytes — is just not a problem we have to solve. | ||
|
|
||
| ## settlement: stablecoins are now load-bearing financial infrastructure | ||
| ## Settlement: stablecoins are now load-bearing financial infrastructure |
There was a problem hiding this comment.
Capitalize "Stablecoins" to maintain consistency with the other headings in this file (e.g., "Transport", "Addressing") and to align with the PR's objective of removing the "lowercase aesthetic" from section titles. Currently, it stands out as inconsistent compared to the sentence case used elsewhere.
## Settlement: Stablecoins are now load-bearing financial infrastructure
There was a problem hiding this comment.
Done in cab29ba — and for consistency the sibling heading got the same treatment: ## Settlement: Stablecoins are now load-bearing financial infrastructure and ## L2s: Payment channels are finally cheap enough to bother with.
The meta line (§ · date · read), the post <h1>, and the tag pills now align on the page's vertical axis, sitting as a centered masthead over the centered reading column. The "← field notes" back-link stays flush-left as nav chrome; body paragraphs and ## section headings stay left-aligned. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…words PR review follow-up: - `.prose h2`'s larger pre-heading gap moves to `.prose > * + h2`, so a post that opens on a heading doesn't pick up a stray top margin (mirrors the `.prose > * + *` lobotomized-owl rule). `.prose h3`'s `margin-block-start` is dropped — it equalled the base 1.4em, so it was redundant for non-first headings and wrong for a first child. No rendering change for current posts (each body opens with a lede). - "why now": capitalize the word after the colon in `## Settlement: Stablecoins …` and `## L2s: Payment channels …` for consistency. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
`text-balance` on the post <h1> so a title that wraps to two lines on the centered masthead breaks evenly instead of leaving a stubby last line. Picked up from PR review feedback. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
What
Polish fixes to the long-form blog posts:
##section headings in all three MDX posts — e.g.the elevator version→The elevator version,transport: …→Transport: …,the common pattern→The common pattern. The deliberate lowercase aesthetic belongs to the chrome (field notes_index title,.metalabels), not to in-body section titles. Acronym/proper-noun headings (## IPFS …,## Filecoin …,## Theta …,## Livepeer …,## Arweave / Sia / Storj …,## MaidSafe / Safe Network …) are left as-is. Frontmattertitle:fields were already capitalized. Also capitalized the word after the colon in## Settlement: Stablecoins …and## L2s: Payment channels …for internal consistency.margin-inline: autoto.proseso the 68ch reading column sits centered within the 1280pxFrameinstead of hugging the left edge. Body text stays left-aligned; the rule above the body and the prev/next nav stay full-width. On phone widths the auto margin collapses to zero, so nothing changes there.§ · date · read), the post<h1>(e.g. "Why now"), and the tag pills now align on the page's vertical axis, sitting as a centered masthead above the centered body. The "← field notes" back-link stays flush-left as nav chrome. The<h1>getstext-balanceso a two-line title breaks evenly.h2is1.7em(was2.4em), scoped to.prose > * + h2so a post that opens on a heading doesn't get a stray top margin (mirrors the.prose > * + *lobotomized-owl rule)..prose h3's explicitmargin-block-start(was2em) is dropped — the base.prose > * + *already supplies1.4em.Files
content/blog/00-what-were-building.mdx,content/blog/01-why-now.mdx,content/blog/02-decentralized-cdn-graveyard.mdx— heading capitalization onlyapp/globals.css—.prose(margin-inline: auto),.prose h2→.prose > * + h2for the pre-heading margin,.prose h3(dropped redundantmargin-block-start)app/blog/[slug]/page.tsx— centered post header (items-center/text-center/justify-center),text-balanceon the<h1>No data-layer changes;
lib/blog.tspassesbodythrough verbatim, and no anchor/TOC/slug machinery consumes the heading text.Review
Addressed the Gemini Code Assist review (heading-margin scoping,
Stablecoinscapitalization) and a follow-up multi-agent review (text-balanceon the centered title). Code-reviewer + comment-analyzer found no critical/important issues.Verification
pnpm lint✓pnpm format:check✓pnpm test— 45 passing ✓pnpm build— static export clean; built HTML has<h2>The elevator version</h2>/<h2>Settlement: Stablecoins are now load-bearing financial infrastructure</h2>/<h1 … class="hug text-balance …">, built CSS has.prose{…;margin-inline:auto}and.prose>*+h2{margin-block-start:1.7em}with nomargin-block-starton.prose h3🤖 Generated with Claude Code