TypebaseTypebase

Changelog

What changed in each release of typebase-io and typebase-io-cli.

Last updated on

typebase-io and typebase-io-cli are released together and always share a version number, so upgrade them as a pair:

npm install typebase-io@latest
npm install -D typebase-io-cli@latest

Run npx typebase-io-cli codegen after every upgrade. _generated/ is written by the version that generated it, so a folder left over from an older release can describe a context your server no longer provides.

0.1.15

2026-08-26.

Added

  • InferStreamEvent from typebase-io/server: give it the RouterOutputs entry of a streaming action and it gives you the type of one event, so you no longer have to unwrap the async iterable by hand to type the state a stream feeds.
  • The CLI checks itself against the installed typebase-io before running a command and warns when the two versions differ, since they are released together and a mismatched pair can generate code your server doesn't understand. npx typebase-io-cli --version prints the CLI's own version.

Changed

  • A stream declared without .output() now reports the same type as one declared with it. Before, its RouterOutputs entry was the generator type of the handler that happened to implement it — AsyncGenerator<Event, void, unknown> — so adding an output schema, or rewriting the handler as something other than a generator function, silently changed the action's public type. Both now describe the same event iterator, matching the value an oRPC client actually hands back. Nothing changes at runtime, but code that named AsyncGenerator explicitly to type a stream needs updating; InferStreamEvent is the replacement.

0.1.14

2026-08-24.

Added

  • Streaming actions: swap .handler() for .stream() and an action becomes an async generator that pushes events to the client over SSE for as long as it's listening. .output() describes one event rather than the whole response, and the generator gets signal and lastEventId on top of the usual handler context. The compiler enforces that a stream yields at least once, that events are yielded rather than returned, and that each one matches .output().
  • definePublisher: declare the events your actions publish in typebase/publisher.ts, and every action gets a typed publisher on its context. A mutation publishes an event, a stream subscribed to it forwards the event to every client watching. Event names and payloads are checked at compile time, and publish(name, payload, { tx }) joins a transaction so a rollback publishes nothing.
  • The db publisher provider keeps events in an events table in your own database, polls it on a loop shared by every subscriber on the instance, and tags each event with its row id, so a client that reconnects resumes from the last event it saw instead of missing whatever was published while it was away. The table is declared in your own db/schema.ts like any other.
  • withEventMeta and getEventMeta from typebase-io/server, for attaching an id or retry to an event and reading it back.
  • init --with-db-publisher: scaffolds publisher.ts, the events table, its relation, and example actions that publish and stream. Like --with-auth, it can't be combined with --skip-example.
  • consumeStream from typebase-io/client, for reading a stream with callbacks instead of for await. Create a client first, then pass the stream call: client.path.to.stream() for createRouterClient, or client.path.to.stream.call() for createTanstackQueryClient. It starts immediately and returns an unsubscribe function, so UI code must start it from the component's mount lifecycle and unsubscribe during cleanup rather than calling it during render.
  • typebase-io/client/plugins re-exports every oRPC client plugin, so ClientRetryPlugin and the rest work without adding a dependency. Streams don't reconnect on their own, so this is what you reach for to make a dropped connection resume.

Changed

  • codegen now also has to be rerun when publisher.ts is added or removed, the same as auth.ts and env.ts. Editing an existing one doesn't need it.

0.1.13

2026-08-19.

Added

  • db pull: read an existing PostgreSQL database and write it to db/schema.ts and db/relations.ts, then regenerate the types. Column types, defaults, primary keys, unique constraints, indexes, foreign keys, enums and views all come across, every table gets registered in relations (Drizzle only writes the ones that have a foreign key), and the result is written in the shorthand a Typebase schema is normally written in. It asks before replacing existing files unless you pass --force.

0.1.12

2026-08-17.

Added

  • config: prints the typebase.json JSON Schema with every option annotated with the value in effect and whether it came from a default. Read-only, and the one command that doesn't need typebase-io installed, so tooling can read a project's setup without reimplementing the schema or its defaults.
  • init now creates a typebase.json holding a $schema reference, so your editor autocompletes the config from the start. Values already in an existing file are kept.

0.1.11

2026-08-02.

Added

  • generate-server --watch keeps the command running and rebuilds typebase/_server/ whenever anything inside typebase/ changes. See Work locally.

0.1.10

2026-08-01.

Fixed

  • Simplified the env type, so editors show the keys you declared instead of an expanded internal type.

0.1.9

2026-08-01.

Added

  • defineEnv: declare the variables your server needs in typebase/env.ts and read them from the handler context as env, each one a plain string. The generated server validates the whole schema before it serves a single request, so a missing variable is a startup error instead of an undefined surfacing deep inside a handler later. DATABASE_URL and BETTER_AUTH_SECRET are added for you.
  • The generated server carries its own env module, and @t3-oss/env-core is added to its dependencies only when the project needs one.

Changed

  • Empty database and relation types are never rather than {}, so a project without a schema no longer offers a db you can't use.
  • A project with an auth.ts but no db/schema.ts is now refused instead of building a server whose auth could never work.
  • Removed skipLoadEnv.

Fixed

  • Types are generated before they are validated, so the first run type-checks against fresh types.
  • Type errors inside _generated/ are no longer reported as yours.

0.1.8

2026-07-29.

Added

  • logs <dev|prod>: stream runtime logs from Vercel, Cloudflare Workers or Deno Deploy until you stop it.
  • deploy <target> --logs tails the server as soon as the deploy goes live.

Fixed

  • proxyToTypebase strips x-forwarded-* headers from the proxied request, which some providers rejected.

0.1.7

2026-07-20.

Added

  • server.port is part of the config schema, so editors validate it in typebase.json.

Changed

  • generate-server removes the files an earlier run left behind instead of writing over them.

Fixed

  • init --with-auth writes the correct relations for the example.
  • Clearer failures instead of silent ones: an unreadable auth.ts, code that cannot be parsed, and relations that auth generate cannot update now stop with an explanation.

0.1.6

2026-07-03.

Added

  • RouterInputs and RouterOutputs in the generated server types, plus InferRouterInputs and InferRouterOutputs from typebase-io, so you can name an action's input or output type without redeclaring its shape. See Generated Code.

0.1.5

2026-07-03.

Fixed

  • auth generate adds the plugin import to the generated auth file when a plugin needs one.
  • A formatting error in generated files.

0.1.4

2026-07-01.

Changed

  • The CLI got a test suite, and CI now runs it on every change.

0.1.3

2026-06-10.

Changed

  • env <target> add takes --no-encrypted instead of --encrypted, so values are encrypted unless you opt out.

Fixed

  • Writing the project .env keeps the variables already in it.
  • Router generation handles nested action files correctly.
  • Type validation ignores _generated/.
  • A command run in a project without typebase-io installed says so, and failures exit with a non-zero code.
  • defineAuth warns when it cannot read trustedOrigins instead of carrying on with an empty list.

0.1.2

2026-06-08.

Added

  • Every built-in better-auth plugin is re-exported through typebase-io/server/auth-plugins and typebase-io/client/auth-plugins, so you don't have to depend on better-auth directly. See Auth.
  • init --skip-example still writes base db/schema.ts and db/relations.ts files.

Changed

  • deploy regenerates types as part of every deploy.

0.1.1

2026-06-03.

Fixed

  • defineAuth infers its options correctly, so plugin and provider config reaches the client types.
  • The example relations file generated with --with-auth registers the auth tables.

0.1.0

2026-05-13.

Added

  • The AI Skill: a single SKILL.md that teaches a coding agent the file layout, CLI commands and conventions.
  • generate-server --port, with a new default port.
  • Dev deploys save their URL to .env as TYPEBASE_APP_URL_DEV, so the dev and prod URLs coexist.
  • The generated server records a packageManager field and installs with the package manager your project uses.

Fixed

  • Vercel: a placeholder is deployed on a first dev deploy when there is no production deployment yet.
  • Neon: the CLI waits for a new dev branch to be ready, and no longer copies data into it.
  • Deno Deploy: fixed the deploy flow and a terminal read error.
  • Only actions end up on the router; helpers exported alongside them are ignored.

On this page