Version control system for any file format
Universal version control system
Lix is a version control system for any file format: code, documents, spreadsheets, design files, video, datasets. It runs in-process on pluggable storage. Files, app tables, and history are rows in one ACID database. Agents read and write normal files. Your product queries SQL. You branch, diff, merge, and roll back all of it together:
Git is a CLI designed for source code. It assumes a local POSIX filesystem, tracks whole files, and diffs text lines. Keep software engineering in Git. Use Lix when your product stores files and data for its users.
| Git | Lix | |
|---|---|---|
| Process model | Separate CLI process | Library in your process |
| Storage | Local disk | Memory · filesystem · OPFS · S3 |
| Application data | Separate database | SQL rows, ACID, with the files |
| Recording changes | Manual commits | Every write, automatically |
| Formats | Text lines | Any, by clause, cell, or row |
| Collaboration | Push and pull | Real time |
JavaScript · Rust · Python · Go
npm install @lix-js/sdk @lix-js/storage-filesystem
Run locally with FilesystemStorage:
import { openLix } from "@lix-js/sdk";
import { FilesystemStorage } from "@lix-js/storage-filesystem";
const lix = await openLix({
storage: new FilesystemStorage({ path: "./repository" }),
});
await lix.execute("INSERT INTO lix_file (path, content) VALUES ($1, $2)", [
"/notes/status.txt",
new TextEncoder().encode("ready"),
]);
Or against a server:
const lix = await openLix({
server: {
url: "https://example.com/lix/01936f4e-7b6c-7c3d-8f9a-123456789abc",
},
});
Lix is in alpha.
Code lives in Git. Documents, design files, and media live in Drive, Figma, and S3. App state lives in Postgres. No system versions all of them together. Lix stores them in one repository with one history.
// A script, a 4.8 GB video, and an app table in one transaction.
await lix.executeBatch([
{
sql: "INSERT INTO lix_file (path, content) VALUES ($1, $2)",
params: ["/automations/weekly-report.js", source],
},
{
sql: "INSERT INTO lix_file (path, content) VALUES ($1, $2)",
params: ["/media/launch.mp4", video],
},
{
sql: "UPDATE orders SET status = 'shipped' WHERE id = $1",
params: [1002],
},
]);
// Branch, diff, and roll back all of it together.
Your customers want agents that write automations and edit their documents, with a way to review and undo. Drive has no version control. Your customers do not have GitHub repos. Embed Lix and give each customer a repository that holds their code, documents, spreadsheets, and media.
// One hosted repository per customer.
const lix = await openLix({
server: {
url: `https://example.com/lix/${customer.repositoryId}`,
},
});
// The agent writes an automation. Lix commits the change automatically.
await lix.execute("INSERT INTO lix_file (path, content) VALUES ($1, $2)", [
"/automations/booking.ts",
code,
]);
// Your UI shows the diff. The customer clicks accept or undo.
Your app reads and writes SQL rows and normal files. Lix records every change with its author, so history, blame, branching, and rollback are queries instead of features you build.
// A normal app write. "orders" is a table you registered with a Lix schema.
await lix.execute("UPDATE orders SET status = 'shipped' WHERE id = 1002");
// The history sidebar, diff view, and undo button are queries:
const changes = await lix.execute(`
SELECT created_at, account_id, schema_key, row_pk, snapshot_content
FROM lix_change
ORDER BY created_at DESC
`);
Plugins map files to SQL rows. A paragraph, cell, or property becomes a row Lix can version.
With FilesystemStorage, the file stays available on disk. Its rows are queryable with SQL. Lix tracks changes to both.
Lix runs in-process with pluggable storage: memory, filesystem, browser OPFS, or S3. See the Storage docs.
Try out lixray.com:
No open issues yet, or sync has not completed.