Shipping today
How to build and deploy Trellis apps before the full local-first stack is turnkey — without vendor kernel backends.
You can ship with Trellis today. What you cannot do — by design — is point Trellis at Convex, Firebase, or Neon as the authoritative op store. That gap is the awkward middle between Trellis's thesis and the BaaS-shaped market.
This guide is the practitioner companion to ADR 0039 (no vendor kernel
backends; compatibility bridge instead) and ADR 0040 (lane boundary, open
engine, hosted Platform sibling) in the trellis package at
docs/adr/0039-no-vendor-kernel-backends-compatibility-bridge.md and
docs/adr/0040-lane-boundary-oss-and-hosted-platform.md.
The question behind the question
| You might ask | What you usually mean |
|---|---|
| "Do we have a Convex adapter?" | "Can I get live data without running infra?" |
| "Can Trellis use our Postgres?" | "Can we keep our warehouse/ops team happy?" |
| "What about Jazz/InstantDB?" | "Can I get that DX without their storage?" |
The answers:
- Live app data → vendor BaaS (Jazz, InstantDB, Convex) or Trellis kernel if you need causal graph semantics — see Trellis and BaaS
- Analytics / BI → one-way export, never the write path
- DX on Trellis graph → typed SDK; for app-only rows, use your BaaS
Three layers (don't mix them)
| Layer | Package | Writes to op log? | Use for |
|---|---|---|---|
| Durable graph | trellis, trellis/sync | Yes | Issues, entities, audit, merge |
| Typed live reads | trellis/schema, trellis/client | Yes (reads persisted state) | Nav, CMS, boards |
| Ephemeral | trellis/realtime | No | Presence, cursors, chat |
Confusing sync with realtime is the most common integration mistake. See Collaboration & Sync and Realtime (ephemeral).
Paths that work now
Path A — Hosted Trellis (fastest multiplayer)
Best when: you want Jazz-like live UI without operating a server.
- Provision a Sprite or Trellis Cloud workspace
- Point the client at your room URL:
import { liveEntities } from "trellis/client";
import { TrellisDb } from "trellis/client/sdk";
import { Task } from "./schema";
const client = new TrellisDb({
url: "https://myapp.sprites.app",
apiKey: process.env.TRELLIS_API_KEY,
});
const tasks = liveEntities(client, Task);
tasks.start();
- Use framework hooks (
trellis/react/typed, etc.) in the UI - Mount relay for presence if needed (
presenceRelayon deploy — see changelog ADR 0016)
Sovereignty check: you still own exportable .trellis state; the host relays
and accelerates — it is not a substitute kernel hidden behind a vendor row store.
Path B — Local kernel + git (fastest solo / agent work)
Best when: agents, CLI, offline-first, file-centric repos.
trellis init
trellis watch # file ops → graph
trellis issue start TRL-1
Git owns file bytes (4.0+); the op-log holds semantics. See Git bridge and Agent coordination.
Gap today: typed live reads in local embedded mode are still remote-only
for WebSocket subscriptions. For local-only UIs, poll trellis query or run
db serve and use Path A against localhost.
Path C — Self-hosted server
Best when: you control infra but want the same stack as Sprites.
trellis serve --port 8230
# client: TrellisDb({ url: 'http://localhost:8230' })
PartyKit or a Durable Object relay can front sync/presence without owning ops —
see demo/partykit/ and Collaboration & Sync.
Path D — Relay-only third-party cloud
Best when: you already pay for Cloudflare / PartyKit and need cross-tab or cross-browser realtime without durable graph writes there.
trellis/realtime+WebSocketRelayTransportorDurableObjectRelayTransporttrellis/sync+PartyKitRoomTransportorIrohSyncTransport
The vendor moves bytes. Your SQLite kernel (or hosted Trellis) still authors ops.
This is the only sanctioned use of "adapters" to commercial realtime infra.
Path E — BaaS for app + Trellis for agents (recommended hybrid)
Best when: you need signup-speed app UI and auditable agent memory.
- App UI on Jazz, InstantDB, or Convex — live rows, auth, multiplayer
- Agents on Trellis — lanes, issues, decision traces, repo semantics
- Link by ID — wiki-links, issue refs; no dual-write
Full pattern, decision table, and anti-patterns: Trellis and BaaS.
For a hosted Rox-shaped product (you operate the stack): see Platform brief in
docs/product/platform-brief.md (ADR 0040).
What we explicitly do not ship
| Non-goal | Why |
|---|---|
KernelBackend on Convex / Firebase / Neon | Vendor becomes source of truth |
| Dual-write Trellis + vendor DB | Hidden state, conflict hell |
| "Trellis Lite" on someone else's row store | Markets as Trellis, locks like BaaS |
If a feature fails the vision test — disconnect the network; does the system still function fully? — a vendor backend made it load-bearing. Roll back.
Bridging from an existing BaaS
You are not stuck forever; you are parallel-running or migrating:
- New features on Trellis — greenfield graph entities via typed SDK
- Legacy reads — keep vendor app on life support; Trellis owns new domains
- Export for analytics — warehouse ETL from Trellis snapshots/JSONL; one-way
- Cutover — when Trellis covers the domain, retire vendor writes
There is no drop-in adapter. Plan for a domain boundary, not a flip of DATABASE_URL.
Current gaps (honest)
| Gap | Workaround today | Direction |
|---|---|---|
| Local typed live reads | db serve + remote client URL | Embedded-kernel subscriptions |
| Empty remote bootstrap | Manual push / ADR 0028 draft | realtime-sync bootstrap |
| One-click onboarding | Sprites / Studio | Hosted Trellis polish |
| BaaS console ergonomics | Studio + graph explorer | Projections, not vendor UI |
Decision tree
Need durable multiplayer graph state on Trellis semantics?
├─ Yes → Trellis kernel (local, self-hosted, or Sprites)
│ └─ Need live UI? → typed SDK + /realtime (remote mode today)
├─ Need fast app UI + agent audit?
│ └─ Path E: BaaS + Trellis sidecar (see trellis-and-baas)
├─ Only presence/cursors/chat?
│ └─ trellis/realtime + relay (vendor OK as pipe)
└─ Only analytics on Trellis data?
└─ export / ETL (one-way, async)
Related
- Trellis and BaaS — decision table, sidecar pattern
- Vision — Design principles (local-first, sovereignty)
- Typed SDK
- Collaboration & Sync
- Realtime (ephemeral)
- Cloud hosting
- Git bridge