diff --git a/bun.lock b/bun.lock
index 3f6727c..e55d569 100644
--- a/bun.lock
+++ b/bun.lock
@@ -5,7 +5,6 @@
"": {
"name": "datamart-web",
"dependencies": {
- "@profullstack/footer": "latest",
"hono": "4.13.12",
"next": "16.3.8",
"react": "19.2.3",
@@ -95,8 +94,6 @@
"@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.3.8", "", { "os": "win32", "cpu": "x64" }, "sha512-WcTlaKt/TWkh5kUjdJcUmB1XgZ+1c6fz4Y9fDHL73YNSdGaUWjceeWrrlwF0nv19iABYWC4iAq1oX1w4Bn0vfg=="],
- "@profullstack/footer": ["@profullstack/footer@0.2.1", "", { "peerDependencies": { "react": ">=18" }, "optionalPeers": ["react"], "bin": { "profullstack-footer": "bin/profullstack-footer.js" } }, "sha512-KHmKVwrlzCBrSAAJ4zobNFCxTg8VF0gvNMeAut00dX3+gbWCtk6eOwIR2AaqEC7smj6Aio6cIexzt/dUnv1McA=="],
-
"@swc/helpers": ["@swc/helpers@0.5.23", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw=="],
"@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
diff --git a/package.json b/package.json
index cb244aa..21a7121 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "datamart-web",
- "version": "0.2.0",
+ "version": "0.2.1",
"private": true,
"description": "datamart.help: public libraries, schools, colleges and government services near you, with the source of every fact",
"license": "MIT",
@@ -15,7 +15,6 @@
"smoke": "bun scripts/smoke.ts"
},
"dependencies": {
- "@profullstack/footer": "latest",
"hono": "4.13.12",
"next": "16.3.8",
"react": "19.2.3",
diff --git a/src/app/globals.css b/src/app/globals.css
index 8fe8fd2..e235c49 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -125,9 +125,9 @@ dl.facts dd { margin: 0; overflow-wrap: anywhere; }
@media (min-width: 52rem) { .split { grid-template-columns: 2fr 1fr; } }
.site-footer { border-top: 1px solid var(--line); padding: 1.5rem 0 0.5rem; color: var(--muted); font-size: 0.85rem; }
-.site-footer nav { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 0.75rem; }
+.site-footer nav { display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 0.5rem; }
+.site-footer p { margin: 0; }
.site-footer a { color: var(--muted); }
-.site-footer + div > .pfs-footer { border-top: 0; }
/* CrawlProof ad unit: no box until ad.js starts filling it, so an unsold or blocked slot leaves no hole. */
.ad-unit { display: flex; flex-direction: column; align-items: center; height: 0; overflow: hidden; }
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 55b0411..eef43af 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,13 +1,13 @@
import type { Metadata, Viewport } from "next";
-import { Footer } from "@profullstack/footer/react";
import Link from "next/link";
import { AdUnit } from "@/components/ad-unit";
+import { PitFooter } from "@/components/pit-footer";
import { RegisterServiceWorker } from "@/components/register-sw";
import { DISCLOSURE } from "@/lib/site";
import "./globals.css";
-// Pages prerender at build; revalidating hourly lets the shared footer pick up a new
-// @profullstack/footer template (served from jsDelivr @latest) without a redeploy.
+// Pages prerender at build; revalidating hourly lets the pit.world footer
+// (fetched server side from pit.world/snippets/footer.html) refresh without a redeploy.
export const revalidate = 3600;
export const metadata: Metadata = {
@@ -64,25 +64,23 @@ export default function RootLayout({ children }: { children: React.ReactNode })
-