[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-71430":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},71430,"tinybase","tinyplex\u002Ftinybase","tinyplex","A reactive data store & sync engine.","https:\u002F\u002Ftinybase.org",null,"TypeScript",5097,128,35,41,0,8,19,33,24,37.33,"MIT License",false,"main",true,[27,28,29,30,31],"data","javascript","react","reactive","typescript","2026-06-12 02:02:52","\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Freact.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fsolid.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fsvelte.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Findexeddb.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fbrowser.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fcloudflare.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fpostgresql.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fpglite.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fsqlite.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fbun.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fexpo.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Felectric.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fturso.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fpowersync.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fpartykit.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fyjs.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fcrsqlite.png\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fautomerge.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fzod.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Ftypebox.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fvalibot.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Farktype.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fyup.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Feffect.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Ftinyplex\u002Ftinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=GitHub&amp;labelColor=%23d81b60&amp;color=%23333\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBluesky-Follow-blue?style=for-the-badge&amp;logo=bluesky&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%230285FF\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%2F%20Twitter-Follow-blue?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%23000\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F1027918215323590676?style=for-the-badge&amp;logo=discord&amp;logoColor=%23fff&amp;label=Discord&amp;labelColor=%233131e8&amp;color=%23333\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdiscussions\u002Ftinyplex\u002Ftinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Ideas&amp;labelColor=%23d81b60&amp;color=%23333\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues\u002Ftinyplex\u002Ftinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Issues&amp;labelColor=%23d81b60&amp;color=%23333\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTests-100%25-green?style=for-the-badge&amp;logo=Vitest&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%2387c305\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Ftinybase?style=for-the-badge&amp;logo=npm&amp;logoColor=%23fff&amp;labelColor=%23bd0005&amp;color=%23333\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fui-react-dom.webp\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Finspector.webp\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Ffastrepl.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FComputelessComputer.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fcancelself.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fexpo.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fbraden-w.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fdylmye.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fgonza224.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fcpojer.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fbeekeeb.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FWonderPanda.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FarpitBhalla.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fbehrends.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fbetomoedano.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fbrentvatne.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FbyCedric.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fcircadian-risk.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fcubecull.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Ferwinkn.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fezra-en.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Ffeychenie.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fflaming-codes.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Ffostertheweb.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FGiulio987.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fhi-ogawa.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fitsdevcoffee.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fjbolda.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FKayoo-asso.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fkotofurumiya.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FKudo.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Flearn-anything.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Flluc.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fmarksteve.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fmiking-the-viking.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fmjamesderocher.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fmouktardev.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fnickmessing.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fnikitavoloboev.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fnkzw-tech.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fpalerdot.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FPorcoRosso85.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fprimodiumxyz.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fshaneosullivan.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fsudo-self.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FSuperSonicHub1.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fthreepointone.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fuptonking.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002FViktorZhurbin.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fgithub.com\u002Fwilkerlucio.png?size=48\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Fsynclets.org\u002Ffavicon.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinywidgets.org\u002Ffavicon.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinytick.org\u002Ffavicon.svg?asImg\">\u003Clink rel=\"preload\" as=\"image\" href=\"https:\u002F\u002Ftinybase.org\u002Fyoutube.webp\">\u003Csection id=\"hero\">\u003Ch2 id=\"a-reactive-data-store-sync-engine\">A \u003Cem>reactive\u003C\u002Fem> data store &amp; \u003Cspan>\u003Cem>sync\u003C\u002Fem> engine\u003C\u002Fspan>\u003C\u002Fh2>\u003C\u002Fsection>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Freleases\u002F#v8-4\">\u003Cem>NEW!\u003C\u002Fem> v8.4 release\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cspan id=\"one-with\">&quot;The one with Solid components!&quot;\u003C\u002Fspan>\u003C\u002Fp>\u003Cp>\u003Ca class=\"start\" href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fthe-basics\u002Fgetting-started\u002F\">Get started\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fdemos\u002F\">Try the demos\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">Read the docs\u003C\u002Fa>\u003C\u002Fp>\u003Chr>\u003Csection>\u003Ch2 id=\"let-s-build-local-first-apps\">Let&#x27;s build \u003Cem>local-first\u003C\u002Fem> apps\u003C\u002Fh2>\u003Cp>Create a todo list, a chat app, a drawing tool, or a tic-tac-toe game - with sync &amp; persistence! - in less than 60 seconds.\u003C\u002Fp>\u003C\u002Fsection>\n\n```bash\n> npm create tinybase@latest\n\n📦 Creating your project...\n```\n\n\u003Chr>\u003Csection>\u003Ch2 id=\"it-s-reactive\">It&#x27;s \u003Cem>Reactive\u003C\u002Fem>\u003C\u002Fh2>\u003Cp>TinyBase lets you \u003Ca href=\"#register-granular-listeners\">listen to changes\u003C\u002Fa> made to any part of your data. This means your app will be fast, since you only spend rendering cycles on things that change. The optional \u003Ca href=\"#call-hooks-to-bind-to-data\">bindings to React\u003C\u002Fa> and \u003Ca href=\"#pre-built-reactive-components\">pre-built components\u003C\u002Fa> let you easily build fully reactive UIs on top of TinyBase. You even get a built-in \u003Ca href=\"#set-checkpoints-for-an-undo-stack\">undo stack\u003C\u002Fa>, and \u003Ca href=\"#an-inspector-for-your-data\">developer tools\u003C\u002Fa>!\u003C\u002Fp>\u003C\u002Fsection>\u003Csection>\u003Ch2 id=\"it-s-database-like\">It&#x27;s \u003Cem>Database-Like\u003C\u002Fem>\u003C\u002Fh2>\u003Cp>Consumer app? Enterprise app? Or even a game? Model \u003Ca href=\"#start-with-a-simple-key-value-store\">key-value data\u003C\u002Fa> and \u003Ca href=\"#level-up-to-use-tabular-data\">tabular data\u003C\u002Fa> with optional typed \u003Ca href=\"#apply-schemas-to-tables-values\">schematization\u003C\u002Fa>, whatever its data structures. There are built-in \u003Ca href=\"#create-indexes-for-fast-lookups\">indexing\u003C\u002Fa>, \u003Ca href=\"#define-metrics-and-aggregations\">metric aggregation\u003C\u002Fa>, and tabular \u003Ca href=\"#model-table-relationships\">relationships\u003C\u002Fa> APIs - and a powerful \u003Ca href=\"#build-complex-queries-with-tinyql\">query engine\u003C\u002Fa> to select, join, filter, and group data (reactively!) without SQL.\u003C\u002Fp>\u003C\u002Fsection>\u003Csection>\u003Ch2 id=\"it-synchronizes\">It \u003Cem>Synchronizes\u003C\u002Fem>\u003C\u002Fh2>\u003Cp>TinyBase has \u003Ca href=\"#synchronize-between-devices\">native CRDT\u003C\u002Fa> support, meaning that you can deterministically \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fsynchronization\u002F\">synchronize\u003C\u002Fa> and merge data across multiple sources, clients, and servers. And although TinyBase is an in-memory data store, you can easily \u003Ca href=\"#persist-to-storage-databases-more\">persist\u003C\u002Fa> your data to file, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-browser\">browser storage\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-indexed-db\">IndexedDB\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fpersistence\u002Fdatabase-persistence\u002F\">SQLite or PostgreSQL databases\u003C\u002Fa>, and \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fpersistence\u002Fthird-party-crdt-persistence\u002F\">more\u003C\u002Fa>.\u003C\u002Fp>\u003C\u002Fsection>\u003Csection>\u003Ch2 id=\"it-s-built-for-a-local-first-world\">It&#x27;s Built For A \u003Cem>Local-First\u003C\u002Fem> World\u003C\u002Fh2>\u003Cp>TinyBase works anywhere that JavaScript does, but it&#x27;s especially great for local-first apps: where data is stored locally on the user&#x27;s device and that can be run offline. It&#x27;s tiny by name, tiny by nature: just \u003Ca href=\"#did-we-say-tiny\">6.2kB - 13.7kB\u003C\u002Fa> and with no dependencies - yet \u003Ca href=\"#well-tested-and-documented\">100% tested\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fthe-basics\u002Fgetting-started\u002F\">fully documented\u003C\u002Fa>, and of course, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftinyplex\u002Ftinybase\">open source\u003C\u002Fa>!\u003C\u002Fp>\u003C\u002Fsection>\u003Chr>\u003Csection id=\"friends\">\u003Ch2 id=\"tinybase-works-great-on-its-own-but-also-plays-well-with-friends\">TinyBase works great on its own, but also plays well with friends.\u003C\u002Fh2>\u003Ch3 id=\"ui-frameworks\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002F\">UI Frameworks\u003C\u002Fa>\u003C\u002Fh3>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fbuilding-uis-with-react\u002Fgetting-started-with-ui-react\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Freact.svg?asImg\" width=\"48\"> React\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fbuilding-uis-with-solid\u002Fgetting-started-with-ui-solid\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fsolid.svg?asImg\" width=\"48\"> Solid\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fbuilding-uis-with-svelte\u002Fgetting-started-with-ui-svelte\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fsvelte.svg?asImg\" width=\"48\"> Svelte\u003C\u002Fa>\u003C\u002Fdiv>\u003Ch3 id=\"storage-sync\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fpersistence\u002F\">Storage &amp; Sync\u003C\u002Fa>\u003C\u002Fh3>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-indexed-db\u002Ffunctions\u002Fcreation\u002Fcreateindexeddbpersister\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Findexeddb.svg?asImg\" width=\"48\"> IndexedDB\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-browser\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fbrowser.svg?asImg\" width=\"48\"> OPFS\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fintegrations\u002Fcloudflare-durable-objects\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fcloudflare.svg?asImg\" width=\"48\"> Cloudflare\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fpostgresql.svg?asImg\" width=\"48\"> PostgreSQL\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fpglite.svg?asImg\" width=\"48\"> PGlite\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fsqlite.svg?asImg\" width=\"48\"> SQLite\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fbun.svg?asImg\" width=\"48\"> Bun SQLite\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fexpo.svg?asImg\" width=\"48\"> Expo SQLite\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Felectric.svg?asImg\" width=\"48\"> ElectricSQL\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fturso.svg?asImg\" width=\"48\"> Turso\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fpowersync.svg?asImg\" width=\"48\"> PowerSync\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-partykit-client\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fpartykit.svg?asImg\" width=\"48\"> PartyKit\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-yjs\u002Ffunctions\u002Fcreation\u002Fcreateyjspersister\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fyjs.svg?asImg\" width=\"48\"> YJS\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-cr-sqlite-wasm\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fcrsqlite.png\" width=\"48\"> CR-SQLite\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fpersister-automerge\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fautomerge.svg?asImg\" width=\"48\"> Automerge\u003C\u002Fa>\u003C\u002Fdiv>\u003Ch3 id=\"schema-systems\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas\u002Fusing-schematizers\u002F\">Schema Systems\u003C\u002Fa>\u003C\u002Fh3>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fschematizer-zod\u002Ffunctions\u002Fcreation\u002Fcreatezodschematizer\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fzod.svg?asImg\" width=\"48\"> Zod\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fschematizer-typebox\u002Ffunctions\u002Fcreation\u002Fcreatetypeboxschematizer\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Ftypebox.svg?asImg\" width=\"48\"> TypeBox\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fschematizer-valibot\u002Ffunctions\u002Fcreation\u002Fcreatevalibotschematizer\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fvalibot.svg?asImg\" width=\"48\"> Valibot\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fschematizer-arktype\u002Ffunctions\u002Fcreation\u002Fcreatearktypeschematizer\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Farktype.svg?asImg\" width=\"48\"> ArkType\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fschematizer-yup\u002Ffunctions\u002Fcreation\u002Fcreateyupschematizer\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fyup.svg?asImg\" width=\"48\"> Yup\u003C\u002Fa>\u003C\u002Fdiv>\u003Cdiv>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fschematizer-effect\u002Ffunctions\u002Fcreation\u002Fcreateeffectschematizer\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Feffect.svg?asImg\" width=\"48\"> Effect\u003C\u002Fa>\u003C\u002Fdiv>\u003Cp>(Baffled by all these logos? Check out our \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fthe-basics\u002Farchitectural-options\">architectural options\u003C\u002Fa> guide to make sense of it all!)\u003C\u002Fp>\u003C\u002Fsection>\u003Chr>\u003Csection id=\"follow\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftinyplex\u002Ftinybase\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Ftinyplex\u002Ftinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=GitHub&amp;labelColor=%23d81b60&amp;color=%23333\"> \u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fbsky.app\u002Fprofile\u002Ftinybase.bsky.social\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FBluesky-Follow-blue?style=for-the-badge&amp;logo=bluesky&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%230285FF\"> \u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fx.com\u002Ftinybasejs\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%2F%20Twitter-Follow-blue?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%23000\"> \u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fdiscord.com\u002Finvite\u002FmGz3mevwP8\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F1027918215323590676?style=for-the-badge&amp;logo=discord&amp;logoColor=%23fff&amp;label=Discord&amp;labelColor=%233131e8&amp;color=%23333\">\u003C\u002Fa>\u003Cbr>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftinyplex\u002Ftinybase\u002Fdiscussions\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdiscussions\u002Ftinyplex\u002Ftinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Ideas&amp;labelColor=%23d81b60&amp;color=%23333\"> \u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftinyplex\u002Ftinybase\u002Fissues\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fissues\u002Ftinyplex\u002Ftinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Issues&amp;labelColor=%23d81b60&amp;color=%23333\"> \u003C\u002Fa>\u003Ca href=\"#well-tested-and-documented\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTests-100%25-green?style=for-the-badge&amp;logo=Vitest&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%2387c305\"> \u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Ftinybase\u002Fv\u002F8.4.0\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Ftinybase?style=for-the-badge&amp;logo=npm&amp;logoColor=%23fff&amp;labelColor=%23bd0005&amp;color=%23333\">\u003C\u002Fa>\u003C\u002Fsection>\u003Chr>\u003Csection>\u003Ch2 id=\"start-with-a-simple-key-value-store\">Start with a simple key-value store.\u003C\u002Fh2>\u003Cp>Creating a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa> requires just a simple call to the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fcreatestore\u002F\">\u003Ccode>createStore\u003C\u002Fcode>\u003C\u002Fa> function. Once you have one, you can easily set \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fvalues\u002F\">\u003Ccode>Values\u003C\u002Fcode>\u003C\u002Fa> in it by unique \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fcommon\u002Ftype-aliases\u002Fidentity\u002Fid\u002F\">\u003Ccode>Id\u003C\u002Fcode>\u003C\u002Fa>. And of course you can easily get them back out again.\u003C\u002Fp>\u003Cp>Read more about using keyed value data in \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fthe-basics\u002F\">The Basics\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {createStore} from 'tinybase';\n\nconst store = createStore()\n  .setValues({employees: 3})\n  .setValue('open', true);\n\nconsole.log(store.getValues());\n\u002F\u002F -> {employees: 3, open: true}\n```\n\n\u003Csection>\u003Ch2 id=\"level-up-to-use-tabular-data\">Level up to use tabular data.\u003C\u002Fh2>\u003Cp>For other types of data applications, a tabular data structure is more useful. TinyBase lets you set and get nested \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Ftable\u002F\">\u003Ccode>Table\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Frow\u002F\">\u003Ccode>Row\u003C\u002Fcode>\u003C\u002Fa>, or \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa> data, by unique \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fcommon\u002Ftype-aliases\u002Fidentity\u002Fid\u002F\">\u003Ccode>Id\u003C\u002Fcode>\u003C\u002Fa> - and in the same \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa> as the keyed values!\u003C\u002Fp>\u003Cp>Read more about setting and changing data in \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fthe-basics\u002F\">The Basics\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nstore\n  .setTable('pets', {fido: {species: 'dog'}})\n  .setCell('pets', 'fido', 'color', 'brown');\n\nconsole.log(store.getRow('pets', 'fido'));\n\u002F\u002F -> {species: 'dog', color: 'brown'}\n```\n\n\u003Csection>\u003Ch2 id=\"register-granular-listeners\">Register granular listeners.\u003C\u002Fh2>\u003Cp>The magic starts to happen when you register listeners on a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fvalue\u002F\">\u003Ccode>Value\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Ftable\u002F\">\u003Ccode>Table\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Frow\u002F\">\u003Ccode>Row\u003C\u002Fcode>\u003C\u002Fa>, or \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa>. They get called when any part of that object changes. You can also use wildcards - useful when you don&#x27;t know the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fcommon\u002Ftype-aliases\u002Fidentity\u002Fid\u002F\">\u003Ccode>Id\u003C\u002Fcode>\u003C\u002Fa> of the objects that might change.\u003C\u002Fp>\u003Cp>Read more about listeners in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fthe-basics\u002Flistening-to-stores\u002F\">Listening To Stores\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nconst listenerId = store.addTableListener('pets', () =>\n  console.log('changed'),\n);\n\nstore.setCell('pets', 'fido', 'sold', false);\n\u002F\u002F -> 'changed'\n\nstore.delListener(listenerId);\n```\n\n\u003Csection>\u003Ch2 id=\"bind-to-data-in-ui-libraries\">Bind to data in UI libraries.\u003C\u002Fh2>\u003Cp>If you&#x27;re using React, Solid, or Svelte in your application, the optional \u003Ccode>ui-react\u003C\u002Fcode> module, \u003Ccode>ui-solid\u003C\u002Fcode> module, or \u003Ccode>ui-svelte\u003C\u002Fcode> module provide hooks and functions to bind to the data in a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>For example, the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fusing-react\u002Fusecell\u002F\">\u003Ccode>useCell\u003C\u002Fcode>\u003C\u002Fa> hook in this example fetches the dog&#x27;s color. But it also registers a listener on that cell that will fire and re-render the component whenever the value changes!\u003C\u002Fp>\u003Cp>Basically you simply describe what data you want in your user interface and TinyBase will take care of the whole lifecycle of updating it for you.\u003C\u002Fp>\u003Cp>Read more about the using hooks in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fbuilding-uis-with-react\u002Fusing-react-hooks\u002F\">Using React Hooks\u003C\u002Fa> guide and the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fbuilding-uis-with-svelte\u002F\">Building UIs With Svelte\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```jsx\nimport React from 'react';\nimport {createRoot} from 'react-dom\u002Fclient';\nimport {useCell} from 'tinybase\u002Fui-react';\n\nconst App1 = () => {\n  const color = useCell('pets', 'fido', 'color', store);\n  return \u003C>Color: {color}\u003C\u002F>;\n};\n\nconst app = document.createElement('div');\nconst root = createRoot(app);\nroot.render(\u003CApp1 \u002F>);\nconsole.log(app.innerHTML);\n\u002F\u002F -> 'Color: brown'\n\nstore.setCell('pets', 'fido', 'color', 'walnut');\nconsole.log(app.innerHTML);\n\u002F\u002F -> 'Color: walnut'\n\nroot.unmount();\n```\n\n\u003Csection>\u003Ch2 id=\"pre-built-reactive-components\">Pre-built reactive components.\u003C\u002Fh2>\u003Cp>The UI modules also provides bare React and Svelte components that let you build up a fully reactive user interface based on a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>For React (in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-react-dom\u002F\">\u003Ccode>ui-react-dom\u003C\u002Fcode>\u003C\u002Fa> module) and Svelte (in the ui-svelte-dom module), these provide tabular display of your data, with lots of customization and interactivity options.\u003C\u002Fp>\u003Cp>Try them out in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fdemos\u002Fui-components-react\u002F\">UI Components (React)\u003C\u002Fa> demos and \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fdemos\u002Fui-components-svelte\u002F\">UI Components (Svelte)\u003C\u002Fa> demos, and read more in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fbuilding-uis\u002F\">Building UIs\u003C\u002Fa> guides.\u003C\u002Fp>\u003C\u002Fsection>\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fui-react-dom.webp\">\u003Csection>\u003Ch2 id=\"an-inspector-for-your-data\">An inspector for your data.\u003C\u002Fh2>\u003Cp>If you are building a web application with React or Svelte, the Inspector component lets you overlay a view of the data in your \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Findexes\u002Finterfaces\u002Findexes\u002Findexes\u002F\">\u003Ccode>Indexes\u003C\u002Fcode>\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Frelationships\u002Finterfaces\u002Frelationships\u002Frelationships\u002F\">\u003Ccode>Relationships\u003C\u002Fcode>\u003C\u002Fa>, and so on. You can even edit the data in place and see it update in your app immediately.\u003C\u002Fp>\u003Cp>Read more about this powerful new tool in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Finspecting-data\u002F\">Inspecting Data\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Finspector.webp\">\u003Csection>\u003Ch2 id=\"apply-schemas-to-tables-values\">Apply schemas to tables &amp; values.\u003C\u002Fh2>\u003Cp>Want clean data? You can add a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fschema\u002Fvaluesschema\u002F\">\u003Ccode>ValuesSchema\u003C\u002Fcode>\u003C\u002Fa> or a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fschema\u002Ftablesschema\u002F\">\u003Ccode>TablesSchema\u003C\u002Fcode>\u003C\u002Fa> to a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa> to ensure that they are always what you expect by constraining types, and providing defaults. There are even TypeScript definitions that infer \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002F\">API\u003C\u002Fa> types from the data schemas you apply.\u003C\u002Fp>\u003Cp>And our &#x27;schematizer&#x27; modules let you convert schemas from libraries like Zod, TypeBox, Valibot, ArkType, Yup, and Effect Schema into TinyBase at runtime.\u003C\u002Fp>\u003Cp>Read more about schemas in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas\u002F\">Schemas\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nstore.setTablesSchema({\n  pets: {\n    species: {type: 'string'},\n    color: {type: 'string'},\n    sold: {type: 'boolean', default: false},\n  },\n});\n\nstore.setRow('pets', 'polly', {species: 'parrot'});\nconsole.log(store.getRow('pets', 'polly'));\n\u002F\u002F -> {species: 'parrot', sold: false}\n\nstore.delTablesSchema();\n```\n\n\u003Csection>\u003Ch2 id=\"synchronize-between-devices\">Synchronize between devices.\u003C\u002Fh2>\u003Cp>The \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fmergeable-store\u002Finterfaces\u002Fmergeable\u002Fmergeablestore\u002F\">\u003Ccode>MergeableStore\u003C\u002Fcode>\u003C\u002Fa> type acts as a native CRDT, letting you merge data and synchronize it between clients and systems - or even a server. The synchronization protocol can run over WebSockets, the browser BroadcastChannel, or your own custom synchronization medium.\u003C\u002Fp>\u003Cp>Read more about these techniques in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fsynchronization\u002F\">Synchronization\u003C\u002Fa> guides.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {WebSocketServer, WebSocket} from 'ws';\nimport {createMergeableStore} from 'tinybase';\nimport {createWsServer} from 'tinybase\u002Fsynchronizers\u002Fsynchronizer-ws-server';\nimport {createWsSynchronizer} from 'tinybase\u002Fsynchronizers\u002Fsynchronizer-ws-client';\n\n\u002F\u002F On a server machine:\nconst server = createWsServer(\n  new WebSocketServer({port: 8040}),\n);\n\n\u002F\u002F On a client machine:\nconst store1 = createMergeableStore();\nconst synchronizer1 = await createWsSynchronizer(\n  store1,\n  new WebSocket('ws:\u002F\u002Flocalhost:8040'),\n);\nawait synchronizer1.startSync();\n\n\u002F\u002F ...\n\nawait synchronizer1.destroy();\nawait server.destroy();\n```\n\n\u003Csection>\u003Ch2 id=\"persist-to-storage-databases-more\">Persist to storage, databases, &amp; more.\u003C\u002Fh2>\u003Cp>You can easily persist a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa> between browser page reloads or sessions. You can also synchronize it with a web endpoint, or (if you&#x27;re using TinyBase in an appropriate environment), load and save it to a file. You can bind TinyBase to various flavors of \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fschemas-and-persistence\u002Fdatabase-persistence\u002F\">database\u003C\u002Fa>, or to \u003Ca href=\"https:\u002F\u002Fyjs.dev\u002F\">Yjs\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fautomerge.org\u002F\">Automerge\u003C\u002Fa> CRDT documents.\u003C\u002Fp>\u003Cp>Read more about persisters in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fpersistence\u002F\">Persistence\u003C\u002Fa> guides.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {createSessionPersister} from 'tinybase\u002Fpersisters\u002Fpersister-browser';\n\nconst persister = createSessionPersister(store, 'demo');\nawait persister.save();\n\nconsole.log(sessionStorage.getItem('demo'));\n\u002F\u002F ->\n`\n[\n  {\n    \"pets\":{\n      \"fido\":{\"species\":\"dog\",\"color\":\"walnut\",\"sold\":false},\n      \"polly\":{\"species\":\"parrot\",\"sold\":false}\n    }\n  },\n  {\"employees\":3,\"open\":true}\n]\n`;\n\nawait persister.destroy();\nawait sessionStorage.clear();\n```\n\n\u003Csection>\u003Ch2 id=\"build-complex-queries-with-tinyql\">Build complex queries with \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fusing-queries\u002Ftinyql\u002F\">TinyQL\u003C\u002Fa>.\u003C\u002Fh2>\u003Cp>The \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fqueries\u002Finterfaces\u002Fqueries\u002Fqueries\u002F\">\u003Ccode>Queries\u003C\u002Fcode>\u003C\u002Fa> object lets you query data across tables, with filtering and aggregation - using a SQL-adjacent syntax called \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fusing-queries\u002Ftinyql\u002F\">TinyQL\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Accessors and listeners let you sort and paginate the results efficiently, making building rich tabular interfaces easier than ever.\u003C\u002Fp>\u003Cp>In this example, we have two tables: of pets and their owners. They are joined together by the pet&#x27;s ownerId \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa>. We select the pet&#x27;s species, and the owner&#x27;s state, and then aggregate the prices for the combinations.\u003C\u002Fp>\u003Cp>We access the results by descending price, essentially answering the question: &quot;which is the highest-priced species, and in which state?&quot;\u003C\u002Fp>\u003Cp>Needless to say, the results are reactive too! You can add listeners to queries, and since v7.2, even parameterize them.\u003C\u002Fp>\u003Cp>Read more about \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fqueries\u002Finterfaces\u002Fqueries\u002Fqueries\u002F\">\u003Ccode>Queries\u003C\u002Fcode>\u003C\u002Fa> in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Freleases\u002F#v2-0\">v2.0 Release Notes\u003C\u002Fa>, the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fusing-queries\u002F\">Using Queries\u003C\u002Fa> guide, and the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fdemos\u002Fcar-analysis\u002F\">Car Analysis\u003C\u002Fa> demo and \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fdemos\u002Fmovie-database\u002F\">Movie Database\u003C\u002Fa> demo.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {createQueries} from 'tinybase';\n\nstore\n  .setTable('pets', {\n    fido: {species: 'dog', ownerId: '1', price: 5},\n    rex: {species: 'dog', ownerId: '2', price: 4},\n    felix: {species: 'cat', ownerId: '2', price: 3},\n    cujo: {species: 'dog', ownerId: '3', price: 4},\n  })\n  .setTable('owners', {\n    1: {name: 'Alice', state: 'CA'},\n    2: {name: 'Bob', state: 'CA'},\n    3: {name: 'Carol', state: 'WA'},\n  });\n\nconst queries = createQueries(store);\nqueries.setQueryDefinition(\n  'prices',\n  'pets',\n  ({select, join, group}) => {\n    select('species');\n    select('owners', 'state');\n    select('price');\n    join('owners', 'ownerId');\n    group('price', 'avg').as('avgPrice');\n  },\n);\n\nqueries\n  .getResultSortedRowIds('prices', 'avgPrice', true)\n  .forEach((rowId) => {\n    console.log(queries.getResultRow('prices', rowId));\n  });\n\u002F\u002F -> {species: 'dog', state: 'CA', avgPrice: 4.5}\n\u002F\u002F -> {species: 'dog', state: 'WA', avgPrice: 4}\n\u002F\u002F -> {species: 'cat', state: 'CA', avgPrice: 3}\n\nqueries.destroy();\n```\n\n\u003Csection>\u003Ch2 id=\"define-metrics-and-aggregations\">Define metrics and aggregations.\u003C\u002Fh2>\u003Cp>A \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fmetrics\u002Finterfaces\u002Fmetrics\u002Fmetrics\u002F\">\u003Ccode>Metrics\u003C\u002Fcode>\u003C\u002Fa> object makes it easy to keep a running aggregation of \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa> values in each \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Frow\u002F\">\u003Ccode>Row\u003C\u002Fcode>\u003C\u002Fa> of a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Ftable\u002F\">\u003Ccode>Table\u003C\u002Fcode>\u003C\u002Fa>. This is useful for counting rows, but also supports averages, ranges of values, or arbitrary aggregations.\u003C\u002Fp>\u003Cp>In this example, we create a new table of the pet species, and keep a track of which is most expensive. When we add horses to our pet store, the listener detects that the highest price has changed.\u003C\u002Fp>\u003Cp>Read more about \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fmetrics\u002Finterfaces\u002Fmetrics\u002Fmetrics\u002F\">\u003Ccode>Metrics\u003C\u002Fcode>\u003C\u002Fa> in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fusing-metrics\u002F\">Using Metrics\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {createMetrics} from 'tinybase';\n\nstore.setTable('species', {\n  dog: {price: 5},\n  cat: {price: 4},\n  worm: {price: 1},\n});\n\nconst metrics = createMetrics(store);\nmetrics.setMetricDefinition(\n  'highestPrice', \u002F\u002F metricId\n  'species', \u002F\u002F      tableId to aggregate\n  'max', \u002F\u002F          aggregation\n  'price', \u002F\u002F        cellId to aggregate\n);\n\nconsole.log(metrics.getMetric('highestPrice'));\n\u002F\u002F -> 5\n\nmetrics.addMetricListener('highestPrice', () =>\n  console.log(metrics.getMetric('highestPrice')),\n);\nstore.setCell('species', 'horse', 'price', 20);\n\u002F\u002F -> 20\n\nmetrics.destroy();\n```\n\n\u003Csection>\u003Ch2 id=\"create-indexes-for-fast-lookups\">Create indexes for fast lookups.\u003C\u002Fh2>\u003Cp>An \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Findexes\u002Finterfaces\u002Findexes\u002Findexes\u002F\">\u003Ccode>Indexes\u003C\u002Fcode>\u003C\u002Fa> object makes it easy to look up all the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Frow\u002F\">\u003Ccode>Row\u003C\u002Fcode>\u003C\u002Fa> objects that have a certain value in a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>In this example, we create an index on the \u003Ccode>species\u003C\u002Fcode> \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa> values. We can then get the the list of distinct \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa> value present for that index (known as &#x27;slices&#x27;), and the set of \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Frow\u002F\">\u003Ccode>Row\u003C\u002Fcode>\u003C\u002Fa> objects that match each value.\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Findexes\u002Finterfaces\u002Findexes\u002Findexes\u002F\">\u003Ccode>Indexes\u003C\u002Fcode>\u003C\u002Fa> objects are reactive too. So you can set listeners on them just as you do for the data in the underlying \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\u003Cp>Read more about \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Findexes\u002Finterfaces\u002Findexes\u002Findexes\u002F\">\u003Ccode>Indexes\u003C\u002Fcode>\u003C\u002Fa> in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fusing-indexes\u002F\">Using Indexes\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {createIndexes} from 'tinybase';\n\nconst indexes = createIndexes(store);\nindexes.setIndexDefinition(\n  'bySpecies', \u002F\u002F indexId\n  'pets', \u002F\u002F      tableId to index\n  'species', \u002F\u002F   cellId to index\n);\n\nconsole.log(indexes.getSliceIds('bySpecies'));\n\u002F\u002F -> ['dog', 'cat']\nconsole.log(indexes.getSliceRowIds('bySpecies', 'dog'));\n\u002F\u002F -> ['fido', 'rex', 'cujo']\n\nindexes.addSliceIdsListener('bySpecies', () =>\n  console.log(indexes.getSliceIds('bySpecies')),\n);\nstore.setRow('pets', 'lowly', {species: 'worm'});\n\u002F\u002F -> ['dog', 'cat', 'worm']\n\nindexes.destroy();\n```\n\n\u003Csection>\u003Ch2 id=\"model-table-relationships\">Model table relationships.\u003C\u002Fh2>\u003Cp>A \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Frelationships\u002Finterfaces\u002Frelationships\u002Frelationships\u002F\">\u003Ccode>Relationships\u003C\u002Fcode>\u003C\u002Fa> object lets you associate a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Frow\u002F\">\u003Ccode>Row\u003C\u002Fcode>\u003C\u002Fa> in a local \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Ftable\u002F\">\u003Ccode>Table\u003C\u002Fcode>\u003C\u002Fa> with the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fcommon\u002Ftype-aliases\u002Fidentity\u002Fid\u002F\">\u003Ccode>Id\u003C\u002Fcode>\u003C\u002Fa> of a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Frow\u002F\">\u003Ccode>Row\u003C\u002Fcode>\u003C\u002Fa> in a remote \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Ftable\u002F\">\u003Ccode>Table\u003C\u002Fcode>\u003C\u002Fa>. You can also reference a table to itself to create linked lists.\u003C\u002Fp>\u003Cp>In this example, the \u003Ccode>species\u003C\u002Fcode> \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Fcell\u002F\">\u003Ccode>Cell\u003C\u002Fcode>\u003C\u002Fa> of the \u003Ccode>pets\u003C\u002Fcode> \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Ftable\u002F\">\u003Ccode>Table\u003C\u002Fcode>\u003C\u002Fa> is used to create a relationship to the \u003Ccode>species\u003C\u002Fcode> \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002Ftype-aliases\u002Fstore\u002Ftable\u002F\">\u003Ccode>Table\u003C\u002Fcode>\u003C\u002Fa>, so that we can access the price of a given pet.\u003C\u002Fp>\u003Cp>Like everything else, you can set listeners on \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Frelationships\u002Finterfaces\u002Frelationships\u002Frelationships\u002F\">\u003Ccode>Relationships\u003C\u002Fcode>\u003C\u002Fa> too.\u003C\u002Fp>\u003Cp>Read more about \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Frelationships\u002Finterfaces\u002Frelationships\u002Frelationships\u002F\">\u003Ccode>Relationships\u003C\u002Fcode>\u003C\u002Fa> in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fusing-relationships\u002F\">Using Relationships\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {createRelationships} from 'tinybase';\n\nconst relationships = createRelationships(store);\nrelationships.setRelationshipDefinition(\n  'petSpecies', \u002F\u002F relationshipId\n  'pets', \u002F\u002F       local tableId to link from\n  'species', \u002F\u002F    remote tableId to link to\n  'species', \u002F\u002F    cellId containing remote key\n);\n\nconsole.log(\n  store.getCell(\n    relationships.getRemoteTableId('petSpecies'),\n    relationships.getRemoteRowId('petSpecies', 'fido'),\n    'price',\n  ),\n);\n\u002F\u002F -> 5\n\nrelationships.destroy();\n```\n\n\u003Csection>\u003Ch2 id=\"set-checkpoints-for-an-undo-stack\">Set checkpoints for an undo stack.\u003C\u002Fh2>\u003Cp>A \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fcheckpoints\u002Finterfaces\u002Fcheckpoints\u002Fcheckpoints\u002F\">\u003Ccode>Checkpoints\u003C\u002Fcode>\u003C\u002Fa> object lets you set checkpoints on a \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">\u003Ccode>Store\u003C\u002Fcode>\u003C\u002Fa>. Move forward and backward through them to create undo and redo functions.\u003C\u002Fp>\u003Cp>In this example, we set a checkpoint, then sell one of the pets. Later, the pet is brought back to the shop, and we go back to that checkpoint to revert the store to its previous state.\u003C\u002Fp>\u003Cp>Read more about \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fcheckpoints\u002Finterfaces\u002Fcheckpoints\u002Fcheckpoints\u002F\">\u003Ccode>Checkpoints\u003C\u002Fcode>\u003C\u002Fa> in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fusing-checkpoints\u002F\">Using Checkpoints\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\n\n```js\nimport {createCheckpoints} from 'tinybase';\n\nconst checkpoints = createCheckpoints(store);\n\nstore.setCell('pets', 'felix', 'sold', false);\ncheckpoints.addCheckpoint('pre-sale');\n\nstore.setCell('pets', 'felix', 'sold', true);\nconsole.log(store.getCell('pets', 'felix', 'sold'));\n\u002F\u002F -> true\n\ncheckpoints.goBackward();\nconsole.log(store.getCell('pets', 'felix', 'sold'));\n\u002F\u002F -> false\n```\n\n\u003Csection>\u003Ch2 id=\"did-we-say-tiny\">Did we say tiny?\u003C\u002Fh2>\u003Cp>If you use the basic \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002F\">\u003Ccode>store\u003C\u002Fcode>\u003C\u002Fa> module alone, you&#x27;ll only add a gzipped \u003Cem>6.2kB\u003C\u002Fem> to your app. Incrementally add the other modules as you need more functionality, or get it all for \u003Cem>13.7kB\u003C\u002Fem>.\u003C\u002Fp>\u003Cp>The optional \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-react\u002F\">\u003Ccode>ui-react\u003C\u002Fcode>\u003C\u002Fa> module is just \u003Cem>5.6kB\u003C\u002Fem>, the ui-react-dom components are another \u003Cem>4.0kB\u003C\u002Fem>, and everything is super fast. Life is easy when you have zero dependencies!\u003C\u002Fp>\u003Cp>Read more about how TinyBase is structured and packaged in the \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fhow-tinybase-is-built\u002Farchitecture\u002F\">Architecture\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\u003Cdiv class=\"table\">\u003Ctable class=\"fixed\">\u003Ctbody>\u003Ctr>\u003Cth> \u003C\u002Fth>\u003Cth>Minified .js.gz\u003C\u002Fth>\u003Cth>Source .js\u003C\u002Fth>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fstore\u002F\">tinybase\u002Fstore\u003C\u002Fa> (minimal)\u003C\u002Fth>\u003Ctd>6.2kB\u003C\u002Ftd>\u003Ctd>65.5kB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">tinybase (complete)\u003C\u002Fth>\u003Ctd>13.7kB\u003C\u002Ftd>\u003Ctd>150.2kB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-react\u002F\">ui-react\u003C\u002Fa>\u003C\u002Fth>\u003Ctd>5.6kB\u003C\u002Ftd>\u003Ctd>60.7kB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-react-dom\u002F\">ui-react-dom\u003C\u002Fa>\u003C\u002Fth>\u003Ctd>4.0kB\u003C\u002Ftd>\u003Ctd>36.7kB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-solid\u002F\">ui-solid\u003C\u002Fa>\u003C\u002Fth>\u003Ctd>5.5kB\u003C\u002Ftd>\u003Ctd>59.8kB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-solid-dom\u002F\">ui-solid-dom\u003C\u002Fa>\u003C\u002Fth>\u003Ctd>4.6kB\u003C\u002Ftd>\u003Ctd>44.9kB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-svelte\u002F\">ui-svelte\u003C\u002Fa>\u003C\u002Fth>\u003Ctd>4.7kB\u003C\u002Ftd>\u003Ctd>58.9kB\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fui-svelte-dom\u002F\">ui-svelte-dom\u003C\u002Fa>\u003C\u002Fth>\u003Ctd>5.8kB\u003C\u002Ftd>\u003Ctd>60.8kB\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\u003Csection>\u003Ch2 id=\"well-tested-and-documented\">Well tested and documented.\u003C\u002Fh2>\u003Cp>TinyBase has \u003Cem>100.0%\u003C\u002Fem> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002F\">API\u003C\u002Fa> examples are designed to make it as easy as possible for you to get your TinyBase-powered app up and running.\u003C\u002Fp>\u003Cp>Read more about how TinyBase is tested in the Unit \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fhow-tinybase-is-built\u002Ftesting\u002F\">Testing\u003C\u002Fa> guide.\u003C\u002Fp>\u003C\u002Fsection>\u003Cdiv class=\"table\">\u003Ctable class=\"fixed\">\u003Ctbody>\u003Ctr>\u003Cth width=\"30%\"> \u003C\u002Fth>\u003Cth>Total\u003C\u002Fth>\u003Cth>Tested\u003C\u002Fth>\u003Cth>Coverage\u003C\u002Fth>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">Tested lines\u003C\u002Fth>\u003Ctd>4,449\u003C\u002Ftd>\u003Ctd>4,449\u003C\u002Ftd>\u003Ctd>100.0%\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">Tested statements\u003C\u002Fth>\u003Ctd>4,828\u003C\u002Ftd>\u003Ctd>4,828\u003C\u002Ftd>\u003Ctd>100.0%\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">Tested functions\u003C\u002Fth>\u003Ctd>2,181\u003C\u002Ftd>\u003Ctd>2,181\u003C\u002Ftd>\u003Ctd>100.0%\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">Tested branches\u003C\u002Fth>\u003Ctd>1,357\u003C\u002Ftd>\u003Ctd>1,357\u003C\u002Ftd>\u003Ctd>100.0%\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">Tests\u003C\u002Fth>\u003Ctd colspan=\"3\">8,530\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"right\">Assertions\u003C\u002Fth>\u003Ctd colspan=\"3\">35,603\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\u003Chr>\u003Csection id=\"sponsors\">\u003Ch2 id=\"proud-to-be-supported-by\">Proud to be supported by:\u003C\u002Fh2>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffastrepl\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Ffastrepl.png?size=48\" title=\"fastrepl\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FComputelessComputer\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FComputelessComputer.png?size=48\" title=\"ComputelessComputer\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcancelself\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fcancelself.png?size=48\" title=\"cancelself\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fexpo\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fexpo.png?size=48\" title=\"expo\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbraden-w\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fbraden-w.png?size=48\" title=\"braden-w\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdylmye\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fdylmye.png?size=48\" title=\"dylmye\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgonza224\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fgonza224.png?size=48\" title=\"gonza224\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcpojer\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fcpojer.png?size=48\" title=\"cpojer\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbeekeeb\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fbeekeeb.png?size=48\" title=\"beekeeb\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FWonderPanda\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FWonderPanda.png?size=48\" title=\"WonderPanda\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FarpitBhalla\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FarpitBhalla.png?size=48\" title=\"arpitBhalla\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003C\u002Fsection>\u003Csection id=\"users\">\u003Ch2 id=\"excited-to-be-used-by\">Excited to be used by:\u003C\u002Fh2>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbehrends\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fbehrends.png?size=48\" title=\"behrends\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbetomoedano\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fbetomoedano.png?size=48\" title=\"betomoedano\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbrentvatne\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fbrentvatne.png?size=48\" title=\"brentvatne\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FbyCedric\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FbyCedric.png?size=48\" title=\"byCedric\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcircadian-risk\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fcircadian-risk.png?size=48\" title=\"circadian-risk\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcpojer\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fcpojer.png?size=48\" title=\"cpojer\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcubecull\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fcubecull.png?size=48\" title=\"cubecull\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ferwinkn\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Ferwinkn.png?size=48\" title=\"erwinkn\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fexpo\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fexpo.png?size=48\" title=\"expo\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fezra-en\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fezra-en.png?size=48\" title=\"ezra-en\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffeychenie\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Ffeychenie.png?size=48\" title=\"feychenie\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fflaming-codes\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fflaming-codes.png?size=48\" title=\"flaming-codes\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ffostertheweb\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Ffostertheweb.png?size=48\" title=\"fostertheweb\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FGiulio987\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FGiulio987.png?size=48\" title=\"Giulio987\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fhi-ogawa\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fhi-ogawa.png?size=48\" title=\"hi-ogawa\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fitsdevcoffee\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fitsdevcoffee.png?size=48\" title=\"itsdevcoffee\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjbolda\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fjbolda.png?size=48\" title=\"jbolda\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKayoo-asso\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FKayoo-asso.png?size=48\" title=\"Kayoo-asso\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkotofurumiya\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fkotofurumiya.png?size=48\" title=\"kotofurumiya\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKudo\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FKudo.png?size=48\" title=\"Kudo\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flearn-anything\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Flearn-anything.png?size=48\" title=\"learn-anything\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flluc\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Flluc.png?size=48\" title=\"lluc\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmarksteve\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fmarksteve.png?size=48\" title=\"marksteve\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmiking-the-viking\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fmiking-the-viking.png?size=48\" title=\"miking-the-viking\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmjamesderocher\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fmjamesderocher.png?size=48\" title=\"mjamesderocher\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmouktardev\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fmouktardev.png?size=48\" title=\"mouktardev\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnickmessing\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fnickmessing.png?size=48\" title=\"nickmessing\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnikitavoloboev\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fnikitavoloboev.png?size=48\" title=\"nikitavoloboev\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnkzw-tech\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fnkzw-tech.png?size=48\" title=\"nkzw-tech\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpalerdot\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fpalerdot.png?size=48\" title=\"palerdot\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FPorcoRosso85\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FPorcoRosso85.png?size=48\" title=\"PorcoRosso85\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fprimodiumxyz\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fprimodiumxyz.png?size=48\" title=\"primodiumxyz\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fshaneosullivan\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fshaneosullivan.png?size=48\" title=\"shaneosullivan\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsudo-self\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fsudo-self.png?size=48\" title=\"sudo-self\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FSuperSonicHub1\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FSuperSonicHub1.png?size=48\" title=\"SuperSonicHub1\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fthreepointone\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fthreepointone.png?size=48\" title=\"threepointone\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fuptonking\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fuptonking.png?size=48\" title=\"uptonking\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FViktorZhurbin\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FViktorZhurbin.png?size=48\" title=\"ViktorZhurbin\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwilkerlucio\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fwilkerlucio.png?size=48\" title=\"wilkerlucio\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FWonderPanda\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FWonderPanda.png?size=48\" title=\"WonderPanda\" width=\"48\" height=\"48\">\u003C\u002Fa>\u003C\u002Fsection>\u003Chr>\u003Cp>\u003Ca class=\"start\" href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fthe-basics\u002Fgetting-started\u002F\">Get started\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fdemos\u002F\">Try the demos\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fapi\u002Fthe-essentials\u002Fcreating-stores\u002Fstore\u002F\">Read the docs\u003C\u002Fa>\u003C\u002Fp>\u003Chr>\u003Csection id=\"family\">\u003Ch2 id=\"meet-the-family\">Meet the family\u003C\u002Fh2>\u003Cp>TinyBase is part of a group of small libraries designed to help make rich client and local-first apps easier to build. Check out the others!\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Fsynclets.org\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fsynclets.org\u002Ffavicon.svg?asImg\" width=\"48\">\u003Cbr>\u003Cb>Synclets\u003C\u002Fb>\u003C\u002Fa>\u003Cbr>An open, storage-agnostic, sync engine development kit.\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinywidgets.org\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Ftinywidgets.org\u002Ffavicon.svg?asImg\" width=\"48\">\u003Cbr>\u003Cb>TinyWidgets\u003C\u002Fb>\u003C\u002Fa>\u003Cbr>A collection of tiny, reusable, UI components.\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Ftinytick.org\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Ftinytick.org\u002Ffavicon.svg?asImg\" width=\"48\">\u003Cbr>\u003Cb>TinyTick\u003C\u002Fb>\u003C\u002Fa>\u003Cbr>A tiny but very useful task orchestrator.\u003C\u002Fp>\u003C\u002Fsection>\u003Chr>\u003Csection id=\"about\">\u003Ch2 id=\"about\">About\u003C\u002Fh2>\u003Cp>Modern apps deserve better. Why trade reactive user experiences to be able to use relational data? Or sacrifice features for bundle size? And why does the cloud do all the work \u003Ca href=\"https:\u002F\u002Flocalfirstweb.dev\u002F\" target=\"_blank\">anyway\u003C\u002Fa>?\u003C\u002Fp>\u003Cp>Building TinyBase was originally an interesting exercise for \u003Ca rel=\"me\" href=\"https:\u002F\u002Ftripleodeon.com\">me\u003C\u002Fa> in [API](\u002Fapi\u002F) design, minification, and documentation. But now it has taken on a life of its own, and has grown beyond my wildest expectations.\u003C\u002Fp>\u003Cp>It could not have been built without these great \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fhow-tinybase-is-built\u002Fcredits\u002F#giants\">projects\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Ftinybase.org\u002Fguides\u002Fhow-tinybase-is-built\u002Fcredits\u002F#and-friends\">friends\u003C\u002Fa>, and I hope you enjoy using it as much as I do building it!\u003C\u002Fp>\u003C\u002Fsection>\u003Csection id=\"story\">\u003Ch2 id=\"the-story\">The story\u003C\u002Fh2>\u003Ca href=\"https:\u002F\u002Fyoutu.be\u002FhXL7OkW-Prk?t=1232\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Ftinybase.org\u002Fyoutube.webp\">\u003C\u002Fa>\u003C\u002Fsection>","tinybase 是一个响应式的数据存储与同步引擎。它使用 TypeScript 开发，具备高效的数据管理能力，并支持多种前端框架如 React、Solid 和 Svelte 的集成，同时也能够与 IndexedDB、PostgreSQL 等后端数据库进行无缝对接。tinybase 通过其强大的数据监听机制实现了数据的实时更新和多客户端间的同步功能，特别适用于需要跨平台共享状态的应用场景，比如协作编辑工具、在线游戏或者任何要求即时反馈的交互式网页应用。此外，由于其轻量级设计，tinybase 也非常适合在资源受限的环境中部署。",2,"2026-06-11 03:37:40","high_star"]