Authentication
Email/password, magic link, phone OTP, OAuth (Google, GitHub), MFA (TOTP), SAML SSO. JWT + refresh, session revocation.
Pluto ships a complete Backend-as-a-Service — authentication, auto-generated APIs, realtime, storage, vector search and edge functions — behind a typed SDK and an admin dashboard. Run it on your laptop with docker compose up, or one-click deploy to Fly, Railway or Render.
git clone pluto-baas && cd pluto-baas && docker compose up -dpluto status --url /api/pluto→ probing modules...showing 8 / 8
Eight canonical services, all namespaced, all versioned, all covered by integration tests.
Email/password, magic link, phone OTP, OAuth (Google, GitHub), MFA (TOTP), SAML SSO. JWT + refresh, session revocation.
Instant CRUD endpoints from Postgres tables. Filters, ordering, pagination, RLS enforced per JWT claim.
WebSocket subscriptions, presence, ordered broadcast, sharded rooms, backpressure policies.
Public/private buckets, signed URLs, resumable uploads. Local disk or S3-compatible (MinIO, R2, S3).
Deploy TypeScript handlers to isolates. KV, queues, secrets, cron triggers.
pgvector-backed HNSW indexes, hybrid rerank (linear/RRF), streaming embeddings.
Durable multi-step workflows with step ledger, retries, side-effect idempotency.
Structured logs, request-id tracing, Prometheus metrics, per-tenant usage & quotas.
One @pluto/js works from React, Vue, React Native and Node — plus first-party Python, Go and CLI SDKs. Same surface as Supabase-JS.
# JavaScript / TypeScript / React / Vue / React Native / Node
# ── Option A · npm registry (recommended, works everywhere) ──────────
npm i @timescard/pluto-js
bun add @timescard/pluto-js
pnpm add @timescard/pluto-js
# ── Option B · Direct tarball (no npm account needed) ────────────────
# Pinned + immutable (1-year CDN cache):
npm i https://backend-joy.lovable.app/sdk/download/pluto-js-0.1.0.tgz
# Always-latest (short cache + ETag revalidation):
npm i https://backend-joy.lovable.app/sdk/download/pluto-js-latest.tgz
# ── Verify the tarball before installing (SHA-256) ───────────────────
curl -fLO https://backend-joy.lovable.app/sdk/download/pluto-js-0.1.0.tgz
echo "789097fdbc4d5d081e5599b9171c0d7eb396cd2558ec1364ce292be238a88c2a pluto-js-0.1.0.tgz" | sha256sum -c -
# pluto-js-0.1.0.tgz: OK ← must print OK
npm i ./pluto-js-0.1.0.tgz
# Machine-readable hashes for every release:
# https://backend-joy.lovable.app/sdk/download/manifest.json
# Python
pip install pluto-sdk
# Go
go get github.com/pluto-baas/pluto/sdks/go/plutoimport { createClient } from "@pluto/js";
// 1) Initialize once — createClient(url, publishableKey)
const pluto = createClient(
"https://api.timescard.cloud",
import.meta.env.VITE_PLUTO_PUBLISHABLE_KEY!, // Dashboard → API keys
{ auth: { persistSession: true, autoRefreshToken: true } },
);
// 2) Sign in with email + password
const { data, error } = await pluto.auth.signInWithPassword({
email: "ada@example.com",
password: "hunter2",
});
if (error) throw error;
// 3) Grab tokens — send access_token as "Authorization: Bearer <token>"
const accessToken = data.session?.access_token;
const refreshToken = data.session?.refresh_token;
// 4) Any authenticated REST call the SDK makes now carries the Bearer token
await pluto.from("posts").select("id,title");
// Sign up + reset + listen
await pluto.auth.signUp({ email: "ada@example.com", password: "hunter2" });
await pluto.auth.resetPasswordForEmail("ada@example.com");
pluto.auth.onAuthStateChange((event, session) => {
console.log(event, session?.user?.email);
});Anon key + service-role key: Dashboard → API. CORS whitelist your frontend origin at Dashboard → CORS before going live.
Every module has a real UI. Manage keys, whitelist origins, edit schemas, revoke sessions — without touching SQL.
Anon + service-role keys per workspace with copy-safe minting.
Per-project allow-list — no wildcards in production.
Visual table editor, SQL runner, migrations timeline.
Native Postgres RLS policies + role registry, tested end-to-end.
List users, revoke sessions, assign roles, manage MFA.
/readyz + one-click smoke run of every canonical endpoint.
Whether you're a solo founder, an agency, or a regional team — Pluto gives you a Supabase-grade backend without the lock-in.
Ship a real backend on your side project without an egress-cost surprise or a rug-pull.
One backend you resell to every client. Per-workspace isolation, custom domains, no lock-in.
Local latency, local pricing, local support. Host in Dhaka or Singapore, invoice in BDT.
Read the full go-to-market playbook at docs/GO-TO-MARKET.md.
Pluto is MIT-licensed and free forever on your own hardware. Managed cloud plans are per-project — no per-seat surprises.
Run Pluto on your own hardware, VPS, or Kubernetes cluster.
We run Pluto for you on dedicated infrastructure with SLA and priority support.
Self-hosted বাসাতেই সব features free — MIT license। Managed hosting চাইলে যোগাযোগ করুন — আমরা আপনার workload অনুযায়ী quote দেব।
Config files ship with the repo — pick a target and go live in minutes.
Common questions from teams evaluating Pluto against Firebase and Supabase.
Every project has a strict allow-list managed in Dashboard → CORS. No wildcards in production. Preflight is served by the API, and disallowed origins are rejected before they hit any module. Add your published frontend origin (e.g. https://backend-joy.lovable.app) before going live.
Pluto uses native Postgres RLS. Every request sets a Postgres session with the JWT claims (sub, role, workspace_id), so policies like posts.owner = auth.uid() run server-side. The Dashboard ships a policy editor and end-to-end regression tests so bad policies are caught before deploy.
Realtime v5 is a WebSocket gateway with sharded rooms, presence, ordered broadcast and backpressure. It piggybacks on Postgres logical replication for row-change events (subscribeTable) and adds application-level channels for chat, cursors and presence.
Cloud plans are billed per project. A workspace can hold many projects, each on its own plan. Self-hosted is free forever regardless of workspace or project count.
Four common paths: (1) docker compose up -d locally; (2) flyctl deploy using the shipped deploy/fly.toml; (3) Railway 1-click via railway.json; (4) Render blueprint via render.yaml. All four boot the same image and pass /readyz before serving traffic.
Yes. The Data API mirrors PostgREST semantics, so Supabase-JS query patterns port directly. For Firebase, use the Pluto CLI import command to move Auth users and Firestore collections into Postgres tables.
Spin up Pluto, point your React app at it, and get back to building features your users care about.