Centina binary setup and self-hosting playbook
This guide is for people who receive Centina as a self-contained executable. They do not need Bun, Node.js, a source checkout, node_modules, or a separate web bundle.
The centina binary contains four pieces:
centina ├── browser application ├── local web server ├── collaboration bridge └── stdio MCP server
Pick the pattern you need
| Goal | Host runs | Other people run | Supported |
|---|---|---|---|
| Use Centina locally | centina serve + a browser | Nothing | Yes |
| Use Centina with an agent | centina serve + centina mcp | Nothing | Yes |
| Share with people on the LAN | centina serve --host + a browser | A browser | Yes |
| Share while host-side agents edit | centina serve --host + centina mcp | A browser | Yes |
| Give every LAN guest their own MCP | A local Centina process per person | A local Centina process per person | Not yet |
| Expose Centina over the internet | Authenticated TLS deployment | A browser | Not yet |
Install the binary
Supported platforms: macOS on Apple silicon (darwin-arm64) and Linux on x86_64 or aarch64 with glibc (linux-x64, linux-arm64). musl systems (Alpine), Intel macOS, and Windows are not supported yet — the installer refuses them up front rather than half-installing.
One-liner — the same command on every supported platform. It detects the OS and architecture, downloads the matching latest release, verifies its SHA-256 checksum, and installs it to ~/.local/bin/centina (override the destination with CENTINA_INSTALL_DIR):
curl -fsSL https://get.centina.build/install.sh | bash
Manually: <https://get.centina.build/latest> names the newest version. Download the artifact for your platform and its checksum, verify, and put the binary on PATH (shown for darwin-arm64 — substitute linux-x64 or linux-arm64, and sha256sum -c for shasum -a 256 -c on Linux):
VERSION=$(curl -fsSL https://get.centina.build/latest)curl -fLO "https://get.centina.build/centina-v${VERSION}-darwin-arm64"curl -fLO "https://get.centina.build/centina-v${VERSION}-darwin-arm64.sha256"shasum -a 256 -c "centina-v${VERSION}-darwin-arm64.sha256"install -m 755 "centina-v${VERSION}-darwin-arm64" "$HOME/.local/bin/centina"centina --version
If $HOME/.local/bin is not already on PATH, either add it or invoke Centina by its absolute path.
The alpha binary is not signed or notarized
Verify the checksum — that is the integrity check for an unsigned download. On macOS, files that arrive via a browser or AirDrop carry the quarantine attribute, and Gatekeeper will refuse to run the binary ("cannot be opened because the developer cannot be verified"). The remedy, only after the checksum verifies:
xattr -d com.apple.quarantine ~/.local/bin/centina
curl downloads (including the one-liner) don't set the attribute, so the steps above run as-is. If a checksum does not match, discard the file — do not run it, and do not disable operating-system security globally.
Command reference
centina serve [--host] [--port <port>] [--no-open] centina mcp centina --help centina --version centina --license
servestarts the browser application and collaboration bridge.--hostallows other machines on the local network to connect.--portchanges the web port; the bridge follows at web port plus701.--no-openstarts the services without opening a browser automatically.mcpruns the newline-delimited stdio MCP server. An MCP client launches this command; people normally do not run it interactively.--licenseprints the Free Binary License the binary is distributed under — the text travels inside the executable, so every copy carries its own license. The running application shows the same text from the Home screen's footer.
Pattern 1: one person, local editor
Run:
centina serve
Centina prints its URL and opens it in the default browser. If automatic opening is disabled or unavailable, open the printed URL manually. The default is:
http://localhost:3000
Keep the terminal process running while Centina is open. Stop it with Ctrl-C.
Data and backups
Centina autosaves canvases in the browser's IndexedDB. Browser storage is tied to the complete origin, including its port:
http://localhost:3000 != http://localhost:4500
Changing the port therefore looks like a new Centina library; it does not move or delete canvases stored at the old origin. Before changing ports, browsers, or machines, use Canvas actions → Export canvas. Import the resulting .centina.json file into the new library.
Use the same browser profile for normal sessions. Private/incognito windows may discard their IndexedDB data when closed.
Pattern 2: local editor with MCP
The MCP client launches centina mcp; the already-running centina serve process owns the local bridge and the browser tab owns the live canvas:
MCP client ⇄ centina mcp ⇄ local bridge ⇄ open browser tab
First start the editor:
centina serve
Then register the MCP command. Claude Code, for example:
claude mcp add centina -- centina mcp
If centina is not on PATH, use its absolute path:
claude mcp add centina -- /absolute/path/to/centina mcp
For a client that accepts JSON configuration, use the equivalent shape:
{"mcpServers": {"centina": {"command": "/absolute/path/to/centina","args": ["mcp"]}}}
Ask the agent to call ping or get_canvas_info to verify the connection.
Important operating rules:
- The server process and browser tab must both remain open. A running server without a tab has no live canvas for MCP to read or edit.
- If several Centina tabs use the same origin, the newest tab becomes the MCP target and the older one disconnects from the bridge.
- Several MCP sessions may connect concurrently. They all edit that one active tab.
- Every MCP write is an undoable editor operation.
- Screenshot tools may require a compatible browser debugging connection; follow the actionable message returned by the tool when it is unavailable.
The complete tool and operating reference lives in the MCP guide.
Pattern 3: share a canvas on a trusted LAN
Start Centina on all network interfaces:
centina serve --host
The terminal prints a local URL and, when an external IPv4 address is found, a LAN URL such as:
http://192.168.1.42:3000
On the host:
- Open the local URL in a browser.
- Open the canvas to share.
- Click Share.
- Choose whether guests can edit or only view.
- Click Start sharing.
- Send the generated join link to people on the same network.
Guests only need a browser; they do not need the Centina binary. Opening the join link gives them the host's current canvas snapshot followed by live edits, presence, and cursor updates.
The host must keep all three of these alive:
- The
centina serve --hostprocess. - The host's browser tab.
- The shared canvas mounted in that tab.
Stopping sharing or leaving the shared canvas ends the room. A page reload has a short grace period so an ordinary refresh does not immediately eject guests.
Ports and firewalls
The default ports are:
| Service | Default | With --port 4500 |
|---|---|---|
| Web application | 3000 | 4500 |
| Collaboration/MCP bridge | 3701 | 5201 |
The bridge is always the web port plus 701. To choose another base port:
centina serve --host --port 4500
Allow inbound TCP traffic to both ports in the host firewall. Do not expose any browser debugging port. If guests cannot connect even though the firewall is open, check whether the Wi-Fi access point enables client/AP isolation; guest networks commonly prevent devices from reaching one another.
LAN security boundary
LAN hosting is intentionally a trusted-network feature:
- The web app and collaboration
/syncsocket are reachable from the LAN. - MCP agent and editor-control sockets remain loopback-only; remote attempts receive HTTP 403.
- Rooms have no accounts, passwords, authentication tokens, or transport encryption.
- Do not port-forward these ports or expose them directly to the internet.
Use a private home, studio, or office network whose participants you trust. Internet self-hosting needs TLS, authenticated share tokens, and a hardened deployment mode that Centina does not currently provide.
Browser limitations for LAN guests
The host uses localhost, which browsers treat as a potentially trustworthy origin. A guest normally uses a plain private-IP URL such as http://192.168.1.42:3000, which is not a secure context. Core canvas editing and collaboration work, but browsers may withhold powerful APIs such as advanced clipboard access and local-font enumeration. Export/import and ordinary browser fallbacks remain the recovery path.
Pattern 4: LAN collaboration with host-side agents
Register MCP once:
claude mcp add centina -- centina mcp
Start each hosting session with:
centina serve --host
The host may connect several MCP sessions. Their work propagates to every guest through the collaboration room, including the Crafting presence indicator. All host-side agent writes use the host's collaboration identity; they do not appear as separate remote guests.
Remote guests cannot attach MCP to their LAN-loaded tab and cannot control the host's tab through the exposed bridge.
Multiple users with their own MCP
This pattern is not supported by the current binary protocol. Safe support requires each person to run Centina locally:
guest's MCP client
⇅ loopback
guest's local Centina process
⇅ collaboration only
host's LAN relayThe app must first separate its local browser origin from its collaboration relay address. Merely exposing the host's /agent socket to the LAN would grant control of the host's tab and is not an acceptable workaround.
Until relay separation ships, use host-side MCP sessions and ordinary browser guest collaboration.
What is included in a release
The executable is self-contained. A release publishes, side by side at get.centina.build:
- One
centinabinary per supported platform (darwin-arm64, linux-x64, linux-arm64), namedcentina-v<version>-<platform>. - A SHA-256 checksum beside every binary.
- The installer script (
install.sh) and alatestversion manifest.
This playbook and the project license are published on the documentation site. Nothing else is needed — not the source repository, not Bun or Node.js, not node_modules, not a build toolchain.
Troubleshooting
centina: command not found
Put the binary on PATH or invoke it by absolute path. On macOS/Linux, also confirm it is executable:
chmod u+x /absolute/path/to/centina/absolute/path/to/centina --version
The operating system blocks the binary
The alpha binary is unsigned; macOS Gatekeeper blocks copies that carry the browser/AirDrop quarantine attribute. Verify the download's checksum against the published .sha256, then remove the attribute (xattr -d com.apple.quarantine <path>) — see the install section. If the checksum does not match, discard the file. Do not disable operating-system security globally.
Centina ... isn't running
Start centina serve for the same origin the MCP reference names, then open that URL in a browser. Remember that localhost:3000 and localhost:4500 are different instances.
No editor tab is open
The server and bridge are running, but no browser tab has connected. Open or reload the printed Centina URL and retry after a few seconds.
A port is already in use
Another Centina process or application owns the web or bridge port. Stop the older process or choose another base port:
centina serve --port 4500
For LAN hosting, remember to allow both 4500 and 5201 through the host firewall.
Guests can load the app but cannot join
Confirm that:
- The host used
--host, not the loopback-only default. - The host clicked Start sharing for the open canvas.
- Both TCP ports are allowed through the firewall.
- The guest used the generated link, including its
?join=...value. - Both machines are on a LAN that permits device-to-device traffic.
A guest's clipboard or installed fonts are unavailable
This is usually the browser's secure-context policy for a plain HTTP private IP, not a collaboration failure. Use browser fallbacks or canvas export/import; do not disable browser security globally.
Canvases appear to be missing after changing ports
Return to the original origin and export them:
http://localhost:<old-port>
Then import the .centina.json files at the new origin.