kynetradb
One Rust binary: BM25 search + vector + KV + document + auth + files + realtime + agentic admin.
vs
Supabase
Open-source Firebase alternative built on Postgres with auth, storage, realtime, and edge functions.
Feature comparison
| Dimension | kynetradb | Supabase |
|---|---|---|
| Full-text search | BM25 (parallel, 1.07 ms @ 100k) | trigram |
| Vector search | Brute-force cosine (2.21 ms @ 100k, no HNSW yet) Supabase uses HNSW which scales better past ~100k vectors | HNSW |
| Auth | Built-in — email+password, refresh tokens, OTP/magic-link, OAuth (Google/GitHub), anonymous, /auth/v1 | Built-in |
| Row-Level Security | Built-in — auth.uid() DSL, per-row enforcement, SELECT/INSERT/UPDATE/DELETE | Postgres RLS |
| File storage | Built-in — buckets, public/private, signed URLs, object RLS, local + S3-compatible | Built-in |
| Realtime | WebSocket — postgres_changes (INSERT/UPDATE/DELETE), presence, broadcast; RLS-filtered | WebSocket |
| Edge Functions | Built-in — WASM /functions/v1, sandboxed, 10s timeout, SDK .invoke() | Yes |
| TypeScript SDK | @kynetra/client — supabase-js-compatible, from().select().eq() | Yes |
| KV lookups | Yes (point lookup by ID) | No |
| Document filter | Yes (JSON predicates) | Yes |
| LLM runtime | Yes (Anthropic + OpenAI + Ollama) | No |
| Outbound DB sync | Yes (12 sinks: Postgres, DynamoDB, BQ, Firestore, CF, Mongo, Redis, Pinecone) | No |
| Self-host | Yes (single binary) | Yes |
| Single binary | Yes | No |
| License | Apache-2.0 | Apache-2.0 |
| Deploy targets | 18 (1-click) | 4 (1-click) |
| Free tier | Yes — Apache-2.0, self-host free | yes — 500 MB database, 1 GB storage |
When to pick Supabase
Supabase is the benchmark for open-source BaaS developer experience. kynetradb targets full API parity — the @kynetra/client SDK mirrors supabase-js so you can swap the import line — but Supabase has deeper ecosystem adoption, SQL joins via Postgres, and more mature fuzzy search. If your team is SQL-native or already invested in Supabase's ecosystem, Supabase wins.
- Your team is SQL-native and needs relational joins.
- Your team is already invested in Supabase's SDK and ecosystem.
When to pick kynetradb
- You want Supabase's developer experience — the
@kynetra/clientTypeScript SDK, PostgREST REST API, GoTrue-shaped auth, RLS, realtime channels — running as a single binary on infra you own. - You need BM25 full-text + vector similarity search built in with no separate service and no CDC pipeline.
- You want to deploy to 18 targets (including 5 Indian providers) from one Dockerfile.
- You need outbound sync to 12 databases (Postgres, DynamoDB, BigQuery, Firestore, Cloudflare, MongoDB, Redis, Pinecone) with zero extra code.
- You want an agentic admin with 10 typed LLM-driven actions and a persisted audit trail.
- You want Apache-2.0 with a self-host path that doesn't require an ops team.
- You want a single binary with no runtime dependencies — no container fleet to operate.
One-line import swap — both APIs side by side
@kynetra/client mirrors supabase-js — same API, swap one import. These are documentation-accurate shapes, not runnable end-to-end examples.
kynetradb
// kynetradb — @kynetra/client (supabase-js-compatible)
import { createClient } from '@kynetra/client' // ← one line change
const kdb = createClient('https://api.myapp.com', PUBLISHABLE_KEY)
// Everything below is identical to supabase-js
const { data, error } = await kdb
.from('posts')
.select('id, title, author(name)')
.eq('published', true)
.order('created_at', { ascending: false })
.range(0, 19)
await kdb.auth.signInWithPassword({ email, password })
kdb.channel('live')
.on('postgres_changes', { event: 'INSERT', table: 'messages' }, payload => {
console.log(payload.new)
})
.subscribe() Supabase
// Supabase — @supabase/supabase-js
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://xxxx.supabase.co', ANON_KEY)
const { data, error } = await supabase
.from('posts')
.select('id, title, author(name)')
.eq('published', true)
.order('created_at', { ascending: false })
.range(0, 19)
await supabase.auth.signInWithPassword({ email, password })
supabase.channel('live')
.on('postgres_changes', { event: 'INSERT', table: 'messages' }, payload => {
console.log(payload.new)
})
.subscribe()