Site / Creating a site

Comparison: TanStack Start

The other side, from its docs (preloading, SEO, data loading):

ConcernTanStack Startfoldkit-site + Plus
Route declarationFile-based routes; route tree by convention, with per-route code splittingExplicit tree over existing Foldkit Routers; no file convention, no codegen — and no per-route code splitting (a document is the split boundary today)
Data fetchingloader per route, run in parallel before render; beforeLoad for context; router cache + Query belowNo loaders: Surfaces declare reads, Remote plans and coalesces; the store + retention are the cache, policies are per-domain
WaterfallsParallel loaders per depth; deferred data for the restNo loader gate at all; satisfy fixed-point per data-dependence level; pending UI by convention
PrefetchBuilt in: intent/viewport/render strategies, freshness/retention windows, preloadRouteSame composition as navigation (sourcesFor + satisfy), trigger app-owned; no windows or lanes — Remote policy + retention decide
GuardsbeforeLoad redirects; server functions enforceRoute access would be presentation policy only (unbuilt); authority stays at RemoteServer/audience — the split is explicit, not layered
Head/SEOPer-route head() meta; SSR + streaming; prerender crawls linksTitles and head metadata (Site.metaOf) from the tree; SSR/static HTML + sitemap
Mutations + refreshRouter invalidation reruns loadersEntity/connection patches apply directly; membership-changing queries refetch (single-flight designed, last)
Server boundaryServer functions alongside routesSeparate by design: documents → SSR, semantic data → RemoteServer, HTTP → Effect HttpApi — the Site never becomes an HTTP router

The deepest difference is not a feature list. TanStack owns the runtime: its router schedules, caches, preloads, and renders. Foldkit Plus refuses the second runtime: the Site is pure topology, and every behavior above is some other package's primitive composed by the caller. That buys one transition per feature (UI, agent, and Sync meet at the same update) and costs the conveniences a runtime provides — per-route code splitting, preload lanes, loader caches — which arrive here only as compositions with proven demand, never as framework.