{"id":40586663,"url":"https://github.com/opral/lix","last_synced_at":"2026-06-02T03:01:19.299Z","repository":{"id":227470447,"uuid":"771518385","full_name":"opral/lix","owner":"opral","description":"Version control system for AI agents","archived":false,"fork":false,"pushed_at":"2026-05-29T00:55:02.000Z","size":34570,"stargazers_count":652,"open_issues_count":51,"forks_count":18,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-05-29T01:20:20.128Z","etag":null,"topics":["ai","ai-agents","change-detection","version-control"],"latest_commit_sha":null,"homepage":"https://lix.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/opral.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-13T12:55:21.000Z","updated_at":"2026-05-29T00:55:04.000Z","dependencies_parsed_at":"2025-03-05T01:20:02.956Z","dependency_job_id":"69c983c9-02fc-4a5f-a0ed-c38d03c6c283","html_url":"https://github.com/opral/lix","commit_stats":null,"previous_names":["opral/lix-sdk","opral/lix"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/opral/lix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opral%2Flix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opral%2Flix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opral%2Flix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opral%2Flix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/opral","download_url":"https://codeload.github.com/opral/lix/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/opral%2Flix/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33803734,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-agents","change-detection","version-control"],"created_at":"2026-01-21T03:06:33.622Z","updated_at":"2026-06-02T03:01:19.293Z","avatar_url":"https://github.com/opral.png","language":"Rust","funding_links":[],"categories":["Rust","ai"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/opral/lix/main/website/public/logo.svg\" alt=\"Lix\" height=\"60\"\u003e\n\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003eAn embeddable version control system for AI agents\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@lix-js/sdk\"\u003e\u003cimg src=\"https://img.shields.io/npm/dw/%40lix-js%2Fsdk?logo=npm\u0026logoColor=red\u0026label=npm%20downloads\" alt=\"weekly downloads on NPM\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://discord.gg/gdMPPWy57R\"\u003e\u003cimg src=\"https://img.shields.io/discord/897438559458430986?style=flat\u0026logo=discord\u0026labelColor=white\" alt=\"Discord\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/opral/lix\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/opral/lix?style=flat\u0026logo=github\u0026color=brightgreen\" alt=\"GitHub Stars\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://x.com/lixCCS\"\u003e\u003cimg src=\"https://img.shields.io/badge/Follow-@lixCCS-black?logo=x\u0026logoColor=white\" alt=\"X (Twitter)\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nLix is an **embeddable version control system** you import as a library. Give agents versions, checkpoints, semantic change history, rollback, immutable history, and SQL-queryable context without wrapping Git or managing repo internals.\n\n- **Runs in-process.** Import it as a library and run it inside your app. No daemon, no protocol.\n- **ACID transactions.** One transaction can cover state, blobs, and history.\n- **Semantic changes.** Track XLSX rows, DOCX clauses, JSON properties, and more as entities.\n- **SQL interface.** Agents can query history and changes without rereading whole files.\n- **Bring your own backend.** Start in memory, then plug into SQLite, Postgres, S3, Cloudflare, or your own adapter.\n\n## Getting started\n\n\u003cp\u003e\n  \u003cimg src=\"https://cdn.simpleicons.org/javascript/F7DF1E\" alt=\"JavaScript\" width=\"18\" height=\"18\" /\u003e JavaScript ·\n  \u003ca href=\"https://github.com/opral/lix/issues/373\"\u003e\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/python/python-original.svg\" alt=\"Python\" width=\"18\" height=\"18\" /\u003e Python\u003c/a\u003e ·\n  \u003ca href=\"https://github.com/opral/lix/issues/371\"\u003e\u003cimg src=\"https://cdn.simpleicons.org/rust/CE422B\" alt=\"Rust\" width=\"18\" height=\"18\" /\u003e Rust\u003c/a\u003e ·\n  \u003ca href=\"https://github.com/opral/lix/issues/370\"\u003e\u003cimg src=\"https://cdn.simpleicons.org/go/00ADD8\" alt=\"Go\" width=\"18\" height=\"18\" /\u003e Go\u003c/a\u003e\n\u003c/p\u003e\n\n```bash\nnpm install @lix-js/sdk\n```\n\n```ts\nimport { openLix, SqliteBackend } from \"@lix-js/sdk\";\n\nconst lix = await openLix({\n  backend: new SqliteBackend({ path: \"app.lix\" }),\n});\n\nawait lix.fs.writeFile(\"/notes/status.txt\", new TextEncoder().encode(\"draft\"));\n\nconst main = await lix.activeBranchId();\n\nconst draft = await lix.createBranch({ name: \"Explore\" });\n\nawait lix.switchBranch({ branchId: draft.id });\n\nawait lix.fs.writeFile(\n  \"/notes/status.txt\",\n  new TextEncoder().encode(\"ready for review\"),\n);\n\nawait lix.switchBranch({ branchId: main });\n\nconst changes = await lix.execute(\n  \"SELECT schema_key, count(*) AS count FROM lix_change GROUP BY schema_key\",\n);\n```\n\n## Why Lix?\n\n### Git was not designed to be embedded\n\nAI agents are creating explosive demand for version control: isolated workspaces, checkpoints, versions, reviewable changes, and rollback.\n\nTeams reach for Git, but wrapping it means managing repository directories, worktrees, locks, packfiles, garbage collection, LFS, process calls, protocol servers, and transaction coordination around a tool that expects to live outside the app.\n\nLix is built the other way around: version control runs in-process inside your app.\n\n[How does Lix compare to Git? →](https://lix.dev/docs/comparison-to-git)\n\n### What Lix provides\n\n#### Import as a library\n\nImport Lix and open it inside your app. No daemon, no protocol.\n\n```ts\nimport { openLix, SqliteBackend } from \"@lix-js/sdk\";\n\nconst lix = await openLix({\n  backend: new SqliteBackend({ path: \"app.lix\" }),\n});\n```\n\n#### ACID transactions\n\nWrite files, blobs, and history in one transaction.\n\n```ts\nconst tx = await lix.beginTransaction();\n\ntry {\n  await tx.fs.writeFile(\"/spec.docx\", body);\n  await tx.fs.writeFile(\"/spec.png\", image);\n  await tx.commit();\n} catch (error) {\n  await tx.rollback();\n  throw error;\n}\n```\n\n#### Parallel branches. No worktrees.\n\nGive every agent its own isolated branch without creating Git-style multi-checkout worktrees.\n\n```ts\nconst main = await lix.activeBranchId();\n\nconst copy = await lix.createBranch({ name: \"Copy draft\" });\nconst pricing = await lix.createBranch({ name: \"Pricing draft\" });\nconst qa = await lix.createBranch({ name: \"QA draft\" });\n\nawait lix.switchBranch({ branchId: copy.id });\nawait lix.fs.writeFile(\"/landing.md\", copyDraft);\n\nawait lix.switchBranch({ branchId: pricing.id });\nawait lix.fs.writeFile(\"/plans.json\", priceModel);\n\nawait lix.switchBranch({ branchId: qa.id });\nawait lix.fs.writeFile(\"/checks/report.json\", testRun);\n\nawait lix.switchBranch({ branchId: main });\n```\n\n#### Semantic changes\n\nUnlike Git's line-based diffs, Lix can track structured entities: XLSX rows, DOCX clauses, JSON properties, app records, and more.\n\n```ts\nconst changes = await lix.execute(`\n  SELECT created_at, schema_key, entity_pk, snapshot_content\n  FROM lix_change\n  ORDER BY created_at DESC\n  LIMIT 20\n`);\n```\n\nFor example, an agent edits an orders spreadsheet:\n\n```text\nBefore:\n| order_id | product  | status  |\n| -------- | -------- | ------- |\n| 1001     | Widget A | shipped |\n| 1002     | Widget B | pending |\n\nAfter:\n| order_id | product  | status  |\n| -------- | -------- | ------- |\n| 1001     | Widget A | shipped |\n| 1002     | Widget B | shipped |\n```\n\nGit can only tell you the file changed:\n\n```diff\n-Binary files differ\n```\n\nLix can expose the row field that changed:\n\n```diff\norder_id 1002 status:\n\n- pending\n+ shipped\n```\n\n[Read more about semantic changes →](https://lix.dev/docs/semantic-changes)\n\n#### SQL interface\n\nAgents burn fewer tokens and keep cleaner context when version-control questions are answered with SQL instead of whole-file rereads.\n\n\u003cimg src=\"./website/public/assets/claude-sql-question.svg\" alt=\"Claude Code asks: Which orders changed status in this branch? Executing SQL\" width=\"460\" /\u003e\n\n```ts\nconst rows = await lix.execute(`\n  SELECT created_at, schema_key, entity_pk, snapshot_content\n  FROM lix_change\n  ORDER BY created_at DESC\n  LIMIT 20\n`);\n```\n\nEvery change, across every file and every branch, is a row in `lix_change`. Filter by branch, file, schema, or time without re-reading whole files.\n\n#### Bring your own backend\n\nStart in memory, then plug Lix into the infrastructure your app already runs.\n\n\u003cp\u003e\u003cimg src=\"https://cdn.simpleicons.org/sqlite/003B57\" alt=\"SQLite\" width=\"18\" height=\"18\" /\u003e SQLite · \u003cimg src=\"https://cdn.simpleicons.org/postgresql/4169E1\" alt=\"Postgres\" width=\"18\" height=\"18\" /\u003e Postgres · \u003cimg src=\"https://api.iconify.design/logos:aws-s3.svg\" alt=\"S3\" width=\"18\" height=\"18\" /\u003e S3 · \u003cimg src=\"https://cdn.simpleicons.org/cloudflareworkers/F38020\" alt=\"Cloudflare Workers\" width=\"18\" height=\"18\" /\u003e Cloudflare Workers · \u003cimg src=\"https://cdn.simpleicons.org/supabase/3FCF8E\" alt=\"Supabase\" width=\"18\" height=\"18\" /\u003e Supabase\u003c/p\u003e\n\n```ts\nconst lix = await openLix({\n  backend: new SqliteBackend({ path: \"app.lix\" }),\n});\n```\n\n## How Lix works\n\nLix runs in-process inside your app.\n\nIt owns the version-control model: files, blobs, versions, history, transactions, and semantic changes. You plug it into whatever backend you need: in-memory, SQLite, Postgres, S3, Cloudflare, or your own adapter.\n\nSQL is the query interface on top. Agents can ask what changed without rereading whole files.\n\n```\n┌─────────────────────────────────────────────────┐\n│                  Your runtime                   │\n│        agent worker · server · CLI · app         │\n│                                                 │\n│   ┌─────────────────────────────────────────┐   │\n│   │                  Lix                    │   │\n│   │  Filesystem · Versions · History · SQL  │   │\n│   └────────────────────┬────────────────────┘   │\n│                        │                        │\n└────────────────────────┼────────────────────────┘\n                         ▼\n┌─────────────────────────────────────────────────┐\n│                    Backend                      │\n│      SQLite, Postgres, S3, Cloudflare, custom   │\n└─────────────────────────────────────────────────┘\n```\n\n[Read more about Lix architecture →](https://lix.dev/docs/architecture)\n\n## What you can build with Lix\n\n- **AI agent filesystems** - isolated workspaces, versioned explore steps, semantic change history, and rollback when a run goes sideways.\n- **Version control for Postgres \u0026 SQLite** - time-travel and versioned schemas on top of an existing database. Reviewable migrations. Diffable rows.\n- **Apps with version control** - add versions, review, rollback, and history to editors, CMSs, design tools, internal ops apps, and AI-native products.\n- **Review for AI-generated changes** - surface what an agent actually changed at the entity level. Approve, request edits, or revert by symbol instead of patch.\n\n## Roadmap\n\n**v0.6: Lix SDK (current)**\n\n- [x] Importable SDK\n- [x] ACID transactions across state, blobs, and history\n- [x] Parallel sessions and versions\n- [x] Entity-level change tracking, queryable via SQL\n- [x] Stable physical storage layout\n- [x] Pluggable backend interface\n\n**v0.7: Lix CLI**\n\n- [ ] CLI for creating, inspecting, and scripting Lix repositories\n\n**v0.8: file plugin API**\n\n- [ ] Finalized file plugin API for DOCX, XLSX, CAD, PDF, and code\n\n**v0.9: merge conflicts**\n\n- [ ] Merge conflicts as first-class citizens\n\n**v0.10: working changes**\n\n- [ ] Working changes and checkpointing\n\n## Learn More\n\n- **[Getting Started Guide](https://lix.dev/docs/getting-started)** - Build your first app with Lix\n- **[Documentation](https://lix.dev/docs)** - Full API reference and guides\n- **[Discord](https://discord.gg/gdMPPWy57R)** - Get help and join the community\n- **[GitHub](https://github.com/opral/lix)** - Report issues and contribute\n\n## Blog posts\n\n- [Introducing Lix: An embeddable version control system](https://lix.dev/blog/introducing-lix)\n- [What if a Git SDK to build apps exists?](https://samuelstroschein.com/blog/what-if-a-git-sdk-exists)\n- [Git is unsuited for applications](https://samuelstroschein.com/blog/git-limitations)\n- [Does a git-based architecture make sense?](https://samuelstroschein.com/blog/git-based-architecture)\n\n## License\n\n[MIT](https://github.com/opral/lix/blob/main/packages/lix-sdk/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopral%2Flix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopral%2Flix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopral%2Flix/lists"}