E2 Dev.

This site is 96 pages. That is the entirety of the E2 world: every person, every city, every system, documented and live at /e2/pages/.

It all runs from one repo (thestudio-io on GitHub), deployed to Vercel as plain static HTML. No database, no build step for content. An edge middleware routes the e2planet.com root and injects the E2 tagline bar on every page. Generators in e2/*.py render the cities, the people index, the pages index, and the online-now avatars, so nothing is ever hand-edited twice.

The 85 pages break down like this: People (the full cast, each with their own page), Cities (every E2 city, each with its own page), Systems (gym, town square, map, passport, radio, lab, workshop, server room, night market, beach, lake, cabin and more), Docs (how the worlds run, brand, tags, values, timeline), and Blogs (Mike, Sally, Dinesh and the bot blog). The sitemap below lists every one.

Files

Where things live

e2/
  index.html          front door (six white boxes)
  people/
    index.html        Our People (from /characters/, E2 chrome)
    casting/          casting copy, links in-world
  cities/index.html   E2 Cities (from /worlds/, musicals removed)
  docs/index.html     world docs (from /worlds/how-they-run/)
  dev/index.html      this page
  brand/index.html    E2 brand page (from /brand/)
  tags/index.html     E2 tags page (from /tags/, urls rewritten in-world)
  passport/
    index.html        E2 passport (original build, flippable booklet)
e2takes/              E2 image takes (hero, city, judge...)
e2planet/index.html   the e2planet.com splash (576 bytes)
middleware.js         edge routing (root hosts + tagline bar)
vercel.json           rewrites, redirects, llama 308s
Sitemap

Every E2 page

Plus: every Studio page is mirrored under /e2/* automatically. /e2/music/, /e2/shortbus/, /e2/radio/, all of them. No copies, no extra files.

Architecture

One repo, zero duplication

E2 is not a second site. It is a lens over the one site. One repo (~/workspace/thestudio-real/), one Vercel project, one deploy. The whole E2 world is expressed in two files:

Native E2 pages (front door, people, cities, docs, dev) are real files under e2/. Everything else is a rewrite. Nothing is copied twice.

Routing

How /e2/* resolves

The mirror rewrites

{ "source": "/e2/:path+",  "destination": "/:path*"  },
{ "source": "/e2/:path+/", "destination": "/:path*/" }

/e2/starvard/ serves /starvard/. /e2/music/ serves /music/. The second rule exists because Vercel's :path+ never matches a trailing slash, so /e2/foo/ needed its own companion rewrite. That bug cost a round of debugging; now it is a standing pattern.

Native E2 pages win

Real files under e2/ take precedence over the rewrites: /e2/, /e2/people/, /e2/cities/, /e2/docs/, /e2/dev. They carry E2 chrome (E2 nav, E2 footer) instead of the mirrored page's chrome.

Llama stays out

Per Dave's standing call, Llama is fully excluded from E2. No folder, no mirror. /e2/llama* and /e2/sloth* 308-redirect to llamachat.io. The E2 front door never mentions Llama; the nav Chat link points at thestudio.io/llama as an external hop.

Redirects mirror too

All 256 redirect aliases in vercel.json are mirrored under /e2/ with in-world destinations, so old links keep working inside the world.

Edge middleware

What the rewrites cannot do

The root-path lesson

Vercel resolves / to /index.html via static-file matching before the rewrites array runs. Host-based rewrites (has: [{type: host}]) can never catch the root path; they work fine for every subpath. This was found the hard way when e2planet.com served the Studio homepage instead of the splash.

Fix: middleware.js at the repo root with matcher: ['/', '/e2/:path*'], running before all routing. Gotcha: plain Response.rewrite() does not exist in the edge runtime (it is Next-only); without the next package, do an internal fetch() subrequest instead. The destination must not match the matcher or it loops; the x-middleware-subrequest / x-e2-bar-done headers guard against that.

The tagline bar

Mirrored /e2/* pages get the E2 tagline bar injected before </body>: E2 - Come build a better world with us. The middleware fetches the page through normal routing (so rewrites, redirects, and static files all resolve), then injects. Native E2 pages already carry E2 chrome, so any HTML already containing the tagline is returned untouched. Non-HTML responses pass through untouched.

E2 chrome

The look

Deploys

Shipping

Numbers

By the numbers