Files
pig/apps/web/index.html
karti 6cf80747cc
CI / verify (push) Successful in 3m11s
Keep PIG out of search results until it is meant to be found
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>
2026-08-13 12:45:18 -07:00

110 lines
5.2 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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>