6cf80747cc
CI / verify (push) Successful in 3m11s
The app is pre-launch and shared by link with a handful of people at Prime
Intellect. It should not be accumulating a search footprint yet.
Three layers, because each covers a gap the others leave:
- robots.txt asks well-behaved crawlers not to fetch at all.
- The <meta name="robots"> tag covers the HTML document for anything that
fetched anyway.
- X-Robots-Tag covers everything that is NOT the HTML document — og.png,
the manifest, the built assets — which the meta tag cannot reach.
noarchive and nosnippet are there so a cache or an excerpt cannot outlive
the page once this is reversed.
Deliberately NOT stripped: the og:/twitter: tags. Link unfurlers are not
crawlers — they fetch on behalf of the person pasting the link, and a
rendered card is exactly what we want when this is shared.
The real gate remains authentication: / returns the sign-in screen and every
/api/ route returns 401. This only stops the app being indexed.
To go public: delete robots.txt, drop the meta tag, drop the header.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
110 lines
5.2 KiB
HTML
110 lines
5.2 KiB
HTML
<!doctype html>
|
||
<html lang="en" data-theme="light">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<!--
|
||
viewport-fit=cover plus the safe-area padding in index.css is what makes
|
||
this sit correctly on notched iPhones. Without it the bottom navigation
|
||
hides under the home indicator.
|
||
|
||
Note the absence of maximum-scale / user-scalable=no: disabling zoom is a
|
||
real accessibility failure, and iOS ignores it in recent versions anyway.
|
||
The 16px minimum font size on inputs (see index.css) is the correct fix
|
||
for Safari's zoom-on-focus behaviour.
|
||
-->
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||
<meta name="description" content="PIG — Prime Intellect Growth. An agent-native CRM for two-sided AI-compute companies." />
|
||
|
||
<!--
|
||
Not public yet. noindex keeps the app out of search results; noarchive
|
||
and nosnippet stop a cache or excerpt surviving after it is removed.
|
||
Mirrored by /robots.txt and by an X-Robots-Tag header in Caddy — see the
|
||
comment in robots.txt for why all three exist.
|
||
|
||
Note this deliberately does NOT strip the og:/twitter: tags below. Link
|
||
unfurlers are not crawlers: they fetch on behalf of the person pasting
|
||
the link, and a card is exactly what we want when this is shared with
|
||
Prime Intellect.
|
||
-->
|
||
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet" />
|
||
|
||
<!-- Matches the app chrome so Safari's toolbar blends rather than banding. -->
|
||
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)" />
|
||
<meta name="theme-color" content="#09090b" media="(prefers-color-scheme: dark)" />
|
||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
||
<meta name="apple-mobile-web-app-title" content="pig" />
|
||
|
||
<!--
|
||
Icons. The SVG is preferred by every modern browser and adapts to the
|
||
system theme; the PNG is the fallback for those that do not. The
|
||
apple-touch-icon is drawn on an opaque plate with inset, because iOS
|
||
rounds the corners itself and a transparent edge-to-edge mark loses its
|
||
ears to the crop.
|
||
-->
|
||
<link rel="icon" href="/pig.svg" type="image/svg+xml" />
|
||
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192" />
|
||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||
<link rel="manifest" href="/manifest.webmanifest" />
|
||
|
||
<title>pig — Prime Intellect Growth</title>
|
||
<link rel="canonical" href="https://primeintellectgrowth.com/" />
|
||
|
||
<!--
|
||
Link previews. og:image must be an ABSOLUTE url — unfurlers fetch it
|
||
without a page context, so a relative path silently yields no image,
|
||
which is the single most common reason a card renders blank.
|
||
|
||
summary_large_image gives the 1200×630 card rather than a small square
|
||
thumbnail. Both og: and twitter: tags are present because Slack, Discord,
|
||
LinkedIn and iMessage read Open Graph while X prefers its own.
|
||
-->
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:site_name" content="pig" />
|
||
<meta property="og:url" content="https://primeintellectgrowth.com/" />
|
||
<meta property="og:title" content="pig — Prime Intellect Growth" />
|
||
<meta
|
||
property="og:description"
|
||
content="An open-source, agent-native CRM for companies that buy GPU capacity and sell it. Margin, utilisation and idle capacity from one ledger."
|
||
/>
|
||
<meta property="og:image" content="https://primeintellectgrowth.com/og.png" />
|
||
<meta property="og:image:width" content="1200" />
|
||
<meta property="og:image:height" content="630" />
|
||
<meta property="og:image:alt" content="pig — Prime Intellect Growth. The CRM for companies that buy compute and sell it." />
|
||
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<meta name="twitter:title" content="pig — Prime Intellect Growth" />
|
||
<meta
|
||
name="twitter:description"
|
||
content="An open-source, agent-native CRM for companies that buy GPU capacity and sell it. Margin, utilisation and idle capacity from one ledger."
|
||
/>
|
||
<meta name="twitter:image" content="https://primeintellectgrowth.com/og.png" />
|
||
|
||
<script>
|
||
// Applied before first paint so a dark-mode user never sees a white
|
||
// flash. Reads the last-known preference from localStorage; the
|
||
// authoritative value arrives from the server moments later and
|
||
// reconciles silently.
|
||
(function () {
|
||
try {
|
||
var mode = localStorage.getItem('pig.themeMode') || 'system';
|
||
var accent = localStorage.getItem('pig.accent') || 'pig';
|
||
var dark =
|
||
mode === 'dark' ||
|
||
(mode === 'system' &&
|
||
window.matchMedia('(prefers-color-scheme: dark)').matches);
|
||
var root = document.documentElement;
|
||
root.setAttribute('data-theme', dark ? 'dark' : 'light');
|
||
root.setAttribute('data-accent', accent);
|
||
} catch (e) {
|
||
/* Private browsing can throw on localStorage. Defaults are fine. */
|
||
}
|
||
})();
|
||
</script>
|
||
</head>
|
||
<body>
|
||
<div id="root"></div>
|
||
<script type="module" src="/src/main.tsx"></script>
|
||
</body>
|
||
</html>
|