ALIVE
Live, by subscription.
Subscribe to a query and receive row-level updates when relevant data changes. The same API for a read or a live view.
Queries & subscriptionsA typed database for the apps you want to build. Live queries, offline writes, and a history you can replay. All in your own Cloudflare account.
Every write lands on the tape.
// A query. A live view. The same API.
db.task.findMany({
where: { done: false },
}).subscribe(({ data }) => render(data));
// One write reaches every subscriber.
await db.task.create({
data: { title: "Replay the log" },
});PROJECT
First project
Define a schema. Connect a client. Subscribe to a query. TapeDB handles subscriptions, the offline outbox, and the transaction log.
ALIVE
Subscribe to a query and receive row-level updates when relevant data changes. The same API for a read or a live view.
Queries & subscriptionsBOFFLINE
Single-row writes apply optimistically and queue in a persistent outbox. Reconnect and pick up where you left off.
The offline write pathCHISTORY
Transactions go onto a log. Segments and snapshots reach R2, ready for replay and recovery when needed.
Inside the transaction tapeFields, relations, and access rules in TypeScript. Your schema shapes the engine, migrations, and client types.
import { schema, model, t } from "tapedb/schema";
export default schema({
project: model({
name: t.string(),
tasks: t.hasMany("task"),
}),
task: model({
title: t.string(),
done: t.boolean().default(false),
project: t.belongsTo("project"),
}),
});Each workspace has one Durable Object and one SQLite database. A single writer makes transactions serializable. R2 gives the log somewhere to go.
Your infrastructure. Your application supplies identity; TapeDB manages workspace data.
Read the architectureTapeDB is in development. We're validating the complete path from the installed package to a running database, before opening the source and announcing availability.
Pre-1.0. The API may change. Public release not yet announced.