The bknd package includes a command-line interface (CLI) that allows you to run a bknd instance and perform various tasks.
npx bknd
Here is the output:
$ npx bkndUsage: bknd [options] [command]Options: -V, --version output the version number -h, --help display help for commandCommands: config [options] get app config copy-assets [options] copy static assets create [options] create a new project debug <subject> debug bknd mcp [options] mcp server stdio transport run [options] run an instance schema [options] get schema sync [options] sync database types [options] generate types user [options] <action> create/update users, or generate a token (auth) help [command] display help for command
To see all available run options, execute npx bknd run --help.
$ npx bknd run --helpUsage: bknd run [options]Options: -p, --port <port> port to run on (default: 1337, env: PORT) -m, --memory use in-memory database -c, --config <config> config file --db-url <db> database url, can be any valid libsql url --db-token <db> database token --server <server> server type (choices: "node", "bun", default: "bun") --no-open don't open browser window on start -h, --help display help for command
To order in which the connection is determined is as follows:
--db-url
--config or reading the filesystem looking for bknd.config.[js|ts|mjs|cjs|json]
--memory
Environment variables DB_URL and DB_TOKEN in .env or .dev.vars
By default, a file-based database data.db is used when running without any arguments. You can specify a different file name or path using the --db-url option. The database file will be created in the current working directory if it does not exist.
You can create a configuration file on the working directory that automatically gets picked up: bknd.config.[js|ts|mjs|cjs|json]
Here is an example of a bknd.config.ts file:
import type { BkndConfig } from "bknd/adapter";export default { // you can either specify the connection directly connection: { url: "file:data.db", }, // or use the `app` function which passes the environment variables app: (env) => ({ connection: { url: env.DB_URL, }, }),} satisfies BkndConfig;
The app function is useful if you need a cross-platform way to access the environment variables. For example, on Cloudflare Workers, you can only access environment variables inside a request handler. If you're exclusively using a node-like environment, it's safe to access the environment variables directly from process.env.
If you're using npx bknd run, make sure to create a file in a file format that node can load, otherwise you may run into an error that the file couldn't be found:
[INF] 2025-03-28 18:02:21 Using config from bknd.config.ts[ERR] 2025-03-28 18:02:21 Failed to load config: Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'bknd.config.ts' imported from [...] at packageResolve (node:internal/modules/esm/resolve:857:9) at [...] { code: 'ERR_MODULE_NOT_FOUND'}
If you still want to use a .ts extension, you can start the CLI e.g. using node (>=v22.6.0):
node --experimental-strip-types node_modules/.bin/bknd run
To see all available types options, execute npx bknd types --help.
$ npx bknd types --helpUsage: bknd types [options]generate typesOptions: -o, --outfile <outfile> output file (default: "bknd-types.d.ts") --no-write do not write to file -h, --help display help for command
To generate types for the database, run the following:
npx bknd types
This will generate types for your database schema in bknd-types.d.ts. The generated file could look like this:
bknd-types.d.ts
import type { DB } from "bknd";import type { Insertable, Selectable, Updateable, Generated } from "kysely";declare global { type BkndEntity<T extends keyof DB> = Selectable<DB[T]>; type BkndEntityCreate<T extends keyof DB> = Insertable<DB[T]>; type BkndEntityUpdate<T extends keyof DB> = Updateable<DB[T]>;}export interface Todos { id: Generated<number>; title?: string; done?: boolean;}interface Database { todos: Todos;}declare module "bknd" { interface DB extends Database {}}
Make sure to add the generated file in your tsconfig.json file:
tsconfig.json
{ "include": ["bknd-types.d.ts"]}
You can then use the types by importing them from bknd:
import type { DB } from "bknd";type Todo = DB["todos"];
All bknd methods that involve your database schema will be automatically typed. You may use the syncTypes plugin to automatically write the types to a file.
Sync your database can be useful when running in code mode. When you're ready to deploy, you can point to the production configuration and sync the database. Schema mutations are only applied when running with the --force option.
$ npx bknd sync --helpUsage: bknd sync [options]sync databaseOptions: -c, --config <config> config file --db-url <db> database url, can be any valid sqlite url --seed perform seeding operations --force perform database syncing operations --drop include destructive DDL operations --out <file> output file --sql use sql output -h, --help display help for command