Parked feature initiatives — real, wanted, not near-term. Each section is a former standalone plan. speed-lab is why Speed Lab data is still static (cite RANK, not Mbps). api-docs-hub is ~60% there (data API exists; only the human docs page is missing).
Consolidated from perks-points-rewards.md · status: parked
Churn is the core issue. Traffic is largely navigational/brand: people land, then leave or click to an affiliate and leave. Perks was the MVP to fight that.
Perks signups engage more: longer sessions, lower bounce, more pages per visit. That is a measured win on the hardest problem. The engagement asset works.
Current flow: Perks signup, then GHL, then a "best NordVPN offer" email. 0 sales from 1,000+ emails. That is weak monetization of a strong engagement asset, not a Perks failure. The email was never the destination.
This is the cashback / rewards-portal model (Rakuten, TopCashback, Honey): monetize affiliate commissions by sharing a slice back to the user. It is proven to lift affiliate conversion and retention, so the concept is an adaptation of a model that already works at scale, not a hunch.
Bonus: it is a textbook endowed-progress nudge ("you are already 500/1,000, a purchase gets you the $10"), a documented motivator. Net result: no unfunded liability and no incentive to farm engagement points for cash.
"A purchase closes the gap" requires detecting the affiliate purchase and crediting the right user. That needs a unique per-user ID passed into /out, forwarded to the network, and returned on the network's conversion postback.
/out passes a static sub_id: 'cf' (out/src/redirect.js:65) and a click_id only if one is passed in (s2/click_id param). There is no unique per-user ID today./out hit, pass it as the network's sub-id (via tracking_map), and store it on the clicks row. We control /out and the clicks D1 table.The "you earned X points" toast, the engagement nudge, and the outbound-click social-proof toast are one UI module. Built in engagement-toast-module.md.
/out and clicks; capture the network postback; award points on a confirmed purchase.Consolidated from vpn-api-docs-hub.md · status: parked
Build a public-facing documentation hub at /docs that serves two purposes:
GET /data/providers.json → 22 providers, sorted by rating
GET /data/providers/{slug}.json → individual provider data
Fields per provider: slug, name, tagline, logo, icon, rating (0-100), stars (0-5), speed, latency, servers, countries, devices, price, pricePeriod, regularPrice, guarantee, discount, features[], affiliateUrl, reviewUrl
Served as: static JSON files from CDN, generated at build time from src/data/providers/*.json. Edge-cached 24h. CORS open.
/docs route or templatellms.txt or llms-full.txt (the emerging standard for AI citation)/docs page template + contentNew layout: src/layouts/Docs.astro — clean, technical, sidebar TOC, code blocks with copy button. No editorial serif fonts — use monospace/sans-serif for a developer docs feel.
Route: src/pages/docs/index.astro (or src/pages/docs/[...slug].astro for multiple doc pages)
Initial pages:
| Page | URL | Content |
|---|---|---|
| API Overview | /docs/ | Introduction, authentication (none — public), base URL, rate limits, CORS |
| Provider API | /docs/providers/ | Endpoints, response schema, field descriptions, examples |
| Methodology | /docs/methodology/ | How we rate, test, and score VPN providers |
/llms.txt — plain text file at the root. Describes the site for AI crawlers:
# VPN.com
> Independent VPN research and review platform. 22 providers rated across security, speed, privacy, and value.
## API
- Provider data: https://www.vpn.com/data/providers.json
- Individual provider: https://www.vpn.com/data/providers/{slug}.json
## Documentation
- API docs: https://www.vpn.com/docs/
- Methodology: https://www.vpn.com/docs/methodology/
- Provider reviews: https://www.vpn.com/vpn/{slug}/
/llms-full.txt — expanded version with full provider data dump, methodology summary, rating criteria. This is what AI models ingest for grounding.
JSON-LD on docs pages — TechArticle or APIReference schema for Google's AI features.
Content pages in /docs/:
| Page | Purpose |
|---|---|
| Rating System | How the 0-100 trust score works, category weights, criteria |
| Speed Testing | How we test (methodology, tools, server locations, sample sizes) |
| Privacy Audit | What we check (logs, jurisdiction, audits, encryption) |
| Changelog | API and methodology changes over time |
These are evergreen authority pages. Not blog posts. Not time-sensitive. They establish VPN.com as a primary source that AI systems cite.
Dataset markup on the API overview pageFAQPage on methodology/docs/openapi.json — machine-readable API contractsrc/layouts/Docs.astro ← new layout (clean, technical, sidebar TOC)
src/pages/docs/index.astro ← API overview
src/pages/docs/providers.astro ← provider API docs
src/pages/docs/methodology.astro ← rating methodology
public/llms.txt ← AI discovery file
public/llms-full.txt ← full AI context dump
public/docs/openapi.json ← API spec (generated at build time)
/llms.txt and /llms-full.txt/methodology/ content)/docs/ pages rank for "VPN API", "VPN comparison data", "VPN trust score methodology"llms.txt gets crawled by AI indexersConsolidated from speed-lab.md · status: parked
The original-data asset the whole authority/GEO play hinges on. See [geo-ai-citations] (why citable original data is the #1 citation lever) and [authority-roadmap] (the broader moat). Today the Speed Lab is static/placeholder; this makes it real, honestly, without negative ROI.
Don't buy 22 annual subscriptions and grind through them — that's negative ROI. Instead:
Start with the top 5 (revenue drivers — NordVPN and Proton lead conversions today), expand later.
Each comped account is leverage for more citable tests beyond speed:
Once the account exists these are almost free, and they multiply the citation value per provider.
Publishing isn't the win — being referenced is. So:
lastTested date./api/speedlab.json, built at deploy) — for AI/researchers (authority-roadmap 2.3)./out clicks + conversions).lastTested + real numbers into provider JSON; ship the /api/speedlab.json data API.Top-5 tested for real on a monthly cadence, a public methodology page, dated monthly reports, real numbers in the provider JSON + open API — and the first time an independent source cites a VPN.com test number.
Consolidated from text-to-speech.md · status: parked
ROI: Tier 3 (park — lowest ROI). Client request (Michael, Jun 1, "on radar," wants an MVP estimate). Niche audience, speculative SEO/LLM benefit, real cost or poor quality, zero conversion. Recommend defer beyond a cheap proof-of-concept unless the client insists.
Michael wants both "100% consistent voice across all browsers/devices" and "no manual MP3s / use system audio." These are mutually exclusive. Pick one:
| Approach | Consistent voice | Files / cost | Survives navigation | LLM/search-findable | MVP effort |
|---|---|---|---|---|---|
Web Speech API (browser speechSynthesis) | ❌ varies by OS/browser | none / free | ❌ worst | ❌ no | ~2–4 days |
| Cloud TTS (OpenAI / ElevenLabs / Google / Azure) | ✅ premium, uniform | 1 MP3/page, build-time gen + cached; per-char cost | ✅ (real audio file) | ✅ yes | ~1–2 weeks + ongoing $ |
Recommendation: for VPN.com's premium positioning, cloud TTS with build-time generation is the only version worth shipping — but it's a pipeline + recurring cost. Web Speech is a free POC that will feel cheap. Michael picks the tradeoff; the estimate follows from that.
<audio> + custom playerParked pending the approach decision. No estimate until then (it's a 4-day vs 2-week fork).
Consolidated from accessibility-toolbar.md · status: parked
ROI: Tier 3 (park — client-driven, low ROI). Client request (Michael, Jun 1): a popout menu of on-page text/visual adjustments, behind an accessibility icon next to the translation menu.
Honest assessment before building:
Do not use a third-party overlay (equalweb / accessiBe-style). Overlays are widely regarded by the accessibility community as harmful and are themselves a lawsuit magnet. Michael's own instinct is right: Astro Skip Link + ViewTransition route announcer + eslint-plugin-jsx-a11y beat any injected script. Build a small native control panel; persist prefs in localStorage; drive everything via CSS custom properties + a data-a11y-* attribute on <html>.
prefers-reduced-motion.scripts/a11y-audit.mjs gate in every state.localStorage persistenceParked pending the decision gate. Documented so the rationale (already-compliant, native-only) is on record when revisited.