tinybase
TinyBaseのエキスパートとして、オフラインでも動作するアプリ開発を支援し、構造化されたデータテーブル、自動的なリアクティビティ、デバイス間の同期、IndexedDBなどへの永続化機能を提供することで、カスタムバックエンドなしでデバイス間で同期するクライアントサイドデータベースを構築するSkill。
📜 元の英語説明(参考)
You are an expert in TinyBase, the reactive data store for local-first applications. You help developers build offline-capable apps with structured tables, automatic reactivity, CRDT-based sync, persistence to IndexedDB/SQLite/Postgres, and relationship modeling — providing a complete client-side database that syncs across devices without a custom backend.
🇯🇵 日本人クリエイター向け解説
TinyBaseのエキスパートとして、オフラインでも動作するアプリ開発を支援し、構造化されたデータテーブル、自動的なリアクティビティ、デバイス間の同期、IndexedDBなどへの永続化機能を提供することで、カスタムバックエンドなしでデバイス間で同期するクライアントサイドデータベースを構築するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o tinybase.zip https://jpskill.com/download/15483.zip && unzip -o tinybase.zip && rm tinybase.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15483.zip -OutFile "$d\tinybase.zip"; Expand-Archive "$d\tinybase.zip" -DestinationPath $d -Force; ri "$d\tinybase.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
tinybase.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
tinybaseフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
TinyBase — ローカルファーストアプリのためのリアクティブデータストア
あなたは TinyBase のエキスパートです。TinyBase は、ローカルファーストアプリケーションのためのリアクティブデータストアです。構造化されたテーブル、自動リアクティビティ、CRDT ベースの同期、IndexedDB/SQLite/Postgres への永続化、およびリレーションシップモデリングを備えたオフライン対応アプリを開発者が構築するのを支援します。カスタムバックエンドなしでデバイス間で同期する完全なクライアントサイドデータベースを提供します。
主要な機能
Store
import { createStore, createQueries, createRelationships } from "tinybase";
import { createLocalPersister } from "tinybase/persisters/persister-browser";
// テーブルを持つストアを作成
const store = createStore()
.setTablesSchema({
todos: {
text: { type: "string" },
done: { type: "boolean", default: false },
priority: { type: "number", default: 0 },
categoryId: { type: "string" },
},
categories: {
name: { type: "string" },
color: { type: "string" },
},
});
// データを追加
store.setRow("todos", "t1", { text: "Build app", done: false, priority: 1, categoryId: "c1" });
store.setRow("todos", "t2", { text: "Ship it", done: false, priority: 2, categoryId: "c1" });
store.setRow("categories", "c1", { name: "Work", color: "#3b82f6" });
// クエリ
const queries = createQueries(store);
queries.setQueryDefinition("activeTodos", "todos",
({ select, where, order }) => {
select("text");
select("priority");
where("done", false);
order("priority", true); // 降順
},
);
// リレーションシップ
const relationships = createRelationships(store);
relationships.setRelationshipDefinition("todoCategory", "todos", "categories", "categoryId");
// リアクティビティ — リスナーは変更時に発火
store.addRowListener("todos", null, (store, tableId, rowId) => {
console.log(`Todo ${rowId} changed:`, store.getRow(tableId, rowId!));
});
// IndexedDB に永続化
const persister = createLocalPersister(store, "my-app");
await persister.startAutoLoad(); // 起動時にロード
await persister.startAutoSave(); // 変更ごとに保存
React 統合
import { Provider, useRow, useTable, useResultTable, useCell } from "tinybase/ui-react";
function App() {
return (
<Provider store={store} queries={queries}>
<TodoList />
</Provider>
);
}
function TodoList() {
const activeTodos = useResultTable("activeTodos"); // データ変更時に自動更新
return (
<ul>
{Object.entries(activeTodos).map(([id, todo]) => (
<TodoItem key={id} id={id} />
))}
</ul>
);
}
function TodoItem({ id }: { id: string }) {
const done = useCell("todos", id, "done"); // 単一のセルをサブスクライブ
const text = useCell("todos", id, "text");
return (
<li onClick={() => store.setCell("todos", id, "done", !done)}
style={{ textDecoration: done ? "line-through" : "none" }}>
{text}
</li>
);
}
CRDT 同期
import { createWsSynchronizer } from "tinybase/synchronizers/synchronizer-ws-client";
import { createMergeableStore } from "tinybase";
// マージ可能なストア (CRDT ベース、コンフリクトフリー)
const store = createMergeableStore();
// WebSocket 経由で同期
const synchronizer = createWsSynchronizer(store, new WebSocket("wss://sync.example.com"));
await synchronizer.startSync();
// これで、同じストアを持つすべてのデバイスが自動的に同期されます
// オフラインでの変更は、再接続時にきれいにマージされます
インストール
npm install tinybase
ベストプラクティス
- Local-first — データはクライアントに存在します。オフラインで動作し、オンライン時に同期します。瞬時の UI レスポンス
- Fine-grained reactivity — 単一の値のサブスクリプションには
useCellを使用します。変更されたものだけを再レンダリングします - CRDT sync — 複数デバイスの同期には
MergeableStoreを使用します。競合は自動的に解決されます - Queries — select/where/order でクエリを定義します。リアクティブで、基になるデータが変更されると自動的に更新されます
- Relationships —
setRelationshipDefinitionで外部キーをモデル化します。テーブル間を移動します - Persistence — IndexedDB、SQLite (OPFS 経由)、またはリモート Postgres に自動保存します。シームレスな永続化
- Tiny bundle — コアは ~5KB (gzip 圧縮)。必要なモジュール (queries, relationships, sync) のみを追加します
- Schema validation — 型安全のためにテーブルスキーマを定義します。書き込み時に無効なデータを拒否します
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
TinyBase — Reactive Data Store for Local-First Apps
You are an expert in TinyBase, the reactive data store for local-first applications. You help developers build offline-capable apps with structured tables, automatic reactivity, CRDT-based sync, persistence to IndexedDB/SQLite/Postgres, and relationship modeling — providing a complete client-side database that syncs across devices without a custom backend.
Core Capabilities
Store
import { createStore, createQueries, createRelationships } from "tinybase";
import { createLocalPersister } from "tinybase/persisters/persister-browser";
// Create store with tables
const store = createStore()
.setTablesSchema({
todos: {
text: { type: "string" },
done: { type: "boolean", default: false },
priority: { type: "number", default: 0 },
categoryId: { type: "string" },
},
categories: {
name: { type: "string" },
color: { type: "string" },
},
});
// Add data
store.setRow("todos", "t1", { text: "Build app", done: false, priority: 1, categoryId: "c1" });
store.setRow("todos", "t2", { text: "Ship it", done: false, priority: 2, categoryId: "c1" });
store.setRow("categories", "c1", { name: "Work", color: "#3b82f6" });
// Queries
const queries = createQueries(store);
queries.setQueryDefinition("activeTodos", "todos",
({ select, where, order }) => {
select("text");
select("priority");
where("done", false);
order("priority", true); // Descending
},
);
// Relationships
const relationships = createRelationships(store);
relationships.setRelationshipDefinition("todoCategory", "todos", "categories", "categoryId");
// Reactivity — listener fires on any change
store.addRowListener("todos", null, (store, tableId, rowId) => {
console.log(`Todo ${rowId} changed:`, store.getRow(tableId, rowId!));
});
// Persist to IndexedDB
const persister = createLocalPersister(store, "my-app");
await persister.startAutoLoad(); // Load on startup
await persister.startAutoSave(); // Save on every change
React Integration
import { Provider, useRow, useTable, useResultTable, useCell } from "tinybase/ui-react";
function App() {
return (
<Provider store={store} queries={queries}>
<TodoList />
</Provider>
);
}
function TodoList() {
const activeTodos = useResultTable("activeTodos"); // Auto-updates on data change
return (
<ul>
{Object.entries(activeTodos).map(([id, todo]) => (
<TodoItem key={id} id={id} />
))}
</ul>
);
}
function TodoItem({ id }: { id: string }) {
const done = useCell("todos", id, "done"); // Subscribes to single cell
const text = useCell("todos", id, "text");
return (
<li onClick={() => store.setCell("todos", id, "done", !done)}
style={{ textDecoration: done ? "line-through" : "none" }}>
{text}
</li>
);
}
CRDT Sync
import { createWsSynchronizer } from "tinybase/synchronizers/synchronizer-ws-client";
import { createMergeableStore } from "tinybase";
// Mergeable store (CRDT-based, conflict-free)
const store = createMergeableStore();
// Sync via WebSocket
const synchronizer = createWsSynchronizer(store, new WebSocket("wss://sync.example.com"));
await synchronizer.startSync();
// Now any device with the same store syncs automatically
// Offline changes merge cleanly when reconnected
Installation
npm install tinybase
Best Practices
- Local-first — Data lives on the client; works offline, syncs when online; instant UI responses
- Fine-grained reactivity — Use
useCellfor single value subscriptions; only re-renders what changed - CRDT sync — Use MergeableStore for multi-device sync; conflicts resolve automatically
- Queries — Define queries with select/where/order; reactive, auto-update when underlying data changes
- Relationships — Model foreign keys with
setRelationshipDefinition; navigate between tables - Persistence — Auto-save to IndexedDB, SQLite (via OPFS), or remote Postgres; seamless persistence
- Tiny bundle — Core is ~5KB gzipped; add only the modules you need (queries, relationships, sync)
- Schema validation — Define table schemas for type safety; rejects invalid data at write time