<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Reference on vanityURLs</title><link>https://vanityurls.link/en/docs/reference/</link><description>Recent content in Reference on vanityURLs</description><generator>Hugo</generator><language>en-CA</language><atom:link href="https://vanityurls.link/en/docs/reference/index.xml" rel="self" type="application/rss+xml"/><item><title>Analytics</title><link>https://vanityurls.link/en/docs/reference/analytics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/analytics/</guid><description>&lt;p&gt;vanityURLs analytics runs inside the Cloudflare Worker. It does not require browser tracking JavaScript, cookies, or a visitor account.&lt;/p&gt;
&lt;p&gt;Cloudflare Web Analytics and Real User Measurement (RUM) are not part of the vanityURLs baseline. Leave Cloudflare RUM disabled unless an operator intentionally wants browser-side performance telemetry outside the redirector&amp;rsquo;s server-side event model.&lt;/p&gt;
&lt;p&gt;The Worker sends analytics with &lt;code&gt;ctx.waitUntil()&lt;/code&gt;.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; Redirects and pages should continue responding even when the analytics provider is slow or unavailable.&lt;/p&gt;</description></item><item><title>Brand</title><link>https://vanityurls.link/en/docs/reference/brand/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/brand/</guid><description>&lt;p&gt;The vanityURLs brand standards now live at &lt;a href="https://brand.vanityurls.link/"&gt;brand.vanityurls.link&lt;/a&gt;. Use that site for logo, color, typography, badge, product UI, and asset guidance.&lt;/p&gt;
&lt;p&gt;Branding controls the public wordmark and the short line under generated public pages. These values live in &lt;code&gt;custom/v8s-site-config.json&lt;/code&gt; and are applied at build time, so a normal branded instance does not need to copy default pages into &lt;code&gt;custom/public/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can customize during &lt;code&gt;npm run setup&lt;/code&gt; or by manually updating files in &lt;code&gt;custom/&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Cheatsheet</title><link>https://vanityurls.link/en/docs/reference/cheatsheet/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/cheatsheet/</guid><description>&lt;p&gt;Use this cheatsheet when you already know the product and need the shortest path to the next correct action. It is designed to work on screen and as a browser-generated PDF.&lt;/p&gt;
&lt;div class="cheatsheet-grid"&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Daily workflow&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Need&lt;/th&gt;
 &lt;th&gt;Action / file&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Install deps&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Run once after checkout or dependency changes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Start locally&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;npm run dev&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Runs the Worker through Wrangler for local testing.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Validate&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;npm run check&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Builds and checks generated runtime artifacts before deploy.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Deploy&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;GitHub and Cloudflare automation publish the Worker.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Repositories&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Surface&lt;/th&gt;
 &lt;th&gt;Repository&lt;/th&gt;
 &lt;th&gt;Deploys to&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Redirector&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;vanityURLs/code&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://VanityURLs.link&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Documentation&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;vanityURLs/website&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://www.VanityURLs.link&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Generated output&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;build/&lt;/code&gt;, &lt;code&gt;src/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Do not edit directly.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Core files&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Use&lt;/th&gt;
 &lt;th&gt;Owner&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-links.txt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Human-authored redirect list.&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-site-config.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Branding, contacts, languages, timezone.&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-policies.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Allow domains, blocked domains, keyword policy.&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;defaults/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Product baseline copied or merged during build.&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Link row format&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Slug&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Public path segment. Keep it readable and durable.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Target&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;https://example.com/docs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Destination URL after policy checks.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;State&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;active&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Controls whether the redirect should resolve.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Metadata&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;notes&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Helps review, audit, dashboard display, and handoff.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Schedules&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Need&lt;/th&gt;
 &lt;th&gt;Syntax&lt;/th&gt;
 &lt;th&gt;Notes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Timed target&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;@schedule&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Indent schedule blocks below the link row.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Timezone&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;America/Toronto&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use IANA timezone names accepted by the runtime.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Exact links&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/launch&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Schedules apply to exact links, not splat namespaces.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Fallback&lt;/td&gt;
 &lt;td&gt;Link row target&lt;/td&gt;
 &lt;td&gt;The normal target remains the default outside windows.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Redirect behavior&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Input&lt;/th&gt;
 &lt;th&gt;Behavior&lt;/th&gt;
 &lt;th&gt;Check&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Known active slug&lt;/td&gt;
 &lt;td&gt;Redirects to target.&lt;/td&gt;
 &lt;td&gt;Confirm target and policy allow it.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Inactive or expired slug&lt;/td&gt;
 &lt;td&gt;Shows the matching status page.&lt;/td&gt;
 &lt;td&gt;Review state, dates, and generated registry.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Blocked destination&lt;/td&gt;
 &lt;td&gt;Does not redirect.&lt;/td&gt;
 &lt;td&gt;Check policy source and generated blocklist.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Unknown path&lt;/td&gt;
 &lt;td&gt;Returns not-found handling.&lt;/td&gt;
 &lt;td&gt;Check slug spelling and generated routes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Customize safely&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Goal&lt;/th&gt;
 &lt;th&gt;Use&lt;/th&gt;
 &lt;th&gt;Avoid&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Change links&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-links.txt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Editing &lt;code&gt;build/v8s.json&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Brand pages&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-site-config.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Copying full templates unless needed.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Override assets&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;custom/public/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Changing product defaults for one instance.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Change Worker code&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;scripts/workers/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Editing generated &lt;code&gt;src/&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
 &lt;section class="cheatsheet-card"&gt;
 &lt;h2&gt;Troubleshooting&lt;/h2&gt;
 &lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Symptom&lt;/th&gt;
 &lt;th&gt;Check&lt;/th&gt;
 &lt;th&gt;Likely fix&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Works locally, not live&lt;/td&gt;
 &lt;td&gt;GitHub action and Worker deploy status.&lt;/td&gt;
 &lt;td&gt;Push, wait for deploy, then retest.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Link missing&lt;/td&gt;
 &lt;td&gt;Generated &lt;code&gt;build/v8s.json&lt;/code&gt;.&lt;/td&gt;
 &lt;td&gt;Fix source row, then rebuild.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Wrong language page&lt;/td&gt;
 &lt;td&gt;Configured languages and localized overrides.&lt;/td&gt;
 &lt;td&gt;Add localized page or rely on fallback.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Schedule surprises&lt;/td&gt;
 &lt;td&gt;Operator timezone and date window.&lt;/td&gt;
 &lt;td&gt;Use explicit IANA timezone names.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
 &lt;/table&gt;
 &lt;/section&gt;
&lt;/div&gt;
&lt;h2 id="quick-comparisons"&gt;Quick comparisons&lt;/h2&gt;
&lt;table class="cheatsheet-compare"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Choice&lt;/th&gt;
 &lt;th&gt;Use this when&lt;/th&gt;
 &lt;th&gt;Remember&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;defaults/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;You are changing the product baseline for every instance.&lt;/td&gt;
 &lt;td&gt;Review as product behavior.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;You are changing one deployed instance.&lt;/td&gt;
 &lt;td&gt;Best place for operator-owned changes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Exact slug&lt;/td&gt;
 &lt;td&gt;The public path must resolve to one known destination.&lt;/td&gt;
 &lt;td&gt;Supports schedule behavior.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Splat namespace&lt;/td&gt;
 &lt;td&gt;A stable prefix should forward nested paths.&lt;/td&gt;
 &lt;td&gt;Do not use for time-sensitive redirects.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Cloudflare products</title><link>https://vanityurls.link/en/docs/reference/cloudflare-products/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/cloudflare-products/</guid><description>&lt;p&gt;vanityURLs is a URL shortener that runs on Cloudflare&amp;rsquo;s edge network with your &lt;em&gt;own&lt;/em&gt; domain.&lt;/p&gt;
&lt;table class="w-full table-fixed"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th class="w-1/3 align-top"&gt;Product&lt;/th&gt;
 &lt;th class="w-2/3 align-top"&gt;Role in vanityURLs&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/products/dns/"&gt;Cloudflare DNS&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Authoritative DNS for the short domain, including the proxied Worker custom domain record&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/products/workers/"&gt;Cloudflare Workers&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Runtime for redirects, protected operational pages, generated static assets, and server-side analytics dispatch&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/products/access/"&gt;Cloudflare Access&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Zero Trust Network Access (ZTNA) protection for protected operational surfaces such as the Stats dashboard and Runtime test matrix&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/products/ssl/"&gt;Cloudflare SSL/TLS&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Edge certificates, Universal SSL, HTTPS enforcement, and minimum TLS configuration&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="network-protection-before-traffic-reaches-the-vanityurls-instance"&gt;Network protection before traffic reaches the vanityURLs instance&lt;/h2&gt;
&lt;table class="w-full table-fixed"&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th class="w-1/3 align-top"&gt;Product or surface&lt;/th&gt;
 &lt;th class="w-2/3 align-top"&gt;Role in vanityURLs&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/products/waf/"&gt;Web Application Firewall&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Custom security rules for scanner probes, unexpected methods, suspicious clients, unwanted AI crawlers, and other edge-blocked traffic&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/products/rate-limiting/"&gt;Cloudflare Rate Limiting&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Rate limiting for abuse patterns that should not spend Worker resources&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/ddos/"&gt;Distributed Denial-of-Service (DDoS) Protection&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Always-on network protection&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://www.cloudflare.com/products/bot-management"&gt;Cloudflare Bot Management&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Bot controls used to reduce automated abuse before requests reach the Worker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developers.cloudflare.com/bots/concepts/bot/#ai-crawlers"&gt;Cloudflare AI Crawl Control&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Crawler-specific controls for selected AI crawler families&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developers.cloudflare.com/rules/"&gt;Cloudflare Rules&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Managed Transforms and URL normalization before traffic reaches the vanityURLs instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://developers.cloudflare.com/waf/analytics/security-events/"&gt;Cloudflare Security Events&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Review surface for mitigations applied before the Worker runs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cloudflare is an evergreen SaaS platform: features, APIs, dashboard labels, and navigation can change continuously without major version numbers. To keep the documentation aligned with that moving surface, vanityURLs maintains a structured &lt;a href="https://github.com/vanityURLs/website/blob/main/data/cloudflare-protection-defaults.json"&gt;Cloudflare dashboard capture&lt;/a&gt; in JSON. The capture helps maintainers compare UI changes over time and update the documentation deliberately. For the maintenance rationale, see &lt;a href="https://github.com/vanityURLs/code/blob/main/docs/adr/0012-maintain-cloudflare-dashboard-capture.md"&gt;ADR 0012&lt;/a&gt; and &lt;a href="https://vanityurls.link/en/blog/json-audit-ledger-for-cloudflare-docs/"&gt;The JSON audit ledger behind the Cloudflare setup docs&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Configuration files</title><link>https://vanityurls.link/en/docs/reference/configuration-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/configuration-files/</guid><description>&lt;p&gt;vanityURLs keeps product defaults, instance-owned choices, local workstation settings, and generated runtime artifacts in separate files.&lt;/p&gt;
&lt;p&gt;Use this page to identify the current configuration files and the schema shape each one follows. The exact implementation contract remains the Git files and scripts in the code repository.&lt;/p&gt;
&lt;h2 id="source-configuration"&gt;Source configuration&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;File&lt;/th&gt;
 &lt;th&gt;Format&lt;/th&gt;
 &lt;th&gt;Schema shape&lt;/th&gt;
 &lt;th&gt;Owner&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/wrangler.toml"&gt;&lt;code&gt;wrangler.toml&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;TOML, following &lt;a href="https://developers.cloudflare.com/workers/wrangler/configuration/"&gt;Cloudflare Wrangler configuration&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;compatibility_date&lt;/code&gt;, &lt;code&gt;workers_dev&lt;/code&gt;, &lt;code&gt;preview_urls&lt;/code&gt;, &lt;code&gt;[build]&lt;/code&gt;, &lt;code&gt;[assets]&lt;/code&gt;, &lt;code&gt;[vars]&lt;/code&gt;, &lt;code&gt;[[routes]]&lt;/code&gt;, &lt;code&gt;[observability]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/package.json"&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;npm package manifest JSON&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;scripts&lt;/code&gt;, &lt;code&gt;devDependencies&lt;/code&gt;, package metadata&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;package-lock.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;npm lockfile JSON&lt;/td&gt;
 &lt;td&gt;Locked dependency graph generated by npm&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/v8s-site-config.json"&gt;&lt;code&gt;defaults/v8s-site-config.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs site config JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Product baseline for &lt;code&gt;i18n&lt;/code&gt;, &lt;code&gt;links&lt;/code&gt;, and &lt;code&gt;operator&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-site-config.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs site config JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Instance overrides for &lt;code&gt;i18n&lt;/code&gt;, &lt;code&gt;links&lt;/code&gt;, &lt;code&gt;operator&lt;/code&gt;, and &lt;code&gt;branding&lt;/code&gt;; &lt;code&gt;operator.operator_domain&lt;/code&gt; can drive default contact email domains&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/v8s-links.txt"&gt;&lt;code&gt;defaults/v8s-links.txt&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Pipe-delimited text with optional inline &lt;code&gt;@schedule&lt;/code&gt; blocks&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;slug|target|state|title|description|tags|owner|expires_at|notes&lt;/code&gt;, followed by indented schedule directives when needed&lt;/td&gt;
 &lt;td&gt;Product starter links&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-links.txt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Pipe-delimited text with optional inline &lt;code&gt;@schedule&lt;/code&gt; blocks&lt;/td&gt;
 &lt;td&gt;Same as &lt;code&gt;defaults/v8s-links.txt&lt;/code&gt;; this is the &lt;a href="https://vanityurls.link/en/docs/reference/link-format/"&gt;human-authored source of truth for links&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-schedules.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Legacy vanityURLs schedule JSON&lt;/td&gt;
 &lt;td&gt;Deprecated 3.x compatibility source read by the build and current &lt;code&gt;lnk schedule&lt;/code&gt; command; inline &lt;code&gt;@schedule&lt;/code&gt; blocks take precedence&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/v8s-policies.json"&gt;&lt;code&gt;defaults/v8s-policies.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs policy JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;defaults&lt;/code&gt;, &lt;code&gt;allow_domains&lt;/code&gt;, &lt;code&gt;blocked_keywords&lt;/code&gt;, &lt;code&gt;block_domains&lt;/code&gt;, optional &lt;code&gt;generated_sources&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-policies.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs policy JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Same as &lt;code&gt;defaults/v8s-policies.json&lt;/code&gt;; custom policy replaces the default source policy before generated feeds are merged&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/v8s-blocklist-categories.json"&gt;&lt;code&gt;defaults/v8s-blocklist-categories.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs policy taxonomy JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;categories&lt;/code&gt;, &lt;code&gt;severities&lt;/code&gt;, &lt;code&gt;sources&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-blocklist-categories.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs policy taxonomy JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Optional custom extension or override for generated blocklist categories, severities, and sources&lt;/td&gt;
 &lt;td&gt;Instance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/v8s-language-metadata.json"&gt;&lt;code&gt;defaults/v8s-language-metadata.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs language metadata JSON&lt;/td&gt;
 &lt;td&gt;Product labels for generated localized page lists and state-page navigation&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/legal/v8s-legal-content.json"&gt;&lt;code&gt;defaults/legal/v8s-legal-content.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs legal content JSON&lt;/td&gt;
 &lt;td&gt;Default legal-page, Trust &amp;amp; Safety, security, and response-window copy rendered by the build&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/v8s-local-config.json"&gt;&lt;code&gt;defaults/v8s-local-config.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs local helper JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;shell_helper&lt;/code&gt;, &lt;code&gt;lnk_cli&lt;/code&gt;, &lt;code&gt;local_publish&lt;/code&gt;, &lt;code&gt;registry&lt;/code&gt;, &lt;code&gt;repository&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Product&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;custom/v8s-local-config.json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;vanityURLs local helper JSON, &lt;code&gt;schema_version: &amp;quot;1.0&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Workstation-specific helper paths and local publish settings written by &lt;code&gt;npm run local-install&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Workstation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/vanityURLs/code/blob/main/defaults/public/_headers"&gt;&lt;code&gt;defaults/public/_headers&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Cloudflare static asset header rules&lt;/td&gt;
 &lt;td&gt;Path pattern followed by indented header lines&lt;/td&gt;
 &lt;td&gt;Product or instance overlay&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;











&lt;div class="not-prose my-5 rounded-lg border border-blue-200 dark:border-blue-800 bg-blue-50 dark:bg-blue-900/20 p-4"&gt;
 &lt;div class="flex gap-3"&gt;
 &lt;svg class="w-5 h-5 text-blue-500 dark:text-blue-400 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/&gt;
 &lt;/svg&gt;
 &lt;div class="flex-1 min-w-0"&gt;
 &lt;p class="text-sm font-semibold text-blue-800 dark:text-blue-300 mb-1"&gt;Legacy blocklist filenames &lt;span class="ml-2 inline-flex items-center gap-1 rounded border border-amber-200 bg-amber-100 px-1.5 py-0.5 text-[0.65rem] font-semibold text-amber-700 dark:border-amber-800 dark:bg-amber-900/30 dark:text-amber-400"&gt;Changed in 3.0.0&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Runtime registry</title><link>https://vanityurls.link/en/docs/reference/runtime-registry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/runtime-registry/</guid><description>&lt;p&gt;&lt;code&gt;build/v8s.json&lt;/code&gt; is the generated runtime registry consumed by the Worker. Humans edit source files such as &lt;code&gt;custom/v8s-links.txt&lt;/code&gt;; the build validates and compiles those files into this runtime shape.&lt;/p&gt;
&lt;h2 id="schema-30"&gt;Schema 3.0&lt;/h2&gt;
&lt;p&gt;Schema &lt;code&gt;3.0&lt;/code&gt; is tree-first:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;schema_version&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Runtime registry contract version, currently &lt;code&gt;3.0&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;generated_at&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Build timestamp&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;generated_timezone&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Operator timezone used by protected dashboards when displaying build time&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;default_state&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Fallback lifecycle state, normally &lt;code&gt;permanent&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;routing&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;State-to-outcome map used by the Worker&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tree&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Canonical nested lookup structure for runtime resolution&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;links[]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Compatibility array for dashboards, local helpers, and review workflows&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each tree node has a &lt;code&gt;children&lt;/code&gt; object and may have a &lt;code&gt;link&lt;/code&gt;. Each &lt;code&gt;link&lt;/code&gt; keeps the same fields exposed in &lt;code&gt;links[]&lt;/code&gt;, including &lt;code&gt;slug&lt;/code&gt;, &lt;code&gt;match&lt;/code&gt;, &lt;code&gt;target&lt;/code&gt;, &lt;code&gt;state&lt;/code&gt;, metadata, and optional &lt;code&gt;schedule&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Custom overrides</title><link>https://vanityurls.link/en/docs/reference/custom-overrides/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/custom-overrides/</guid><description>&lt;p&gt;Use &lt;code&gt;custom/&lt;/code&gt; for instance-owned files. This keeps your deployment upgradable because default pages, Worker logic, source policy, and local helper settings can move forward without mixing in every local choice.&lt;/p&gt;
&lt;p&gt;For the upgrade rationale, read &lt;a href="https://vanityurls.link/en/blog/keeping-vanityurls-upgradable-with-custom-overrides/"&gt;Keeping vanityURLs upgradable with custom overrides&lt;/a&gt;. For the build order and generated artifacts, read &lt;a href="https://vanityurls.link/en/docs/reference/configuration-files/"&gt;Configuration files&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="defaults-versus-custom"&gt;Defaults versus custom&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;defaults/&lt;/code&gt; is the product baseline. &lt;code&gt;custom/&lt;/code&gt; is your instance overlay. Files in &lt;code&gt;custom/&lt;/code&gt; either replace specific defaults or provide instance data that should survive upstream updates.&lt;/p&gt;</description></item><item><title>Public and status pages</title><link>https://vanityurls.link/en/docs/reference/public-pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/public-pages/</guid><description>&lt;p&gt;Use &lt;code&gt;custom/public/&lt;/code&gt; when an instance needs to replace generated public pages, add public assets, or customize link status pages. Use &lt;a href="https://vanityurls.link/en/docs/reference/custom-overrides/"&gt;Custom overrides&lt;/a&gt; for the broader configuration-file map.&lt;/p&gt;
&lt;h2 id="public-override-map"&gt;Public override map&lt;/h2&gt;











&lt;div class="not-prose my-5 rounded-lg border border-amber-200 dark:border-amber-800 bg-amber-50 dark:bg-amber-900/20 p-4"&gt;
 &lt;div class="flex gap-3"&gt;
 &lt;svg class="w-5 h-5 text-amber-500 dark:text-amber-400 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"&gt;
 &lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/&gt;
 &lt;/svg&gt;
 &lt;div class="flex-1 min-w-0"&gt;
 &lt;p class="text-sm font-semibold text-amber-800 dark:text-amber-300 mb-1"&gt;Avoid replacing shared public assets casually&lt;/p&gt;</description></item><item><title>Glossary</title><link>https://vanityurls.link/en/docs/reference/glossary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/glossary/</guid><description>&lt;p&gt;The glossary defines the terms and abbreviations used on the web site.&lt;/p&gt;
&lt;section id="terms"&gt;
 &lt;h2&gt;Terms&lt;/h2&gt;
 &lt;dl&gt;
 &lt;dt&gt;&lt;dfn id="access-application"&gt;Access application&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A Cloudflare Zero Trust application that protects selected paths, such as localized stats paths like &lt;code&gt;/en/_stats/&lt;/code&gt; and &lt;code&gt;/fr/_stats/&lt;/code&gt;, plus &lt;code&gt;/_tests/*&lt;/code&gt;, before the Worker serves those pages.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="access-policy"&gt;Access policy&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A Cloudflare Zero Trust rule that decides which identities can reach a protected Access application.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="alias"&gt;Alias&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The short path or keyword used to reach a configured destination.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="badge"&gt;Badge&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A compact visual link that advertises, previews, or shares an alias.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="block-policy"&gt;Block policy&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The instance-owned rules in &lt;code&gt;custom/v8s-policies.json&lt;/code&gt; that block unsafe domains, keywords, scanner paths, or unwanted traffic before redirect lookup.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="build-artifact"&gt;Build artifact&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A generated file under &lt;code&gt;build/&lt;/code&gt; or &lt;code&gt;src/&lt;/code&gt;. Edit source files in &lt;code&gt;custom/&lt;/code&gt; or &lt;code&gt;defaults/&lt;/code&gt;, then rebuild instead of editing artifacts directly.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="custom-overlay"&gt;Custom overlay&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The instance-owned layer under &lt;code&gt;custom/&lt;/code&gt;. It overrides or extends product defaults without editing upstream files.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="default-target"&gt;Default target&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The fallback destination used by a scheduled link when no time-based rule is currently active.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="destination"&gt;Destination&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The long URL a short link redirects to. In the link format, it is stored in the &lt;code&gt;target&lt;/code&gt; column.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="generated-registry"&gt;Generated registry&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The runtime redirect registry written to &lt;code&gt;build/v8s.json&lt;/code&gt; during build from links, inline schedules, policies, and configuration.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="generated-page"&gt;Generated page&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A page emitted by the redirector for expansion, fallback, link status, legal, privacy, or other public runtime surfaces.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="hardening"&gt;Hardening&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;Reducing the available attack surface by disabling unused features, tightening browser policies, and keeping security controls owned by one clear source of truth.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="identity-provider"&gt;Identity provider&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A login source used by Cloudflare Access, such as GitHub, Google, or one-time PIN, to confirm who is trying to reach a protected page.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="idempotent"&gt;Idempotent&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A command or operation that can be run repeatedly with the same inputs without creating duplicate state or requiring a fresh setup. In vanityURLs, &lt;code&gt;npm run setup&lt;/code&gt; rereads existing answers and updates the same generated files.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="idna"&gt;IDNA&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;Internationalized Domain Names in Applications, the standard that lets software represent non-ASCII domain names in DNS-compatible ASCII form.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="link-registry"&gt;Link registry&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The set of short-link records used by vanityURLs. Humans edit &lt;code&gt;custom/v8s-links.txt&lt;/code&gt;; the build produces the generated registry consumed by the Worker.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="operator"&gt;Operator&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The person, team, or organization responsible for the vanityURLs instance, public pages, trust contacts, and legal-page configuration.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="owner-label"&gt;Owner label&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A short internal value in &lt;code&gt;v8s-links.txt&lt;/code&gt; that identifies the person or team accountable for a link.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="punycode"&gt;Punycode&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The ASCII encoding used by IDNA for internationalized domain labels, usually visible with the &lt;code&gt;xn--&lt;/code&gt; prefix.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="random-slug"&gt;Random slug&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A slug generated by &lt;code&gt;lnk&lt;/code&gt; when you provide a destination but do not choose the short path yourself.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="redirect"&gt;Redirect&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A short-link request that resolves to a configured destination.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="route"&gt;Route&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The Cloudflare Workers mapping that sends requests for your short domain to the vanityURLs Worker.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="runtime"&gt;Runtime&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The Cloudflare Worker and static assets that serve redirects and pages after build and deployment.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="scheduled-link"&gt;Scheduled link&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A short link whose destination can change by day, time window, and timezone using inline &lt;code&gt;@schedule&lt;/code&gt; rules in &lt;code&gt;v8s-links.txt&lt;/code&gt;.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="short-domain"&gt;Short domain&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The domain used for redirects, such as &lt;code&gt;v8s.link&lt;/code&gt; or &lt;code&gt;go.example.com&lt;/code&gt;.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="slug"&gt;Slug&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The path after your short domain. In &lt;code&gt;https://v8s.link/docs&lt;/code&gt;, the slug is &lt;code&gt;docs&lt;/code&gt;.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="splat-link"&gt;Splat link&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A link stored as &lt;code&gt;slug/*&lt;/code&gt; that forwards the remaining path into a destination containing &lt;code&gt;:splat&lt;/code&gt;.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="tag"&gt;Tag&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A comma-separated label on a link row used to group links, describe purpose, or select tag-specific random slug lengths.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="worker"&gt;Worker&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The Cloudflare Workers application that runs the vanityURLs redirector.&lt;/dd&gt;
 &lt;/dl&gt;
&lt;/section&gt;

&lt;section id="abbreviations"&gt;
 &lt;h2&gt;Abbreviations&lt;/h2&gt;
 &lt;dl&gt;
 &lt;dt&gt;&lt;dfn id="adr"&gt;&lt;abbr class="no-underline" title="Architecture Decision Record"&gt;ADR&lt;/abbr&gt; &amp;larr; Architecture Decision Record&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A short document that records an implementation decision and the reason behind it.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="api"&gt;&lt;abbr class="no-underline" title="Application Programming Interface"&gt;API&lt;/abbr&gt; &amp;larr; Application Programming Interface&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A documented interface that software can call, such as an analytics or provider endpoint.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="cli"&gt;&lt;abbr class="no-underline" title="Command Line Interface"&gt;CLI&lt;/abbr&gt; &amp;larr; Command Line Interface&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A terminal command interface, such as the &lt;code&gt;lnk&lt;/code&gt; helper used to manage links.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="ci"&gt;&lt;abbr class="no-underline" title="Continuous Integration"&gt;CI&lt;/abbr&gt; &amp;larr; Continuous Integration&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;Automated checks that run before code is merged or deployed.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="csp"&gt;&lt;abbr class="no-underline" title="Content Security Policy"&gt;CSP&lt;/abbr&gt; &amp;larr; Content Security Policy&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;Browser security rules that limit which scripts, styles, images, and connections a page may use.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="dns"&gt;&lt;abbr class="no-underline" title="Domain Name System"&gt;DNS&lt;/abbr&gt; &amp;larr; Domain Name System&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The system that maps hostnames to network destinations and lets Cloudflare route your short domain.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="gdpr"&gt;&lt;abbr class="no-underline" title="General Data Protection Regulation"&gt;GDPR&lt;/abbr&gt; &amp;larr; General Data Protection Regulation&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;European Union privacy regulation that may affect operators handling personal data from EU visitors.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="html"&gt;&lt;abbr class="no-underline" title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt; &amp;larr; HyperText Markup Language&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The markup language used for web pages.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="http"&gt;&lt;abbr class="no-underline" title="Hypertext Transfer Protocol"&gt;HTTP&lt;/abbr&gt; &amp;larr; Hypertext Transfer Protocol&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The protocol used by browsers, clients, and Workers to request and return web resources.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="ip"&gt;&lt;abbr class="no-underline" title="Internet Protocol"&gt;IP&lt;/abbr&gt; &amp;larr; Internet Protocol&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;Network addressing used to route traffic; analytics and logs may include visitor IP addresses.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="json"&gt;&lt;abbr class="no-underline" title="JavaScript Object Notation"&gt;JSON&lt;/abbr&gt; &amp;larr; JavaScript Object Notation&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A structured data format used by vanityURLs for generated registries and configuration files.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="otp"&gt;&lt;abbr class="no-underline" title="One-Time PIN"&gt;OTP&lt;/abbr&gt; &amp;larr; One-Time PIN&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A temporary login code that Cloudflare Access can send directly to an approved email address.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="qr"&gt;&lt;abbr class="no-underline" title="Quick Response"&gt;QR&lt;/abbr&gt; &amp;larr; Quick Response&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A scannable barcode format often used to share short links in print or slides.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="rfc"&gt;&lt;abbr class="no-underline" title="Request for Comments"&gt;RFC&lt;/abbr&gt; &amp;larr; Request for Comments&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A standards-track or informational publication, such as RFC 9116 for &lt;code&gt;security.txt&lt;/code&gt;.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="sla"&gt;&lt;abbr class="no-underline" title="Service-Level Agreement"&gt;SLA&lt;/abbr&gt; &amp;larr; Service-Level Agreement&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A formal service commitment; vanityURLs docs warn operators not to promise one casually.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="sri"&gt;&lt;abbr class="no-underline" title="Subresource Integrity"&gt;SRI&lt;/abbr&gt; &amp;larr; Subresource Integrity&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A browser integrity check that lets HTML pin the expected hash of a loaded script or stylesheet.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="tls"&gt;&lt;abbr class="no-underline" title="Transport Layer Security"&gt;TLS&lt;/abbr&gt; &amp;larr; Transport Layer Security&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The encryption protocol behind HTTPS.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="url"&gt;&lt;abbr class="no-underline" title="Uniform Resource Locator"&gt;URL&lt;/abbr&gt; &amp;larr; Uniform Resource Locator&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;The address of a web resource, including the protocol, host, path, and optional query string.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="utm"&gt;&lt;abbr class="no-underline" title="Urchin Tracking Module"&gt;UTM&lt;/abbr&gt; &amp;larr; Urchin Tracking Module&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;Campaign query parameters used by analytics tools.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="vdp"&gt;&lt;abbr class="no-underline" title="Vulnerability Disclosure Policy"&gt;VDP&lt;/abbr&gt; &amp;larr; Vulnerability Disclosure Policy&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A policy that explains how security researchers should report vulnerabilities.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="waf"&gt;&lt;abbr class="no-underline" title="Web Application Firewall"&gt;WAF&lt;/abbr&gt; &amp;larr; Web Application Firewall&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;Cloudflare edge rules that block suspicious or abusive traffic before it reaches the Worker.&lt;/dd&gt;
 &lt;dt&gt;&lt;dfn id="yaml"&gt;&lt;abbr class="no-underline" title="YAML Ain&amp;#39;t Markup Language"&gt;YAML&lt;/abbr&gt; &amp;larr; YAML Ain&amp;#39;t Markup Language&lt;/dfn&gt;&lt;/dt&gt;
 &lt;dd&gt;A human-readable structured data format used by the documentation site for data and configuration.&lt;/dd&gt;
 &lt;/dl&gt;
&lt;/section&gt;</description></item><item><title>Timezones</title><link>https://vanityurls.link/en/docs/reference/timezones/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/timezones/</guid><description>&lt;p&gt;vanityURLs accepts IANA timezone names, plus &lt;code&gt;UTC&lt;/code&gt;. Do not enter numeric offsets such as &lt;code&gt;-4&lt;/code&gt;, &lt;code&gt;-5&lt;/code&gt;, or &lt;code&gt;GMT-0400&lt;/code&gt;; offsets do not describe daylight saving time.&lt;/p&gt;
&lt;p&gt;Use the place-based timezone that matches the operator or scheduled link. For example, Eastern Time should usually be &lt;code&gt;America/Toronto&lt;/code&gt; or &lt;code&gt;America/New_York&lt;/code&gt;. The JavaScript &lt;code&gt;Intl&lt;/code&gt; timezone database handles the switch between EST and EDT.&lt;/p&gt;
&lt;h2 id="common-choices"&gt;Common choices&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Region&lt;/th&gt;
 &lt;th&gt;Choices&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;UTC&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;UTC&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Canada&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;America/Toronto&lt;/code&gt;, &lt;code&gt;America/Montreal&lt;/code&gt;, &lt;code&gt;America/Halifax&lt;/code&gt;, &lt;code&gt;America/Winnipeg&lt;/code&gt;, &lt;code&gt;America/Regina&lt;/code&gt;, &lt;code&gt;America/Edmonton&lt;/code&gt;, &lt;code&gt;America/Vancouver&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;United States&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;America/New_York&lt;/code&gt;, &lt;code&gt;America/Chicago&lt;/code&gt;, &lt;code&gt;America/Denver&lt;/code&gt;, &lt;code&gt;America/Phoenix&lt;/code&gt;, &lt;code&gt;America/Los_Angeles&lt;/code&gt;, &lt;code&gt;America/Anchorage&lt;/code&gt;, &lt;code&gt;Pacific/Honolulu&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Europe&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Europe/London&lt;/code&gt;, &lt;code&gt;Europe/Dublin&lt;/code&gt;, &lt;code&gt;Europe/Paris&lt;/code&gt;, &lt;code&gt;Europe/Berlin&lt;/code&gt;, &lt;code&gt;Europe/Rome&lt;/code&gt;, &lt;code&gt;Europe/Madrid&lt;/code&gt;, &lt;code&gt;Europe/Amsterdam&lt;/code&gt;, &lt;code&gt;Europe/Stockholm&lt;/code&gt;, &lt;code&gt;Europe/Zurich&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Latin America&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;America/Mexico_City&lt;/code&gt;, &lt;code&gt;America/Bogota&lt;/code&gt;, &lt;code&gt;America/Lima&lt;/code&gt;, &lt;code&gt;America/Santiago&lt;/code&gt;, &lt;code&gt;America/Argentina/Buenos_Aires&lt;/code&gt;, &lt;code&gt;America/Sao_Paulo&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Africa and Middle East&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Africa/Casablanca&lt;/code&gt;, &lt;code&gt;Africa/Johannesburg&lt;/code&gt;, &lt;code&gt;Africa/Cairo&lt;/code&gt;, &lt;code&gt;Asia/Jerusalem&lt;/code&gt;, &lt;code&gt;Asia/Dubai&lt;/code&gt;, &lt;code&gt;Asia/Riyadh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Asia&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Asia/Kolkata&lt;/code&gt;, &lt;code&gt;Asia/Bangkok&lt;/code&gt;, &lt;code&gt;Asia/Singapore&lt;/code&gt;, &lt;code&gt;Asia/Hong_Kong&lt;/code&gt;, &lt;code&gt;Asia/Shanghai&lt;/code&gt;, &lt;code&gt;Asia/Tokyo&lt;/code&gt;, &lt;code&gt;Asia/Seoul&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Oceania&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Australia/Perth&lt;/code&gt;, &lt;code&gt;Australia/Adelaide&lt;/code&gt;, &lt;code&gt;Australia/Brisbane&lt;/code&gt;, &lt;code&gt;Australia/Sydney&lt;/code&gt;, &lt;code&gt;Pacific/Auckland&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="complete-local-list"&gt;Complete local list&lt;/h2&gt;
&lt;p&gt;The exact accepted list comes from the JavaScript runtime used by setup, build, the Worker, and the browser. To print the complete list supported by your local Node.js runtime:&lt;/p&gt;</description></item><item><title>Internationalization (i18n)</title><link>https://vanityurls.link/en/docs/reference/i18n/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/i18n/</guid><description>&lt;p&gt;Internationalization (i18n) is the software engineering process of designing an application so it can easily adapt to different languages without requiring structural code changes. vanityURLs detects the browser language from the request and sends localized English, French, German, Italian, and Spanish web pages when they are available. The English page is sent when there is no localized page for the requested ISO language code.&lt;/p&gt;
&lt;h2 id="supported-languages"&gt;Supported Languages&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Code&lt;/th&gt;
 &lt;th&gt;Language&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;en&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;English&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fr&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;French&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;es&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Spanish&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;it&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Italian&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;de&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;German&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="localized-pages"&gt;Localized Pages&lt;/h2&gt;
&lt;p&gt;The default public pages are available in the localized language directories under &lt;code&gt;defaults/public/{language}/&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Link format</title><link>https://vanityurls.link/en/docs/reference/link-format/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/link-format/</guid><description>&lt;p&gt;&lt;code&gt;v8s-links.txt&lt;/code&gt; is the human-authored source of truth for links. Each non-empty, non-comment row is pipe-delimited:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;slug|target|state|title|description|tags|owner|expires_at|notes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Required&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;Slash-delimited alias path, without leading &lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;target&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;Absolute &lt;code&gt;http&lt;/code&gt; or &lt;code&gt;https&lt;/code&gt; URL, or a hostname normalized to &lt;code&gt;https://&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;state&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;permanent&lt;/code&gt;, &lt;code&gt;ephemeral&lt;/code&gt;, &lt;code&gt;expired&lt;/code&gt;, &lt;code&gt;disabled&lt;/code&gt;, &lt;code&gt;maintenance&lt;/code&gt;, &lt;code&gt;deactivated&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;Dashboard title&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;Human-readable purpose&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;Comma-separated tags&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;owner&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;recommended&lt;/td&gt;
 &lt;td&gt;Accountability label&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;expires_at&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;ISO date or timestamp&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;notes&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;Internal notes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="exact-links"&gt;Exact links&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;social/x|https://x.com/vanityURLs|permanent|X / Twitter|Social profile|social,x|v8s||
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The link resolves only &lt;code&gt;/social/x&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Policy and blocklist</title><link>https://vanityurls.link/en/docs/reference/policy-blocklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/policy-blocklist/</guid><description>&lt;p&gt;vanityURLs edits source policy as &lt;code&gt;v8s-policies.json&lt;/code&gt; and deploys runtime policy as &lt;code&gt;build/v8s-blocklist.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The names are intentionally described as source policy and runtime blocklist artifact throughout the docs because the current filenames are easy to confuse. A future breaking cleanup should use clearer paired names for source and generated policy files.&lt;/p&gt;
&lt;p&gt;Built-in runtime protections are documented in &lt;a href="https://vanityurls.link/en/docs/reference/runtime-security/"&gt;Runtime security&lt;/a&gt;. Use &lt;a href="https://vanityurls.link/en/docs/customize/blocklist/"&gt;Policy and blocklist&lt;/a&gt; when you need the operator workflow for changing instance policy.&lt;/p&gt;</description></item><item><title>Repository layout</title><link>https://vanityurls.link/en/docs/reference/repository-layout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/repository-layout/</guid><description>&lt;p&gt;A vanityURLs instance keeps product-owned files separate from instance-owned files. That is what makes &lt;code&gt;npm run upgrade&lt;/code&gt; practical: upstream can refresh &lt;code&gt;defaults/&lt;/code&gt; and &lt;code&gt;scripts/&lt;/code&gt;, while your links, branding, policy choices, and Cloudflare deployment settings stay under your control.&lt;/p&gt;
&lt;p&gt;The public &lt;a href="https://github.com/vanityURLs/v8s.link"&gt;v8s.link repository&lt;/a&gt; follows this layout:&lt;/p&gt;
&lt;div class="filetree not-prose" role="tree" aria-label="File tree"&gt;&lt;ul class="filetree-root"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;package.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;npm scripts and dependencies&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;package-lock.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;locked dependency graph&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;wrangler.toml&lt;/span&gt;&lt;span class="filetree-annotation"&gt;Cloudflare Worker deployment settings&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;defaults/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;product baseline refreshed by upgrade&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;public/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;default pages, assets, badges, status pages, and headers&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;_headers&lt;/span&gt;&lt;span class="filetree-annotation"&gt;static asset cache and no-index headers&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;robots.txt&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;style.css&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-js" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;script.js&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-links.txt&lt;/span&gt;&lt;span class="filetree-annotation"&gt;starter link inventory and inline schedules&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-policies.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;default trust-and-safety policy&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-blocklist-categories.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;policy category labels&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-language-metadata.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;localized generated-page labels&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;legal/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;default generated legal and trust copy&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-legal-content.json&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-site-config.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;default languages, branding, and operator values&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-local-config.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;default workstation helper settings&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;custom/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;instance-owned overrides&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;public/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;instance branding, pages, assets, and headers&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;_headers&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;robots.txt&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;style.css&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-js" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;script.js&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-links.txt&lt;/span&gt;&lt;span class="filetree-annotation"&gt;human-authored source of truth for links&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-site-config.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;instance languages, branding, operator values, and contacts&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;scripts/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;product tooling&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;workers/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;canonical Worker source and tests&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;worker.mjs&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;worker.test.mjs&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;lnk&lt;/span&gt;&lt;span class="filetree-annotation"&gt;CLI for links, schedules, and policy workflows&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;build.mjs&lt;/span&gt;&lt;span class="filetree-annotation"&gt;build defaults plus custom into deploy output&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;setup.mjs&lt;/span&gt;&lt;span class="filetree-annotation"&gt;npm run setup&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;upgrade.mjs&lt;/span&gt;&lt;span class="filetree-annotation"&gt;npm run upgrade&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;local-install.mjs&lt;/span&gt;&lt;span class="filetree-annotation"&gt;local helper setup&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-sh" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s.sh&lt;/span&gt;&lt;span class="filetree-annotation"&gt;read-only local helper&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;src/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;generated Worker entry copied from scripts/workers&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;worker.mjs&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;build/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;generated deploy output&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;runtime redirect registry&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-blocklist.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;runtime policy artifact&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-config" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;v8s-site-config.json&lt;/span&gt;&lt;span class="filetree-annotation"&gt;runtime site configuration&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;_headers&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;index.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;_stats/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;protected stats shell&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;index.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;_tests/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;protected runtime test page&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;index.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem" aria-expanded="true"&gt;
&lt;div class="filetree-row filetree-folder-row"&gt;&lt;svg class="filetree-icon filetree-folder-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M5 19a2 2 0 01-2-2V7a2 2 0 012-2h4l2 2h4a2 2 0 012 2v1M5 19h14a2 2 0 002-2v-5a2 2 0 00-2-2H9a2 2 0 00-2 2v5a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name filetree-folder-name"&gt;en/&lt;/span&gt;&lt;span class="filetree-annotation"&gt;localized public pages and assets&lt;/span&gt;&lt;/div&gt;&lt;ul class="filetree-children" role="group"&gt;
&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;index.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;404.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;expired.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;disabled.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;li class="filetree-item" role="treeitem"&gt;
&lt;div class="filetree-row filetree-file-row"&gt;
&lt;svg class="filetree-icon filetree-file-default" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414A1 1 0 0119 9.414V19a2 2 0 01-2 2z"/&gt;&lt;/svg&gt;&lt;span class="filetree-name"&gt;maintenance.html&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;/ul&gt;&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;

&lt;h2 id="product-defaults"&gt;Product Defaults&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;defaults/&lt;/code&gt; is the product baseline. It contains public pages, localized status pages, redirected badges, policy pages, icons, the protected stats shell, starter links, inline starter schedules, default policy, site configuration, and local-helper defaults.&lt;/p&gt;</description></item><item><title>Runtime security approach</title><link>https://vanityurls.link/en/docs/reference/runtime-security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/runtime-security/</guid><description>&lt;p&gt;The vanityURLs runtime is deliberately small: validate the generated registry, serve static assets, read &lt;code&gt;v8s.json&lt;/code&gt;, and return one of a small set of outcomes.&lt;/p&gt;
&lt;p&gt;For the design rationale, read &lt;a href="https://vanityurls.link/en/blog/runtime-security-for-a-small-redirector/"&gt;Runtime security for a small redirector&lt;/a&gt;. This page is the compact reference for controls to preserve.&lt;/p&gt;
&lt;h2 id="defensive-runtime"&gt;Defensive runtime&lt;/h2&gt;
&lt;p&gt;The Worker keeps the runtime path narrow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;only public &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;HEAD&lt;/code&gt;, and quiet &lt;code&gt;OPTIONS&lt;/code&gt; requests are accepted, plus &lt;code&gt;POST /lookup/resolve&lt;/code&gt; for lookup resolution and the dedicated &lt;code&gt;POST /_analytics/lookup&lt;/code&gt; beacon&lt;/li&gt;
&lt;li&gt;direct access to &lt;code&gt;/v8s.json&lt;/code&gt;, &lt;code&gt;/v8s-blocklist.json&lt;/code&gt;, and &lt;code&gt;/v8s-site-config.json&lt;/code&gt; returns 404&lt;/li&gt;
&lt;li&gt;redirects allow only &lt;code&gt;http:&lt;/code&gt; and &lt;code&gt;https:&lt;/code&gt; targets&lt;/li&gt;
&lt;li&gt;redirect targets with credentials, missing hostnames, control characters, or unsupported protocols fail closed&lt;/li&gt;
&lt;li&gt;splat values are URL-encoded segment by segment before insertion&lt;/li&gt;
&lt;li&gt;lifecycle states resolve through explicit routing rules&lt;/li&gt;
&lt;li&gt;protected operational paths verify &lt;a href="https://vanityurls.link/en/docs/customize/access-control/"&gt;Cloudflare Access&lt;/a&gt; JWTs and fail closed when Access is not configured&lt;/li&gt;
&lt;li&gt;scanner probes return a plain no-store 404 before short-link lookup or analytics&lt;/li&gt;
&lt;li&gt;analytics is sent with &lt;code&gt;ctx.waitUntil()&lt;/code&gt; so provider failure does not delay redirects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Default runtime protections include:&lt;/p&gt;</description></item><item><title>Security model</title><link>https://vanityurls.link/en/docs/reference/security-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/security-model/</guid><description>&lt;p&gt;This page is written for security reviewers. &lt;a href="https://vanityurls.link/en/docs/reference/runtime-security/"&gt;Runtime security&lt;/a&gt; explains how the Worker behaves. &lt;a href="https://vanityurls.link/en/docs/customize/network-protection/"&gt;Network protection&lt;/a&gt; and &lt;a href="https://vanityurls.link/en/docs/customize/access-control/"&gt;Access control&lt;/a&gt; explain what an operator configures. This page ties those views together by naming the trust boundaries and showing where each control is enforced: build time, Worker runtime, or the Cloudflare edge.&lt;/p&gt;
&lt;p&gt;The most common review mistake is treating an edge-enforced or build-time control as missing because it is not in the Worker source. The matrix below exists to make that split explicit.&lt;/p&gt;</description></item><item><title>Scheduled links</title><link>https://vanityurls.link/en/docs/reference/schedules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/schedules/</guid><description>&lt;p&gt;Scheduled links let a stable slug point somewhere different during configured time windows. Keep the normal target on the link row in &lt;code&gt;v8s-links.txt&lt;/code&gt;, then add indented &lt;code&gt;@schedule&lt;/code&gt; directives below that row.&lt;/p&gt;
&lt;p&gt;For use cases and decision guidance, read &lt;a href="https://vanityurls.link/en/blog/when-scheduled-links-are-useful/"&gt;When scheduled links are useful&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Schedules currently apply to exact links. Splat links stay path-driven.&lt;/p&gt;
&lt;h2 id="inline-form"&gt;Inline form&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hangout|https://discord.gg/personal|permanent|Hangout|Community hangout|community|team||
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @schedule timezone=America/Toronto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @schedule rule=work days=mon,tue,wed,thu,fri from=09:00 to=17:00 target=https://zoom.us/j/work
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The link target is the fallback target. Schedule rules only choose a temporary target during matching windows.&lt;/p&gt;</description></item><item><title>Upgrading an instance</title><link>https://vanityurls.link/en/docs/reference/upgrading/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/reference/upgrading/</guid><description>&lt;p&gt;Use &lt;code&gt;npm run upgrade&lt;/code&gt; to refresh an existing vanityURLs instance. The command updates the product-owned files and leaves your instance-owned files alone.&lt;/p&gt;
&lt;p&gt;Run it from a clean worktree:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The command fetches the configured upstream source, refreshes product files such as &lt;code&gt;defaults/&lt;/code&gt; and &lt;code&gt;scripts/&lt;/code&gt;, runs the project checks, and leaves a normal Git diff for review. If package dependency definitions changed during the refresh, the upgrade runs &lt;code&gt;npm install&lt;/code&gt; before validation so local tooling matches the updated product files.&lt;/p&gt;</description></item></channel></rss>