QUIC / HTTP/3 on the BEAM — what to add next to Elixir

Copy Markdown View Source

Phoenix and Bandit do not speak HTTP/3. Bandit is HTTP/1.1 + HTTP/2 over TCP (Thousand Island). HTTP/3 needs QUIC over UDP. Gale is the Zig-NIF codec

  • alt-svc Plug that sits beside Bandit, not a replacement.

Map

PackageHexRoleH3How it fits Elixir
Gale (this)unpublishedDrop-in Bandit/Phoenix/Finch/Req + H3H1/H2 + H3adapter: Gale.PhoenixAdapter, {Gale, plug: ...}, Gale.get/2
BanditbanditPhoenix default servernoKeep for H1/H2
CowboycowboyRanch HTTP serverpartial (quicer NIF, not Plug-H3)plug_cowboy still H1/H2
Mint / Finch / Reqmint finch reqClientsnoALPN http/1.1 + h2 only
quicquic 1.8.xPure Erlang QUIC + quic_h3yesBest in-VM transport. Used by hackney, quiver, webtransport, livery
hackney 4.xhackneyClientopt-in experimental{protocols, [http3, http2, http1]}
quiverquiver 0.4Elixir clientyes (on quic)Closest Finch-like H3 client
http_fetchhttp_fetchFetch APIvia quicBrowser-shaped client
webtransportwebtransportWT over H2/H3yesAlready in phoenix_kit/saas_kit locks
liveryliveryErlang web frameworkH1+H2+H3Not Plug/Phoenix
quicergit emqx/quicMsQuic NIFtransportEMQX MQTT-over-QUIC; Linux/macOS
quichexquichex 0.3quiche RustlerexperimentalNeeds Rust; not a Phoenix adapter
requiemrequiemWebTransport ElixirexperimentalForked quiche
Caddy / nginx / CFproxyTerminate H3yesProduction Phoenix path
  1. quic + quic_h3 — real UDP QUIC/H3 in the VM. Gale can feed QPACK bytes into it later.
  2. hackney 4.x or quiver — outbound H3 for Elixir apps (Mint/Req cannot).
  3. Keep Bandit for inbound H1/H2; advertise H3 with Gale.Plug.AltSvc and terminate QUIC at Caddy until a Plug adapter exists.
  4. Do not wait on Bandit/Mint H3. Do not treat quichex/quicer as Phoenix servers.

Gaps nobody fills yet

  • Plug/Phoenix adapter that accepts browser HTTP/3 (UDP listener + TLS-for-QUIC + QPACK + Plug.Conn).
  • Mint transport for QUIC (would unlock Finch/Req).
  • Thousand Island UDP/QUIC acceptor.