Skip to Content
🚀 Legit SDK Alpha preview – help shape it on Discord here.

Legit makes everything versionable

The SDK that turns your data into a living timeline.
Built on Git to branch, rewind and sync effortlessly.

schematic
schematic

Delight users

Offer user collaboration features inspired by Git.

Skip the hard part

Save time and infrastructure costs.

Simple FS API

Control collaboration through a filesystem interface.

File agnostic

Collab on any app data. From JSON to legacy formats to SQLite.

Features

Production ready features your users already expect

From undo-redo to rollback , branching to experiments, sync and more. Everything is built in, powered by Git at the core. Deliver collaboration and reliability without building your own version control.

Time Travel State

Branch Experiments

Let users create isolated workspaces to try out ideas safely. They can experiment freely and later decide if they want to merge changes back to the original document.

Branch Experiments

Rollback Anytime

Let users recover from mistakes instantly. They can bring back any earlier version of their data and stay fully in control of AI assisted changes.

Rollback Anytime

Local-First Sync

Start local and sync seamlessly across all devices later.

Audit Trail

Every change is tracked with full context and accountability.

Access Control

Control who can view or edit your data.

Rules & Triggers

Define rules and triggers that run whenever AI or users modify data.

Hands-On

As easy as implementing read and write files.

Everything is based on the filesystem API. If you know how to read and write files, you already know how to use Legit SDK.

UI

ui

Legit

legit

File System API

file system api

React


import { LegitProvider, useLegitFile } 
  from '@legit-sdk/react';
 
function App() {
  return (
    <LegitProvider>
      <Editor />
    </LegitProvider>
  );
}
 
function Editor() {
  const { content, setContent, history } 
    = useLegitFile('/document.txt');

  return (
    <textarea
      value={content || ''}
      onChange={e => setContent(e.target.value)}
    />
  );
}