Vulcan Labs

State, Simplified

Most of our time as developers is spent dealing with state. Ensuring it remains valid, syncing it to different devices, protecting it from unauthorized access, transforming it into new forms for new use cases, indexing it for faster access, and reacting to changes in it.

Vulcan Labs researches and develops state management solutions for the coming decades of software.

Production Software

cubes connected in a graph, syncing state between one another


An extension to SQLite that allows databases to be merged together. This enables SQLite backed applications to take writes while offline and then merge those writes with the server, or peers, whenever internet connectivity is available. Like Git but for your application databases. Read More...

-- pull changes from one database
SELECT * FROM crsql_changes;
-- merge changes into another DB
INSERT INTO crsql_changes VALUES (
A cube where each side is a feature of vlcn, held by a hand with a lightning bolt on its palm

Vulcan Web

Combination of projects as they reach maturity, running in the browser to create a web & mobile development stack. Vulcan Web lets you use SQLite as a collaborative application file format for multiplayer, local & offline-first software. Read More...

function App() {
  const todos = useQuery(`SELECT * FROM todo WHERE status = ?`, [filter]).data;
  return <div>{ => <Todo item={todo} />)}</div>;


metal lightning bolt


Incremental computation for JavaScript. When data changes, only run computations against the items that changed rather than the entire collection. Early benchmarks show that we can maintain computations over millions of items in less than 0.05 milliseconds. Read More...

const view =;
folder and file


Updating TypeScript to understand SQL so SQL seamlessly integrates with your applicaiton. Read More...




The relational model is great -- you can always access the data you need and re-form it into whatever is required. Flat tables, however, are not always an ideal structure for an application to deal with its data. Would SQL be more palatable if it could understand how to return trees of data? Read More...

  tracks: [SELECT {
    addedAt: tp.added_at_timestamp,
    trackNumber: tp.track_index,
    track: (SELECT {
      durationMs: t.duration_ms,
      trackNumer: t.track_number,
      album: (SELECT 
        FROM spotify_albums AS a WHERE = t.album_id),
      artists: [SELECT {
      } FROM spotify_artists AS art
        LEFT JOIN spotify_tracks_artists AS ta
        ON ta.artist_id =
        WHERE ta.track_id =],
    } FROM spotify_tracks AS t WHERE = tp.track_id)
  } FROM spotify_tracks_playlists as tp
    WHERE tp.playlist_id =]
} FROM spotify_playlists AS p WHERE = ?


How can we use standard language primitives to fetch data for our components? And avoid loading waterfalls? Read More...

  • CRDT Substrate
  • Rebasing SQLite