Use this skill when building, debugging, or optimizing Jazz applications. It covers Jazz's bindings with various different UI frameworks, as well as how to use Jazz without a framework. Look here for details on providers and context, hooks and reactive data fetching, authentication, and specialized UI components for media and inspection.
76
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
jazz-schema-design)jazz-permissions-security)jazz-testing)Use this skill when the user asks about rendering data, handling user input, managing authentication state, or framework-specific integration (React, Svelte, etc.). If the issue is "data not appearing" but permissions are correct, look here for loading and subscription patterns.
Select the guide for your specific framework:
These APIs are available on all CoValue instances, regardless of the framework.
All CoValues (CoMaps, CoLists, etc.) have these properties directly on the instance:
$isLoaded (boolean): Returns true if the CoValue is fully loaded and ready to read..toJSON(): Returns a plain JavaScript object representation of the CoValue. Use this for debugging only, not for rendering..$jazz NamespaceEvery CoValue instance has a .$jazz property containing metadata and utility methods.
.$jazz.id (ID<CoValue>): The globally unique ID of the CoValue (e.g., co_zXy...)..$jazz.owner (Group): The Group that owns this CoValue. Access control is determined by membership in this group..$jazz.createdAt (number): Creation timestamp (ms since epoch)..$jazz.createdBy (ID<Account> | undefined): ID of the creating account..$jazz.lastUpdatedAt (number): Last update timestamp (ms since epoch)..$jazz.loadingState ("loading" | "loaded" | "unavailable" | "unauthorized"): The current loading state..$jazz.ensureLoaded({ resolve: { ... } }): Waits for nested references to load. Returns a promise with a new instance where requested fields are guaranteed available.const detailedPost = await post.$jazz.ensureLoaded({
resolve: {
comments: {
$each: {
author: true
}
}
}
});.$jazz.refs (CoMap/CoRecord only): Access nested CoValues as references (with IDs) without loading them..$jazz.has(key) (CoMap/CoRecord only): Checks if a key exists..$jazz.subscribe(callback): Manually subscribe to changes. Returns an unsubscribe function. Prefer framework-specific hooks (e.g., useCoState) over this..$jazz.waitForSync(): Promise that resolves when changes are synced to peers. Useful for critical saves or logout flows..$jazz.isBranched (boolean): Whether the CoValue is currently in a local branch..$jazz.branchName (string): The name of the current branch..$jazz.unstable_merge(): Merges a branch back into the main history.user.name)..$jazz.set(key, value).$jazz.delete(key).$jazz.applyDiff(diff)list[0]), iterate (map, forEach)..$jazz.push(item).$jazz.unshift(item).$jazz.splice(...).$jazz.remove(index or predicate)toString() or use directly in template.insertAfter(index, text)deleteRange({ from, to }).$jazz.applyDiff(newText)feed.all (returns per-session feeds)..$jazz.push(item) (Append-only).// Subscribing to all entries across all accounts
const allEntries = Object.values(feed.perAccount).flatMap(accountFeed => Array.from(accountFeed.all));
// Pushing a new entry
feed.$jazz.push({ message: "Hello", timestamp: Date.now() });type) to narrow the type.const list = co.list(MyUnion);
const item = list[0];
if (item.type === "text") {
console.log(item.value); // item is narrowed to TextVariant
} else if (item.type === "image") {
console.log(item.image.$jazz.id); // item is narrowed to ImageVariant
}toBlob() or consume chunks.createFromBlob(blobOrFile) or start(metadata) -> push(chunk) -> end().<Image> component (framework specific) or loadImageBySize.createImage function from jazz-tools/media<Image imageId={productImage.$jazz.id} width={300} />$isLoaded: Ensure you are checking if (coValue.$isLoaded) before rendering.resolve in your hook (e.g. useCoState(..., { resolve: { items: true } })).<JazzProvider />.select function in useCoState is stable or returns stable references.useMemo instead of doing them inside the select function.equalityFn to prevent unnecessary updates if the selected data hasn't changed semantically..$jazz.set() or .$jazz.push() instead of direct property assignment (e.g. obj.key = val won't sync).4f90501
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.