vTilt
By roleFoundersKnow what to fix firstMarketersSee what happens after the clickCMOsSee what your budget really buys
By businessSaaSTurn signups into active usersEcommerceSee why shoppers abandon cartsAgenciesProve your work to clientsEnterpriseOne customer record for every team
MeasureWeb AnalyticsFind where buyers leaveSession ReplaySee why they left, not just that they didAdsKnow what paid visitors do nextIntegrationsOne snippet feeds your stack
ThinkPeopleOne profile per customerCustomer MemoryvTilt remembers every visitorSite KnowledgeAnswers and audits from your own pages
ActAsk AIAnswers from real behaviorAI ChatChat that knows the visitorEmail CampaignsEmail from real visits
PricingWhy vTiltDocs
Docs / Site knowledge
Getting Started
OverviewInstallInitializeIdentify usersTrack eventsLogout & resetVerify eventsCommon mistakes
Guides
Event forwardingReverse proxyRealtime dashboardSite knowledge
Frontend frameworks
Next.jsNuxt.jsVue.jsReactReact RouterRemixGatsbySvelte / SvelteKitAstroAngularTanStack StartDocusaurus
Backend frameworks
NestJSHonoCloudflare WorkersDjangoFlaskLaravelPhoenixRuby on Rails
Backend languages
PythonPHPRubyElixirGoJava.NET / C#Rust
Stack guides
Vue + PHP
API Reference
Browser SDK
Script bundlesAutocaptureWeb VitalsSession recordingChat widgetFeature readinessRemote configurationDebug logging
Node SDK
Install & setupCapture, identify & aliasContext & shutdownGlobal properties & opt-outError tracking
MCP server
Guides
OverviewAuthenticationOAuthAgent skills (prompts)AI intelligenceSite knowledgeGoogle AdsMeta Ads
Client setup
CursorClaude DesktopVS CodeCodex

Getting Started

OverviewInstallInitializeIdentify usersTrack eventsLogout & resetVerify eventsCommon mistakes

Guides

Event forwardingReverse proxyRealtime dashboardSite knowledge

API Reference

MCP server

On this page

On this page

  • Why it exists
  • Where indexed content is used
  • How crawling works
  • 1. URL discovery
  • 2. HTTP fetch
  • 3. Recording fallback
  • 4. Merge, skip, and persist
  • Crawl schedule
  • Output format
  • Chunk kinds
  • Crawl sources (per page)
  • Dashboard
  • Prerequisites
  • Security
  • Limits
  • Related
DocsGuidesSite knowledge

Site knowledge

Last updated July 22, 2026

How vTilt crawls and indexes your website for AI — HTTP crawl plus session-recording fallback, markdown chunks, semantic search, and dashboard review.

Site knowledge is vTilt's per-project index of your website content. It crawls public pages over HTTP, falls back to session recordings for auth-gated or JavaScript-heavy routes, and stores clean markdown chunks with embeddings so AI surfaces can answer product, pricing, and policy questions with citations — not guesses.

Site knowledge is opt-in per project — turn it on under Project → Site Knowledge when you want crawling and AI context from your website.

#Why it exists

Structured page content is ground truth for everything downstream:

GoalWhat site knowledge provides
Accurate AI answersWidget chat, MCP agents, and summarizers cite indexed copy instead of hallucinating
Behavior in contextSession summaries attach page content for pathnames a visitor actually opened
Ad and landing-page reviewAgents compare campaign copy with what /pricing or /landing actually says
Operator visibilityReview what was indexed, which source was used, and re-crawl on demand

Site knowledge stores what your site says today (one row per pathname in site_pages) plus append-on-change version history (site_page_versions) so you can correlate layout/copy changes with metrics — see Limits below.

#Where indexed content is used

SurfaceHow it consumes site knowledge
MCP (site-knowledge toolset)search_site_knowledge, get_site_page, list_site_pages, list_site_references, get_site_reference, get_site_overview — see Site knowledge (MCP)
Widget chatSite overview (synopsis/features) plus top relevant chunks (and the visitor’s current page when known) pre-injected into the system prompt; search_site_knowledge available as a tool. Turn on under Channels → Chat → Settings (requires Indexing → Use indexed pages in AI)
AI memorySession and conversation summarizers attach === WEBSITE KNOWLEDGE === (and === BUSINESS CONTEXT ===) for visited pathnames via buildSiteContextBlock
AI CanvasPerson context includes page chunks for URLs the person opened
Campaign AI fieldsGenerated business context pulls from indexed site chunks
VQLQuery site_pages, site_knowledge_chunks, site_page_elements, site_page_versions, and site_overview with semantic :embed('text')
References (dashboard)Upload briefs/PDFs under Site Knowledge → References so RAG includes operator files alongside crawled pages

Tip: Site knowledge answers questions about your website. For vTilt SDK install steps or MCP auth, use search_docs — not site knowledge.

#How crawling works

vTilt runs a hybrid crawl on a schedule and on manual trigger:

Discover URLs → HTTP fetch → (recording fallback if needed) → merge → chunk → embed → store
text

#1. URL discovery

Discovery runs in two flows that build a priority-ranked URL list:

FlowSourceRole
UsagePageviewsTraffic-weighted pathnames from the last 7 days — high-traffic pages first
UsageSession recordingsURLs seen in replay metadata — catches routes HTTP alone misses
StructureSitemapBroad coverage from sitemap.xml (and nested indexes)
StructureLink-followingFollows internal links from your landing page — reveals real navigation and pages missing from the sitemap
Structurellms.txt / llms-full.txtLinks from AI-oriented site maps
StructureSeed paths/, /pricing, /about as bootstrap

The usage flow captures what your visitors actually see (including auth-gated pages, via recordings); the structure flow maps your public, link-reachable pages. A pathname found by both is kept once and prioritized.

Near-duplicate pages are sampled, not exhaustively crawled. When many pages share a template but differ only by an id (for example thousands of /property/12345 detail pages), the structure flow keeps a representative sample rather than every one — pages your visitors actually open are always kept.

Only hosts on your project's verified domains are fetched. Private IPs and off-domain URLs are blocked (SSRF guard).

#2. HTTP fetch

For each discovered URL, vTilt:

  1. Fetches the page with VtiltSiteCrawler/1.0 user agent (15 s timeout)
  2. Honors robots.txt Disallow rules
  3. Parses HTML with JSDOM — title, meta tags, Open Graph, JSON-LD, forms, links
  4. Converts the body to clean markdown (headings, lists, links, tables preserved) via a Readability-vs-full-DOM dual run with quality fallback

Note: HTTP crawl does not execute JavaScript. When a public page comes back thin or JavaScript-heavy and headless rendering is configured, vTilt re-renders it with a headless browser (Cloudflare Browser Run) to capture the real content before falling back to recordings.

#3. Recording fallback

When HTTP returns 401/403, is auth-gated, or the extracted body is under ~500 characters, vTilt samples up to five session recordings for that pathname and rebuilds the page from rrweb snapshots (FullSnapshot + DOM mutations). The same markdown engine used for recording transcripts drops nav/chrome and keeps substantive content.

Recording fallback requires:

  • Session replay enabled on the project
  • Real visitor sessions that reached the pathname (with a FullSnapshot in the recording)

Indexed pages from this path are marked source: recording or hybrid.

#4. Merge, skip, and persist

  • HTTP and recording extracts are merged into one canonical page per pathname
  • A content hash skips re-embedding when nothing changed (saves cost on daily crawls)
  • Sections split on markdown heading boundaries with full heading ancestry (Pricing > Enterprise)
  • Chunks (~2 000 characters) are embedded with text-embedding-3-small (1536 dimensions)
  • Rows written to ClickHouse: site_pages, site_page_chunks
  • After each crawl, an LLM generates a project site overview (synopsis + taxonomy) in site_overview (best-effort — never fails the crawl)

#Crawl schedule

ModeScheduleScope
Usage discoveryDaily (03:00 UTC)Finds pageview + recording URLs (what visitors actually see)
Structure discoveryWeekly (Sunday 04:00 UTC)Sitemap + link-following + llms.txt (the site's public link graph)
CrawlingContinuous (every few minutes)Works through discovered URLs by priority; unchanged pages are skipped
ManualRe-crawl now in dashboardRuns both discovery flows, then indexes the pages in the background

Discovery queues the URLs to crawl; crawling then works through that queue continuously and picks up where it left off, so large sites finish reliably across multiple runs rather than being cut off by a single time-boxed pass. Default cap: 500 pages per crawl (configurable in project settings).

Re-crawl now returns immediately and indexes in the background — the dashboard shows a live progress bar (pages processed, pending, failed). If a very large site does not finish in one pass, a Resume button appears to continue; the background schedule also picks up the remainder. Auto-crawls run per project on your chosen frequency (daily or weekly) and can be paused independently with the auto-crawl toggle without disabling the whole feature.

New projects land on the Site Knowledge setup step after creation: enter your website URL to start indexing. Indexing runs in the background and typically takes a few minutes.

#Output format

The crawl pipeline is optimized for AI retrieval, not raw HTML archival.

LayerFormatStored?Purpose
Raw HTMLFull HTTP responseNoTransient input to the extractor
Markdown chunksClean text with heading pathsYes → site_page_chunksSemantic search, RAG, MCP citations
Page metadataTitle, meta, JSON-LD types, page type, auth flagYes → site_pagesFilters, list views, overview
Page summaryShort synopsis per pathnameYes → site_pages.summaryQuick context
Site overviewLLM synopsis + taxonomy JSONYes → site_overviewHigh-level orientation for agents
Embeddings1536-d vectorsYessearch_site_knowledge, VQL :embed()
Media / screenshotsDesktop + mobile full-page PNGs per public pageOptional → site_pages / versionsOff by default; enable Capture screenshots in settings (two viewports per page)

#Chunk kinds

Each chunk carries a chunk_kind for filtering:

KindTypical content
bodyMain page copy
pricingPricing sections (auto-detected from pathname or content)
faqFAQ-style Q&A blocks
formForm labels and fields
metaMeta description, Open Graph
structured_dataJSON-LD blocks
navNavigation labels (when extracted)
ui_labelShort UI strings

#Crawl sources (per page)

sourceMeaning
httpPublic HTTP crawl only
recordingExtracted from session recordings only
hybridBoth HTTP and recording contributed

#Dashboard

Project → Site Knowledge is a table of indexed pages. Configuration lives in a Settings modal, and clicking a row opens a full page detail view.

ControlWhereAction
Indexed pages tableMain areaSearch pathnames, filter by source, click a row to open its detail page
StatusToolbarLive page count, auth-gated count, last discovery, or crawl progress while a run is active
Settings modalToolbar → SettingsWebsite domain, enable toggle, crawl frequency, max pages, screenshots, full-site re-crawl
Page detailRow click (own page)Overview (summary, desktop/mobile screenshots, metadata), Content, and History tabs; per-page re-crawl

#Prerequisites

  1. Verified domains — add and verify your site host under project settings so the crawler is allowed to fetch it
  2. Session replay — enable for auth-gated or SPA pages that HTTP cannot render
  3. Traffic — pageviews and recordings drive URL discovery; low-traffic pages may not be indexed until a full crawl or sitemap picks them up

#Security

  • Crawl fetches only verified project domains; private IP ranges are blocked
  • robots.txt is respected
  • Recording extraction inherits replay masking and block rules from capture settings
  • Indexed content is tenant-scoped — agents never cross projects

#Limits

TopicCurrent behavior
JavaScript renderingPublic pages that return a thin body are re-rendered with a headless browser (Cloudflare Browser Run) when configured; otherwise SPAs rely on recording fallback or server-rendered HTML
Version historyAppend-on-change versions in site_page_versions; dashboard History tab + MCP list_page_versions / get_page_version / diff_page_versions
Event-timestamp DOM"What did the page look like at click time?" uses recording analysis, not the crawl index — see AI intelligence (recording_summaries, recording_chunks)
Raw HTML archiveNot persisted after extraction
Near-duplicate templatesPages sharing a template that differ only by an id are sampled, not crawled exhaustively (pages visitors open are always kept)

#Related

  • Site knowledge (MCP) — tools, VQL tables, and example agent prompts
  • AI intelligence — AI memory, recording summaries, and :embed() search
  • Session recording — enable replay for auth-gated page indexing
  • MCP server — connect an AI client to your project
PreviousRealtime dashboardGuidesNextNext.jsIntegration guides