Internal Link Automator

What this does. For each target page you supply, this tool finds the most topically-related source pages using semantic embeddings, then asks a Gemini Flash model for a natural internal-link suggestion — either an anchor from existing copy on the source page, or a fresh one-line insertion with a rendered in-situ preview.

Usage tips

  1. Paste or upload target URLs (the pages that will receive links) and source URLs (the pages that will contain the links). You can also import candidates from a sitemap.
  2. Keep each list to 30 URLs or fewer per run — larger batches time out inside a single Function invocation.
  3. Isolate a run to a single region/language (e.g. UK-only sources and UK-only targets) to avoid weird cross-region linking.
  4. Pages are cached for 7 days and suggestions for 30 days. Tick Force refresh to bypass both.
  5. Anchor selection uses semantic embeddings (bge-large-en-v1.5) — a major upgrade on the original TF-IDF, so results should feel less random.

How it differs from the original Streamlit tool

  1. Runs on Cloudflare Pages + Functions — no long-lived Python server, no Streamlit session reset when you export.
  2. URL candidates come from paste/upload or a sitemap picker — no forced full-sitemap crawl.
  3. Similarity uses real semantic embeddings (Workers AI, bge-large-en-v1.5) instead of TF-IDF word overlap.
  4. All LLM calls route through Cloudflare AI Gateway for caching and cost dashboards.
  5. The Gemini model is dynamically resolved from the ListModels endpoint — the tool picks the newest stable Flash automatically, no code updates needed.
  6. Results persist server-side (KV, 30-day TTL) — exports don't wipe your working set.

Import URLs from a sitemap