SPB Git forge

spb/websensor

Public
33commits 1branches 0releases
3.4 MBsize
maindefault branch
10 days agolast push
TypeScript 55.4% Python 43.2% SQL 1.2%

web: footer credits (Simon-Pierre Boucher, contact@spboucher.ai, hosted on MacLustr), author metadata, contact on bot and API pages

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed 13 days ago (Sep 11, 2026) parent 792343f

4 changed files +27 −13

modified apps/web/src/app/api/page.tsx +1 −1
@@ -65,7 +65,7 @@ export default function ApiPage() {
65 65 const wss = base.replace(/^http/, "ws");
66 66 return (
67 67 <>
68 − <PageHeader compact kicker="Machine-readable WebSensor" title="API" description="WebSensor practises what it monitors: stable URLs, JSON, RSS, JSON-LD and a replayable WebSocket feed. Phase 1 is public and unauthenticated; rate limit 600 requests / minute / IP. Owner-scoped tools (watchlists, alerts, bookmarks, views, monitors) use an anonymous X-WebSensor-Owner token generated by your browser." />
68 + <PageHeader compact kicker="Machine-readable WebSensor" title="API" description="WebSensor practises what it monitors: stable URLs, JSON, RSS, JSON-LD and a replayable WebSocket feed. Phase 1 is public and unauthenticated; rate limit 600 requests / minute / IP. Owner-scoped tools (watchlists, alerts, bookmarks, views, monitors) use an anonymous X-WebSensor-Owner token generated by your browser. Higher limits, keys or questions: contact@spboucher.ai." />
69 69 <div className="grid grid-cols-1 gap-4 lg:grid-cols-[minmax(0,1fr)_400px]">
70 70 <div className="flex min-w-0 flex-col gap-4">
71 71 <Panel title="Public REST endpoints" dense>
modified apps/web/src/app/bot/page.tsx +1 −1
@@ -11,7 +11,7 @@ export default function BotPage() {
11 11 <Panel title="Identification">
12 12 <p className="text-[13px]">User agent:</p>
13 13 <pre className="mt-1 rounded-md border border-line bg-panel-2 p-2 font-mono text-[12px]">WebSensorBot/0.1 (+https://www.websensor.io/bot; contact@websensor.io)</pre>
14 − <p className="mt-3 text-[13px] text-fg-muted">Requests originate from a small, fixed set of addresses. Contact: <a href="mailto:contact@websensor.io" className="text-info hover:underline">contact@websensor.io</a>.</p>
14 + <p className="mt-3 text-[13px] text-fg-muted">Requests originate from a small, fixed set of addresses. Contact: <a href="mailto:contact@spboucher.ai" className="text-info hover:underline">contact@spboucher.ai</a> (Simon-Pierre Boucher). WebSensor is hosted on <a href="https://www.maclustr.io" className="text-info hover:underline" target="_blank" rel="noopener noreferrer">MacLustr</a>.</p>
15 15 </Panel>
16 16 <Panel title="What we fetch">
17 17 <ul className="list-disc space-y-1 pl-5 text-[13px] text-fg-muted">
modified apps/web/src/app/layout.tsx +2 −0
@@ -18,6 +18,8 @@ export const metadata: Metadata = {
18 18 title: { default: "WebSensor — The Web is changing. We are watching.", template: "%s · WebSensor" },
19 19 description: "WebSensor continuously watches the public web for meaningful changes, preserving evidence and connecting signals into real-world events.",
20 20 applicationName: "WebSensor",
21 + authors: [{ name: "Simon-Pierre Boucher", url: "https://www.maclustr.io" }],
22 + creator: "Simon-Pierre Boucher",
21 23 openGraph: { type: "website", siteName: "WebSensor", url: SITE_URL, title: "WebSensor — The Web is changing. We are watching.", description: "Real-time Internet change intelligence: what changed, where, when, whether it was silent, how important it is — with immutable evidence." },
22 24 twitter: { card: "summary_large_image", title: "WebSensor — The Web is changing. We are watching.", description: "Detect what changed. Know why it matters." },
23 25 alternates: { canonical: "/", types: { "application/rss+xml": `${SITE_URL}/api/v1/feed.rss` } },
modified apps/web/src/components/footer.tsx +23 −11
@@ -3,18 +3,30 @@ import Link from "next/link";
3 3 export function Footer() {
4 4 return (
5 5 <footer className="mt-10 border-t border-line pb-20 lg:pb-6">
6 − <div className="mx-auto flex max-w-[1500px] flex-wrap items-center justify-between gap-3 px-3 py-4 text-[12px] text-fg-subtle sm:px-4">
7 − <div>
8 − <span className="font-semibold text-fg-muted">WebSensor</span> — Detect What Changed. Know Why It Matters.
6 + <div className="mx-auto flex max-w-[1600px] flex-col gap-3 px-3 py-4 text-[12px] text-fg-subtle sm:px-4">
7 + <div className="flex flex-wrap items-center justify-between gap-3">
8 + <div>
9 + <span className="font-semibold text-fg-muted">WebSensor</span> — Detect What Changed. Know Why It Matters.
10 + </div>
11 + <nav className="flex flex-wrap gap-3" aria-label="Footer">
12 + <Link href="/api" className="hover:text-fg">API</Link>
13 + <Link href="/health" className="hover:text-fg">Health</Link>
14 + <Link href="/bot" className="hover:text-fg">Bot</Link>
15 + <a href="/api/v1/feed.rss" className="hover:text-fg">RSS</a>
16 + <Link href="/explore" className="hover:text-fg">Explore</Link>
17 + <Link href="/country" className="hover:text-fg">Countries</Link>
18 + </nav>
19 + <div className="font-mono text-[11px]">All timestamps UTC</div>
20 + </div>
21 + <div className="flex flex-wrap items-center justify-between gap-x-4 gap-y-1 border-t border-line pt-3 text-[11.5px]">
22 + <div>
23 + Built by <span className="text-fg-muted">Simon-Pierre Boucher</span> · <a href="mailto:contact@spboucher.ai" className="text-info hover:underline">contact@spboucher.ai</a>
24 + </div>
25 + <div>
26 + Hosted on <a href="https://www.maclustr.io" target="_blank" rel="noopener noreferrer" className="text-info hover:underline">MacLustr</a>, an Apple-silicon compute cluster in Québec
27 + </div>
28 + <div className="font-mono text-[10.5px]">© {new Date().getUTCFullYear()} WebSensor</div>
9 29 </div>
10 − <nav className="flex flex-wrap gap-3">
11 − <Link href="/api" className="hover:text-fg">API</Link>
12 − <Link href="/health" className="hover:text-fg">Health</Link>
13 − <Link href="/bot" className="hover:text-fg">Bot</Link>
14 − <a href="/api/v1/feed.rss" className="hover:text-fg">RSS</a>
15 − <Link href="/explore" className="hover:text-fg">Explore</Link>
16 − </nav>
17 − <div className="font-mono text-[11px]">All timestamps UTC</div>
18 30 </div>
19 31 </footer>
20 32 );
21 33