<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare on vanityURLs</title><link>https://vanityurls.link/en/tags/cloudflare/</link><description>Recent content in Cloudflare on vanityURLs</description><generator>Hugo</generator><language>en-CA</language><lastBuildDate>Mon, 15 Jun 2026 22:51:56 -0400</lastBuildDate><atom:link href="https://vanityurls.link/en/tags/cloudflare/index.xml" rel="self" type="application/rss+xml"/><item><title>Cloudflare products vanityURLs leaves out</title><link>https://vanityurls.link/en/blog/cloudflare-products-outside-the-vanityurls-baseline/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/cloudflare-products-outside-the-vanityurls-baseline/</guid><description>&lt;p&gt;Cloudflare has more useful products than a short-link redirector should use.&lt;/p&gt;
&lt;p&gt;That is not a criticism of Cloudflare. It is an operating boundary. vanityURLs uses &lt;a href="https://www.cloudflare.com/products/dns/"&gt;Cloudflare DNS&lt;/a&gt;, &lt;a href="https://www.cloudflare.com/products/workers/"&gt;Cloudflare Workers&lt;/a&gt;, &lt;a href="https://www.cloudflare.com/products/access/"&gt;Cloudflare Access&lt;/a&gt;, SSL/TLS, and selected edge protections. The baseline product list lives in &lt;a href="https://vanityurls.link/en/docs/reference/cloudflare-products/"&gt;Cloudflare products&lt;/a&gt;. The detailed setup lives in &lt;a href="https://vanityurls.link/en/docs/customize/network-protection/"&gt;Network protection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This page records the other side of that decision: products that are visible, useful in the right deployment, and still not part of the default vanityURLs setup.&lt;/p&gt;</description></item><item><title>vanityURLs' secret sauce is a JSON ledger</title><link>https://vanityurls.link/en/blog/json-audit-ledger-for-cloudflare-docs/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/json-audit-ledger-for-cloudflare-docs/</guid><description>&lt;p&gt;The problem showed up in the usual small way: a Cloudflare dashboard label moved, a setup page still named the old path, and the next maintainer had to decide whether the documentation was stale or the product guidance had changed.&lt;/p&gt;
&lt;p&gt;vanityURLs stands on Cloudflare&amp;rsquo;s shoulders. That is the point. A short-link redirector should not need a fleet of servers, a database, or a private control plane. It can run on Cloudflare&amp;rsquo;s serverless architecture and let Cloudflare stop noisy traffic before the Worker executes.&lt;/p&gt;</description></item><item><title>Do not turn every Cloudflare knob</title><link>https://vanityurls.link/en/blog/cloudflare-features-not-to-enable-by-default/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/cloudflare-features-not-to-enable-by-default/</guid><description>&lt;p&gt;The Cloudflare dashboard is not a checklist.&lt;/p&gt;
&lt;p&gt;That is the rule. A vanityURLs instance has a narrow job: serve short links from a Worker, keep operational pages behind Access, and let Cloudflare reject obvious noise before application code runs. The baseline controls are documented in &lt;a href="https://vanityurls.link/en/docs/customize/network-protection/"&gt;Network protection&lt;/a&gt;. The product inventory is documented in &lt;a href="https://vanityurls.link/en/docs/reference/cloudflare-products/"&gt;Cloudflare products&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This post is the negative space. It names the knobs that should stay off unless an operator has a reason that survives writing down.&lt;/p&gt;</description></item><item><title>vanityURLs compared with hosted and self-hosted shorteners</title><link>https://vanityurls.link/en/blog/vanityurls-vs-alternatives/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/vanityurls-vs-alternatives/</guid><description>&lt;p&gt;vanityURLs is for operators who want a branded short-link domain, operated from Git on Cloudflare Workers, without a shared hosted account, without a click database by default, and with configuration reviewed as code. It does not try to replace every hosted dashboard. It tries to make a small auditable redirector easy to own.&lt;/p&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Dimension&lt;/th&gt;
 &lt;th&gt;vanityURLs&lt;/th&gt;
 &lt;th&gt;Bitly&lt;/th&gt;
 &lt;th&gt;Dub&lt;/th&gt;
 &lt;th&gt;Short.io&lt;/th&gt;
 &lt;th&gt;YOURLS&lt;/th&gt;
 &lt;th&gt;Shlink&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Custom domain&lt;/td&gt;
 &lt;td&gt;Operator-owned Cloudflare domain&lt;/td&gt;
 &lt;td&gt;Hosted plan feature&lt;/td&gt;
 &lt;td&gt;Hosted plan feature&lt;/td&gt;
 &lt;td&gt;Hosted plan feature&lt;/td&gt;
 &lt;td&gt;Self-hosted domain&lt;/td&gt;
 &lt;td&gt;Self-hosted domain&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Analytics model&lt;/td&gt;
 &lt;td&gt;Disabled by default; optional server-side Umami or Fathom&lt;/td&gt;
 &lt;td&gt;Hosted analytics&lt;/td&gt;
 &lt;td&gt;Hosted analytics&lt;/td&gt;
 &lt;td&gt;Hosted analytics&lt;/td&gt;
 &lt;td&gt;Built-in self-hosted stats&lt;/td&gt;
 &lt;td&gt;Built-in visits&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Account required&lt;/td&gt;
 &lt;td&gt;No visitor account; operator uses Cloudflare and GitHub&lt;/td&gt;
 &lt;td&gt;Hosted account&lt;/td&gt;
 &lt;td&gt;Hosted account&lt;/td&gt;
 &lt;td&gt;Hosted account&lt;/td&gt;
 &lt;td&gt;Admin account on the install&lt;/td&gt;
 &lt;td&gt;Admin/API access on the install&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Data residence&lt;/td&gt;
 &lt;td&gt;Depends on operator choices for Cloudflare, Git, and analytics&lt;/td&gt;
 &lt;td&gt;Controlled by provider&lt;/td&gt;
 &lt;td&gt;Controlled by provider&lt;/td&gt;
 &lt;td&gt;Controlled by provider&lt;/td&gt;
 &lt;td&gt;Your hosting/database choices&lt;/td&gt;
 &lt;td&gt;Your hosting/database choices&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ToS surface&lt;/td&gt;
 &lt;td&gt;Instance terms generated from config&lt;/td&gt;
 &lt;td&gt;Provider terms plus your link usage&lt;/td&gt;
 &lt;td&gt;Provider terms plus your link usage&lt;/td&gt;
 &lt;td&gt;Provider terms plus your link usage&lt;/td&gt;
 &lt;td&gt;Your terms&lt;/td&gt;
 &lt;td&gt;Your terms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Deployment model&lt;/td&gt;
 &lt;td&gt;Cloudflare Worker plus Static Assets from Git&lt;/td&gt;
 &lt;td&gt;Hosted software service&lt;/td&gt;
 &lt;td&gt;Hosted software service, open-source core&lt;/td&gt;
 &lt;td&gt;Hosted software service&lt;/td&gt;
 &lt;td&gt;PHP app and database&lt;/td&gt;
 &lt;td&gt;PHP service and database&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cost at scale&lt;/td&gt;
 &lt;td&gt;Cloudflare usage plus optional analytics provider&lt;/td&gt;
 &lt;td&gt;Per plan&lt;/td&gt;
 &lt;td&gt;Per plan&lt;/td&gt;
 &lt;td&gt;Per plan&lt;/td&gt;
 &lt;td&gt;Hosting and maintenance&lt;/td&gt;
 &lt;td&gt;Hosting and maintenance&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Code visibility&lt;/td&gt;
 &lt;td&gt;MIT open source code and instance config in Git&lt;/td&gt;
 &lt;td&gt;Closed hosted service&lt;/td&gt;
 &lt;td&gt;Open-source product with hosted service&lt;/td&gt;
 &lt;td&gt;Closed hosted service&lt;/td&gt;
 &lt;td&gt;Open source&lt;/td&gt;
 &lt;td&gt;Open source&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Link scheduling&lt;/td&gt;
 &lt;td&gt;Configured in Git and evaluated by the Worker&lt;/td&gt;
 &lt;td&gt;Depends on plan/product&lt;/td&gt;
 &lt;td&gt;Depends on product&lt;/td&gt;
 &lt;td&gt;Depends on product&lt;/td&gt;
 &lt;td&gt;Depends on plugins/custom code&lt;/td&gt;
 &lt;td&gt;Depends on built-in features&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Bulk operations&lt;/td&gt;
 &lt;td&gt;Text file and &lt;code&gt;lnk&lt;/code&gt; CLI workflow&lt;/td&gt;
 &lt;td&gt;Dashboard/API/import&lt;/td&gt;
 &lt;td&gt;Dashboard/API/import&lt;/td&gt;
 &lt;td&gt;Dashboard/API/import&lt;/td&gt;
 &lt;td&gt;Admin/API/database workflows&lt;/td&gt;
 &lt;td&gt;CLI/API workflows&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="bitly"&gt;Bitly&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://bitly.com/"&gt;Bitly&lt;/a&gt; wins when a team wants a mature hosted product, a dashboard-centered workflow, brand/campaign features, and a vendor responsible for product operations. It is the safer choice when non-technical users need to create and inspect links without touching Git or Cloudflare.&lt;/p&gt;</description></item><item><title>Cloudflare Access is not a checkbox</title><link>https://vanityurls.link/en/blog/operating-cloudflare-access-for-a-short-link-domain/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/operating-cloudflare-access-for-a-short-link-domain/</guid><description>&lt;p&gt;The failure mode is ordinary. Someone opens &lt;code&gt;/en/_stats/&lt;/code&gt; from a private browser window and sees the dashboard instead of the Cloudflare Access login page.&lt;/p&gt;
&lt;p&gt;That is the whole problem. Public redirects should stay public. Operational pages should not.&lt;/p&gt;
&lt;p&gt;For vanityURLs, &lt;a href="https://developers.cloudflare.com/cloudflare-one/applications/"&gt;Cloudflare Access&lt;/a&gt; has one narrow job: keep localized stats paths such as &lt;code&gt;/en/_stats/&lt;/code&gt;, localized test paths such as &lt;code&gt;/en/_tests/&lt;/code&gt;, and similar operator surfaces private before the Worker serves them. Treat it as an access boundary, not a setup souvenir.&lt;/p&gt;</description></item><item><title>Keep scanner traffic out of the Worker</title><link>https://vanityurls.link/en/blog/layering-cloudflare-protection-around-a-short-link-domain/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/layering-cloudflare-protection-around-a-short-link-domain/</guid><description>&lt;p&gt;A short-link redirector looks simple: receive a slug, look up a destination, redirect.&lt;/p&gt;
&lt;p&gt;The internet supplies the rest. PHP probes. WordPress paths. Odd methods. Bot traffic. Crawlers. Repeated misses for slugs nobody created.&lt;/p&gt;
&lt;p&gt;The Worker should not be the first place that noise gets expensive. vanityURLs keeps the Worker small and deterministic, then uses Cloudflare edge controls for traffic that should never spend Worker CPU or analytics quota.&lt;/p&gt;
&lt;h2 id="block-before-runtime"&gt;Block Before Runtime&lt;/h2&gt;
&lt;p&gt;The Worker still validates destinations and runtime policy. That is the last line of defense, not the first.&lt;/p&gt;</description></item><item><title>Migrating from Cloudflare Pages redirects to vanityURLs Workers</title><link>https://vanityurls.link/en/blog/migrating-from-cloudflare-pages-redirects/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/migrating-from-cloudflare-pages-redirects/</guid><description>&lt;p&gt;The first vanityURLs instances were intentionally simple: a domain, a &lt;code&gt;_redirects&lt;/code&gt; file, and Cloudflare Pages. That was a good starting point. It made short links easy to keep in Git, easy to review, and easy to deploy.&lt;/p&gt;
&lt;p&gt;The current runtime keeps the same spirit, but moves the redirect decision into a Cloudflare Worker. That change gives the instance a stronger runtime: protected operational pages, generated policy, localized public pages, server-side analytics, scanner protection, and a clearer split between product defaults and instance-owned files.&lt;/p&gt;</description></item><item><title>Release checklist for a vanityURLs instance</title><link>https://vanityurls.link/en/blog/release-checklist-for-a-vanityurls-instance/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/release-checklist-for-a-vanityurls-instance/</guid><description>&lt;p&gt;Use this checklist before launching a new instance or promoting a major upgrade. A vanityURLs instance is robust, but anything shiny on the internet attracts scanners, bots, and abuse attempts.&lt;/p&gt;
&lt;p&gt;The code repository keeps the executable activity list in &lt;a href="https://github.com/vanityURLs/code/blob/main/RELEASE_CHECKLIST.md"&gt;&lt;code&gt;RELEASE_CHECKLIST.md&lt;/code&gt;&lt;/a&gt;. This post explains why those checks matter and adds operational context for Cloudflare and instance owners.&lt;/p&gt;
&lt;p&gt;The strongest release posture is boring: a small Worker, reviewed generated files, narrow Cloudflare exposure, protected operational pages, and clear ownership of every destination.&lt;/p&gt;</description></item><item><title>Runtime security for a small redirector</title><link>https://vanityurls.link/en/blog/runtime-security-for-a-small-redirector/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/runtime-security-for-a-small-redirector/</guid><description>&lt;p&gt;Short-link domains are small targets with oversized consequences. A bad redirect can damage trust quickly, and scanner traffic can arrive before the domain is even public. That is why vanityURLs treats simplicity as a security feature, not an aesthetic preference.&lt;/p&gt;
&lt;p&gt;The runtime is not a public link-submission service. It is not a database-backed web application. It is a Git-built redirect engine: validate the registry, deploy static assets, read generated data, and return a redirect, protected page, disabled page, expired page, or localized 404.&lt;/p&gt;</description></item><item><title>Start with one-time PIN, then earn the IdP</title><link>https://vanityurls.link/en/blog/choosing-identity-provider/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/choosing-identity-provider/</guid><description>&lt;p&gt;The first identity decision for a short-link domain should be boring.&lt;/p&gt;
&lt;p&gt;Protect &lt;code&gt;/en/_stats/&lt;/code&gt;, other localized stats paths, and &lt;code&gt;/en/_tests/&lt;/code&gt; before the instance goes public. Do not spend the first deploy designing an enterprise identity architecture unless the enterprise already exists.&lt;/p&gt;
&lt;p&gt;For vanityURLs, &lt;a href="https://developers.cloudflare.com/cloudflare-one/applications/"&gt;Cloudflare Access&lt;/a&gt; protects the operational pages before the Worker serves them. The question is not &amp;ldquo;which IdP is best?&amp;rdquo; The question is &amp;ldquo;which access path can the operator review and revoke without ceremony?&amp;rdquo;&lt;/p&gt;</description></item><item><title>Wrangler Without Shooting Yourself in the Foot</title><link>https://vanityurls.link/en/blog/wrangler/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/wrangler/</guid><description>&lt;p&gt;&lt;a href="https://developers.cloudflare.com/workers/wrangler/"&gt;Wrangler&lt;/a&gt; is Cloudflare&amp;rsquo;s command-line tool for Workers. &lt;code&gt;wrangler.toml&lt;/code&gt; is the configuration file that tells Cloudflare exactly what Worker you are deploying, where your code lives, which static assets to publish, and which runtime values are part of the deployment.&lt;/p&gt;
&lt;p&gt;It might be tempting to use this file to build a beautiful platform abstraction layer. &lt;strong&gt;Resist that urge.&lt;/strong&gt; For a vanityURLs instance, &lt;code&gt;wrangler.toml&lt;/code&gt; should be boring enough that your future self can open it in six months and immediately understand exactly what is deployed.&lt;/p&gt;</description></item><item><title>The current v8s architecture</title><link>https://vanityurls.link/en/blog/current-architecture/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/current-architecture/</guid><description>&lt;p&gt;The current v8s release is built around a small contract: keep the runtime simple, keep the source of truth in Git, and push abuse filtering as close to the edge as possible.&lt;/p&gt;
&lt;h2 id="the-instance-model"&gt;The instance model&lt;/h2&gt;
&lt;p&gt;An instance has two kinds of files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;defaults/&lt;/code&gt; contains the product defaults, public operational pages, blocklist defaults, robots and LLM crawler guidance, and scripts that should be updated from upstream&lt;/li&gt;
&lt;li&gt;&lt;code&gt;custom/&lt;/code&gt; contains the instance-owned links, schedules, policy replacement, branding, legal pages, and any intentionally local public files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That split is the upgrade story. If instance owners keep their work in &lt;code&gt;custom/&lt;/code&gt;, future releases can refresh &lt;code&gt;defaults/&lt;/code&gt; and &lt;code&gt;scripts/&lt;/code&gt; without trampling local content.&lt;/p&gt;</description></item></channel></rss>