diff --git a/README.md b/README.md
index f669459..468cd80 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
-# fosterstack/www — marketing site + waitlist
+# fosterstack/www — marketing site
-Static landing page for fosterstack.com with a Cloudflare Pages Function waitlist
-(`/api/waitlist`) backed by a KV namespace. No external requests, no third-party form
+Static landing page for fosterstack.com. No forms, no email capture, no cookies, no
+analytics, and no third-party requests of any kind
service, no analytics (add privacy-respecting analytics later if wanted).
**One-time setup after cloning:** `git config core.hooksPath .githooks` — enables the
@@ -13,7 +13,6 @@ either way, but the hook catches it before a push, not after.
```
index.html the page (inline CSS/JS, system fonts, zero external assets)
bcn-removed/index.html pre-positioned migration page (see below) — NOT linked from nav
-functions/api/waitlist.js Pages Function: POST /api/waitlist -> KV
_headers security headers incl. CSP
.githooks/pre-commit public-repo hygiene hook (see below)
bin/check-file-allowlist.sh the allowlist itself — shared by the hook and CI
@@ -56,20 +55,22 @@ Full instructions are in an HTML comment at the top of `bcn-removed/index.html`.
2. Cloudflare dashboard → Workers & Pages → Create → Pages → connect to git →
select `fosterstack/www`. Framework preset: None. Build command: (empty).
Output directory: `/`. Deploy.
-3. KV: Workers & Pages → KV → Create namespace `waitlist`. Then in the Pages project →
- Settings → Bindings → add KV binding, variable name `WAITLIST` (exact, uppercase),
- pointing at that namespace. Redeploy so the binding takes effect.
-4. Custom domain: Pages project → Custom domains → add `fosterstack.com` and
+3. Custom domain: Pages project → Custom domains → add `fosterstack.com` and
`www.fosterstack.com`. (Requires fosterstack.com DNS on Cloudflare; if the domain is
registered elsewhere, add the site to Cloudflare DNS first.)
-5. Test: submit a real email on the live page, then check KV entries in the dashboard,
- or `wrangler kv key list --namespace-id=`.
+4. Test: load the page and confirm the links resolve. There is nothing to submit.
-## Reading the waitlist
+## No data collection
-Each signup is a KV entry: key `email:`, value JSON `{email, ts, country}`.
-Idempotent — duplicate signups don't error and don't overwrite the original timestamp.
-Honeypot field (`website`) silently drops bots.
+This site has no forms, no inputs, and no server-side functions. It collects no email
+addresses, sets no cookies, loads no third-party scripts, and makes no external
+requests. The CSP in `_headers` enforces that: `connect-src 'self'` and no `form-action`
+target, so a form or a beacon added by accident fails in the browser rather than
+shipping quietly.
+
+Do not reintroduce an email field. "Stay in touch" is GitHub star and
+Watch → Releases, which is a subscription the reader controls and can revoke without
+asking us.
## Copy constraints (do not undo)
@@ -79,3 +80,7 @@ Honeypot field (`website`) silently drops bots.
unlock, security patches never withheld from free tier) is brief §0.2 policy, not
marketing filler. Changes to it are an owner decision.
- No fabricated testimonials, logos, or usage numbers — FTC posture per brief §4.
+- No calendar commitments. No launch dates, no "beta in ", no phase language.
+ The dateless roadmap and the honest maturity label (v0.1, early) stay; a schedule
+ we might miss does not go on a public page.
+- No email capture, ever. See "No data collection" above.
diff --git a/_headers b/_headers
index b017cae..eeb30a7 100644
--- a/_headers
+++ b/_headers
@@ -2,5 +2,5 @@
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
- Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; form-action 'self'; frame-ancestors 'none'
+ Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; form-action 'none'; frame-ancestors 'none'
Permissions-Policy: camera=(), microphone=(), geolocation=()
diff --git a/bcn-removed/index.html b/bcn-removed/index.html
index aa3d013..5a619f5 100644
--- a/bcn-removed/index.html
+++ b/bcn-removed/index.html
@@ -67,21 +67,11 @@
code, pre { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: .88em; }
code { background: var(--card); border: 1px solid var(--line); border-radius: 5px; padding: .1em .35em; }
pre { background: var(--card); border: 1px solid var(--line); border-radius: 8px; padding: .9rem 1rem; overflow-x: auto; margin-top: .6rem; }
- form { display: flex; gap: .6rem; flex-wrap: wrap; margin-top: 1.1rem; }
- input[type=email] {
- flex: 1 1 16rem; padding: .7rem .9rem; font-size: 1rem; color: var(--fg);
- background: var(--bg); border: 1px solid var(--line); border-radius: 8px;
- }
- input[type=email]:focus { outline: 2px solid var(--accent); outline-offset: 1px; border-color: transparent; }
button {
padding: .7rem 1.3rem; font-size: 1rem; font-weight: 600; cursor: pointer;
background: var(--accent); color: var(--accent-fg); border: 0; border-radius: 8px;
}
button:disabled { opacity: .6; cursor: default; }
- .form-msg { font-size: .92rem; margin-top: .6rem; min-height: 1.4em; }
- .form-msg.ok { color: var(--accent); }
- .form-msg.err { color: #d92d20; }
- .hp { position: absolute; left: -6000px; }
footer { border-top: 1px solid var(--line); margin-top: 4rem; padding: 1.5rem 1.25rem 3rem; }
footer div { max-width: 44rem; margin: 0 auto; color: var(--muted); font-size: .82rem; }
a { color: var(--accent); }
@@ -148,13 +138,14 @@ Verify what you're running
for the exact commands, copy-pasteable.
- Questions, or need help migrating a larger fleet?
-
-
+ Questions, or migrating a larger fleet?
+ Open an issue at
+ github.com/fosterstack/cache/issues
+ — public, searchable, and it helps the next person with the same question. For anything
+ you would rather not discuss in public, email
+ hello@fosterstack.com.
+ There is no signup and no waitlist. We do not collect email addresses, and this site
+ sets no cookies and runs no analytics.
-
+