Immutable revisions
Each edit is a new version; history is auditable, rollback is append-only.
Every prompt is a set of immutable revisions. Promote by moving a label — REST, SDK, and MCP resolve identically, with no redeploy.
Immutable revisions + append-only rollback + label promotion, resolved identically across REST, SDK, and MCP.
$ npm install @usetheo/promptly-sdkcoming to npmPrompts drift the moment they leave your editor: hard-coded strings, a redeploy for every tweak, no history when something breaks. Theo Prompts treats a prompt as a named resource with immutable revisions and environment labels. You edit by adding a revision, you promote by moving a label, and the next resolution reflects it — from your backend, your app, or an agent over MCP.
Each edit is a new version; history is auditable, rollback is append-only.
Point prod / staging at a revision; promote by moving the pointer, no redeploy.
Templates render client-side in the SDK; the server never sees variable values.
REST, SDK, and MCP delegate to the same core — a contract test proves parity.
Codes like prompt_not_found, invalid_template, label_not_found.
Redis epoch-rotation invalidates on promote; any Redis error falls back to Postgres.
import { PromptlyClient } from '@usetheo/promptly-sdk';
const client = new PromptlyClient({ baseUrl: 'http://localhost:3000' });
await client.createPrompt('greet', 'hi {{name}}'); // v1
await client.assignLabel('greet', 'prod', 1); // prod -> v1
const p = await client.getPrompt('greet', { label: 'prod', vars: { name: 'Theo' } });
p.content; // 'hi Theo' — rendered in the SDK; the value never reaches the server
await client.assignLabel('greet', 'prod', 2); // promote, no redeployPromote from v1 to v2 by moving a label — no redeploy.
Prompts are now production config, and agents increasingly need the same prompt your app uses, resolved the same way. Comparison of versioned-prompt features, public docs mid-2026.
| Capability | Theo Prompts | LangSmith Prompts | PromptLayer | Langfuse |
|---|---|---|---|---|
| Access surface | REST + SDK + MCP (one core) | REST / SDK | REST / SDK | REST / SDK |
| Promotion model | Move a label, next resolve reflects it | Versions / tags | Versions | Labels / versions |
| Variable privacy | Rendered client-side, values never sent | Varies | Varies | Varies |
| SDK runtime deps | Zero (native fetch) | Varies | Varies | Varies |
| Self-host | Apache-2.0, Postgres (+Redis) | Mostly SaaS | SaaS | Self-hostable |
Versioned prompts you promote by moving a label — reachable identically from a backend, an app, and an agent — over Apache-2.0 code you can host yourself.
A prompt change should be a config change, not a deploy. Theo Prompts makes the prompt a first-class, versioned, immutable resource with one core behind REST, SDK, and MCP.
$ npm install @usetheo/promptly-sdkcoming to npmRead the docs → docs.usetheo.dev
View the source → github.com/usetheodev/theo-promptly