Features
Features · Performance · Compatibility
This page lists every application capability, grouped by purpose, with one row per capability. Each works on every platform and language in the compatibility matrix, unless its row names an exception. See Concepts for the terms used here.
Operations use Python spellings. Each language’s reference gives its own spellings.
Local first
Section titled “Local first”| Feature | What it means for the application | Everywhere except | Documented |
|---|---|---|---|
| A real SQLite database on the device | Read and write a SQLite database at a path, with SQLite’s SQL, transactions and speed. Writes never wait for the network. Reads wait only for unfetched pages. | — | /reference/python/database/ |
| Reads and writes told apart before they run | query declares a read and execute declares a write. A call with the wrong intent fails with an error code and an action. SQLite can apply effects during statement preparation even if the call refuses execution. | — | /reference/python/connection/ |
| Durable local storage on disk or in the browser | Each database uses one append-only container, on disk or in the browser’s origin private file system. Each commit is durable. One opener owns it at a time. local_budget_bytes bounds its contents. | — | /compatibility/ |
| Storage that stays compact | Each connection checkpoints according to your policy. The container compacts when both its size threshold and dead-byte ratio are crossed. Local storage therefore stays bounded. | — | /reference/advanced/ |
Sync without a server
Section titled “Sync without a server”| Feature | What it means for the application | Everywhere except | Documented |
|---|---|---|---|
| No server to run | Devices exchange immutable objects through a remote with two compare-and-swap cells. Supported storage services provide this. No potluckdb server, relay or daemon needs deployment, scaling or payment. | — | /install/python/#remote-storage |
| Two-way sync, automatic by default | A writable database with a remote synchronizes automatically. sync synchronizes once on demand and returns an outcome value. It publishes local writes if there are any. Otherwise, it pulls a newer revision if one exists. on_sync reports each automatic outcome. | — | /reference/python/database/ |
| Four remote kinds, one line apart | Choose a directory, S3-compatible bucket, Google Cloud Storage or Azure Blob Storage. Only the constructor changes. Every other program line stays the same. | — | /reference/python/remote/ |
| Short-lived credentials, no stored key | Supply a credentials callback with an expiry. The runtime refreshes credentials before expiry and never renders the secret. Devices carry no long-lived credential key. | — | /reference/python/remote/ |
| Every outcome is a value | sync returns pushed, pulled, up to date or conflict as a value. A failure raises an error that carries a code and an action. status reports database, connection or snapshot state without side effects. | — | /reference/options/ |
| Conflicts come back as data and replay | A push meeting an unseen remote head returns a conflict value. resolve_conflict adopts that revision, replays local statements and names quarantined transactions. See the replay limitations. | — | /reference/python/database/ |
| A device cannot flood the bucket | Uploads per publication and re-encryption limits are bounded and public. A fleet of devices therefore has a predictable request rate. | — | /reference/options/ |
What travels
Section titled “What travels”| Feature | What it means for the application | Everywhere except | Documented |
|---|---|---|---|
| Only changed pages travel | A push sends changed pages. A piece already present under its digest is not replaced. Pieces use plaintext digests as names, so compression and encryption preserve deduplication. Retrying a push can still make storage requests and transfer bytes. | — | /performance/ |
| Open before the download completes | A device with a remote reads pages on demand, making large databases usable immediately. The prefetch policy bounds retrieval ahead of statements and in the background. | — | /reference/options/ |
| Compressed on the wire | The runtime compresses pieces before encrypting and publishing them. The envelope carries the compression flag, so readers never guess. | — | /reference/options/ |
| Encrypted before it leaves the device | When enabled, AES-256-GCM encrypts every published piece with an application-held encryption key. The bucket sees ciphertext and a key identity. admin.reencrypt migrates one retained revision to a new encryption key. | — | /reference/advanced/ |
History
Section titled “History”| Feature | What it means for the application | Everywhere except | Documented |
|---|---|---|---|
| Read any retained revision | open_revision opens exactly one retained revision read-only. Use the data as it was for audit, support or historical reads. | — | /reference/python/snapshot/ |
| Retention you set, collection you control | collect keeps the newest revisions and removes objects no retained revision references. Retention is a replaceable policy over an exact history. | — | /reference/advanced/ |
Analytics
Section titled “Analytics”| Feature | What it means for the application | Everywhere except | Documented |
|---|---|---|---|
| Analytical SQL on DuckDB over the same data | DuckDB queries a read-only snapshot of the same database on the device. Native targets load the engine at run time. WebAssembly links it into the module. | Rust on Linux (musl) | /analytics-engine/ |
Everywhere
Section titled “Everywhere”| Feature | What it means for the application | Everywhere except | Documented |
|---|---|---|---|
| One API in fourteen languages | Every SDK exposes the same everyday operations, checked by name against the declared surface. The native application ABI provides the same intents as C symbols. A team can change language without relearning the model. | — | /compatibility/ |
| DB-API, JDBC and ODBC over the same database | Python uses potluckdb.dbapi, JVM programs use JDBC, and desktop tools use ODBC. One connection string names the local database, remote and options without secrets. Existing tools read and write the synchronized database. | — | /interfaces/dbapi/ |
| A trial, then a license key, all offline | Every SDK authorizes the database location before it operates. Supply a license key through the license_key open option, the environment or the configuration directory. Without an accepted license key, a 30-day trial applies per machine. After the trial, existing databases keep working, but creating a database needs an accepted license key. No server is consulted in either case. | — | /licensing/ |
The generator checks each feature against the behavior specification. Each documentation link leads to the behavior that your application can use.