@fusekit-cloud/sdk
v0.2.2
Published
Browser SDK for Fusekit apps: authenticated user, document database, file storage, realtime, and AI APIs.
Maintainers
Readme
@fusekit-cloud/sdk
The browser SDK for Fusekit apps. It gives a deployed app authenticated access to the current user, a Postgres-backed document database, object file storage, server-mediated realtime, and optional AI — all scoped automatically to the app and tenant, with no API keys in the browser.
npm install @fusekit-cloud/sdkOr load it straight from a CDN (no build step):
import { fusekit } from "https://esm.sh/@fusekit-cloud/sdk";Quick start
import { fusekit } from "@fusekit-cloud/sdk";
// Who is signed in
const user = await fusekit.user();
// Document database (a "collection" of JSON records)
const task = await fusekit.db.collection("tasks").create({
title: "Review invoices",
done: false,
});
await fusekit.db.collection("tasks").update(task.id, { done: true });
const open = await fusekit.db.collection("tasks").list();
// File storage
const uploaded = await fusekit.files.upload(file);
// AI (when enabled on the server)
const response = await fusekit.ai.chat({
model: "gpt-4o-mini",
messages: [{ role: "user", content: "Summarize this" }],
});The SDK infers the app slug and tenant from the current hostname (handling both
app.domain and app.tenant.domain) and sends credentialed same-origin
requests. Tests and non-browser clients can configure it explicitly:
fusekit.configure({
app: "expenses",
tenant: "acme", // optional
baseUrl: "https://expenses.acme.apps.fusekit.cloud",
});Realtime
Subscribe to live changes on a collection:
const unsubscribe = fusekit.db.collection("tasks").subscribe((change) => {
// change.op is "insert" | "update" | "delete"
console.log(change.op, change.record ?? change.recordId);
});
unsubscribe();App-scoped broadcast rooms and presence:
const room = fusekit.realtime.room("document-123");
const stop = room.subscribe((m) => console.log(m.event, m.payload, m.sender));
await room.broadcast("cursor.move", { x: 10, y: 20 });
const presence = fusekit.realtime.presence("document-123", (members) => {
console.log("online:", members.map((m) => m.sender));
});
presence.leave();Handling errors
Every call rejects with a FusekitError when something goes wrong. It carries
the server's own human-readable message (safe to show a user as-is), the HTTP
status (0 when the request never reached the server), and the operation
that failed — so failures are easy to surface and to log.
import { fusekit, FusekitError } from "@fusekit-cloud/sdk";
try {
await fusekit.db.collection("tasks").create({ title: "Review invoices" });
} catch (err) {
if (err instanceof FusekitError) {
setBanner(err.message); // e.g. "You've been signed out. Refresh the page to sign in again."
console.error(err.operation, err.status); // "POST /runtime/tasks/db/tasks", 401
}
}When the server sends no message of its own, the SDK fills in a friendly, status-appropriate default rather than a bare status code.
Documentation
Full docs, the CLI, the MCP server, and importable AI skills: https://docs.fusekit.cloud
License
MIT
