<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Customize on vanityURLs</title><link>https://vanityurls.link/en/docs/customize/</link><description>Recent content in Customize on vanityURLs</description><generator>Hugo</generator><language>en-CA</language><atom:link href="https://vanityurls.link/en/docs/customize/index.xml" rel="self" type="application/rss+xml"/><item><title>Access control</title><link>https://vanityurls.link/en/docs/customize/access-control/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/customize/access-control/</guid><description>&lt;p&gt;The vanityURLs Worker blocks access to the private dashboard and tests until Cloudflare Access is configured. Anyone who tries to open those pages sees the Cloudflare Access not-configured response&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; shown below, so public redirects stay open while operational pages fail closed.&lt;/p&gt;
&lt;p&gt;&lt;img src="../cf-access-not-configured.png" alt="protected path fails closed"&gt;&lt;/p&gt;
&lt;div class="mermaid-wrap not-prose my-5"&gt;&lt;pre class="mermaid"&gt;flowchart LR
A["Private path"] --&gt; B["Cloudflare Access&lt;br/&gt;application"]
B --&gt; C{"Allowed&lt;br/&gt;identity?"}
C --&gt;|"no"| D["Access login&lt;br/&gt;or deny"]
C --&gt;|"yes"| E["JWT assertion"]
E --&gt; F["Worker validates&lt;br/&gt;AUD and secret"]
F --&gt; G{"JWT valid?"}
G --&gt;|"yes"| H["Serve dashboard&lt;br/&gt;or tests"]
G --&gt;|"no"| I["Fail closed with&lt;br/&gt;not-configured response"]&lt;/pre&gt;&lt;/div&gt;

&lt;div class="steps not-prose my-6"&gt;
&lt;h3 id="find-the-team-domain"&gt;Find the Team domain&lt;/h3&gt;
&lt;p&gt;If this Cloudflare account has never used Zero Trust, Cloudflare shows a short first-time setup before the normal Access screens:&lt;/p&gt;</description></item><item><title>Analytics</title><link>https://vanityurls.link/en/docs/customize/analytics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/customize/analytics/</guid><description>&lt;p&gt;Use server-side analytics when you want redirect and page activity without adding browser tracking JavaScript. vanityURLs sends analytics from the Worker with &lt;code&gt;ctx.waitUntil()&lt;/code&gt;, so provider failures should not delay redirects.&lt;/p&gt;
&lt;p&gt;For provider selection and privacy tradeoffs, read &lt;a href="https://vanityurls.link/en/blog/choosing-privacy-friendly-analytics-for-short-links/"&gt;Choosing privacy-friendly analytics for short links&lt;/a&gt;. For event names, provider payloads, IP handling, and blocked-traffic behavior, read &lt;a href="https://vanityurls.link/en/docs/reference/analytics/"&gt;Analytics&lt;/a&gt;.&lt;/p&gt;
&lt;div class="mermaid-wrap not-prose my-5"&gt;&lt;pre class="mermaid"&gt;flowchart LR
A["Request&lt;br/&gt;reaches&lt;br/&gt;Worker"] --&gt; B{"Request type"}
B --&gt;|"valid short link"| C["Redirect&lt;br/&gt;response"]
C --&gt; D["redirect event"]
B --&gt;|"valid local page"| E["Public page&lt;br/&gt;response"]
E --&gt; F["pageview event"]
B --&gt;|"unknown slug"| G["404 page"]
G --&gt; H["short-link-miss&lt;br/&gt;event"]
B --&gt;|"lookup"| I["Lookup response"]
I --&gt; J["pageview event"]
D --&gt; K["ctx.waitUntil&lt;br/&gt;analytics send"]
F --&gt; K
H --&gt; K
J --&gt; K
K --&gt; L["Umami or Fathom"]&lt;/pre&gt;&lt;/div&gt;

&lt;div class="steps not-prose my-6"&gt;
&lt;h3 id="decide-whether-to-enable-analytics"&gt;Decide whether to enable analytics&lt;/h3&gt;
&lt;p&gt;Leave analytics disabled during the first setup unless you already know what question the reports need to answer. A working redirector with no analytics is a valid production choice.&lt;/p&gt;</description></item><item><title>Footer &amp; pages</title><link>https://vanityurls.link/en/docs/customize/footer-pages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/customize/footer-pages/</guid><description>&lt;p&gt;vanityURLs can publish footer links and public pages from the operator values stored in &lt;code&gt;custom/v8s-site-config.json&lt;/code&gt;. These pages are part of the public posture of a short-link domain: they tell visitors, reporters, registrars, and security researchers who operates the redirector and how to reach the right contact.&lt;/p&gt;
&lt;p&gt;Use this page to understand what files are generated, which links appear in the footer, and where to override pages when generated content is not enough. Use &lt;a href="https://vanityurls.link/en/docs/customize/jurisdiction/"&gt;Jurisdiction&lt;/a&gt; when you are deciding the operator, jurisdiction, governing law, and trust contacts.&lt;/p&gt;</description></item><item><title>Jurisdiction</title><link>https://vanityurls.link/en/docs/customize/jurisdiction/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/customize/jurisdiction/</guid><description>&lt;p&gt;vanityURLs asks a few operator questions so generated public pages have a real owner, a reporting path, and a legal context. Use this page before or during &lt;code&gt;npm run setup&lt;/code&gt; when you are deciding what to enter.&lt;/p&gt;
&lt;p&gt;This page is not legal advice. It explains what the fields control and gives phase-1 answers that are practical enough to get an instance online. Use &lt;a href="https://vanityurls.link/en/docs/customize/footer-pages/"&gt;Footer &amp;amp; pages&lt;/a&gt; when you need generated output paths, footer links, aliases, and custom page overrides.&lt;/p&gt;</description></item><item><title>Network protection</title><link>https://vanityurls.link/en/docs/customize/network-protection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/customize/network-protection/</guid><description>&lt;p&gt;Use this page when you are ready to configure Cloudflare controls in front of the Worker. Network protection keeps commodity abuse, unexpected methods, scanner probes, unwanted crawlers, and infrastructure noise away from application code.&lt;/p&gt;
&lt;p&gt;For the layered security rationale, read &lt;a href="https://vanityurls.link/en/blog/layering-cloudflare-protection-around-a-short-link-domain/"&gt;Layering Cloudflare protection around a short-link domain&lt;/a&gt;. The raw Cloudflare dashboard capture lives in &lt;a href="https://github.com/vanityURLs/website/blob/main/data/cloudflare-protection-defaults.json"&gt;data/cloudflare-protection-defaults.json&lt;/a&gt;; use it to track Cloudflare menu changes, not as an operator checklist.&lt;/p&gt;
&lt;p&gt;For the features intentionally left out of the default setup, read &lt;a href="https://vanityurls.link/en/blog/cloudflare-features-not-to-enable-by-default/"&gt;Cloudflare features not to enable by default&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Policy and blocklist</title><link>https://vanityurls.link/en/docs/customize/blocklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/docs/customize/blocklist/</guid><description>&lt;p&gt;Use policy and blocklist customization when your instance needs local trust-and-safety decisions beyond the product defaults.&lt;/p&gt;
&lt;p&gt;For the trust-and-safety rationale, read &lt;a href="https://vanityurls.link/en/blog/protecting-the-reputation-of-a-short-link-domain/"&gt;Protecting the reputation of a short-link domain&lt;/a&gt;. For source file selection, categories, generated feeds, runtime artifacts, and field behavior, read &lt;a href="https://vanityurls.link/en/docs/reference/policy-blocklist/"&gt;Policy and blocklist&lt;/a&gt;.&lt;/p&gt;
&lt;div class="mermaid-wrap not-prose my-5"&gt;&lt;pre class="mermaid"&gt;flowchart LR
A["defaults/&lt;br/&gt;source policy"] --&gt; C["generate:blocklist"]
B["custom/&lt;br/&gt;local policy"] --&gt; D["link validation"]
C --&gt; E["runtime blocklist&lt;br/&gt;artifacts"]
E --&gt; D
F["configured&lt;br/&gt;short links"] --&gt; D
D --&gt; G{"Validation&lt;br/&gt;passes?"}
G --&gt;|"yes"| H["Build and deploy"]
G --&gt;|"no"| I["Fix link&lt;br/&gt;or policy"]&lt;/pre&gt;&lt;/div&gt;

&lt;div class="steps not-prose my-6"&gt;
&lt;h3 id="decide-whether-you-need-local-policy"&gt;Decide whether you need local policy&lt;/h3&gt;
&lt;p&gt;In your instance repository, review &lt;code&gt;defaults/v8s-policies.json&lt;/code&gt; before creating an override. Start with the default policy unless you have a concrete reason to replace it. Common reasons include:&lt;/p&gt;</description></item></channel></rss>