Slash Socket turns a JSON manifest into a real-time server. The manifest names fields — a chat list, a likes counter, who's here, everyone's cursor — and says who may read and write each one. The runtime serves exactly those fields over a WebSocket, checks every write against them, and your page uses them through a small client. There's no server code to write.
slash.tools keeps your manifests and your account. It never sits between your visitors and your socket.
- presencepresence
- cursorstream
- chatlist
- likescounter
- One manifestFields and who may touch them. No server code.
- Your serverOn your Mac or any host, from the same runtime.
- Your domain, your trafficVisitors never pass through slash.tools.
- The app is the consoleManage every one of your servers from one place.
- The manifest — one JSON file. Write it on slash.tools under Dashboard → Socket, with the field builder or as JSON, or have an LLM write it with the Slash Socket skill.
- The server — the same runtime wherever you want it: inside the Slash Socket app on your Mac, or slash-socket-server on Fly.io, Railway, Render, a VPS, or anything else that runs a container.
- The client — your page imports connect from your server's /client.js (or @slash.tools/socket from npm) and reads and writes fields by name.
- The app — Slash Socket is the console: every field rendered by type, the pages connected, removing and banning, for your Mac's server or any server you add with its admin key.
12345678910111213{ "$schema": "https://slash.tools/socket/v1.json", "name": "portfolio-live", "title": "Portfolio live", "origins": ["https://astrit.co"], "fields": { "presence": { "type": "presence", "shape": { "page": "string(200)?" } }, "cursor": { "type": "stream", "shape": { "x": "number(0..1)", "y": "number(0..1)" } }, "chat": { "type": "list", "shape": { "text": "string(500)" }, "keep": 200 }, "likes": { "type": "counter", "perVisitor": 1, "min": 0 }, "status": { "type": "value", "shape": { "text": "string(140)" } } }}123456789101112import { connect } from "https://live.astrit.co/client.js"
const socket = connect("wss://live.astrit.co", { name: "Ada" })
socket.field("chat").subscribe((items) => renderChat(items))socket.field("likes").subscribe((count) => (likeButton.textContent = `♥ ${count}`))
likeButton.onclick = () => socket.field("likes").incr()form.onsubmit = () => socket.field("chat").push({ text: input.value })addEventListener("pointermove", (e) => socket.field("cursor").send({ x: e.clientX / innerWidth, y: e.clientY / innerHeight }))Your server, your traffic. Visitors connect straight to your server; slash.tools keeps your manifests and your account and is never in the path between your visitors and your socket, so there's no shared server to outgrow and no bill but your own host's. Domains are yours too: point any domain at your server, or let the dashboard publish one through Vercel for a socket running on your Mac.
Next: the Manifest reference, the field types, the client, and a deploy recipe for wherever you want it to run.