diff --git a/apps/web/index.html b/apps/web/index.html
index ee57059..76272f1 100644
--- a/apps/web/index.html
+++ b/apps/web/index.html
@@ -15,6 +15,19 @@
+
+
+
diff --git a/apps/web/public/robots.txt b/apps/web/public/robots.txt
new file mode 100644
index 0000000..2dd1d1c
--- /dev/null
+++ b/apps/web/public/robots.txt
@@ -0,0 +1,17 @@
+# PIG is not public yet. Nothing here should be indexed or crawled.
+#
+# This is a request, not enforcement — well-behaved crawlers honour it, and
+# hostile ones do not. The real gate is authentication: every route below /
+# returns the sign-in screen to an unauthenticated visitor and every /api/
+# route returns 401. This file exists so the app does not accumulate a search
+# footprint before it is meant to have one.
+#
+# Backed by an `X-Robots-Tag: noindex, nofollow` response header in the Caddy
+# config and a tag in index.html. The header is the one
+# that matters most: it also covers og.png, the manifest and anything else
+# served that is not HTML.
+#
+# To go public: delete this file, remove the meta tag, and drop the header.
+
+User-agent: *
+Disallow: /
diff --git a/deploy/Caddyfile.example b/deploy/Caddyfile.example
index e3557f1..7b84732 100644
--- a/deploy/Caddyfile.example
+++ b/deploy/Caddyfile.example
@@ -20,6 +20,11 @@ primeintellectgrowth.com, www.primeintellectgrowth.com {
# IMPORTANT: editing that script changes its hash and CSP will silently
# block it. The browser console says exactly which hash it wants.
header {
+ # Not public yet. The header covers everything served — og.png, the
+ # manifest, the built assets — where the tag in index.html only
+ # covers the HTML document. robots.txt asks crawlers not to fetch;
+ # this tells the ones that fetch anyway not to index.
+ X-Robots-Tag "noindex, nofollow, noarchive, nosnippet"
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"