This is Promising (promisingbeer.com), a non-alcoholic beer review site by Sam Brown. Built with Eleventy (11ty) and deployed as a static site.
Curating the best non-alcoholic beers for the sober curious. Reviews use a modified Robert Parker 100-point scoring system.
npm run build / Serve: npm run serve/reviews/ as markdown files/reviews_pending/brewery-name-beer-name.md (lowercase, hyphenated)
athletic-brewing-cerveza-atletica.md, sierra-nevada-trail-pass.mdEvery review requires this YAML frontmatter:
---
title: Beer Name Here # Just the beer name, not the brewery. Exception: when the brewery name is part of the product's branded name (e.g. "Budweiser Zero", "Heineken 0.0", "Guinness Zero"), include it in the title.
date: YYYY-MM-DD # Publication date
score: 74 # Integer, 50-100 (see scoring below)
style: Hazy IPA # Beer style
container: can # Optional: can (default), tall-can, or bottle. Used to normalize image scale on the /beers/ listing.
alcohol: 0.5% # ABV as percentage string. Use the ACTUAL ABV, not the marketed figure. Products branded "0.0" or "Zero" often still contain up to 0.5% by volume — record the real number.
calories: 98 # Integer
lowsugar: Yes # Yes, No, or leave empty if unknown
glutenfree: No # Yes, No, or leave empty if unknown
brewery: Samuel Adams # Brewery name
brewery_url: https://... # Brewery website
origin: Boston, Massachusetts # City/region, Country or State
img_beer: /img/beers/promising-brewery-beer-name.jpg
img_asset: /img/photos/brewery-beer-name.jpg
color: "#B5232F" # Hex color representing the beer/brand
tags:
- style tag # e.g. hazyipa, ipa, paleale, lager
- brewery tag # e.g. samueladams (no spaces/hyphens)
- location tags # e.g. boston, massachusetts, usa
layout: layouts/review.njk
featured_post: false # Optional, omit or set true/false for homepage feature
featured_quote: ... # Optional, a pull quote for featured reviews (used with featured_post: true)
---
/img/beers/promising-{brewery}-{beer-name}.jpg/img/photos/{brewery}-{beer-name}.jpgTags are lowercase with no spaces or hyphens. Beer style first, then brewery name (as a single concatenated word, e.g. "otherhalfbrewing", "samueladams", "sierranevada"), then location tags if applicable.
Every review is exactly three paragraphs. No more, no less.
Reviews almost always end with a direct recommendation or assessment aimed at the reader:
_includes/layouts/) #base.njk — Master HTML layout. Contains all <head> metadata, Open Graph, Twitter cards, JSON-LD structured data, and the site header/footer. All other layouts inherit from this.review.njk — Beer review pages. Inherits from base.njk. Renders hero, score bar, review content, stats sidebar, photo asset, and tags.home.njk — Homepage wrapper. Inherits from base.njk.single.njk — Static pages (About, Scoring, Beers listing). Inherits from base.njk.news.njk — News article pages. Inherits from base.njk.index.njk — Homepage (hero, featured post, latest news, recent reviews, brewery logos)beers.njk — All beers listing page at /beers/. Includes ItemList JSON-LD schema.sitemap.xml.njk — XML sitemap with image sitemap support (img_beer and img_asset)robots.txt.njk — Robots.txt referencing sitemap, llms.txt, and llms-full.txtfeed/feed.njk — Atom feed using @11ty/eleventy-plugin-rssllms-full.txt.njk — Auto-generated complete review database for LLM crawlers. Outputs structured markdown with every review's key data (name, brewery, score, style, ABV, calories, origin, URL, excerpt).tags.njk / tags-list.njk — Tag index pages_data/) #metadata.json — Site title, URL, author info, feed configscoring.json — The six scoring tiers (range, value, description)llms.txt — Hand-written overview for LLM crawlers (links to llms-full.txt for full data)/img/ — All images (beers, breweries, photos, favicons)/css/ — Compiled Sass stylesheets.eleventy.js) #@11ty/eleventy-plugin-rss, @11ty/eleventy-plugin-syntaxhighlightreadableDate, htmlDateString, head, stripHtmlcurrentYearfeaturedPost, allContent (reviews + news sorted by date), tagListimg/, css/, llms.txtAll visual type is expressed through a small set of .type-* classes defined in css/base.scss. Element-level h1–h4 are reset to margin: 0 and inherit sizing — they never carry visual treatment on their own. Pick semantic markup (<h2> if it's a heading, <p> if it's text, <dt> if it's a definition term) and add a class for visuals.
| Class | Size | Treatment | Use for |
|---|---|---|---|
.type-display |
96px (64px mobile) | Display sans, weight 800, line-height 100% | Score numerals, marquee tiles |
.type-title |
32px (24px mobile) | Sans, weight 700, line-height 100% | Card titles, page titles |
.type-subtitle |
24px | Sans, weight 700, line-height 100% | Smaller card titles |
.type-body |
24px (18px mobile) | Sans, line-height 125% | Paragraph copy (also the default <p> style) |
.type-label |
18px | Sans, normal weight, dim | Inline metadata (stats labels, brewery line, ABV, date, single-page subtitles) |
.type-section-label |
18px | Sans, normal weight, dim, 16px bottom margin | Section kickers introducing a block ("Featured review", "Recently reviewed", "Latest news") |
.type-eyebrow |
14px | Sans, bold, uppercase, tracked, dim, 16px bottom margin | Tiny tracked section kicker ("Breweries I've reviewed") |
.type-caption |
14px | Sans | Fine print |
When you can't add a class — markdown-generated headings (## in editorial pages becomes a raw <h2>) — style them with a page-scoped rule (e.g. .single-content h2, .faq-page .single-content h2). These rules live alongside the page's other styles and override the empty element-level reset.
Don't introduce new font-size declarations inside per-page stylesheets unless the case is genuinely outside the system. If you find yourself wanting a new type style, add it to base.scss and document it here.
All SEO markup lives in base.njk <head>. When modifying SEO:
Review schema (with speakable), BreadcrumbList schema, review-specific OG/Twitter tags, and review-specific meta descriptionNewsArticle schemaWebSite schemaOrganization schema, canonical URL, hreflang="en", OG tags, Twitter cardsabout/index.md) has inline FAQPage schema (NA beer definitions)scoring/index.njk) has inline FAQPage schema (scoring system)beers.njk) has inline ItemList schemarel="noopener nofollow" and ?utm_source=promisingbeer.comabout/index.md — About page with FAQ schemascoring/index.njk — Scoring system page with FAQ schema, renders tiers from scoring.jsonnews/ — News articles as markdown filesreviews/ — Published beer reviews as markdown filesreviews_pending/ — Draft/pending reviews/reviews/ with complete frontmatterllms-full.txt on next build