powabase — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited powabase (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Powabase is a multi-tenant AI Backend-as-a-Service. One REST API gives every project an isolated stack — Postgres + pgvector, an API gateway, auth, storage, realtime, and an AI worker — exposing three composable modules on top of a Supabase-style backend:
| Module | What it is | Entry reference |
|---|---|---|
| Context Engineering (RAG) | Sources → extraction → Knowledge Bases → indexing → retrieval → reranking | rag-context-engineering.md |
| Agent Orchestration | ReAct agents with tools, sessions, streaming; multi-agent coordinators | agents-and-tools.md · orchestrations.md |
| Workflow Automation | DAG of blocks; webhook / scheduled triggers; NL Copilot | workflows-and-copilot.md |
| BaaS layer | PostgREST + RLS, GoTrue auth, Storage, Realtime, direct Postgres | baas-database-rls.md · baas-auth-storage-realtime.md |
Use only the modules you need. A KB can attach to an agent; an agent can be a block in a workflow; a workflow can call a KB search — they compose.
trust this snapshot for exact request/response shapes. The docs at https://docs.powabase.ai are the contract; fetch the relevant page (Mintlify — you can append .md to a page path) before relying on a field you're unsure about. This skill flags known ambiguities inline.
GET /api/agents, a KBsearch, a one-message run) and read the response. A fix without a confirming call is incomplete.
re-read the error, check the run record (see the debugging playbook), try a different method. The agent itself fails a run if it calls the same tool with the same args 3× in a row ("doom loop").
/api/*, /rest/v1/*, /auth/v1/*,/storage/v1/* request needs both apikey and Authorization: Bearer. Sending one is the #1 cause of 401s.
keys, and tool API keys live behind the Studio UI. Don't guess them — ask, and point the user to the exact place. See studio-setup-and-human-handoff.md.
### ⚠️ Security must-knows (read before exposing anything to end users) - Run agents from a trusted backend only. Powabase does not forward end-user JWTs to agent tools —database_query/database_writerun on the DB superuser connection (RLS bypassed) regardless of caller. Exposing/api/agents/{id}/run/stream(the tool-bearing path) to clients with their own tokens gives them full project-wide DB access. Inject per-user data yourself (viacontext_itemsor a custom tool). See agents-and-tools.md. - *`ai.RLS is project-wide, not per-user.** Any signed-in (authenticated) user can read every agent/KB/workflow in the project; only session tables filter byuser_id`. See baas-database-rls.md. - Never ship the Service Role key, JWT Secret, or Database URL client-side. The Anon (Publishable) key is the only credential safe in a browser/mobile app.
Base URL is the Project URL: https://{ref}.p.powabase.ai. Most platform docs (and this skill) assume the Service Role (Secret) Key for server-side /api/* calls.
import requests
BASE_URL = "{BASE_URL}" # Connect modal → Project URL
API_KEY = "{API_KEY}" # Connect modal → Service Role (Secret) Key
headers = {"apikey": API_KEY, "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
requests.get(f"{BASE_URL}/api/agents", headers=headers).json() # verify: 200 + {agents, total, ...}Which key for which surface:
| Key | Use for | Client-safe? |
|---|---|---|
| Project URL | BASE_URL for every call | Yes |
| Anon (Publishable) | Browser calls to PostgREST/Storage that respect RLS | Yes |
| Service Role (Secret) | Server-side /api/* and RLS-bypassing PostgREST | No — server only |
| JWT Secret | Verifying user JWTs on your backend | No |
| Database URL | Direct Postgres (migrations, ORMs, psql) | No |
→ The credentials come from the Studio's Connect modal (project header → Connect, or append ?showConnect=true to a project URL). If you don't have them, ask the user to open it and paste the Project URL + Service Role Key. Full detail: connection-and-auth.md. Shared conventions (errors, pagination, PUT vs PATCH, headers): api-conventions.md.
Powabase is a full Supabase-style backend first, AI modules second. Every project ships an isolated Postgres + PostgREST + GoTrue + Storage + Realtime — so for ordinary app data (users' profiles, todos, orders, app state) you create your own `public` tables and use them directly; don't model app data as agents/KBs. This should be your default reach for anything that isn't RAG/agents/workflows.
public schema is yours to migrate.
/rest/v1/{table} — GET ?col=eq.val&select=...&order=,POST, PATCH ?id=eq.{id}, DELETE ?id=eq.{id} (filters required on write), embeds (select=*,relation(*)), upsert (Prefer: resolution=merge-duplicates), RPC (/rest/v1/rpc/{fn}). Two-header auth applies.
on — and new public tables have RLS OFF by default**, so a fresh table is world-readable/writable to anyone with the Anon key until you ENABLE ROW LEVEL SECURITY and add policies. Turn RLS on as step one for any user-facing table.
database_query/database_writetools — but those run as DB superuser (RLS bypassed); see the security box.
Full surface — schemas, RLS posture, PostgREST patterns, direct Postgres/pooler, extensions: baas-database-rls.md.
The reference end-to-end pattern. Each step links to depth.
POST /api/sources/upload (multipart file) → pollGET /api/sources/{id} until extraction_status is terminal. Extraction is a barrier: the next step needs extracted specifically. Re-uploading identical bytes returns 409 `duplicate_source` (project-wide dedup) — reuse it, don't treat it as an error. See rag-context-engineering.md §1.
POST /api/knowledge-bases {name} → add sourcePOST /api/knowledge-bases/{kb_id}/sources {source_id} (triggers indexing). This 400s unless the source is `extracted` (attention_required is rejected — re-extract with OCR). Re-adding the same source is an idempotent re-index. Poll until the indexed source is indexed.
POST /api/agents {name, model, system_prompt, settings} →link KB POST /api/agents/{id}/knowledge-bases {knowledge_base_id} (the agent auto-gets a knowledge_search tool).
POST /api/agents/{id}/run/stream {message} — consumeSSE; capture session_id from the start event for multi-turn.
Extraction artifacts are reusable beyond RAG. Every Source also exposes derivatives — per-page images (rendered PNGs), per-page text, and whole-doc markdown/text — that you can render directly in your own UI (e.g. a document viewer). Reach for these before reinventing PDF rendering. See rag-context-engineering.md §1.
Details: rag-context-engineering.md, agents-and-tools.md, and the SSE parser in streaming-sse.md.
Which indexing strategy + retrieval method? (set on the KB; full table in rag-context-engineering.md)
| Your documents / queries | Indexing strategy | Retrieval method |
|---|---|---|
| General docs, mixed queries (default) | chunk_embed | hybrid |
| Exact tokens — IDs, error codes, product names | chunk_embed | full_text |
| Whole short docs as a unit (cases, memos, papers) | full_document | hybrid (top_k=3) |
| Long structured PDFs, structural queries | page_index | tree_search |
| Cross-referenced corpora (regs, standards, code) | graph_index | hybrid |
| Structured field extraction (invoices, forms) | doc2json | vector_search |
tree_searchworks only withpage_indexKBs.build-bm25andfull_text/hybridneed a KB whose retrieval method includes BM25.
Tune retrieval quality with three `retrieval_config` knobs (stored on the KB, query-time, no reindex; settable at create or viaPATCH):reranker(precision),query_enrichment(LLM query rewrite for conversational/multi-turn),context_mode: "image"(multimodal retrieval — all strategies exceptdoc2json). See rag-context-engineering.md §6.
Agent vs Orchestration vs Workflow?
conversation/task. → agents-and-tools.md
(supervisor/sequential/parallel). Multi-domain or multi-stage reasoning. → orchestrations.md
Known steps, dynamic content; webhook/cron triggers. → workflows-and-copilot.md
Specify any agent/orchestration exhaustively (MECE). Cover all four pillars — data (link the right KBs), prompt (detailed, explicit, Markdown bulleted instructions), tools (builtin / custom / MCP, only what's needed), and model + `reasoning_effort` (choose deliberately — defaults often underperform). No gaps, no overlap. Full checklists: agents-and-tools.md §0 · orchestrations.md.
*Typed `/api/ vs PostgREST vs direct Postgres?** Use **/api/` for anything the platform manages (runs, indexing, workflow execution — it coordinates async work and ownership). Use PostgREST (`/rest/v1/) for your own public tables and read-only ai.` queries (mind RLS + `Accept-Profile: ai`). Use the Database URL* for migrations/ORMs/extensions. → baas-database-rls.md
The footguns most likely to bite. Each is expanded in a reference.
temperature (and othertuning fields) on agent create/update is silently dropped. → agents-and-tools.md
KB search) use `/run/stream`. → agents-and-tools.md
via PostgREST needs Accept-Profile: ai`** (writes:Content-Profile: ai) — without it you get public and a 404/empty. → baas-database-rls.md
input/output/llm are not real(use starter / response). → workflows-and-copilot.md
Authorization: Bearer <secret> with a trailing space and notoken returns 401** and won't fall back to ?token=. Guard against Bearer ${secret ?? ""}. → workflows-and-copilot.md
sse isaccepted but not honored by the current client. → agents-and-tools.md
renews_at);`503 billing service unreachable` → retry with backoff. → billing-limits-and-debugging.md
jitter. → billing-limits-and-debugging.md
postgres_changes deliver nothing until you create thesupabase_realtime publication.** → baas-auth-storage-realtime.md
GET /api/agents/runs/{run_id} (error, events,retrieved_context) is the highest-signal start. → billing-limits-and-debugging.md
Some setup can't be done over the API. When you hit one, pause and tell the user exactly where to go (full table in studio-setup-and-human-handoff.md):
| Need | Ask the user to go to |
|---|---|
| Project URL / API keys / Database URL | Connect modal (project header → Connect) |
| BYOK model provider keys (or "AI-on-us" status) | Settings → LLM Provider Keys |
web_search needs EXA_API_KEY; web_scrape needs FIRECRAWL_API_KEY | Settings → Tools (also settable via `PUT /api/settings`) |
| Database restore / point-in-time recovery | Email support (no self-service) |
Out of credits after a 402 | Top up / upgrade (account-level) |
<!-- PLACEHOLDER — Powabase ships no MCP server yet (unlike Supabase); fill in URL / .mcp.json / auth / tool list when it launches. --> Coming soon — none exists today. There is no first-party Powabase MCP server or CLI. Build requests over raw HTTP (principle #1) and verify shapes against the live docs. Don't assume tools named powabase_* exist.
Separately, an agent can connect to external MCP servers as runtime tools — a real Powabase feature (agents-and-tools.md), unrelated to a Powabase MCP server for your assistant.
ai.* schema, RLS posture, PostgREST, direct Postgres, extensions.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.