Skip to content

Server & Native Apps

Use a server-side SDK when your app owns the authoritative state outside the browser. These providers expose a public WebSocket, Unix socket, or stdio endpoint directly instead of relying on the browser extension.

RuntimePackageBest fit
TypeScript / Node / Bun@slop-ai/serverservices, local desktop helpers, CLI tools
TanStack Start@slop-ai/tanstack-startfull-stack React apps with mounted UI state
Pythonslop-aiFastAPI, services, local tools
Goslop-ainet/http services, daemons, CLI tools
Rustslop-aiAxum apps, daemons, CLI tools
import { createServer } from "node:http";
import { createSlopServer } from "@slop-ai/server";
import { attachSlop } from "@slop-ai/server/node";
const slop = createSlopServer({ id: "my-app", name: "My App" });
slop.register("todos", () => ({
type: "collection",
props: { count: getTodos().length },
items: getTodos().map((todo) => ({
id: todo.id,
props: { title: todo.title, done: todo.done },
})),
}));
const server = createServer(app);
attachSlop(slop, server, { path: "/slop" });
server.listen(3000);

When the provider lives on the same machine as the consumer, Unix socket or stdio transports are a good fit:

import { listenUnix } from "@slop-ai/server/unix";
listenUnix(slop, "/tmp/slop/my-app.sock", { register: true });
from slop_ai.transports.unix import listen
server = await listen(slop, "/tmp/slop/my-app.sock", register=True)
slop.ListenUnix(ctx, server, "/tmp/slop/my-app.sock", slop.WithDiscovery(true))
let handle = slop_ai::transport::unix::listen(&slop, "/tmp/slop/my-app.sock").await?;

Server-backed web apps should expose /.well-known/slop alongside the WebSocket endpoint.

Local apps can register a descriptor in ~/.slop/providers/ so the desktop app, the inspector, and other consumers can discover them automatically.