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. */}
-
+
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. */}
-