diff --git a/apps/logicsrc-web/src/app/blog/[slug]/page.tsx b/apps/logicsrc-web/src/app/blog/[slug]/page.tsx
index 0f1d922..fb140c2 100644
--- a/apps/logicsrc-web/src/app/blog/[slug]/page.tsx
+++ b/apps/logicsrc-web/src/app/blog/[slug]/page.tsx
@@ -4,6 +4,7 @@ import type { ReactNode } from "react";
import type { Metadata } from "next";
import { publicClient } from "@/lib/supabase";
import { SiteShell } from "@/components/site-shell";
+import { AdUnit } from "@/components/ad-unit";
import { sanitizeRenderedHtml } from "@/lib/html";
export const dynamic = "force-dynamic";
@@ -118,6 +119,9 @@ export default async function BlogPostPage({
style={{ lineHeight: 1.7 }}
dangerouslySetInnerHTML={{ __html: html }}
/>
+
);
diff --git a/apps/logicsrc-web/src/app/blog/page.tsx b/apps/logicsrc-web/src/app/blog/page.tsx
index a92e048..77c6362 100644
--- a/apps/logicsrc-web/src/app/blog/page.tsx
+++ b/apps/logicsrc-web/src/app/blog/page.tsx
@@ -3,6 +3,7 @@ import type { ReactNode } from "react";
import type { Metadata } from "next";
import { publicClient } from "@/lib/supabase";
import { SiteShell } from "@/components/site-shell";
+import { AdUnit } from "@/components/ad-unit";
export const dynamic = "force-dynamic";
@@ -123,6 +124,10 @@ export default async function BlogIndex(): Promise {
})}
)}
+
+
);
diff --git a/apps/logicsrc-web/src/components/ad-unit.tsx b/apps/logicsrc-web/src/components/ad-unit.tsx
new file mode 100644
index 0000000..bdcd344
--- /dev/null
+++ b/apps/logicsrc-web/src/components/ad-unit.tsx
@@ -0,0 +1,20 @@
+import type { ReactNode } from "react";
+import Script from "next/script";
+
+// CrawlProof ad unit, scoped to the pages that render it (currently /blog/*).
+// The loader is deduped by src, so mounting on multiple routes only
+// injects one https://crawlproof.com/ad.js.
+export function AdUnit({
+ slot,
+ format = "banner_300x250",
+}: {
+ slot: string;
+ format?: string;
+}): ReactNode {
+ return (
+ <>
+
+
+ >
+ );
+}