From a25e14a44be7ba19bf67a08ddad43f8873b9eb64 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Wed, 21 Oct 2026 05:38:55 +0000 Subject: [PATCH] No ads on the homepage; low-profile text-link ads elsewhere Homepage renders no ad unit. Remaining units are a single text_link line per page with quiet spacing, never against the footer. Co-Authored-By: Claude Opus 5.5 --- src/app/about/page.tsx | 4 ++-- src/app/category/[category]/page.tsx | 1 - src/app/globals.css | 6 +++--- src/app/hosts/page.tsx | 2 +- src/app/language/[lang]/page.tsx | 1 - src/app/page.tsx | 8 +------- src/app/podcast/[slug]/page.tsx | 4 ++-- src/app/search/page.tsx | 1 - 8 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index e7d66c0..f19eee9 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,7 +1,7 @@ import type { Metadata } from "next"; import { cachedDb } from "@/lib/cached-db"; import Ad from "@/components/Ad"; -import { AD_MREC } from "@/lib/ads"; +import { AD_TEXT } from "@/lib/ads"; import Link from "next/link"; const { all, count } = cachedDb(86400); @@ -148,7 +148,7 @@ export default async function About() { {/* One rectangle, at a section break well into the piece — someone still reading here has settled in. */} - +

Why not just rank by popularity?

diff --git a/src/app/category/[category]/page.tsx b/src/app/category/[category]/page.tsx index 79d71d8..f84d17d 100644 --- a/src/app/category/[category]/page.tsx +++ b/src/app/category/[category]/page.tsx @@ -123,7 +123,6 @@ export default async function Category({ {split > 0 && ( <> -

{rows.slice(split).map((p) => ( diff --git a/src/app/globals.css b/src/app/globals.css index a802af7..2038a03 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -445,13 +445,13 @@ body:has(.player) { padding-bottom: 122px; } prepends. No label of our own: the banners get that caption and the text link carries its own "Sponsored" inside the frame. */ .ad { display: block; width: 100%; margin: 0 auto; } -.ad[data-cp-filled] { margin: 34px auto; } +.ad[data-cp-filled] { margin: 10px auto; } /* ad.js gives the frame display:block inline but no margin, so this is what centres a 300px creative in a wider column. */ .ad > iframe { margin-left: auto; margin-right: auto; } -.ad-text_link[data-cp-filled] { min-height: 40px; margin: 26px auto; } +.ad-text_link[data-cp-filled] { min-height: 40px; margin: 10px auto; } .ad-banner_300x250[data-cp-filled] { min-height: 266px; max-width: 300px; } @@ -471,7 +471,7 @@ body:has(.player) { padding-bottom: 122px; } /* A unit sitting in a stack of .row links belongs to the stack, not to the page around it. */ -.rows > .ad[data-cp-filled] { margin: 14px auto; } +.rows > .ad[data-cp-filled] { margin: 10px auto; } /* Off-screen until it takes focus, then the first thing on the page. Kept out of the flow with a negative offset rather than display:none, which would diff --git a/src/app/hosts/page.tsx b/src/app/hosts/page.tsx index 9ed113f..9f55658 100644 --- a/src/app/hosts/page.tsx +++ b/src/app/hosts/page.tsx @@ -24,7 +24,7 @@ export default async function Hosts() { // A stack of 300 compact rows. text_link is the only format that belongs in // it — a rectangle here would break the column in half. - const ads = adPlan(rows.length, { first: 13, every: 40, max: 3, formats: [AD_TEXT] }); + const ads = adPlan(rows.length, { first: 13, every: 40, max: 1, formats: [AD_TEXT] }); return (
diff --git a/src/app/language/[lang]/page.tsx b/src/app/language/[lang]/page.tsx index e97524c..d574377 100644 --- a/src/app/language/[lang]/page.tsx +++ b/src/app/language/[lang]/page.tsx @@ -140,7 +140,6 @@ export default async function Language({
{split > 0 && ( <> -
{rows.slice(split).map((p) => ( diff --git a/src/app/page.tsx b/src/app/page.tsx index ebb1a1f..09a5080 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -5,8 +5,6 @@ import TimeAgo from "@/components/TimeAgo"; import type { Podcast } from "@/lib/db"; import Card from "@/components/Card"; import Art from "@/components/Art"; -import Ad from "@/components/Ad"; -import { AD_TEXT } from "@/lib/ads"; import Link from "next/link"; const { all, count, languageBuckets } = cachedDb(300); @@ -75,11 +73,7 @@ export default async function Home() {
- {/* A text link, not a banner: it is the only format that can sit between - the hero and the first row of shows without pushing them down. */} -
- -
+ {/* The homepage carries no ad unit. */}

Deep catalogues, still publishing

diff --git a/src/app/podcast/[slug]/page.tsx b/src/app/podcast/[slug]/page.tsx index db294c0..ae352e6 100644 --- a/src/app/podcast/[slug]/page.tsx +++ b/src/app/podcast/[slug]/page.tsx @@ -7,7 +7,7 @@ import type { Podcast } from "@/lib/db"; import Card from "@/components/Card"; import Art from "@/components/Art"; import Ad from "@/components/Ad"; -import { AD_MREC } from "@/lib/ads"; +import { AD_TEXT } from "@/lib/ads"; import FollowButton from "@/components/FollowButton"; import { LatestButton, ShowEpisodes } from "@/components/ShowEpisodes"; import PlaylistButtons from "@/components/PlaylistButtons"; @@ -235,7 +235,7 @@ export default async function Show({ params }: { params: Promise<{ slug: string to look at something, which is the only condition under which a rectangle is worth its space. Nothing above it — the play button, the follow button and the feed URL are what this page is for. */} - + {sameHost.length > 0 && (
diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx index bf8df73..aff082d 100644 --- a/src/app/search/page.tsx +++ b/src/app/search/page.tsx @@ -105,7 +105,6 @@ export default async function Search({ {split > 0 && ( <> -
{results.slice(split).map((p) => (