Mesh servers

Three servers run every portal

Each kind of portal name is served by one of three servers: identities by the Character Server, places by the Portal Server, and experiences and works by the Experience Server. Jubilee hosts all three for you, or you can run one yourself.

Hosted by Jubilee

Jubilee runs one Character Server, one Portal Server and one Experience Server for every customer at once. Nothing is set up for you alone, so turning hosting on is immediate: your names run on the server for their kind, and you see them here with the server's health and your usage.

A .character's yearly fee already includes a year on Jubilee's Character Server, with 50 GB of memory storage.

Run it yourself

Each server is its own codebase, and the code Jubilee runs is the code you can run on your own machine with Node. The download is that self-host build: the server in one JavaScript file, with its database schema and a README that explains every setting.

Still being settled

A self-hosted server's place in the Mesh is still Jubilee's to decide: who reviews a self-hosted .character's Character DNA before it is born, and how the registry learns which server holds a name and accepts births from it. Until then you can install and try a server yourself; your names are still registered, born and certified by Jubilee, a name runs on your server only when its ENDPOINT record points there, and Jubilee's hosted servers keep serving your names.

Character Server

Checking for the download

What it needs

  • Node 22.13 or later. It uses Node's own SQLite.
  • A database: Postgres (install its driver beside the server with npm install pg), or SQLite in one file for a small server.
  • S3-compatible storage with two buckets, one for memory and one for voices, and Redis as a cache. A production server will not start without them.
  • From Jubilee: the root public key every certificate is checked against, and this server's own service token.
  • Your own secrets: a key that seals owners' model keys, a key that signs sessions, and an OpenAI-compatible model gateway for conversations.
  • An HTTPS proxy in front of it, and one process: a second process would not see the first one's open conversations.

Start it from the unpacked folder:

node character-server.mjs check
node character-server.mjs migrate
node character-server.mjs serve

Portal Server

Checking for the download

What it needs

  • Node 20 or later. Its built-in SQLite database needs Node 22.13 or later.
  • A database: SQLite (the default) or Postgres (install its driver beside the server with npm install pg).
  • A folder or an S3-compatible bucket for scene files. Redis is optional; without it the cache is in memory.
  • From Jubilee: the root public key and the service tokens for the Portal and Character Servers. Without the key, no place opens.
  • An HTTPS proxy in front of it: browsers on a secure page open only secure room connections.
  • For voice, a Cloudflare Realtime app of your own. Without one, rooms tell visitors that no audio flows.
  • One process: every place and room lives in it, and a restart closes the open rooms.

Start it from the unpacked folder:

node portal-server.mjs

Experience Server

Checking for the download

What it needs

  • Node 20 or later. SQLite needs Node 22.13 or later.
  • A database: Postgres (install its driver beside the server with npm install pg) or SQLite.
  • A folder or S3-compatible storage for scripts and packages. Redis for the cache and the job queue, or memory, where waiting reports are lost on a restart.
  • From Jubilee: the root public key and the service tokens for the Experience, Character and Portal Servers.
  • Your own staff to review reserved events and tragedies, in the Experience Admin.

Start it from the unpacked folder:

node --env-file=.env server.mjs

Before you run a download, compare its SHA-256 with the one shown here: sha256sum <file> on Linux, shasum -a 256 <file> on macOS, or certutil -hashfile <file> SHA256 on Windows. The developer docs describe the records every server works with.