Roadmap
This is an honest snapshot of where Causet is today and where it is going. Status labels are accurate as of the date this page was last updated.
Status labels:
- stable — production-ready, used in production
- in-progress — actively being built or improved
- planned — committed to building; design complete or in progress
- proposed — on the roadmap but not yet scheduled; design not started
Core Runtime
| Feature | Status | Notes |
|---|---|---|
| Append-only event ledger | stable | PostgreSQL-backed, per-entity cursor ordering |
Declarative rules DSL (.causet) | stable | YAML-based, compiled to JSON IR |
| Compiler with error validation | stable | causet-compiler, full cross-reference checking |
| Per-entity serial write ordering | stable | Cursor-based optimistic locking |
| Entity snapshots | stable | Materializes current entity state from event history |
| Kafka fan-out | stable | causet.ledger-events.v1, causet.projection-events.v1 |
| SaaS multi-tenant layer | stable | Per-fork PostgreSQL schemas, release management |
| Preflight rules | stable | reject op with typed error codes |
| Core rules (state mutations) | stable | set, add, sub, push, filter, remove, unset, merge |
| Event emission | stable | emit, emit_each |
| Side effects | stable | submit, schedule |
| Anonymous sessions | stable | Short-lived JWTs for unauthenticated users |
Projection Reliability
| Feature | Status | Notes |
|---|---|---|
| Projection materialization (Kafka → PostgreSQL) | stable | R2DBC, reactive writes |
| Projection worker retry policy | stable | Configurable max retries + backoff |
| Projection failure capture | stable | projection_failures table |
| DLQ routing on failure | planned | Route to causet.projection-dlq.v1 after max retries |
| Projection failure REST API | proposed | REST endpoint for failure records (currently direct DB) |
Deployment gates (causet projections doctor) | planned | Validate projection health before release activation |
| Fixture-based regression testing for projections | planned | Define fixture events in DSL; verify on compile |
| Per-projection health endpoint | planned | Endpoint reporting per-projection lag + failure status |
Workflow Durability (Sagas)
| Feature | Status | Notes |
|---|---|---|
Submit/schedule chains (side_effects) | stable | Fan-out and delayed events across entities — see Workflows |
sagas: DSL — entity state machines | stable | Compiles to event-triggered core rules (op: merge) — no separate execution engine. See Defining Sagas |
Saga failure paths (on_failure routing) | proposed | Declarative failure routing beyond end: true terminal steps |
| External signals to sagas | proposed | Wait for an external event before proceeding to next step |
| Long-running sleep (timer) | proposed | Requires integration with an external scheduler (e.g. EventBridge Scheduler) |
| Workflow observability dashboard | planned | Saga state + step history in control plane UI |
Replay Tooling
| Feature | Status | Notes |
|---|---|---|
causet recovery replay / causet recovery rewind | available | CLI-driven replay from a ledger cursor — see Recovery |
| Zero-downtime rebuild (parallel projection) | proposed | Automated parallel projection + swap workflow |
| Time-travel queries | proposed | Query projection state at a specific past timestamp |
| Replay progress tracking | planned | Expose replay ETA and progress via CLI/UI |
Developer Experience
| Feature | Status | Notes |
|---|---|---|
causet build compile CLI | available | Bundled in causet CLI — see Install |
causet doctor CLI | available | Local diagnostic checks — see causet doctor |
causet dev (compile + watch loop) | available | See causet dev |
| Local dev mode against self-hosted stack | in-progress | Docker Compose stack for team contributors — see Development Setup |
| Monaco editor with DSL schema | in-progress | Control plane UI — DSL schema for autocomplete |
| DSL language server protocol | proposed | IDE integrations for VSCode, IntelliJ |
CLI Completeness
For the authoritative, currently-shipped command set, see the CLI table in Install Causet and the commands used throughout Deployments.
| Command | Status |
|---|---|
causet build compile / causet build validate | available |
causet doctor | available |
causet dev | available |
causet login | available |
causet deploy | available |
causet fork create / list / diff / delete | available |
causet intent / causet query | available |
causet inspect entity / causet inspect timeline | available |
causet recovery replay / causet recovery rewind | available |
causet projections list / doctor / replay | proposed |
causet projections failures list / retry | proposed |
causet migrations apply / status | proposed |
causet events publish | proposed |
causet dlq list / retry | proposed |
Cloud Deployment
| Feature | Status | Notes |
|---|---|---|
| ECS deployment | stable | Used in production (Causet Cloud) |
| Docker Compose (self-hosted local stack) | team contributors | Private source — Docker build and publish workflow — see Installation |
| Terraform modules | in-progress | ECS + RDS + MSK + ElastiCache |
| Kubernetes Helm chart | proposed | Not yet designed |
| AWS CDK constructs | proposed | Not yet scheduled |
Admin UI / Dashboard
| Feature | Status | Notes |
|---|---|---|
| Control plane UI | stable | Release management, fork management |
| Entity browser | stable | gRPC browser exists; web UI in progress |
| Projection health dashboard | planned | Per-projection lag, failure count, last event |
| DLQ management UI | proposed | List, inspect, retry DLQ messages |
| Replay UI | proposed | Trigger replay from control plane |
| Event log viewer | stable | Browse ledger events per entity in UI |
SDK and Client Libraries
The causet-sdks packages ship typed clients for TypeScript, Python, Go, Java, and Laravel/PHP — intents, named queries, SSE intent progress, entity state caching, and real-time WebSocket patches. All are at 0.1.0 with 100% test coverage; publishing to npm/PyPI/Packagist is in progress. Full usage docs: SDK Overview.
| Feature | Status | Notes |
|---|---|---|
| REST API | stable | Stable integration surface |
WebSocket real-time gateway (ws-gateway-go) | available | Hello/sub protocol at /ws — ledger + state patch channels, consumed by every SDK’s connectStream() |
@causet/sdk-core (TypeScript core client) | available (pre-release) | Intents, queries, SSE streaming, WebSocket, entity-state cache. Not yet published to npm |
@causet/sdk (browser/ESM) | available (pre-release) | Re-exports sdk-core for bundler/browser apps |
@causet/sdk-node (Node.js 18+) | available (pre-release) | createCausetClient() factory for backend services |
@causet/sdk-next (Next.js / React) | available (pre-release) | CausetProvider + hooks (useCausetQuery, useCausetIntent, useCausetEntity) and server helpers |
causet-sdk (Python 3.10+) | available (pre-release) | Async (CausetClient) and sync (CausetClientSync); not yet published to PyPI |
causet/laravel-sdk (PHP / Laravel 11+) | available (pre-release) | Facade + DI, intent SSE, connectStream() for live ledger/projection SSE; no WebSocket client (synchronous Guzzle) |
causet-sdk-go (Go 1.22+) | available (pre-release) | Intents (sync + SSE progress), queries, projections, entity listing, entity-state cache, WebSocket + SSE stream transport |
com.causet:causet-sdk (Java 17+) | available (pre-release) | Intents (sync + SSE progress), queries, projections, entity listing, entity-state cache, WebSocket + SSE stream transport |
Usage examples
Every SDK shares the same shape: construct a client from apiUrl + platformSlug + appSlug + apiKey (or a bearer JWT), emit() an intent, runQuery() a named projection, and optionally connectStream() for real-time patches.
TypeScript — @causet/sdk (browser) or @causet/sdk-node (backend)
import { CausetClient } from '@causet/sdk'; // or '@causet/sdk-node'
const client = new CausetClient({
apiUrl: 'https://api.causet.cloud',
platformSlug: 'my-platform',
appSlug: 'my-app',
apiKey: process.env.CAUSET_API_KEY,
});
await client.init();
const result = await client.emit('ticket_stream', 'tkt_1', 'CREATE_TICKET', {
customer_id: 'cust_1',
subject: 'Help',
});
const rows = await client.runQuery('open_tickets', { status: 'open' }, { limit: 20 });
await client.connectStream('ticket_stream', { channels: [{ channel: 'ledger' }, { channel: 'state' }] });
client.on('patch_op', (ev) => console.log(ev.ops));
client.destroy();Next.js — @causet/sdk-next
'use client';
import { useCausetQuery, useCausetIntent } from '@causet/sdk-next';
function TicketList() {
const { data, loading, refresh } = useCausetQuery('open_tickets', { status: 'open' }, { limit: 20 });
const { emit, pending } = useCausetIntent();
return (
<ul>
{data?.items.map((row) => <li key={String(row.id)}>{String(row.subject)}</li>)}
<button disabled={pending} onClick={() => emit('ticket_stream', 'tkt_1', 'CLOSE_TICKET', {}).then(refresh)}>
Close first ticket
</button>
</ul>
);
}Python — causet-sdk
from causet_sdk import CausetClient
client = CausetClient(
api_url="https://api.causet.cloud",
platform_slug="my-platform",
app_slug="my-app",
api_key="ck_live_xxx.secret",
)
await client.init()
result = await client.emit("ticket_stream", "tkt_1", "CREATE_TICKET", {
"customer_id": "cust_1", "subject": "Help",
})
rows = await client.run_query("open_tickets", {"status": "open"}, limit=20)
await client.connect_stream("ticket_stream")
client.destroy()PHP / Laravel — causet/laravel-sdk
use Causet\Laravel\Facades\Causet;
Causet::init();
$result = Causet::emit('ticket_stream', 'tkt_1', 'CREATE_TICKET', [
'customer_id' => 'cust_1',
'subject' => 'Billing question',
]);
$rows = Causet::runQuery('open_tickets', ['status' => 'open'], limit: 20);Go — causet-sdk-go
client := causet.NewClient(causet.Config{
APIURL: "https://api.causet.cloud",
PlatformSlug: "my-platform",
AppSlug: "my-app",
APIKey: os.Getenv("CAUSET_API_KEY"),
})
result, _ := client.Emit("ticket_stream", "tkt_1", "CREATE_TICKET", map[string]any{"subject": "Help"})
rows, _ := client.RunQuery("open_tickets", map[string]any{"status": "open"}, causet.QueryOptions{Limit: 20})
client.ConnectStream(ctx, "ticket_stream", causet.StreamConnectOptions{}, onEvent)
client.On("patch_op", func(ev any) { fmt.Println(ev) })Java — com.causet:causet-sdk
CausetConfig cfg = new CausetConfig();
cfg.apiUrl = "https://api.causet.cloud";
cfg.platformSlug = "my-platform";
cfg.appSlug = "my-app";
cfg.apiKey = System.getenv("CAUSET_API_KEY");
CausetClient client = new CausetClient(cfg);
JsonNode result = client.emit("ticket_stream", "tkt_1", "CREATE_TICKET", Map.of("subject", "Help"));
JsonNode rows = client.runQuery("open_tickets", Map.of("status", "open"), opts);
client.connectStream("ticket_stream", null, event -> System.out.println(event));Full API reference, configuration options, and error handling for each SDK: SDK Overview.
Scaling and Performance
| Feature | Status | Notes |
|---|---|---|
| Horizontal projection worker scaling | stable | Kafka partition-bounded |
| Query service horizontal scaling | stable | Stateless, ALB-backed |
| Redis query result caching | stable | TTL-based |
| Per-tenant Kafka topics | proposed | Currently all tenants share the same topics |
| Shard routing for queries | proposed | Route query requests based on tenant to dedicated DB replicas |
| Connection pooling improvements | planned | PgBouncer or RDS Proxy integration |
AI Memory Layer
| Feature | Status | Notes |
|---|---|---|
op: decision — declarative LLM calls in side_effects | available | AI |
| Vector memory — event ingestion + retrieval | available | Vector Memory |
| Providers, prompts, BYOK | available | Providers & Prompts |
| Support Copilot example | available | Example walkthrough |
| Application memory (deterministic entity state) | available | Application Memory |
Open Source
Causet today is Causet Cloud (managed control plane, Early access / waitlist). The causet CLI is publicly distributed via Causet-Inc/causet-cli releases.
For the docs-facing readiness table (labels used across the site), see What runs today?.
| Feature | Status | Notes |
|---|---|---|
| Causet Cloud (managed control plane) | Early access | Sign up |
causet CLI (install script) | Available now | curl -fsSL https://raw.githubusercontent.com/Causet-Inc/causet-cli/main/install.sh | sh — see Install |
| Public documentation site | in-progress | This site |
| Self-hosted Docker stack | Coming soon (public) / team contributors today | Private source — see Development Setup |
| Homebrew tap | planned | After native binary distribution ships |
| npm / PyPI / Packagist SDKs | Preview | @causet/sdk, causet-sdk, causet/laravel-sdk — see SDKs |
| Public changelog | planned | Versioned, linked from docs |
| Outbound HTTP webhook delivery | Available now | Managed HTTP callbacks from Causet to your app |