SPB Git

brand: pressure-dial mark, logo, favicons, manifest, OG image; registry fragment developer/SaaS/AI/security (5 319 targets, 319 services); docs

Simon-Pierre Boucher committed (Sep 13, 2026) parent b77c2dc Browse files

17 changed files +4,616 −4,384

modified README.md +1 −1
@@ -12,7 +12,7 @@ Live: https://www.internetpressure.io · API: `/api/v1/*` (see `docs/API.md`) ·
12 | `apps/api` | Python package `internetpressure`: ingestion API, pressure engine, event engine, BGP ingestor, corroboration connectors, public/admin API, SSE | 12 | `apps/api` | Python package `internetpressure`: ingestion API, pressure engine, event engine, BGP ingestor, corroboration connectors, public/admin API, SSE |
13 | `services/probe-agent` | Go probe agent (HTTP/DNS/ICMP/traceroute, signed gzip batches, spool, self-update) | 13 | `services/probe-agent` | Go probe agent (HTTP/DNS/ICMP/traceroute, signed gzip batches, spool, self-update) |
14 | `packages/config/pressure.yaml` | weights, levels, engine & scheduler parameters | 14 | `packages/config/pressure.yaml` | weights, levels, engine & scheduler parameters |
15−| `data/` | region model, target registry seed (2 128 targets, 165 services), services, probes | 15+| `data/` | region model, target registry (27 700 verified targets in 219 countries, 700 services incl. 670 public status pages — `targets.yaml` + `fragments/*.yaml`, validated by `scripts/registry-check.py`), services, probes |
16 | `infra/` · `deploy/` | Docker Compose stack, edge Caddy, deploy & probe scripts | 16 | `infra/` · `deploy/` | Docker Compose stack, edge Caddy, deploy & probe scripts |
17 | `docs/` | SPEC (product), ARCHITECTURE, API, PROBE-PROTOCOL, DEPLOY | 17 | `docs/` | SPEC (product), ARCHITECTURE, API, PROBE-PROTOCOL, DEPLOY |
18 18
added apps/web/public/brand/mark-256.png +0 −0

Binary file not shown.

added apps/web/public/brand/mark-mono.svg +13 −0
@@ -0,0 +1,13 @@
1+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="InternetPressure.io">
2+ <!-- InternetPressure.io — the pressure dial: seven bands (calm → extreme), needle, hub -->
3+ <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/>
4+ <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/>
5+ <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/>
6+ <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/>
7+ <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/>
8+ <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/>
9+ <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="currentColor" stroke-width="6.5" stroke-linecap="round" fill="none"/>
10+ <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="currentColor"/>
11+ <circle cx="32.0" cy="32.0" r="4.2" fill="currentColor"/>
12+ <circle cx="32.0" cy="32.0" r="1.6" fill="none"/>
13+</svg>
added apps/web/public/brand/mark.svg +13 −0
@@ -0,0 +1,13 @@
1+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="InternetPressure.io">
2+ <!-- InternetPressure.io — the pressure dial: seven bands (calm → extreme), needle, hub -->
3+ <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" stroke-width="6.5" stroke-linecap="round" fill="none"/>
4+ <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" stroke-width="6.5" stroke-linecap="round" fill="none"/>
5+ <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" stroke-width="6.5" stroke-linecap="round" fill="none"/>
6+ <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" stroke-width="6.5" stroke-linecap="round" fill="none"/>
7+ <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" stroke-width="6.5" stroke-linecap="round" fill="none"/>
8+ <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" stroke-width="6.5" stroke-linecap="round" fill="none"/>
9+ <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" stroke-width="6.5" stroke-linecap="round" fill="none"/>
10+ <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3"/>
11+ <circle cx="32.0" cy="32.0" r="4.2" fill="#E6EDF3"/>
12+ <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F"/>
13+</svg>
added apps/web/public/brand/og-wallpaper.png +0 −0

Binary file not shown.

modified apps/web/public/logo.svg +12 −14
@@ -1,15 +1,13 @@
1−<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="none" stroke="#5B8DEF" stroke-width="1.75" stroke-linecap="round"> 1+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 64" width="360" height="64" role="img" aria-label="InternetPressure.io">
2− <!-- InternetPressure.io — pressure-gauge glyph: dial, tick marks, needle --> 2+ <g><path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" stroke-width="6.5" stroke-linecap="round" fill="none"/>
3− <circle cx="16" cy="16" r="13" /> 3+ <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" stroke-width="6.5" stroke-linecap="round" fill="none"/>
4− <path d="M6.6 22.4 L8.4 21.4" /> 4+ <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" stroke-width="6.5" stroke-linecap="round" fill="none"/>
5− <path d="M5 16 L7 16" /> 5+ <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" stroke-width="6.5" stroke-linecap="round" fill="none"/>
6− <path d="M6.6 9.6 L8.4 10.6" /> 6+ <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" stroke-width="6.5" stroke-linecap="round" fill="none"/>
7− <path d="M11.6 5.4 L12.4 7.2" /> 7+ <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" stroke-width="6.5" stroke-linecap="round" fill="none"/>
8− <path d="M16 4 L16 6" /> 8+ <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" stroke-width="6.5" stroke-linecap="round" fill="none"/>
9− <path d="M20.4 5.4 L19.6 7.2" /> 9+ <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3"/>
10− <path d="M25.4 9.6 L23.6 10.6" /> 10+ <circle cx="32.0" cy="32.0" r="4.2" fill="#E6EDF3"/>
11− <path d="M27 16 L25 16" /> 11+ <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F"/></g>
12− <path d="M25.4 22.4 L23.6 21.4" /> 12+ <text x="76" y="41" font-family="Geist, Inter, -apple-system, Segoe UI, Helvetica, Arial, sans-serif" font-size="28" font-weight="600" letter-spacing="-0.6" fill="#E6EDF3">InternetPressure<tspan fill="#8B98A5" font-weight="500">.io</tspan></text>
13− <path d="M16 16 L22.5 9.5" stroke-width="2.25" />
14− <circle cx="16" cy="16" r="1.6" fill="#5B8DEF" stroke="none" />
15 </svg> 13 </svg>
added apps/web/src/app/apple-icon.png +0 −0

Binary file not shown.

added apps/web/src/app/favicon.ico +0 −0

Binary file not shown.

added apps/web/src/app/icon.png +0 −0

Binary file not shown.

modified apps/web/src/app/icon.svg +12 −8
@@ -1,9 +1,13 @@
1−<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32"> 1+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
2− <rect width="32" height="32" rx="4" fill="#070A0F" /> 2+ <rect width="64" height="64" rx="14" fill="#0C1117"/>
3− <g fill="none" stroke="#5B8DEF" stroke-width="1.9" stroke-linecap="round"> 3+ <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" stroke-width="6.5" stroke-linecap="round" fill="none"/>
4− <circle cx="16" cy="16" r="11.5" /> 4+ <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" stroke-width="6.5" stroke-linecap="round" fill="none"/>
5− <path d="M7.7 20.8 L9.3 19.9" /><path d="M6.5 16 L8.3 16" /><path d="M7.7 11.2 L9.3 12.1" /><path d="M12 6.9 L12.7 8.6" /><path d="M16 5.5 L16 7.3" /><path d="M20 6.9 L19.3 8.6" /><path d="M24.3 11.2 L22.7 12.1" /><path d="M25.5 16 L23.7 16" /><path d="M24.3 20.8 L22.7 19.9" /> 5+ <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" stroke-width="6.5" stroke-linecap="round" fill="none"/>
6− <path d="M16 16 L21.6 10.4" stroke-width="2.4" /> 6+ <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" stroke-width="6.5" stroke-linecap="round" fill="none"/>
7− </g> 7+ <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" stroke-width="6.5" stroke-linecap="round" fill="none"/>
8− <circle cx="16" cy="16" r="1.7" fill="#5B8DEF" /> 8+ <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" stroke-width="6.5" stroke-linecap="round" fill="none"/>
9+ <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" stroke-width="6.5" stroke-linecap="round" fill="none"/>
10+ <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3"/>
11+ <circle cx="32.0" cy="32.0" r="4.2" fill="#E6EDF3"/>
12+ <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F"/>
9 </svg> 13 </svg>
modified apps/web/src/app/layout.tsx +4 −1
@@ -14,7 +14,10 @@ export const metadata: Metadata = {
14 alternates: { canonical: '/' }, 14 alternates: { canonical: '/' },
15 openGraph: { type: 'website', siteName: SITE_NAME, url: SITE_URL, title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION }, 15 openGraph: { type: 'website', siteName: SITE_NAME, url: SITE_URL, title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION },
16 twitter: { card: 'summary_large_image', title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION }, 16 twitter: { card: 'summary_large_image', title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION },
17− icons: { icon: [{ url: '/icon.svg', type: 'image/svg+xml' }] }, 17+ authors: [{ name: 'Simon-Pierre Boucher', url: 'mailto:contact@spboucher.ai' }],
18+ creator: 'Simon-Pierre Boucher',
19+ publisher: 'MacLustr (www.maclustr.io)',
20+ // icons: Next file conventions in src/app — icon.svg, icon.png, apple-icon.png, favicon.ico (generated by scripts/brand.py)
18 }; 21 };
19 22
20 export const viewport: Viewport = { 23 export const viewport: Viewport = {
added apps/web/src/app/manifest.ts +19 −0
@@ -0,0 +1,19 @@
1+import type { MetadataRoute } from 'next';
2+import { DESCRIPTION, SITE_NAME } from '@/lib/site';
3+
4+export default function manifest(): MetadataRoute.Manifest {
5+ return {
6+ name: SITE_NAME,
7+ short_name: 'InternetPressure',
8+ description: DESCRIPTION,
9+ start_url: '/',
10+ display: 'standalone',
11+ background_color: '#070A0F',
12+ theme_color: '#070A0F',
13+ icons: [
14+ { src: '/icon.png', sizes: '512x512', type: 'image/png' },
15+ { src: '/apple-icon.png', sizes: '180x180', type: 'image/png' },
16+ { src: '/icon.svg', sizes: 'any', type: 'image/svg+xml' },
17+ ],
18+ };
19+}
modified apps/web/src/app/opengraph-image.tsx +11 −9
@@ -11,6 +11,13 @@ export const size = { width: 1200, height: 630 };
11 export const contentType = 'image/png'; 11 export const contentType = 'image/png';
12 12
13 /** OG image rendered from the live index (real API data, never a fixture). Falls back to an unknown state. */ 13 /** OG image rendered from the live index (real API data, never a fixture). Falls back to an unknown state. */
14+/** The brand dial (same geometry as scripts/brand.py / public/brand/mark.svg). */
15+function Dial({ SZ, OP }: { SZ: number; OP: number }) {
16+ return (
17+ <svg viewBox="0 0 64 64" width={SZ} height={SZ} style={{ opacity: OP }}><path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke="#4CC9F0" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke="#7FB77E" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke="#E9C46A" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke="#F4A261" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke="#E76F51" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke="#D62828" strokeWidth={6.5} strokeLinecap="round" fill="none" /><path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke="#F72585" strokeWidth={6.5} strokeLinecap="round" fill="none" /><polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3" /><circle cx="32" cy="32" r="4.2" fill="#E6EDF3" /><circle cx="32" cy="32" r="1.6" fill="#070A0F" /></svg>
18+ );
19+}
20+
14 export default async function OpenGraphImage() { 21 export default async function OpenGraphImage() {
15 let g: GlobalPressure | null = null; 22 let g: GlobalPressure | null = null;
16 try { 23 try {
@@ -24,16 +31,11 @@ export default async function OpenGraphImage() {
24 return new ImageResponse( 31 return new ImageResponse(
25 ( 32 (
26 <div style={{ width: '100%', height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', padding: '56px 72px', background: '#070A0F', color: '#E6EDF3', fontFamily: 'sans-serif', position: 'relative' }}> 33 <div style={{ width: '100%', height: '100%', display: 'flex', flexDirection: 'column', justifyContent: 'space-between', padding: '56px 72px', background: '#070A0F', color: '#E6EDF3', fontFamily: 'sans-serif', position: 'relative' }}>
27− <div style={{ position: 'absolute', left: 120, top: 80, width: 700, height: 500, borderRadius: 9999, background: `radial-gradient(circle at 40% 45%, ${color}22, #070A0F00 70%)`, display: 'flex' }} /> 34+ <div style={{ position: 'absolute', right: -40, top: 60, display: 'flex' }}>
35+ <Dial SZ={560} OP={0.22} />
36+ </div>
28 <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}> 37 <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>
29− <svg width="44" height="44" viewBox="0 0 32 32" fill="none" stroke="#5B8DEF" strokeWidth="1.75" strokeLinecap="round"> 38+ <Dial SZ={52} OP={1} />
30− <circle cx="16" cy="16" r="13" />
31− <path d="M16 4 L16 6" />
32− <path d="M5 16 L7 16" />
33− <path d="M27 16 L25 16" />
34− <path d="M16 16 L22.5 9.5" strokeWidth="2.25" />
35− <circle cx="16" cy="16" r="1.6" fill="#5B8DEF" stroke="none" />
36− </svg>
37 <div style={{ display: 'flex', fontSize: 30, letterSpacing: -0.5 }}> 39 <div style={{ display: 'flex', fontSize: 30, letterSpacing: -0.5 }}>
38 InternetPressure<span style={{ color: '#5B6875' }}>.io</span> 40 InternetPressure<span style={{ color: '#5B6875' }}>.io</span>
39 </div> 41 </div>
modified apps/web/src/components/chrome/Logo.tsx +14 −15
@@ -1,19 +1,18 @@
1−/** Pressure-gauge glyph (same drawing as public/logo.svg) — inline so it inherits colour and needs no request. */ 1+/** InternetPressure.io mark — the pressure dial (generated by scripts/brand.py; same geometry as public/brand/mark.svg).
2−export function Logo({ size = 22, className, color = 'var(--accent)' }: { size?: number; className?: string; color?: string }) { 2+ * Seven bands = the pressure palette calm → extreme, a needle and a hub. `mono` renders everything in `color`. */
3+export function Logo({ size = 22, className, color = 'currentColor', mono = false }: { size?: number; className?: string; color?: string; mono?: boolean }) {
3 return ( 4 return (
4− <svg viewBox="0 0 32 32" width={size} height={size} fill="none" stroke={color} strokeWidth={1.75} strokeLinecap="round" className={className} aria-hidden="true"> 5+ <svg viewBox="0 0 64 64" width={size} height={size} className={className} aria-hidden="true">
5− <circle cx="16" cy="16" r="13" /> 6+ <path d="M11.22 44.00 A24.0 24.0 0 0 1 8.01 31.28" stroke={mono ? color : "#4CC9F0"} strokeWidth={6.5} strokeLinecap="round" fill="none" />
6− <path d="M6.6 22.4 L8.4 21.4" /> 7+ <path d="M8.08 30.03 A24.0 24.0 0 0 1 12.69 17.75" stroke={mono ? color : "#7FB77E"} strokeWidth={6.5} strokeLinecap="round" fill="none" />
7− <path d="M5 16 L7 16" /> 8+ <path d="M13.46 16.76 A24.0 24.0 0 0 1 24.24 9.29" stroke={mono ? color : "#E9C46A"} strokeWidth={6.5} strokeLinecap="round" fill="none" />
8− <path d="M6.6 9.6 L8.4 10.6" /> 9+ <path d="M25.44 8.91 A24.0 24.0 0 0 1 38.56 8.91" stroke={mono ? color : "#F4A261"} strokeWidth={6.5} strokeLinecap="round" fill="none" />
9− <path d="M11.6 5.4 L12.4 7.2" /> 10+ <path d="M39.76 9.29 A24.0 24.0 0 0 1 50.54 16.76" stroke={mono ? color : "#E76F51"} strokeWidth={6.5} strokeLinecap="round" fill="none" />
10− <path d="M16 4 L16 6" /> 11+ <path d="M51.31 17.75 A24.0 24.0 0 0 1 55.92 30.03" stroke={mono ? color : "#D62828"} strokeWidth={6.5} strokeLinecap="round" fill="none" />
11− <path d="M20.4 5.4 L19.6 7.2" /> 12+ <path d="M55.99 31.28 A24.0 24.0 0 0 1 52.78 44.00" stroke={mono ? color : "#F72585"} strokeWidth={6.5} strokeLinecap="round" fill="none" />
12− <path d="M25.4 9.6 L23.6 10.6" /> 13+ <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill={mono ? color : '#E6EDF3'} />
13− <path d="M27 16 L25 16" /> 14+ <circle cx="32.0" cy="32.0" r="4.2" fill={mono ? color : '#E6EDF3'} />
14− <path d="M25.4 22.4 L23.6 21.4" /> 15+ {!mono && <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F" />}
15− <path d="M16 16 L22.5 9.5" strokeWidth={2.25} />
16− <circle cx="16" cy="16" r="1.6" fill={color} stroke="none" />
17 </svg> 16 </svg>
18 ); 17 );
19 } 18 }
modified data/targets/fragments/developer.yaml +4333 −4333
Large diff (9,095 lines) is not loaded by default to keep the page fast.Load diff
modified docs/ARCHITECTURE.md +12 −3
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
added scripts/brand.py +172 −0
Large diff (173 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme