Open-source project
tinyplex/tinybase avatar
tinyplex/tinybase

TinyBase v10: the store fits in memory, everything else is a peer you pick

A reactive data store & sync engine.

5,215 stars139 forksTypeScriptMIT

At a glance

What is it?
TinyBase ships the reactive table layer and leaves persistence, synchronization, UI bindings and schema validation to 31 peer dependencies. That choice keeps the install small and hands 31 upgrade decisions to whoever ships the app.
Who is it for?
TinyBase fits an app that wants reactive tables in the browser or on a device and can name its own storage and sync layer. It does not fit a team that expects one install to bring a database, a conflict resolution strategy and framework bindings.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • tinyplex/tinybase5,215 ★ · +38
Star history
Repository2026-09-232026-11-14
tinyplex/tinybase5.2k5.2k

38 Stars in the last 52 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

readme.md on main is a wall of preload tags, not a tutorial

The readme on the default branch opens with a run of image preload entries pointing at logo files served from tinybase.org, one for each integration the project cares about: `react.svg`, `solid.svg`, `svelte.svg`, `indexeddb.svg`, `browser.svg`, `sqlite.svg`, `bun.svg`, `expo.svg`, `capacitor.svg`, `turso.svg`, `powersync.svg`, `postgresql.svg`, `pglite.svg`, `mssql.svg`, `tinyjoin.svg`, `neon.svg`, `supabase.svg`, `cloudflare.svg`, `partykit.svg`, `yjs.svg`, `automerge.svg`, `zod.svg`, `typebox.svg`, `valibot.svg`, `arktype.svg`, `yup.svg` and `effect.svg`, followed by shields.io badges for the star count, Bluesky, X and Discord. So the first impression on GitHub is a compatibility list and a counter. `package.json` names https://tinybase.org as the homepage, and the tree carries `docs/` and `site/`, which is where the project's own documentation is published.

npm install tinybase leaves the backend to you

What you add is a package named `tinybase` at version 10.0.0, and the fields that matter for a bundler are these:

json
"name": "tinybase",
"version": "10.0.0",
"license": "MIT",
"type": "module",
"sideEffects": false

`"type": "module"` marks the package's .js files as ES modules, and `"sideEffects": false` lets a bundler drop code paths the app never touches. The framework peers are separate ranges you add yourself: `"react": "^19.3.0"`, `"react-dom": "^19.3.0"`, `"solid-js": "^1.9.15"`, `"svelte": "^5.57.1"`. Storage follows the same pattern, with `better-sqlite3` at `^13.0.3` for Node, `expo-sqlite` at `^57.0.3` and `@capacitor-community/sqlite` at `^8.1.1` for mobile, and `@sqlite.org/sqlite-wasm` at `^3.53.4-build1` for the browser. The author field is a single name, `jamesgpearce`, and the licence is MIT.

Thirty-one peer ranges turn the manifest into a compatibility table

The peer block is where the design decision becomes visible. It is not a list of helpers, it is the full set of choices the library refuses to make for you: `pg`, `postgres` and `mssql` for server databases, `@libsql/client`, `@electric-sql/pglite` and `@supabase/supabase-js` for hosted or embedded databases, `yjs` and `@automerge/automerge-repo` for CRDT merging, `@powersync/common`, `partykit`, `partysocket` and `ws` for the sync transport, `zod`, `valibot`, `arktype`, `@sinclair/typebox` and `effect` for validation, `bun`, `expo` and `@cloudflare/workers-types` for runtimes, and `tinyjoin` for queries. A representative slice:

json
"peerDependencies": {
  "yjs": "^13.6.33",
  "@automerge/automerge-repo": "^2.5.6",
  "better-sqlite3": "^13.0.3",
  "zod": "^4.6.5",
  "tinyjoin": "^0.2.0"
}

One wrinkle worth knowing: the logo row includes `yup.svg`, but no yup entry appears among the 31 ranges.

browser fs false removes the filesystem from browser builds

The manifest declares `"browser": { "fs": false }`. Read literally, that tells a bundler the Node `fs` module resolves to nothing in a browser target. The consequence for a reader is concrete: an adapter written against `fs` cannot be bundled for the web, so Node-only and browser-only paths have to be kept apart rather than swapped at runtime. The same `browser` map is where further substitutions would go, and the package declares no others here, so the set of replacements is exactly what the manifest shows.

v10.0.0 shipped four weeks after v9.6.0, so old examples age fast

Three releases sit inside two months: v9.7.0 on 2026-09-03, v10.0.0 on 2026-09-24 and v10.1.0-beta.1 on 2026-10-22. The last push to the repository was on 2026-10-22, the day of the v10.1.0-beta.1 tag, and the version field in `package.json` reads 10.0.0, so the tag and the manifest agree. A major bump inside that window means most code examples circulating for this library were written against the 9.x line. The top-level tree does have a `releases.md`, which is the file to read when an example and the current version disagree.

gulpfile.mjs, Vitest and a committed Playwright report

The repository is bigger than the library. Alongside `src/` and `test/` sit `gulpfile.mjs` as the build script, `vitest.config.ts`, `playwright.config.ts` and a checked-in `playwright-report/` directory, plus `coverage.json` at the root, `cspell.json` for spelling, `.prettierrc` and `eslint.config.js` for style, and `svelte.config.js`. There is also `docs/`, `site/`, `skills/`, `support/`, an `agents.md`, a `.claude-plugin/` directory and a `context7.json`. That layout tells you the published package and the documentation site are built from one tree, so a change to the docs can land in the same commit as a change to the store.

No default store, so 31 upgrade decisions land on the app team

The package description promises a reactive in-memory data store with persistence and synchronization for local-first apps, yet the manifest names no default for either. Persistence is a peer you choose from a dozen server and device databases, and synchronization is a peer you choose from CRDT libraries or from a transport such as `partykit`, `partysocket` or `ws`. That is the trade in one line: you get a small reactive core and you inherit the compatibility matrix. Two things follow for whoever ships the app. First, the first real design decision lands before the first feature, because the storage engine shapes what the store can express. Second, an upgrade of the store is an upgrade of the peer set around it, and those peers move on their own schedules.

Editorial conclusion

TinyBase fits an app that wants reactive tables in the browser or on a device and can name its own storage and sync layer. It does not fit a team that expects one install to bring a database, a conflict resolution strategy and framework bindings. Before adopting it, check the peer range for the one backend you intend to use, confirm that backend is named in the current manifest on GitHub, and read the install steps at tinybase.org rather than an example written before v10.0.0.

Frequently asked questions

What is TinyBase?

TinyBase describes itself as a reactive in-memory data store with persistence and synchronization for local-first JavaScript and TypeScript apps. Its keywords name local-first, offline-first, crdt and indexeddb, and the current package version is 10.0.0.

tinybase vs legend-state: what does the TinyBase repository itself show?

Nothing here compares the two. What the manifest shows is a reactive in-memory store at version 10.0.0 whose persistence and synchronization come from named peers, including better-sqlite3 at ^13.0.3 for Node storage and yjs at ^13.6.33 for CRDT merging.

How do I install TinyBase and pick a storage backend?

Run npm install tinybase for the core library, then add the peer for the target you need: better-sqlite3 ^13.0.3 on Node, expo-sqlite ^57.0.3 or @capacitor-community/sqlite ^8.1.1 on mobile, or @sqlite.org/sqlite-wasm ^3.53.4-build1 in the browser. The manifest does not pick one for you.

What does the TinyBase repository contain besides the library source?

The top-level entries include src/, test/, docs/, site/, skills/ and support/, a gulpfile.mjs build script, vitest.config.ts, playwright.config.ts, a committed playwright-report/ directory and coverage.json. The package itself is published from package.json as tinybase 10.0.0 under the MIT license.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. tinyplex/tinybase on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/tinyplex-tinybase.svg)](https://hysenlabs.com/projects/tinyplex-tinybase)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/tinyplex-tinybase.svg)](https://hysenlabs.com/projects/tinyplex-tinybase)

Was this useful?