---
title: "SQLite"
canonical_url: "https://tiptap.dev/docs/hocuspocus/server/extensions/sqlite"
---

# SQLite

## Introduction

For local development purposes it’s nice to have a database ready to go with a few lines of code. That’s what the SQLite
extension is for.

## Installation

Install the SQLite extension like this:

```bash
npm install @hocuspocus/extension-sqlite better-sqlite3
npm install -D @types/better-sqlite3
```

Since v4, the extension uses [`better-sqlite3`](https://github.com/WiseLibs/better-sqlite3) instead of the unmaintained `sqlite3` package. If you're upgrading from v3, uninstall the old dependency with `npm uninstall sqlite3`. Existing SQLite database files are fully compatible — no data migration needed.

## Configuration

**database**

Valid values are filenames, ":memory:" for an anonymous in-memory database and an empty
string for an anonymous disk-based database. Anonymous databases are not persisted and
when closing the database handle, their contents are lost.

[https://github.com/mapbox/node-sqlite3/wiki/API#new-sqlite3databasefilename-mode-callback](https://github.com/mapbox/node-sqlite3/wiki/API#new-sqlite3databasefilename-mode-callback)

Default: `:memory:`

**schema**

The SQLite schema that’s created for you.

Default:

```sql
CREATE TABLE IF NOT EXISTS "documents" (
  "name" varchar(255) NOT NULL,
  "data" blob NOT NULL,
  UNIQUE(name)
)
```

If you wrote a **custom schema** under v3, note that v4's `better-sqlite3` uses named parameters without the `$` prefix — rename `$name` to `name` and `$data` to `data` in your queries.

**fetch**

An async function to retrieve data from SQLite. If you change the schema, you probably want to override the query.

**store**

An async function to store data in SQLite. If you change the schema, you probably want to override the query.

**Usage**

By default, data is just “stored” in `:memory:`, so it’s wiped when you stop the server. You can pass a file name to
persist data on the disk.

```js
import { Server } from "@hocuspocus/server";
import { SQLite } from "@hocuspocus/extension-sqlite";

const server = new Server({
  extensions: [
    new SQLite({
      database: "db.sqlite",
    }),
  ],
});

server.listen();
```

## Troubleshooting

### `Could not locate the bindings file`

`better-sqlite3` ships prebuilt native bindings, but they don't always match fresh Node.js versions on day one. If the server throws `Error: Could not locate the bindings file` on start-up, rebuild the binding from source in your server project:

```bash
npm rebuild better-sqlite3 --build-from-source
```

This compiles the native addon for your exact Node.js + OS + architecture combo. Requires a working C++ toolchain (Xcode Command Line Tools on macOS, `build-essential` on Debian/Ubuntu, or the Visual Studio Build Tools on Windows).
