--- ### ALL PAGES ### layout: themes/[ site.theme.id ]/frontend/core/base ### PAGE CONFIG ### # Hero Section — memberships fund the journalism. News voice throughout: a # theme's frontmatter defaults are part of its identity (see docs/themes.md). hero: headline: "Journalism worth" headline_accent: "paying for" subheadline: "Simple memberships that keep the reporting independent. No hidden fees, cancel anytime." # Pricing Section — reader membership tiers pricing: price_per_unit: enabled: false feature_id: "stories" label: "story" definitions: - id: "stories" definition: "Member-only stories you can read each month, on top of our free coverage." - id: "briefing" definition: "The daily morning briefing delivered to your inbox before 6am." - id: "ad_free" definition: "Read every page without ads or sponsored placements." - id: "archive" definition: "Full access to every story we've ever published." - id: "comments" definition: "Join the discussion with our reporters and fellow members." - id: "events" definition: "Invites to member-only briefings, AMAs, and live events." plans: - id: "reader" name: "Reader" tagline: "best for casual readers" url: "/signup" features: - id: "stories" name: "Free stories" icon: "newspaper" - id: "briefing" name: "Daily briefing" icon: "envelope" - id: "supporter" name: "Supporter" tagline: "best for daily readers" url: null features: - id: "stories" name: "Member stories" icon: "newspaper" - id: "briefing" name: "Daily briefing" icon: "envelope" - id: "ad_free" name: "Ad-free reading" icon: "eye-slash" - id: "comments" name: "Comments" icon: "comments" - id: "insider" name: "Insider" tagline: "best for news junkies" url: null popular: true features: - id: "stories" name: "Member stories" icon: "newspaper" - id: "briefing" name: "Daily briefing" icon: "envelope" - id: "archive" name: "Full archive" icon: "box-archive" - id: "newsroom" name: "Newsroom" tagline: "best for teams" url: null features: - id: "stories" name: "Member stories" icon: "newspaper" - id: "briefing" name: "Daily briefing" icon: "envelope" - id: "events" name: "Member events" icon: "calendar-star" - id: "seats" name: "Team seats" icon: "users" # Feature Comparison Section feature_comparison: superheadline: icon: "sparkles" text: "Features" headline: "Compare all" headline_accent: "memberships" subheadline: "See exactly what's included in each membership" # Social Proof Section social_proof: items: - number: "2M" label: "Monthly readers" - number: "#1" label: "Independent newsroom" - number: "4.8" label: "Apple News" - number: "4.8" label: "Google News" # CTA Section cta: superheadline: icon: "comments" text: "Support" headline: "Questions about your" headline_accent: "membership?" subheadline: "The support desk answers 24/7" button: text: "Talk to us" icon: "headset" href: "/contact" # FAQs Section faqs: superheadline: icon: "messages-question" text: "FAQs" headline: "Frequently asked" headline_accent: "questions" subheadline: "Everything you need to know about {{ site.brand.name }} memberships & billing." items: - question: "Can I cancel my membership anytime?" answer: "Yes, you can cancel anytime, no questions asked. Your member benefits stay active until the end of the billing period." - question: "Is there a free way to read?" answer: "Always. The Reader tier is free forever — our core coverage and the daily briefing stay open to everyone. Memberships unlock the extras and keep the lights on." - question: "Do memberships really fund the journalism?" answer: "Directly. Reader memberships are our primary source of revenue, which is exactly why no advertiser or owner gets a say in what we publish." --- {% comment %} NEWSFLASH PRICING Same data contract + price-resolution Liquid as the classy pricing page, presented as the "subscription desk": pill billing toggle, framed paper plan cards (the popular plan is the vermilion-framed "Editor's pick"), an enterprise strip, stroked-numeral social proof, FAQ accordion, and the dark big-read CTA band. See docs/themes.md "Per-page HTML layout overrides". {% endcomment %}
{% uj_icon "tag", "me-1" %}Pricing

{{ page.resolved.hero.headline }} {{ page.resolved.hero.headline_accent }}

{% iftruthy page.resolved.hero.subheadline %}

{{ page.resolved.hero.subheadline }}

{% endiftruthy %}

{% uj_icon "shield-check", "me-1 text-success" %} Every paid membership backed by a 7-day money-back guarantee

{% assign plan_count = page.resolved.pricing.plans | size %} {% comment %} Detect common features across ALL plans (same logic as classy) {% endcomment %} {% assign common_feature_ids = "" | split: "," %} {% if plan_count > 0 %} {% assign first_plan = page.resolved.pricing.plans[0] %} {% for first_feature in first_plan.features %} {% assign is_common = true %} {% for check_plan in page.resolved.pricing.plans %} {% assign found_in_plan = false %} {% for check_feature in check_plan.features %} {% if check_feature.id == first_feature.id %}{% assign found_in_plan = true %}{% break %}{% endif %} {% endfor %} {% unless found_in_plan %}{% assign is_common = false %}{% break %}{% endunless %} {% endfor %} {% if is_common %}{% assign common_feature_ids = common_feature_ids | push: first_feature.id %}{% endif %} {% endfor %} {% endif %}
{% for plan in page.resolved.pricing.plans %} {% comment %} Shared pricing math (assigns _plan_monthly/_plan_annually/per-unit into this scope) {% endcomment %} {% include core/pricing/resolve-plan.html plan=plan %}
{% if plan.popular %} Editor's pick {% endif %}

{{ plan.name }}

{{ plan.tagline }}

{% if _plan_monthly == 0 %} Free {% else %} ${{ _plan_annually | divided_by: 12 | round }}/mo {% endif %}
{% if page.resolved.pricing.price_per_unit.enabled %}

{% if monthly_price_per_unit %} ${{ annual_price_per_unit }} per {{ page.resolved.pricing.price_per_unit.label }} {% elsif _plan_monthly == 0 %} Perfect for trying out {% endif %}

{% endif %}
{% if _plan_monthly == 0 %}{% assign _cta_class = "btn-outline-dark" %}{% else %}{% assign _cta_class = "btn-primary" %}{% endif %} {% iftruthy plan.url %} {% if _plan_monthly == 0 %}Get started{% elsif plan.trial.days > 0 %}Get free trial{% else %}Get started{% endif %} {% endiftruthy %} {% iffalsy plan.url %} {% endiffalsy %}

{% if _plan_monthly == 0 %} No credit card required {% else %} Billed ${{ _plan_annually | uj_commaify }} annually {% endif %}

{% if _plan_monthly > 0 %} {% uj_icon "shield-check", "me-1 text-success" %}7-day money-back guarantee {% else %} {% uj_icon "rocket", "me-1 text-success" %}Upgrade any time {% endif %}


{% comment %} Feature list — same tier-inheritance logic as classy: 1. Common features (vary by plan, shown on every card) 2. Basic (first plan): "What you get:" + its unique features 3. Other plans: "Everything in , and more:" + only the ADDED features Helpers below render a value + the name (wrapped in a tooltip span when the feature has a definition). {% endcomment %}
    {% for feature in plan.features %} {% if common_feature_ids contains feature.id %} {% assign _feature_value = feature.value %} {% if _config_product and _feature_value == nil %} {% assign _config_limit = nil %}{% for _lim in _config_product.limits %}{% if _lim[0] == feature.id %}{% assign _config_limit = _lim[1] %}{% break %}{% endif %}{% endfor %} {% if _config_limit == -1 %}{% assign _feature_value = "Unlimited" %}{% elsif _config_limit %}{% assign _feature_value = _config_limit %}{% endif %} {% endif %} {% assign feature_definition = nil %} {% for def in page.resolved.pricing.definitions %}{% if def.id == feature.id %}{% assign feature_definition = def.definition %}{% break %}{% endif %}{% endfor %}
  • {% uj_icon feature.icon, "fa-sm" %} {% if _feature_value == "Unlimited" %}Unlimited{% elsif _feature_value == "24/7" %}{{ _feature_value }}{% elsif _feature_value == true or _feature_value == "Included" or _feature_value == "Available" or _feature_value == "Full" %}{% else %}{{ _feature_value | uj_commaify }}{% endif %} {% iftruthy feature_definition %}{{ feature.name }}{% endiftruthy %} {% iffalsy feature_definition %}{{ feature.name }}{% endiffalsy %}
  • {% endif %} {% endfor %}
{% comment %} Does this plan add any non-common (unique) features? {% endcomment %} {% assign has_additional = false %} {% for feature in plan.features %}{% unless common_feature_ids contains feature.id %}{% assign has_additional = true %}{% break %}{% endunless %}{% endfor %} {% if forloop.index == 1 %} {% if has_additional %}

What you get:

{% endif %} {% else %} {% assign _prev_index = forloop.index0 | minus: 1 %} {% assign _prev_plan = page.resolved.pricing.plans[_prev_index] %}

Everything in {{ _prev_plan.name }}{% if has_additional %}, and more:{% endif %}

{% endif %} {% if has_additional %}
    {% for feature in plan.features %} {% unless common_feature_ids contains feature.id %} {% assign _feature_value = feature.value %} {% if _config_product and _feature_value == nil %} {% assign _config_limit = nil %}{% for _lim in _config_product.limits %}{% if _lim[0] == feature.id %}{% assign _config_limit = _lim[1] %}{% break %}{% endif %}{% endfor %} {% if _config_limit == -1 %}{% assign _feature_value = "Unlimited" %}{% elsif _config_limit %}{% assign _feature_value = _config_limit %}{% endif %} {% endif %} {% assign feature_definition = nil %} {% for def in page.resolved.pricing.definitions %}{% if def.id == feature.id %}{% assign feature_definition = def.definition %}{% break %}{% endif %}{% endfor %}
  • {% uj_icon feature.icon, "fa-sm" %} {% if _feature_value == "Unlimited" %}Unlimited{% elsif _feature_value == "24/7" %}{{ _feature_value }}{% elsif _feature_value == true or _feature_value == "Included" or _feature_value == "Available" or _feature_value == "Full" %}{% else %}{{ _feature_value | uj_commaify }}{% endif %} {% iftruthy feature_definition %}{{ feature.name }}{% endiftruthy %} {% iffalsy feature_definition %}{{ feature.name }}{% endiffalsy %}
  • {% endunless %} {% endfor %}
{% endif %}
{% endfor %}

Group & campus access

Bulk memberships for companies, newsrooms, schools, and libraries — custom invoicing and easy seat management.

The receipts

{% for item in page.resolved.social_proof.items %}
{{ item.number }}
{{ item.label }}
{% endfor %}
{% iftruthy page.resolved.faqs.superheadline.text %}

{{ page.resolved.faqs.superheadline.text }}

{% endiftruthy %}

{{ page.resolved.faqs.headline }} {{ page.resolved.faqs.headline_accent }}

{% iftruthy page.resolved.faqs.subheadline %}

{{ page.resolved.faqs.subheadline }}

{% endiftruthy %}
{% if page.resolved.faqs.items %}
{% for faq in page.resolved.faqs.items %}

{{ faq.answer }}
{% endfor %}
{% endif %}
{% iftruthy page.resolved.cta.superheadline.text %} {% uj_icon page.resolved.cta.superheadline.icon, "me-1" %}{{ page.resolved.cta.superheadline.text }} {% endiftruthy %}

{{ page.resolved.cta.headline }} {{ page.resolved.cta.headline_accent }}

{% iftruthy page.resolved.cta.subheadline %}

{{ page.resolved.cta.subheadline }}

{% endiftruthy %}
{{ content | uj_content_format }}