Skip to content

VidyaNet.ai → Kwilo AI transition bridge

Status: in-progress LNO: N — the rebrand itself was leverage; this is the neutral-but-necessary bridge so the old domain doesn't silently bleed inbound traffic. Owners: @bhanu.pv Last updated: 2026-04-22 Roles affected: all personas who may still have the legacy domain cached (prospects, early pilot contacts, press, LinkedIn link clickers) Primary routes: served on the vidyanet.ai hostname only — short-circuits the apps/site router before any route matches. Source of the ask: self-initiated, driven by the completed VidyaNet → Kwilo AI rebrand (documented in root CLAUDE.md).

TL;DR

vidyanet.ai still has inbound traffic (bookmarks, LinkedIn profile links, old press mentions, word-of-mouth) but currently parks on a generic GoDaddy page. We're moving DNS to Cloudflare and attaching the domain to the existing kwilo-site Pages project. A single lazy-loaded React page (VidyanetTransition.tsx) renders for any request whose hostname ends in vidyanet.ai, telling the visitor we rebranded and sending them to kwilo.ai with a UTM we can measure.

Why this exists

Who asked for it

Self-initiated. The rebrand was announced and kwilo.ai shipped, but the legacy domain was left pointing at a GoDaddy parking page. Anyone with the old URL in a bookmark, signature, deck, or LinkedIn "experience" section currently hits a dead-looking page that doesn't mention Kwilo at all.

What user pain does it solve

A prospect opens a LinkedIn profile from our earliest design-partner season. The profile still says "Founding engineer at VidyaNet — vidyanet.ai". They click. They get a GoDaddy "this domain is parked" stock page. They don't know whether we shut down, got acquired, or just let the domain lapse. They don't re-search for us.

This is real — we have early team members and partners whose public bios still point at the old domain, and we can't rewrite all of their external surfaces.

Cost of not doing it

  • Every inbound visit to vidyanet.ai today is a lost prospect — the parked page actively implies we no longer exist.
  • Any SEO equity from old deep links (press mentions, blog posts) never transfers to kwilo.ai.
  • The rebrand message ("same team, new name") never lands for the most invested audience — people who already know us by the old name.
  • Continues to degrade as time passes; not fixing it means slow-bleeding brand confusion forever.

Validation

Validated, not a guess:

  • The rebrand is real and shipped (root CLAUDE.md documents Kwilo AI (formerly VidyaNet)).
  • The old domain is actively on GoDaddy right now (confirmed with owner).
  • Known-live inbound surfaces: LinkedIn profiles of early team members, the 2024-era pilot pitch decks, a handful of press mentions indexed by Google.

Personas

  • Priya, pilot-era contact. Met us at a 2024 edtech event as "VidyaNet", kept our card. Now types vidyanet.ai into her address bar when her principal asks her to re-evaluate AI tutoring vendors. Currently gets a parking page.
  • Arjun, press/analyst clicker. Reads a 2024 article that mentions "VidyaNet (vidyanet.ai)". Clicks. Same parking page, so he assumes the company folded.

ICP exclusions

  • Search-engine users — we're deliberately setting noindex, nofollow on the bridge so it doesn't compete with kwilo.ai in brand search. SEO users find us via kwilo.ai directly.
  • Authenticated product users — they already live on app.kwilo.ai, not affected by the legacy domain.

Outcomes for the user

  • Priya lands on vidyanet.ai, immediately sees "VidyaNet is now Kwilo AI", clicks the CTA, and continues her evaluation on kwilo.ai.
  • Arjun sees the rebrand message, updates his mental model ("they rebranded, didn't shut down"), and follows through to the live site.

Non-goals

  • Not preserving every deep link. If someone clicks vidyanet.ai/old-blog-post, we send them to the bridge page — not to a matched kwilo.ai/old-blog-post. Keeping a deep-link mapping for a domain we're retiring is not worth the scope.
  • Not prerendering the bridge. The page is client-rendered via the existing kwilo-site bundle. Short, lazy-loaded chunk.
  • Not adding i18n keys. One-off disposable copy, inline strings (with t() fallback syntax to satisfy the site's t() convention).
  • Not creating a separate app or CF Pages project. Reuses apps/site + the existing kwilo-site project + site-cf-pages.yml.
  • Not keeping this code forever. Planned deletion once analytics show bridge traffic dropping below ~10 hits/month (estimated ~12 months out).

Mental model

Request to vidyanet.ai/*  ─► Cloudflare Pages (kwilo-site)
                             ─► prerendered index.html (kwilo.ai landing)
                             ─► React hydrates, App.tsx checks hostname
                             ─► if hostname ends in "vidyanet.ai":
                                  lazy-load VidyanetTransition
                                  render it, noindex meta tag
                             ─► else: normal kwilo.ai marketing site

Single source of hostname truth: window.location.hostname.endsWith('vidyanet.ai') inside App.tsx. Matches both vidyanet.ai and www.vidyanet.ai.

Design decisions

Decision 1: Hostname short-circuit inside apps/site, not a separate app

Chose: one new page file + a 5-line hostname check at the top of App.tsx, reusing the existing kwilo-site Pages project and its deploy workflow.

Why: this is a disposable bridge, not a product. Creating apps/vidyanet-transition/ would duplicate Vite/Tailwind/TypeScript config, add a second CI workflow, and spin up a second Pages project — all to host a single static page. The incremental cost inside apps/site is ~one file + five lines; the path to deletion is symmetric.

Alternatives rejected: - New apps/vidyanet-transition/ app — ~10× more setup churn, no benefit for a disposable page. - Static HTML file — loses the Kwilo design system without either importing tokens or hardcoding them; drifts visually from brand. - Pure DNS redirect (vidyanet.aikwilo.ai) — strips the transition message entirely. Users wouldn't know why the redirect happened.

Decision 2: noindex, nofollow on the bridge

Chose: inject <meta name="robots" content="noindex, nofollow" /> via Helmet on the transition page.

Why: we don't want Google indexing the bridge and competing with kwilo.ai in brand searches. Any SEO equity should continue to accumulate on the canonical domain.

Decision 3: UTM param on the CTA

Chose: primary CTA links to https://kwilo.ai/?ref=vidyanet-transition.

Why: only instrumentation we need to answer "is this bridge worth keeping?" The existing captureAttribution() on apps/site will persist ref into the .kwilo.ai cookie, so downstream signup funnels can attribute back to the bridge.

Decision 4: Accept a brief hydration flash, don't fight it

Chose: on first load, vidyanet.ai briefly serves the prerendered kwilo.ai landing HTML before React hydrates and swaps in the transition page. We do nothing to hide this.

Why: eliminating the flash would require either (a) a CF Pages Function that rewrites responses per-hostname, or (b) an inline pre-hydration script that hides <html> until React decides. Both add moving parts for a page that will be deleted. Real-world flash is ~100-300ms on a warm cache; visitors see Kwilo-branded content either way (same design system), so the transition is less jarring than it sounds.

Alternatives rejected: - Inline <script> that hides documentElement on vidyanet.ai hostnames until React shows it — adds complexity to index.html that touches the kwilo.ai path too. - CF Pages Function for edge hostname rewrite — over-engineered for a bridge.

Risks and mitigations

  • Risk: DNS move from GoDaddy to Cloudflare takes longer than expected or propagation is uneven. Mitigation: nameserver change is reversible; the old GoDaddy parking page is no worse than the new bridge during propagation. No user-facing downtime risk.
  • Risk: React.lazy chunk fails to load (network blip) — user stuck on the flashed kwilo.ai landing. Mitigation: Suspense fallback={null} means blank during load; on failure the user sees the kwilo.ai landing page, which at least carries the right brand. Acceptable fallback.
  • Risk: we forget this code exists when we finally sunset the legacy domain. Mitigation: feature doc is the reminder. When vidyanet.ai traffic drops to noise, delete the page file + the 5-line check + this doc.

Rollout plan

Phase 1 — Ship the bridge (this PR)

  • New: apps/site/src/pages/VidyanetTransition.tsx.
  • Edit: apps/site/src/App.tsx — hostname short-circuit.
  • New: this doc.

Explicitly deferred: - DNS nameserver change at GoDaddy → Cloudflare (human step, post-merge). - Adding vidyanet.ai + www.vidyanet.ai as custom domains on the kwilo-site Pages project (dashboard step, post-merge).

Phase 2 — Sunset

When analytics show ?ref=vidyanet-transition hits drop below ~10/month sustained, delete the page, the hostname check, and this doc. Remove the custom domain from kwilo-site, then release the vidyanet.ai registration.

Success signals

What good looks like

  • Visitors arriving on vidyanet.ai immediately understand the rebrand and click through.
  • Cookie attribution captures ref=vidyanet-transition, showing up in downstream signup funnels.

Observable signals

  • Cloudflare Web Analytics on kwilo-site shows non-zero traffic on the vidyanet.ai hostname.
  • Signup attribution data includes vidyanet-transition as a ref source.
  • No new support tickets about "VidyaNet shutting down" (qualitative).

Sean Ellis counterfactual

If we removed this one week after shipping, Priya and Arjun would hit the old GoDaddy parking page (or, post-DNS-move, a domain with no content) and assume we folded. We'd never know — we'd just keep losing them silently. So yes, removing it would degrade outcomes; it's not over-built.

Open questions

  • [ ] Confirm whether www.vidyanet.ai should be added alongside the apex. Default: yes.

Changelog

  • 2026-04-22 — Doc created. Hostname short-circuit inside apps/site chosen over a separate app. Bridge intended for deletion once traffic tails off (~12 months).

Appendix: Reference

Key files

  • apps/site/src/pages/VidyanetTransition.tsx — the transition page (one-off, disposable).
  • apps/site/src/App.tsx — hostname short-circuit at the top of the component.
  • apps/site/src/components/landing/shared/DarkHeroBackground.tsx — reused background.
  • apps/site/src/components/landing/constants.tsLANDING_PRIMARY_CTA_CLASS reused for CTA styling.
  • apps/site/src/config/urls.tsCANONICAL_SITE_URL reused as the CTA target origin.

External (manual, post-merge)

  • Cloudflare dashboard → add vidyanet.ai zone (nameserver change at GoDaddy).
  • Cloudflare Pages → kwilo-site project → Custom domains → add vidyanet.ai and www.vidyanet.ai on the main branch.