<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eric Augustinowicz</title>
    <description>The latest articles on DEV Community by Eric Augustinowicz (@kireji).</description>
    <link>https://dev.to/kireji</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667307%2F51465201-ea8a-4067-bad3-97658b2dbd1f.png</url>
      <title>DEV Community: Eric Augustinowicz</title>
      <link>https://dev.to/kireji</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kireji"/>
    <language>en</language>
    <item>
      <title>The URL Space is Bigger than the Universe</title>
      <dc:creator>Eric Augustinowicz</dc:creator>
      <pubDate>Tue, 24 Jun 2025 03:29:51 +0000</pubDate>
      <link>https://dev.to/kireji/the-url-space-is-bigger-than-the-universe-4dfg</link>
      <guid>https://dev.to/kireji/the-url-space-is-bigger-than-the-universe-4dfg</guid>
      <description>&lt;p&gt;For the past few years I’ve been trying to build an operating system that can do everything you expect an operating system to do while also encoding its entire state as a single &lt;a href="https://url.spec.whatwg.org" rel="noopener noreferrer"&gt;URL&lt;/a&gt;. That way, we get a permanent link to every O/S state, achieving truly comprehensive deep linking.&lt;/p&gt;

&lt;p&gt;For a long time, I struggled with finding a solid approach to achieving this goal. A user-friendly operating system involves many independent, dependent and otherwise tightly-coupled components — especially when you want it to be a platform that supports third-party app development. I tried a variety of different methods to encode/decode data from a string without redundancy.&lt;/p&gt;

&lt;p&gt;Some of my attempts involved &lt;a href="https://en.wikipedia.org/wiki/Query_string" rel="noopener noreferrer"&gt;query parameters&lt;/a&gt;, some of them &lt;a href="https://en.wikipedia.org/wiki/Base64" rel="noopener noreferrer"&gt;base64-encoded&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/JSON" rel="noopener noreferrer"&gt;JSON data&lt;/a&gt;, and some of them custom &lt;a href="https://dev.tourl"&gt;domain-specific languages&lt;/a&gt;. They all had the same problem — they failed to capitalize on the &lt;em&gt;actual space available&lt;/em&gt; in URLs.&lt;/p&gt;

&lt;p&gt;An incredible combinatorial explosion appears when you try to compute the number of unique URLs that can exist. Query params, JSON objects, domain-specific languages and virtually all other syntax only take advantage of a minuscule fraction of that space.&lt;/p&gt;

&lt;h2&gt;
  
  
  How is it Bigger than the Universe?
&lt;/h2&gt;

&lt;p&gt;I'm being a bit facetious, but according to some very quick research, the estimated number of particles in the observable universe is 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;109610^{96} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;96&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. That’s a 97-digit number. Even though that’s an unfathomably large number (imagine having to count to it), its not &lt;em&gt;that&lt;/em&gt; long. Have a look:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It barely fills two lines of text on my monitor. That's &lt;em&gt;a lot&lt;/em&gt; shorter than this article.&lt;/p&gt;

&lt;p&gt;If you could assign a unique natural number (or &lt;em&gt;hash&lt;/em&gt;) to every particle in the known universe you’d never need more than 97 digits to do it.&lt;/p&gt;

&lt;p&gt;If we &lt;a href="https://www.wolframalpha.com/input?i=10%5E96+in+base+64" rel="noopener noreferrer"&gt;change the base&lt;/a&gt; from 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;b=10b = 10 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 to 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;b=64b = 64 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;b&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;64&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;109610^{96} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;96&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 is less than 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;645464^{54} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;54&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. That means you never need more than 54 characters to assign a unique base-64 hash to every particle in the observable universe.&lt;/p&gt;

&lt;p&gt;That’s an incredibly short string of text for such a big feat. Here’s a sample of such a base-64 string I made by mashing my keyboard 54 times:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;09m84COSM84wf897hos_t83740FW3M-8tdocs8374tyvsc9nc3b1nt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In theory, this could be the hash of a random particle in the universe. Hopefully, it’s one close by.&lt;/p&gt;

&lt;p&gt;This kind of assignment, where each element in a set has an integer value and there are no gaps or collisions, is called a &lt;a href="https://en.wikipedia.org/wiki/Perfect_hash_function#Minimal_perfect_hash_function" rel="noopener noreferrer"&gt;minimal perfect hash function (MPHF)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Of course, URLs are more than simple numerals. For my project, they will require a domain name and unless we encode numerical data into the domain name, that added length can't be used to store much data.&lt;/p&gt;

&lt;p&gt;Yet, even if we add an 8-letter protocol and the longest allowable domain name (255 characters)…&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://heres.a.huge.domain.name.as.long.as.it.can.possibly.be.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.example.com/09m84COSM84wf897hos_t83740FW3M-8tdocs8374tyvsc9nc3b1nt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;… we now have a valid URL capable of disambiguating any particle in the known universe and it only uses 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;8+255+1+54=3188 + 255 + 1 + 54 = 318 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;255&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;54&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;318&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 characters. For comparison, here's a URL I got by searching Google for pictures of cats, sporting 376 characters:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://www.google.com/search?sca_esv=c99a67a28e4a9644&amp;amp;q=cats&amp;amp;udm=2&amp;amp;fbs=AIIjpHxU7SXXniUZfeShr2fp4giZ1Y6MJ25_tmWITc7uy4KIeioyp3OhN11EY0n5qfq-zENwnGygERInUV_0g0XKeHGJtesk9Adz8V_3dCFxRHd-4rVc28Hvas3fJjxYa4l0bNk99rKkfyreU5lHIQnHuafulMAL-Uqa-w7l2q-jrp2K_DA_pRuYwavY1buYjWGJpBAMTtrbI6TDhEB-GyDqzxOrfIfwCQ&amp;amp;sa=X&amp;amp;ved=2ahUKEwiQhOe9hd6NAxVRRjABHUCvJ6oQtKgLegQIGRAB&amp;amp;biw=1223&amp;amp;bih=754&amp;amp;dpr=2&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  TL; DR:
&lt;/h3&gt;

&lt;p&gt;Based on current estimates, &lt;strong&gt;there are far more unique URLs than there are particles in the observable universe.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This had me thinking: how can a web app truly capitalize on all of that storage space?&lt;/p&gt;
&lt;h2&gt;
  
  
  How many possible URLs are there?
&lt;/h2&gt;

&lt;p&gt;Back when Internet Explorer was popular, URLs were allowed to have &lt;em&gt;thousands&lt;/em&gt; of characters. Today, they can have &lt;em&gt;millions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To determine the actual &lt;a href="https://en.wikipedia.org/wiki/Cardinality" rel="noopener noreferrer"&gt;cardinality&lt;/a&gt; of the set of all URLs, we need to account for a lot of factors. For example, are consecutive slashes allowed in the &lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.3" rel="noopener noreferrer"&gt;pathname&lt;/a&gt; or will they be normalized away? Do we limit the URL length to two thousand characters &lt;a href="https://support.microsoft.com/en-us/topic/maximum-url-length-is-2-083-characters-in-internet-explorer-174e7c8a-6666-f4e0-6fd6-908b53c12246#:~:text=Microsoft%20Internet%20Explorer%20has%20a,request%20and%20GET%20request%20URLs." rel="noopener noreferrer"&gt;like Internet Explorer&lt;/a&gt; or two million &lt;a href="https://chromium.googlesource.com/chromium/src/+/main/docs/security/url_display_guidelines/url_display_guidelines.md#:~:text=Chrome%20limits%20URLs%20to%20a,is%20used%20on%20VR%20platforms." rel="noopener noreferrer"&gt;like Chrome&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Lets go factor-by-factor and, at each step, we’ll assume the worst possible case.&lt;/p&gt;
&lt;h3&gt;
  
  
  Worst-Case Length
&lt;/h3&gt;

&lt;p&gt;First, we start with the length. Let’s use a hard limit of 2000 characters. Since Chrome supports 2MB, &lt;strong&gt;we just removed 99.9% of the URLs from our set&lt;/strong&gt;. Even so, there is still a lot of nuance to computing the cardinality of that remaining 0.1%.&lt;/p&gt;
&lt;h3&gt;
  
  
  No Protocol Mutability
&lt;/h3&gt;

&lt;p&gt;For the &lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.1" rel="noopener noreferrer"&gt;protocol&lt;/a&gt;, forget about any cardinality imparted by that. I only want to think about secure browsing contexts (“https://”). We subtract those 8 characters, leaving us with 1992 characters.&lt;/p&gt;
&lt;h3&gt;
  
  
  Worst Possible Host
&lt;/h3&gt;

&lt;p&gt;What about the host name? Well, what’s the worst case we could possibly run in to?&lt;/p&gt;

&lt;p&gt;Many projects and apps are meant to exist on only one origin, so lets not even allow any mutability in the host.&lt;/p&gt;

&lt;p&gt;The maximum length of a host name is 255-characters. So let’s bring back that behemoth of a name that I showed earlier:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://heres.a.huge.domain.name.as.long.as.it.can.possibly.be.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.example.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Just to be clear, we removed every URL from our set that doesn’t have this domain name which, as you know, was pretty much &lt;em&gt;all of them&lt;/em&gt;. Yet, we’re still left with 1737 characters we can store data in.&lt;/p&gt;
&lt;h3&gt;
  
  
  No Optional Features
&lt;/h3&gt;

&lt;p&gt;There’s still a lot of unpredictability in the size of our set, however. For example, the &lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.1" rel="noopener noreferrer"&gt;user credentials&lt;/a&gt;, &lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3" rel="noopener noreferrer"&gt;port&lt;/a&gt;, query parameters and &lt;a href="https://datatracker.ietf.org/doc/html/rfc3986#section-3.5" rel="noopener noreferrer"&gt;hash/fragment&lt;/a&gt; all add a ton of cardinality to our set but they also add an incredible amount of complexity to the equation.&lt;/p&gt;

&lt;p&gt;Luckily, they’re all optional. We’ll just remove all of the URLs that have any of these features (which, if you didn’t know, &lt;em&gt;was almost all of the URLs we had left&lt;/em&gt;).&lt;/p&gt;
&lt;h3&gt;
  
  
  No Variable-Length Pathnames
&lt;/h3&gt;

&lt;p&gt;At this point, we’re really just counting the set of all valid pathnames up to 1737 characters long. All pathnames require at least the initial slash. In other words, that first pathname character is useless.&lt;/p&gt;

&lt;p&gt;Furthermore, how do we account for the variable-length of pathnames? We’d have to add the number of 2-character pathnames to the number of 3-character pathnames to the number of 4-character pathnames and so on.&lt;/p&gt;

&lt;p&gt;To compute that, we require a &lt;a href="https://en.wikipedia.org/wiki/Geometric_series" rel="noopener noreferrer"&gt;geometric series&lt;/a&gt;. That’s too rich for our worst-case set, so lets just remove every URL whose pathname is not exactly 1737 characters long. Again, we just removed almost every URL from our already stripped-down set.&lt;/p&gt;
&lt;h3&gt;
  
  
  No Special Characters
&lt;/h3&gt;

&lt;p&gt;URL pathnames support 76+ characters (once you include the percent symbol, comma, period, exclamation point, etc.),  suggesting it might be possible to approach base 76. &lt;/p&gt;

&lt;p&gt;Sadly, though, many of these special symbol combinations will get stripped away/normalized down to others during URL resolution. Others will cause an error if used incorrectly. It isn’t trivial to compute the cardinality of that.&lt;/p&gt;

&lt;p&gt;The solution? You guessed it. We’ll remove most of the URLs from our set! Let’s only consider URLs that use the following 64 character alphabet to spell out their pathname segments:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But we can’t just string together 1737 of these bad boys and call it a day… &lt;/p&gt;
&lt;h3&gt;
  
  
  No Variable-Length Segments
&lt;/h3&gt;

&lt;p&gt;A valid URL pathname can be broken up into segments, each separated by a forward slash. Some systems throw an error if even one of those segments is longer than 250 characters. It wouldn’t be terribly hard to account for these arrangements but it &lt;em&gt;would&lt;/em&gt; mean writing out a geometric series.&lt;/p&gt;

&lt;p&gt;So, lets only count URLs that have this exact arrangement:&lt;/p&gt;

&lt;p&gt;Seven fixed-length segments: six 250-character segments followed by one 230 character segment.&lt;/p&gt;

&lt;p&gt;This requires seven slashes to split it all up; 1737 minus 7 leaves us with an even 1730 segment characters.&lt;/p&gt;

&lt;p&gt;Not to sound like a broken record, but almost none of the URLs in our set had this exact arrangement. We just removed almost everything we had left, &lt;em&gt;yet again&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Just for fun, here is a “random” sample from our set:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://heres.a.huge.domain.name.as.long.as.it.can.possibly.be.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.abcdefghijklmnopqrstuvwxyz.example.com/ld9370LC9uzp83Mklv90dujd9v7774n0V7p7em5078B7S790dkb094977au9D07B098yAV76ouyf79J7uft7d5f77g90jki98765dc7hkji7865d7dgy77yuhjkIk8Kgf567hj9ny7GVNjn7677V9jbvr567bj099efbn49efg776ft5x4rxi7T8Yoih0n7hv6r4d657d8g9u8b779ub8yf7t7d75d674s77743s2a1a7772zqzdtcuhbi/007opkolpp7m777ko7n777ou77h8yvtcr7tds5es5241awzsx7dfchvj7jkhboi78g8765c6e4x421s576y57t6fv8iub9ub87ytvc64dc768fv897b9ub9yv7tc7tv8ybhvutF64d52as2zfxcghvbhininIonoi0ih9ubgiI0P1MS07vmllp0097f74d2wa1asswextyvunimlljo00987643212wzqz1a12aswzz23sxerc34dfcrvr/5fvtby65g67buh7nu98m09k0,00k9jubyuhubvtctvubuvtdcrd4dxw23314152375786e6d976f70867f97743d8742a13s7278rf97vtiyfcdtd7xtrwSte7wrxztewzyrTUCtivuyvbOUyv77utrs462s67546rv9vbyv8rtc6X4s13A2ezwrexrcYdexwa2WESDfgtyu789iujhnmko9iujhbVFdre321qasxcfvghuiuytr432was/zxcvfghyui9o876543wsaxcdfghyuI9Oijnjiuygtftdrezwertrytfugyhiu8978gtf7r6d53s64512zwxetCRYtfughioYG87f564dsetrcyvubhij9i8u7t6f5r7743217aqwezsxdcrft7gyh77ujikJHgt5432177777qwertyhj7kJHgre321qaszxcvghjio987654321QWErfcv7bhuyTRfdfgtyui987654321qwerfv77798/bnhjHGv7fghjio09oiujhn7b7VCxsaq12we7rty7u8Ikj7hgFD777seRTyu876YT7r4ewsDFghJiuy6543721Qas7zxcVBnjio9876574321qasDFGhbnJUytrfdsERtyuJHgbvfdeRthBVGCFdsw34543212qaszxcVbghjkio0987654321qasZXcvbnhJKo0987654ERD7sw21qas7ZXcfghyuI9O0okmjki87uyhgbvgt54edsxzsa/Q12qwasXCfrt56tygBnhjio909OIKjmnko09iujhY76tfgcder321q7aszxCvgbhjui7uY6T5r4e321234567879i8UytrfdsXcvbghjIuyTRewqA7SzxcvbgHJik7oKjmjI7UyhgfrEwszx7sAWaszxcdftYUijkmjNHBGfrtYuiuYTredFCghyui89876543eDfgyuytr43edfgyuhbghJUI987654321qaszxCVghui9o876543wErt/fGHYBUtcu63s312asydu6IYUTYVbokuvhtExt42at4wrexcutyvbo8ygoiyrc53yr3254Sdu6rfvoyboiybiutyvyuCtycurc6u5c865777ctycuyut7ityd7i6757DE7U7674s5u74s54sd7xry7txc7jyrfxd7j7yrDujdI7775edu77564st427as13szr7ezUT7rxiYGCkyuC77FJut7ykm79OM0p7978t&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I mashed my keyboard as fast as I could and didn’t bother adding any underscores or dashes, and it still took a surprisingly long time to type this out.&lt;/p&gt;
&lt;h3&gt;
  
  
  Final Cardinality of our Set
&lt;/h3&gt;

&lt;p&gt;Our set is now a fraction of a fraction of a fraction of a fraction of a fraction of a fraction of a fraction of its former self. Every URL in our set is a highly unlikely 264-character origin followed by a just-as-unlikely arrangement of 1730 base-64 digits. Ultimately, what we’ve got here isn’t even a drop in the bucket.&lt;/p&gt;

&lt;p&gt;But the good news is we finally have a set that can be represented by a trivial cardinality expression! Here it is:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;k=641730k = 64^{1730} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1730&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Remember how we said there are less than 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;645464^{54} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;54&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 particles in the observable universe? Contrast that with 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;64173064^{1730} &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1730&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. The ratio is basically 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;0:10 \ratio 1 &lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&lt;span class="mop"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. But what does our final number &lt;em&gt;look&lt;/em&gt; like?&lt;/p&gt;

&lt;p&gt;First, recall this number:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can hash &lt;em&gt;every particle&lt;/em&gt; in the universe with this.&lt;/p&gt;

&lt;p&gt;Now, take a look at the number of URLs in our “tiny” worst-case set:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;49130930808458578125726405944552267433522803882142885516112811523788026785247859392846571767356697524778325967483200069078779474567637462287039820734625250499484361851684556510293931285640090262847320625396236411697500945066199598105166159939755919883442591852056298637720529199720593614665368213198995251597105758524900013562528183914971627692406189778877642149164166096666344310948740383560007413387592604328612531345115046683029331104462385525968171774813136492661946688877582952419371606080350664628677161116012681284900630454342749044599225617460538414933002793524748242310551996204900729123914340847332998493284864702610102439307491216408396209310348370320754399598907600619635495790019370265074821420291117076832510034388136166750175664483098298227108288715448223965251691403281034083780954570303916571362770718114444005072106144764849088939314984894581474809543833192044410395714190504825893726938138808786090562830615071943734645166593502644409746065788403640661934980709315726553694898120393882753330274852067296608154605846048350579895683801542722129840564975973695792574841807503188443209805038542236087627591190050313931573054215490244259112910601708234964741899698246055425592081845013246361046328159137214118378184713651023860908738930831971118247941416724345631434014423798305497398506349015730376483008110926005644593572237269397514131887446582215094604019679547368523447625105463951586910365216023840045751551948134564505146576477286926376308492310938786531574335304262217571479998838543109756673336971087025554889723823983924836021091907239786400390676746118864056643193205208982882660920507349524831913201182159186699144808760747505873640789216340957248824164601830737224297040770920458197407697184648022371257191918470172361380986595622828733829413281500185801880456613038104242643213822575569128878763680705643247394470467893917356297826947055879379566532902944043402022244021075932899192372571062439168957178821897773439784799153514401590031281325655093535268608362216209580429528935699708423114866509895772049714403629267974279109387816328548424345736717256948117015825744199080052425083293799967061771719865084133230904096721868612800747277569863102967441274245770550134896869196181886526475029674372524872538258468524762201586321646559863923236843242370292251062221529264770493701602901661815354058944472808349405810473671013491176811312485003537600785430597702027500137187545757793793903699970939444681886308707596870841054350202539644315500656737966010773075989351158870179723002367751683561878721860274497306669607424568652625472586573342936967070726864546132506261184714500488245623426076538010987701708241991726967647765104168030353744906806687895709021815045224257436600078097509507924968458836098125864106257805097776865485964770796555656543643860800587923743280926493394369557925897760397469072974966876141221188598603450443972539793912611469980053930814065772811818839300960781935055752799228266748050545969251447362299129060916916664278672204155214991658109636131883622892313180240750974195280013175415626930825404039290811759144500594703907940131918638449619062937500747268988899138994176&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;🤯&lt;/p&gt;

&lt;p&gt;Imagine what you could hash with &lt;em&gt;this&lt;/em&gt; range!&lt;/p&gt;

&lt;p&gt;In the case of my project, the “things” I need to hash are operating system states.&lt;/p&gt;

&lt;p&gt;Do I really need this many application states to make an operating system?&lt;/p&gt;

&lt;p&gt;My guess was no, especially if I embrace a minimalist approach to UI interaction design.&lt;/p&gt;

&lt;p&gt;However, to take full advantage of all of that storage space, I would need to create a MPHF that could integrate naturally into today’s web app technology stack.&lt;/p&gt;
&lt;h2&gt;
  
  
  MVC + MPHF
&lt;/h2&gt;

&lt;p&gt;In addition to an MPHF, my project needed a reactive full-stack MVC framework. An application state needed to be recoverable from any hash, and vice-versa, so both the hash function and its &lt;a href="https://en.wikipedia.org/wiki/Inverse_function" rel="noopener noreferrer"&gt;inverse function&lt;/a&gt; had to actually exist and be computable (not just theoretically). Furthermore, it had to be fast - fast enough for real-time operating system interaction (at least 60 frames per second).&lt;/p&gt;

&lt;p&gt;All of my math and programming knowledge is self-taught. Unfortunately, that means I sometimes come upon information in a less-than-ideal order. I filled several fat sketchbooks with graphs and notes and ended up creating a &lt;a href="https://en.wikipedia.org/wiki/Piecewise_function" rel="noopener noreferrer"&gt;piecewise-defined&lt;/a&gt; MPHF.&lt;/p&gt;

&lt;p&gt;Yet, I only learned the term “perfect hash function” &lt;em&gt;after&lt;/em&gt; I finished the algorithm. Had I studied perfect hash functions at any point before this project, it would have shaved months off of the process. But maybe I wouldn’t have arrived at the same breakthrough.&lt;/p&gt;

&lt;p&gt;The breakthrough came when I realized that the structure I was building to support the bijection had a surprising amount in common with MVC architecture. In fact, the two ended up laying right on top of each other and being the &lt;em&gt;same thing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Every MVC controller object is piece of the whole piecewise-defined function. Whether you assign a hash (which acts as the data model) to a controller or manipulate the controller (for example, in response to user interaction), the application state and the model are always be kept in sync.&lt;/p&gt;

&lt;p&gt;Each controller is a reusable component. It has it’s own hash range from 0 to k-1, where k is the cardinality of the component’s model.&lt;/p&gt;

&lt;p&gt;These components assemble together like LEGO® blocks, and no matter what assembly you make with them, the result is still a minimal perfect hash function over the assembly’s state domain.&lt;/p&gt;

&lt;p&gt;Leveraging the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain" rel="noopener noreferrer"&gt;JavaScript prototype chain&lt;/a&gt;, I was able to add object-oriented concepts like inheritance into the equation.&lt;/p&gt;

&lt;p&gt;The algorithm is fast (60hz most of the time - but talk to me later when I put a bit more stress on it) and it powers my operating system’s reactive framework.&lt;/p&gt;

&lt;p&gt;It takes a bit of doing to express an enjoyable user experience using just numbers, but once you have those expressions it is easy to turn them into software components.&lt;/p&gt;

&lt;p&gt;What I’ve made so far are a few basic apps which remember where you scroll in each section and include some basic user preferences like light/dark/device mode, theme options, and a menu that remembers where it is in its open/close tween. All of this comes together in a configuration space that demands &lt;em&gt;less than 5 characters&lt;/em&gt; - significantly less than a base64-encoded JSON object. Not to mention, my domain names are never 255 characters long.&lt;/p&gt;

&lt;p&gt;I’m currently creating the quantitative expressions of movable windows, the ability to have arbitrarily many of them open, and a full read-write file system that behaves in the familiar way. I expect these to start adding length to my hashes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Hopefully, this shows you just how powerful a minimal perfect hash function is when employed for the purposes of data compression.&lt;/p&gt;

&lt;p&gt;The next question I need to answer is whether the URL space is bigger than the multiverse? Check out my previous post, which takes the conversation to the next level.&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/kireji/a-space-age-metaphor-for-software-development-3pie" class="crayons-story__hidden-navigation-link"&gt;A Space-Age Metaphor for Software Development&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/kireji" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667307%2F51465201-ea8a-4067-bad3-97658b2dbd1f.png" alt="kireji profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/kireji" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Eric Augustinowicz
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Eric Augustinowicz
                
              
              &lt;div id="story-author-preview-content-2618963" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/kireji" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667307%2F51465201-ea8a-4067-bad3-97658b2dbd1f.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Eric Augustinowicz&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/kireji/a-space-age-metaphor-for-software-development-3pie" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 23 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/kireji/a-space-age-metaphor-for-software-development-3pie" id="article-link-2618963"&gt;
          A Space-Age Metaphor for Software Development
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/multiverse"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;multiverse&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/metaphor"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;metaphor&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/development"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;development&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/datascience"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;datascience&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/kireji/a-space-age-metaphor-for-software-development-3pie" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/kireji/a-space-age-metaphor-for-software-development-3pie#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;I look forward to writing more about my project soon!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>webcomponents</category>
      <category>webdev</category>
      <category>programming</category>
      <category>mathematics</category>
    </item>
    <item>
      <title>A Space-Age Metaphor for Software Development</title>
      <dc:creator>Eric Augustinowicz</dc:creator>
      <pubDate>Mon, 23 Jun 2025 20:22:06 +0000</pubDate>
      <link>https://dev.to/kireji/a-space-age-metaphor-for-software-development-3pie</link>
      <guid>https://dev.to/kireji/a-space-age-metaphor-for-software-development-3pie</guid>
      <description>&lt;p&gt;&lt;em&gt;Captain's Log, supplemental.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Metaphors are a useful way to develop and present new data structures. The &lt;a href="https://en.wikipedia.org/wiki/Directory_(computing)#Folder_metaphor" rel="noopener noreferrer"&gt;file folder metaphor&lt;/a&gt; is one of the more ubiquitous examples.&lt;/p&gt;

&lt;p&gt;Here, I present a new abstraction that brings the irresistible thrill of science fiction - from &lt;a href="https://en.wikipedia.org/wiki/Starship" rel="noopener noreferrer"&gt;starships&lt;/a&gt; to &lt;a href="https://eureka.fandom.com/wiki/Section_5" rel="noopener noreferrer"&gt;top secret labs&lt;/a&gt; to &lt;a href="https://en.wikipedia.org/wiki/Multiverse" rel="noopener noreferrer"&gt;interdimensional travel&lt;/a&gt; - to the practical world of software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Through Boundaries
&lt;/h2&gt;

&lt;p&gt;The first step toward bringing this fantasy to life is to tear down a familiar boundary: the wall between &lt;em&gt;developing&lt;/em&gt; an application and &lt;em&gt;using&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;Imagine a website with a reactive imperative framework whose entire source code is stored in your browser addressbar. As you browse, the URL changes and so does the app's behavior.&lt;/p&gt;

&lt;p&gt;For a hint at how this could be accomplished efficiently, see this post:&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/kireji/the-url-space-is-bigger-than-the-universe-4dfg" class="crayons-story__hidden-navigation-link"&gt;The URL Space is Bigger than the Universe&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/kireji" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667307%2F51465201-ea8a-4067-bad3-97658b2dbd1f.png" alt="kireji profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/kireji" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Eric Augustinowicz
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Eric Augustinowicz
                
              
              &lt;div id="story-author-preview-content-2619557" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/kireji" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1667307%2F51465201-ea8a-4067-bad3-97658b2dbd1f.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Eric Augustinowicz&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/kireji/the-url-space-is-bigger-than-the-universe-4dfg" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 24 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/kireji/the-url-space-is-bigger-than-the-universe-4dfg" id="article-link-2619557"&gt;
          The URL Space is Bigger than the Universe
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webcomponents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webcomponents&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mathematics"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mathematics&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/kireji/the-url-space-is-bigger-than-the-universe-4dfg#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;No matter what you do in an app like this, only one thing happens under the hood: the source code changes. This demolishes the boundary between browsing and coding.&lt;/p&gt;

&lt;p&gt;Yet, it leaves us with a problem in &lt;a href="https://en.wikipedia.org/wiki/Cognitive_ergonomics" rel="noopener noreferrer"&gt;cognitive ergonomics&lt;/a&gt;: how do you navigate in this app without breaking it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter the Multiverse
&lt;/h2&gt;

&lt;p&gt;Imagine that the app in question is an IDE that you're using to develop &lt;em&gt;a second app&lt;/em&gt;. The source code for both the IDE and your own app will be mixed together.&lt;/p&gt;

&lt;p&gt;We are now entering the untamed realm of a &lt;em&gt;universal&lt;/em&gt; IDE or &lt;em&gt;UIDE&lt;/em&gt;. We can unleash a hard science fiction abstraction to tame it.&lt;/p&gt;

&lt;p&gt;Consider an empty document as the basis of all reality. It is lawless at first, but with each line of code we add, we're adding new laws of physics. The unified space containing all of the possible laws of physics that could ever exist is called the multiverse.&lt;/p&gt;

&lt;p&gt;Any given document represents a point in that unified space. All at once, it includes both the laws of physics of a single universe &lt;em&gt;and&lt;/em&gt; an observer's position in that universe. Everything you do in the UIDE is just motion within the unified space.&lt;/p&gt;

&lt;p&gt;With that in mind, we can design a user interface for the UIDE which makes it feel like there are two different modes of transportation: &lt;a href="https://memory-alpha.fandom.com/wiki/Impulse_engine" rel="noopener noreferrer"&gt;one that moves you around the universe&lt;/a&gt; and &lt;a href="https://rickandmorty.fandom.com/wiki/Portal_Gun" rel="noopener noreferrer"&gt;one that moves you around the multiverse&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this interface - just like in the real world - you can travel the world without destroying the universe or changing its fundamental laws.&lt;/p&gt;

&lt;p&gt;However - unlike the real world - this abstraction equips you with a very dangerous piece of technology: a gateway to other realities.&lt;/p&gt;

&lt;p&gt;Make the wrong move, and you might get ripped apart, get stuck in a time loop, or cease to exist entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Gateway to Many Worlds
&lt;/h2&gt;

&lt;p&gt;So now we can separate in-universe changes from out-of-this-world changes. But which changes are which? That, like the laws of physics themselves, depends entirely on which universe you are in.&lt;/p&gt;

&lt;p&gt;This is perhaps no more satisfying than when we let our imagination run wild with what kind of user interface could be created - especially if we include all of the possible &lt;em&gt;games&lt;/em&gt; that are also &lt;em&gt;UIDEs&lt;/em&gt; (&lt;em&gt;GUIDEs&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;In one world, you are a starship captain in a galactic empire. They've installed both you and the reality drive onto a cutting edge starship and given it a capable crew. In that world, you can fly directly into other worlds while keeping your starship wherever you go.&lt;/p&gt;

&lt;p&gt;In another world, they've hidden the technology in Section 5 of a top-secret research facility. You wouldn't even know about it unless you were invited to participate in the secret project. On your way down that elevator, they'll ask you: are you brave enough to take control of the laws of physics?&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This metaphor is one of my favorite ideas. The sci-fi edge makes the experience entertaining while also bringing to mind the potential consequences.&lt;/p&gt;

&lt;p&gt;It's also a metaphor that begs to be extended. With the right presentation of this technology, it becomes both easy and fun to do just that.&lt;/p&gt;

&lt;p&gt;That is the inspiration behind my game project, &lt;em&gt;Kireji: The Reality Drive&lt;/em&gt;. The goal of that project is to build the UIDE and use it to "find" an &lt;em&gt;open world&lt;/em&gt; and &lt;em&gt;open multiverse&lt;/em&gt; game.&lt;/p&gt;

&lt;p&gt;It is one of the many ongoing threads I’m exploring to make my dream come true: making software engineering enjoyable and accessible to everyone.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>multiverse</category>
      <category>metaphor</category>
      <category>development</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
