skein-js — The open-source LangGraph Platform alternative, for TypeScript
Skip to content
Appearance
skein-jsThe open-source LangGraph Platform alternative, for TypeScript<br>Self-host your LangGraph.js agents on your own infrastructure — your servers, your database, your data. Apache-2.0, no licence key, no per-run bill.<br>Get started<br>Why skein-js?<br>See it running
🧠<br>Memory & persistence<br>Short-term state checkpointed per conversation, and long-term memory that outlives every one of them — three different lifetimes, and users notice when you only have the first.<br>State, context & persistence
💬<br>Threads & session state<br>Multi-turn conversations that survive requests, restarts and deploys — addressable by an id you already have: a ticket, a phone number, a customer.<br>Threads & time travel
Streaming<br>Tokens, tool calls and reasoning as they happen — surviving a dropped connection, a refresh, and a second device joining halfway through.<br>Streaming & SSE
🎛️<br>Human-in-the-loop<br>Pause for approval on anything consequential, take a correction mid-run, rewind a turn and try it again — hours later, from another machine.<br>Interrupts & steering
🔄<br>Scheduling & background work<br>Work that outlives the request — schedules that don't double-fire across servers, background jobs, and a callback when they finish.<br>Background jobs & crons
🛡️<br>Durable execution<br>A run whose process died is recovered, not lost. Two messages on one conversation serialize. One server or ten, the work still completes.<br>Running it in production
Your agent works on your laptop. Now what? <br>You could wrap it in Express yourself — it's an afternoon, and then it's five categories of plumbing you maintain forever. None of it is what your users came for.<br>skein-js is that backend, and it starts in one command:<br>bashnpm create skein-js@latest my-agent<br>cd my-agent && npm run dev<br>You now have an agent server on http://localhost:2024 and a control room at /console. No API key, no database, no Docker — the agent it writes for you runs offline, so the first thing you see is your own agent working rather than a credentials error.<br>Talk to it with the client you'd already be using. If it speaks the Agent Protocol, it works — you're only changing a URL:<br>Any frameworkReactVueSvelteAngular<br>tsimport { Client } from "@langchain/langgraph-sdk";
const client = new Client({ apiUrl: "http://localhost:2024" });<br>const thread = await client.threads.create();
for await (const chunk of client.runs.stream(thread.thread_id, "agent", {<br>input: { messages: [{ role: "human", content: "hello" }] },<br>streamMode: "messages",<br>})) {<br>console.log(chunk);
All four bindings are thin wrappers over the same @langchain/langgraph-sdk, so they issue identical requests and read identical frames. Agent Chat UI and LangGraph Studio work the same way, for the same reason. Details and the honest caveats: react-sdk.md.<br>Your first agent takes it from here to deployed — and teaches you the LangGraph you need on the way, if you're new to it.<br>How it fits together <br>Three moving parts. Your clients and your agent are the ones you already have.<br>Your clientsLangGraph SDK · useStream · Agent Chat UIAgent Protocol · HTTP + SSEskein-jsruns · threads · streaming · approvalsmemory · schedules · webhooks · consoleYour PostgresYour RedisYour agenta LangGraph.js graph, unchangedYour clients don't know skein-js exists — they speak a standard. Your agent doesn't either. skein-js is the middle box, and it's the only part you didn't have to write.<br>You're not learning a new framework <br>The agent itself is plain LangGraph.js — LangChain's own framework, MIT-licensed and pulling millions of downloads a week on npm. skein-js introduces no framework of its own, and there is nothing skein-specific in your graph code. No imports of ours, no decorators, no lifecycle hooks:<br>tsimport { MessagesAnnotation, StateGraph } from "@langchain/langgraph";
export const graph = new StateGraph(MessagesAnnotation)<br>.addNode("agent", callModel) // your step<br>.addEdge("__start__", "agent") // what runs next<br>.compile();<br>That's the whole contract. The same file runs under langgraph dev, on LangGraph Platform, or on skein — which is why migrating is one word in either direction, and why migrated-langgraph is a stock LangGraph project with nothing changed but a script.<br>New to it? LangChain's Thinking in LangGraph is the shortest path to the mental model — nodes, shared state, and explicit routing.<br>So the thing you're betting on for your agent logic is LangChain's, not ours. What skein-js adds is everything around it. Why we bet on LangGraph →<br>Not using LangGraph? The protocol engine carries no graph runtime, so another agent runtime can serve the same API by implementing two methods — bringing its own persistence and giving up the LangChain-specific pieces. The honest limits are in building a runner.
Your stack is already TypeScript <br>Your frontend is TypeScript. Your API is TypeScript. Why is your agent in Python?<br>The cost of a Python sidecar isn't the...