brand: pressure-dial mark, logo, favicons, manifest, OG image; registry fragment developer/SaaS/AI/security (5 319 targets, 319 services); docs
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