<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Operations on vanityURLs</title><link>https://vanityurls.link/en/tags/operations/</link><description>Recent content in Operations on vanityURLs</description><generator>Hugo</generator><language>en-CA</language><lastBuildDate>Sun, 07 Jun 2026 18:08:29 -0400</lastBuildDate><atom:link href="https://vanityurls.link/en/tags/operations/index.xml" rel="self" type="application/rss+xml"/><item><title>Operator timezone is not just a setup question</title><link>https://vanityurls.link/en/blog/operator-timezone-is-not-just-a-setup-question/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/operator-timezone-is-not-just-a-setup-question/</guid><description>&lt;p&gt;The operator timezone question in &lt;code&gt;npm run setup&lt;/code&gt; looks like a small preference. It is more useful than that.&lt;/p&gt;
&lt;p&gt;vanityURLs uses timezone names in places where a numeric offset is too brittle: scheduled links, generated registry metadata, and operator-facing views such as &lt;code&gt;/en/_stats/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="use-a-place-not-an-offset"&gt;Use a place, not an offset&lt;/h2&gt;
&lt;p&gt;Enter an &lt;a href="https://vanityurls.link/en/docs/reference/timezones/"&gt;IANA timezone&lt;/a&gt; such as &lt;code&gt;America/Toronto&lt;/code&gt;, &lt;code&gt;America/New_York&lt;/code&gt;, &lt;code&gt;Europe/Paris&lt;/code&gt;, or &lt;code&gt;UTC&lt;/code&gt;. Do not enter &lt;code&gt;-4&lt;/code&gt;, &lt;code&gt;-5&lt;/code&gt;, or &lt;code&gt;GMT-0400&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An offset only describes one moment. It does not describe daylight saving time, historical transitions, or the operator&amp;rsquo;s normal working context. A place-based timezone lets the JavaScript runtime handle EST/EDT or other local transitions without the instance owner updating config twice a year.&lt;/p&gt;</description></item><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>Do not delete a link to change its meaning</title><link>https://vanityurls.link/en/blog/link-lifecycle-states/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/link-lifecycle-states/</guid><description>&lt;p&gt;A short link usually outlives the moment that created it.&lt;/p&gt;
&lt;p&gt;Someone pastes it into a runbook. Someone prints it on a slide. Someone bookmarks it. Six months later, a destination changes and the tempting fix is to delete the row.&lt;/p&gt;
&lt;p&gt;Do not start there. In vanityURLs, lifecycle states make the operational decision explicit in &lt;code&gt;custom/v8s-links.txt&lt;/code&gt;: redirect, expire, disable, hold for maintenance, or disappear as a true not-found.&lt;/p&gt;
&lt;h2 id="redirect-states"&gt;Redirect States&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;permanent&lt;/code&gt; when the destination is stable. vanityURLs returns HTTP &lt;code&gt;301&lt;/code&gt;, the permanent redirect status defined by &lt;a href="https://www.rfc-editor.org/rfc/rfc9110"&gt;RFC 9110&lt;/a&gt;.&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>Random slugs still have human readers</title><link>https://vanityurls.link/en/blog/choosing-readable-random-slugs/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/choosing-readable-random-slugs/</guid><description>&lt;p&gt;Random slugs are for the moments when the keyword does not matter.&lt;/p&gt;
&lt;p&gt;You paste a long URL. &lt;code&gt;lnk&lt;/code&gt; chooses the slug. You keep moving. The catch is that a random slug may still be read from a slide, typed from a badge, dictated over a call, pasted into a ticket, or compared in a screenshot.&lt;/p&gt;
&lt;p&gt;In vanityURLs 3.x, random slug generation is configurable. Existing instances can get it by following the &lt;a href="https://vanityurls.link/en/docs/reference/upgrading/"&gt;upgrade workflow&lt;/a&gt;, including &lt;code&gt;npm run upgrade&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Owner labels for short-link change history</title><link>https://vanityurls.link/en/blog/owner-labels-for-short-link-change-history/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/owner-labels-for-short-link-change-history/</guid><description>&lt;p&gt;The owner label lives in &lt;code&gt;v8s-links.txt&lt;/code&gt;, the human-authored source of truth for links. It is a short internal value that identifies who created or maintains a link. For a personal instance, it can simply be your name or initials. For a team, it becomes a useful part of change history. See the &lt;a href="https://vanityurls.link/en/docs/reference/link-format/"&gt;link format documentation&lt;/a&gt; for the full row structure.&lt;/p&gt;
&lt;p&gt;Short links often look simple from the outside, but they can represent campaign pages, support portals, internal tools, partner destinations, or regulated communications. When several people or business units can make changes, the owner label helps answer basic operational questions:&lt;/p&gt;</description></item><item><title>Reading your vanityURLs admin dashboard</title><link>https://vanityurls.link/en/blog/reading-your-admin-dashboard/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/reading-your-admin-dashboard/</guid><description>&lt;p&gt;The &lt;code&gt;/en/_stats/&lt;/code&gt; dashboard is intentionally modest. It does not edit links, publish changes, or replace Git review. It gives the operator a protected read-only view of what the Worker will do with the generated registry. Other supported languages use the same localized pattern, such as &lt;code&gt;/fr/_stats/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That makes it useful in exactly the moments where a text file is a little too quiet: after a deployment, before a cleanup, when a link expires, or when someone asks whether a slug is exact, splat, permanent, disabled, or missing metadata.&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>When scheduled links are useful</title><link>https://vanityurls.link/en/blog/when-scheduled-links-are-useful/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/when-scheduled-links-are-useful/</guid><description>&lt;p&gt;Most short links should be boring: one slug, one destination, one clear owner. Scheduled links are for the few cases where the slug should stay stable but the destination needs to change during a predictable time window.&lt;/p&gt;
&lt;p&gt;The starter instance includes a deliberately silly &lt;code&gt;/contact&lt;/code&gt; example. During the configured 9-to-5 window, it can point to Dolly Parton&amp;rsquo;s &amp;ldquo;9 to 5&amp;rdquo;; outside that window, it falls back to Rick Astley and &amp;ldquo;Never Gonna Give You Up.&amp;rdquo; The point is not the music taste, heroic as it may be. The point is that one memorable short link can have a normal destination and a time-based exception.&lt;/p&gt;</description></item><item><title>Where to start customizing vanityURLs</title><link>https://vanityurls.link/en/blog/where-to-start-customizing-vanityurls/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/where-to-start-customizing-vanityurls/</guid><description>&lt;p&gt;Once the Quickstart works, the redirector is already useful. Customization is the part where it becomes yours: your links, your public pages, your brand, your policies, your access rules, and your operating habits.&lt;/p&gt;
&lt;p&gt;You do not need to customize everything at once. Start with the area that hurts most.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Goal&lt;/th&gt;
 &lt;th&gt;Start here&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Change the public look and static pages&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/reference/custom-overrides/"&gt;Custom overrides&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Configure the split-color wordmark and brand assets&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/reference/brand/"&gt;Brand&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Add, inspect, or update short links&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/command-line-interface/lnk/"&gt;LNK&lt;/a&gt; and &lt;a href="https://vanityurls.link/en/docs/reference/link-format/"&gt;Link format&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Add time-based destinations&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/reference/schedules/"&gt;Scheduled links&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Decide which languages to publish&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/reference/i18n/"&gt;Internationalization&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Configure jurisdiction and public trust contacts&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/customize/jurisdiction/"&gt;Jurisdiction&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Protect private operational paths&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/customize/access-control/"&gt;Access control&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Protect the domain before traffic reaches the Worker&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/customize/network-protection/"&gt;Network protection&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Configure redirect analytics&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/customize/analytics/"&gt;Analytics&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tune allow/block policy&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://vanityurls.link/en/docs/customize/blocklist/"&gt;Policy and blocklist&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The nicest path is usually not linear. A personal instance might start with links and branding. A team instance might start with Access control and owner labels. A public marketing domain might start with legal pages, analytics, and network protection.&lt;/p&gt;</description></item><item><title>You do not need to restart from scratch</title><link>https://vanityurls.link/en/blog/upgrading-without-restarting-from-scratch/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/upgrading-without-restarting-from-scratch/</guid><description>&lt;p&gt;When a tool is still moving quickly, the tempting but exhausting instinct is to start over each time the installer improves. Delete the instance, clone again, answer the questions again, copy custom files back, hope nothing subtle was lost.&lt;/p&gt;
&lt;p&gt;That is not the intended vanityURLs workflow.&lt;/p&gt;
&lt;p&gt;An instance is designed to keep its local identity while the product layer improves around it. Your links, schedules, policies, branding, legal pages, Cloudflare settings, and helper configuration live in the instance layer. The upstream product files live in &lt;code&gt;defaults/&lt;/code&gt; and &lt;code&gt;scripts/&lt;/code&gt;. The generated output can be rebuilt.&lt;/p&gt;</description></item><item><title>Instance compliance</title><link>https://vanityurls.link/en/blog/instance-compliance/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/instance-compliance/</guid><description>&lt;blockquote&gt;
&lt;p&gt;I built an open-source URL shortener, available at &lt;a href="https://www.VanityURLS.link"&gt;https://www.VanityURLS.link&lt;/a&gt;, &lt;a href="https://github.com/vanityURLs/code"&gt;https://github.com/vanityURLs/code&lt;/a&gt;, and &lt;a href="https://github.com/vanityURLs/website"&gt;https://github.com/vanityURLs/website&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For example, the official demo redirector is at &lt;a href="https://vanityurls.link"&gt;https://vanityurls.link&lt;/a&gt; and my personal instance is at dicai.re.&lt;/p&gt;
&lt;p&gt;I will copy a zip of both public repositories so you have the context.&lt;/p&gt;
&lt;p&gt;The user chooses an available short domain, copies the Git repository locally, runs setup, creates a Worker in their Cloudflare account, and deploys it to the Internet.&lt;/p&gt;
&lt;p&gt;It is their instance of the open-source solution, and they are responsible for ethical behavior. Like building a website with Hugo. It is only a tool.&lt;/p&gt;</description></item><item><title>What comes next for v8s.link</title><link>https://vanityurls.link/en/blog/future-roadmap/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://vanityurls.link/en/blog/future-roadmap/</guid><description>&lt;p&gt;The next challenge is not the first install. A new v8s instance can already be created quickly.&lt;/p&gt;
&lt;p&gt;The harder problem is long-term ownership: how does an instance safely receive upstream improvements to &lt;code&gt;defaults/&lt;/code&gt; and &lt;code&gt;scripts/&lt;/code&gt; while preserving everything in &lt;code&gt;custom/&lt;/code&gt;?&lt;/p&gt;
&lt;h2 id="the-upgrade-principle"&gt;The upgrade principle&lt;/h2&gt;
&lt;p&gt;The project should keep the contract simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;product-owned files live in &lt;code&gt;defaults/&lt;/code&gt; and &lt;code&gt;scripts/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;instance-owned files live in &lt;code&gt;custom/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;generated output can be rebuilt&lt;/li&gt;
&lt;li&gt;secrets stay in Cloudflare or local secret storage&lt;/li&gt;
&lt;li&gt;documentation lives on the website, not duplicated in every instance repo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That contract makes a future upgrade tool possible without requiring a package manager on day one.&lt;/p&gt;</description></item></channel></rss>