Rework OrbitFour section: add intro and feature overview slides

Torey Heinz committed Feb 22, 2026
commit 603c6a3bd2d5fe1015c43477ed518a2b2f315823
Showing 1 changed file with 31 additions and 71 deletions
slides/03-real-world.html +31 -71
@@ @@ -233,94 +233,54 @@ end
</section>
<section>
- <h2>The Challenge</h2>
- <p>OrbitFour is a <strong>domain registrar</strong> and needs to communicate with registries like Verisign via EPP as our <strong>core function</strong>.</p>
+ <h2>What is OrbitFour?</h2>
+ <p>A <strong>domain registrar</strong> &mdash; customers buy and manage domain names like <code>.com</code> and <code>.net</code>.</p>
<ul>
- <li class="fragment">Originally an <strong>open-source PHP EPP library</strong> was used.</li>
- <li class="fragment">Open-source is great for non-core features.</li>
- <li class="fragment">We needed to <strong>own</strong> the protocol layer: persistent TCP/TLS, connection pooling, automatic recovery</li>
+ <li class="fragment">Communicates directly with <strong>Verisign</strong> to register domains</li>
+ <li class="fragment">Handles the full lifecycle: search &rarr; register &rarr; DNS &rarr; renew &rarr; transfer</li>
+ <li class="fragment">Customer portal, billing, and marketing site &mdash; all in one</li>
</ul>
<p class="fragment muted small" style="margin-top: 0.8em;">
- Elixir made this possible &mdash; the BEAM was literally built for managing network connections.
+ Think GoDaddy or Namecheap &mdash; but built by a small team in West Michigan.
</p>
<aside class="notes">
- OrbitFour is a domain registrar. Talking to Verisign over EPP is the single most important thing the app does. Originally we relied on an open-source PHP EPP library — it worked, but we didn't fully understand it, and when things broke we were at the mercy of upstream. Using open-source for non-core features is smart — but when the feature IS your product, you need to own it. Elixir made this realistic. The BEAM was designed for exactly this kind of work: persistent TCP connections, connection pooling, automatic recovery. We could write our own EPP client and actually understand every line.
+ OrbitFour is Vianet's domain registrar. Customers come to the site, search for a domain, buy it, manage DNS, renew it — the whole lifecycle. Under the hood, it talks directly to Verisign over a persistent TCP connection to actually register .com and .net domains. Think GoDaddy or Namecheap, but built by a small team right here in West Michigan. And it's all one Elixir app.
</aside>
</section>
<section>
- <h2>The Connection</h2>
- <p class="muted small"><code>with</code> chains &mdash; same pattern as the email worker</p>
-
- <pre><code class="language-elixir" data-trim>
- def connect(host, port, username, password, opts \\ []) do
- with {:ok, socket_info} <- establish_ssl_connection(host, port, opts, timeout),
- {:ok, greeting} <- read_greeting(socket_info, timeout),
- :ok <- validate_greeting(greeting),
- {:ok, session_id} <- perform_login(socket_info, username, password, timeout) do
- {:ok, %__MODULE__{
- socket: socket_info, host: host, port: port,
- logged_in: true, session_id: session_id, greeting: greeting
- }}
- else
- {:error, reason} = error ->
- Logger.error("EPP connection failed to #{host}:#{port} - #{inspect(reason)}")
- error
- end
- end
- </code></pre>
-
- <p class="fragment" style="font-size: 0.75em; color: #555;">
- Four steps: connect &rarr; read greeting &rarr; validate &rarr; login.<br/>
- If any step fails, it short-circuits. Clean, linear, <strong>no nesting</strong>.
- </p>
+ <h2>Lots of Moving Parts</h2>
+ <p class="muted small">but a single Phoenix app handles <strong>everything</strong></p>
+ <ul>
+ <li class="fragment"><strong>EPP</strong> &mdash; register, renew, transfer, and manage domains</li>
+ <li class="fragment"><strong>RDAP &amp; WHOIS</strong> &mdash; public lookup APIs (RFC-compliant)</li>
+ <li class="fragment"><strong>Billing</strong> &mdash; Stripe payments, invoicing, renewals</li>
+ <li class="fragment"><strong>DNS</strong> &mdash; zone management, DNSSEC, nameservers</li>
+ <li class="fragment"><strong>Portal</strong> &mdash; LiveView dashboard, 2FA, account management</li>
+ <li class="fragment"><strong>Marketing site</strong> &mdash; public pages, domain search, SEO</li>
+ <li class="fragment"><strong>16 background workers</strong> &mdash; syncing, renewals, health checks, cleanup</li>
+ </ul>
<aside class="notes">
- Same `with` pattern we saw in the email worker. Four steps: establish SSL connection, read the greeting, validate it, perform login. If any step fails, it short-circuits with an error. No callback hell, no nested if-statements.
+ Before we talk about the challenge, look at what this single Elixir app handles. EPP protocol for talking to Verisign over persistent TCP. RDAP and WHOIS public APIs. Stripe billing with invoicing and auto-renewals. DNS zone management with DNSSEC. A full customer portal built in LiveView with two-factor auth. The marketing website. And 16 background workers handling everything from domain syncing to SSL provisioning. In most stacks, this would be 4 or 5 separate services. Here it's one app, one deployment, one supervision tree.
</aside>
</section>
<section>
- <h2>Connection Pool</h2>
- <p class="muted small">Long-lived TCP sessions managed as supervised processes</p>
-
- <pre class="small-code"><code class="language-elixir" data-trim>
- defmodule OrbitFour.Epp.ConnectionPool do
- use GenServer
-
- @pool_size 2 # Connections per registry
- @max_overflow 3 # Extra connections under load
- @max_connection_age 4 * 60 * 60 * 1000 # 4 hours
-
- def with_connection(registrar_module, fun, opts \\ []) do
- timeout = Keyword.get(opts, :timeout, 30_000)
- try do
- GenServer.call(__MODULE__, {:checkout, registrar_module, timeout}, timeout + 5_000)
- |> case do
- {:ok, conn} ->
- try do
- result = fun.(conn)
- GenServer.cast(__MODULE__, {:checkin, registrar_module, conn, :ok})
- result
- rescue
- error ->
- GenServer.cast(__MODULE__, {:checkin, registrar_module, conn, :error})
- reraise error, __STACKTRACE__
- end
- {:error, :pool_exhausted} ->
- {:error, "Connection pool is busy. Please try again."}
- end
- catch
- :exit, {:timeout, _} ->
- {:error, "Registry is taking too long to respond."}
- end
- end
- end
- </code></pre>
+ <h2>The Core Function</h2>
+ <p>OrbitFour is a <strong>domain registrar</strong> and needs to communicate with registries like Verisign via EPP as our <strong>core function</strong>.</p>
+ <ul>
+ <li class="fragment">Originally an <strong>open-source PHP EPP library</strong> was used.</li>
+ <li class="fragment">Open-source is great for non-core features.</li>
+ <li class="fragment">We needed to <strong>own</strong> the protocol layer: persistent TCP/TLS, connection pooling, automatic recovery</li>
+ </ul>
+ <p class="fragment muted small" style="margin-top: 0.8em;">
+ Elixir made this possible &mdash; the BEAM was literally built for managing network connections.
+ </p>
<aside class="notes">
- The connection pool is a GenServer managing long-lived TCP sessions. The public API is with_connection — checkout a connection, run your function, return it. If your function succeeds, the connection goes back to the pool. If it raises, we mark it as errored and the pool creates a fresh one. If the pool is exhausted, we return a user-friendly error. All supervised.
+ OrbitFour is a domain registrar. Talking to Verisign over EPP is the single most important thing the app does. Originally we relied on an open-source PHP EPP library — it worked, but we didn't fully understand it, and when things broke we were at the mercy of upstream. Using open-source for non-core features is smart — but when the feature IS your product, you need to own it. Elixir made this realistic. The BEAM was designed for exactly this kind of work: persistent TCP connections, connection pooling, automatic recovery. We could write our own EPP client and actually understand every line.
</aside>
</section>
@@ @@ -336,7 +296,7 @@ end
</ul>
<p class="fragment" style="font-size: 0.8em; margin-top: 0.8em; color: #555;">
These services took <strong>years</strong> to build originally.<br/>
- <span class="fragment">With Elixir + Claude Code, we replaced them all in <strong>under six months</strong>.</span>
+ <span class="fragment">With <strong>Elixir</strong> + Claude Code,<br> we replaced them all in <strong>under six months</strong>.</span>
</p>
<aside class="notes">