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 12 | `apps/api` | Python package `internetpressure`: ingestion API, pressure engine, event engine, BGP ingestor, corroboration connectors, public/admin API, SSE |
13 13 | `services/probe-agent` | Go probe agent (HTTP/DNS/ICMP/traceroute, signed gzip batches, spool, self-update) |
14 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 16 | `infra/` · `deploy/` | Docker Compose stack, edge Caddy, deploy & probe scripts |
17 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">
2 − <!-- InternetPressure.io — pressure-gauge glyph: dial, tick marks, needle -->
3 − <circle cx="16" cy="16" r="13" />
4 − <path d="M6.6 22.4 L8.4 21.4" />
5 − <path d="M5 16 L7 16" />
6 − <path d="M6.6 9.6 L8.4 10.6" />
7 − <path d="M11.6 5.4 L12.4 7.2" />
8 − <path d="M16 4 L16 6" />
9 − <path d="M20.4 5.4 L19.6 7.2" />
10 − <path d="M25.4 9.6 L23.6 10.6" />
11 − <path d="M27 16 L25 16" />
12 − <path d="M25.4 22.4 L23.6 21.4" />
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" />
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 + <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 + <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="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="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="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="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="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 + <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill="#E6EDF3"/>
10 + <circle cx="32.0" cy="32.0" r="4.2" fill="#E6EDF3"/>
11 + <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F"/></g>
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>
15 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">
2 − <rect width="32" height="32" rx="4" fill="#070A0F" />
3 − <g fill="none" stroke="#5B8DEF" stroke-width="1.9" stroke-linecap="round">
4 − <circle cx="16" cy="16" r="11.5" />
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" />
6 − <path d="M16 16 L21.6 10.4" stroke-width="2.4" />
7 − </g>
8 − <circle cx="16" cy="16" r="1.7" fill="#5B8DEF" />
1 +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
2 + <rect width="64" height="64" rx="14" fill="#0C1117"/>
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"/>
9 13 </svg>
modified apps/web/src/app/layout.tsx +4 −1
@@ -14,7 +14,10 @@ export const metadata: Metadata = {
14 14 alternates: { canonical: '/' },
15 15 openGraph: { type: 'website', siteName: SITE_NAME, url: SITE_URL, title: `${SITE_NAME} — ${TAGLINE}`, description: DESCRIPTION },
16 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 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 11 export const contentType = 'image/png';
12 12
13 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 21 export default async function OpenGraphImage() {
15 22 let g: GlobalPressure | null = null;
16 23 try {
@@ -24,16 +31,11 @@ export default async function OpenGraphImage() {
24 31 return new ImageResponse(
25 32 (
26 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 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">
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>
38 + <Dial SZ={52} OP={1} />
37 39 <div style={{ display: 'flex', fontSize: 30, letterSpacing: -0.5 }}>
38 40 InternetPressure<span style={{ color: '#5B6875' }}>.io</span>
39 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. */
2 −export function Logo({ size = 22, className, color = 'var(--accent)' }: { size?: number; className?: string; color?: string }) {
1 +/** InternetPressure.io mark — the pressure dial (generated by scripts/brand.py; same geometry as public/brand/mark.svg).
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 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 − <circle cx="16" cy="16" r="13" />
6 − <path d="M6.6 22.4 L8.4 21.4" />
7 − <path d="M5 16 L7 16" />
8 − <path d="M6.6 9.6 L8.4 10.6" />
9 − <path d="M11.6 5.4 L12.4 7.2" />
10 − <path d="M16 4 L16 6" />
11 − <path d="M20.4 5.4 L19.6 7.2" />
12 − <path d="M25.4 9.6 L23.6 10.6" />
13 − <path d="M27 16 L25 16" />
14 − <path d="M25.4 22.4 L23.6 21.4" />
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" />
5 + <svg viewBox="0 0 64 64" width={size} height={size} className={className} aria-hidden="true">
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" />
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" />
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" />
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" />
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" />
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" />
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" />
13 + <polygon points="34.11,31.36 29.89,32.64 27.09,15.73" fill={mono ? color : '#E6EDF3'} />
14 + <circle cx="32.0" cy="32.0" r="4.2" fill={mono ? color : '#E6EDF3'} />
15 + {!mono && <circle cx="32.0" cy="32.0" r="1.6" fill="#070A0F" />}
17 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