Skip to main content
StackhouseStackhouse

Database, auth, vector search, realtime — and billing.

One binary. Schema-Later data modeling, decoupled vector search, native subscription billing. Self-hosted under MIT, free and unlimited. A managed offering is in development.

View on GitHubStart herecargo run --release -- serve
01 — The problem

The modern backend is six vendors in a trench coat.

Structured data, cache, vectors, function runtime, realtime, payments. Six contracts, six dashboards, six failure modes — plus the ORM and migration scripts holding them in alignment. That integration cost is paid up front, before a single feature ships.

Postgres
structured data
Redis
cache
Pinecone
vector search
Lambda
custom logic
Firebase
realtime
Stripe + RevenueCat
getting paid
+ an ORM, a migrations folder, six invoices, and integration glue rewritten per project
stackhouse serve
all of the above

AI coding tools drove the cost of frontend and app logic to near zero. They did not touch the backend integration cost — they standardized on a default and moved on.

02 — Schema-Later

Push JSON. The schema follows.

Payloads are the source of truth. Stackhouse infers types, provisions the table, and evolves it as the shape changes. Every generatedCREATE/ALTERis recorded with up/down SQL and a checksum, so the schema remains fully auditable.

conventional ORM workflow3 files · 1 deploy window
// 1. edit the model
department: string;
// 2. generate the migration
$ npx prisma migrate dev
// 3. apply it, hope nothing locks
ALTER TABLE users
ADD COLUMN department TEXT;
// 4. redeploy so app and
// schema agree
stackhouse0 files · 0 downtime
// monday
awaitdb.push('users', {
name:'Alice',
email:'alice@example.com',
age:28
});
// thursday — new field, same call
awaitdb.push('users', {
name:'Bob',
department:'Engineering'
});
// → column provisioned. no migration.
Real Postgres underneath
Schema-Later is dynamic DDL over standard Postgres tables via sqlx. Durability and crash-safety are Postgres's — no proprietary storage layer to trust.
Safe type promotion
Conflicting types resolve to a common supertype via explicitALTER COLUMN … USINGcasts. No silent truncation.
Preview before you push
POST /v1/preview/:collectionreturns the DDL a payload would generate, without applying it.
03 — Semantic search

Vector workloads do not belong on your transactional box.

The category default is pgvector on the primary instance. It holds until an index rebuild lands in peak hour and transactional queries queue behind it — one CPU budget, one connection pool, two very different access patterns.

Stackhouse runs semantic search on Qdrant, decoupled from the primary store and HNSW-native, scaled independently. Embedding throughput and write latency stop trading against each other.

pgvector, co-located
transactions
+
embeddings
shared instance · contended CPU
stackhouse
Postgres
transactions
|
Qdrant
vectors
separate engines · one API · one bill
04 — Category gap

Billing is already here.

Every platform in this category stops at the data layer. Monetization is left to the customer: plans, entitlements, Apple and Google receipt validation, Stripe webhook reconciliation — built in-house or licensed and integrated, per project. That is the gap between a working application and a revenue-generating one, and it is measured in weeks.

assembled
Stripe products, prices, and a checkout session
Webhook endpoint + idempotency + retry handling
Apple StoreKit and Google Play receipt validation
A bespoke entitlements model, maintained in-house
Reconciliation for renewals that fire while you are down
included
const{ active } =awaitdb.billing.entitlements('pro');
if(!active)returnpaywall();
Subscriptions, offerings, and entitlements are first-class objects. Stripe, Apple, and Google receipt and webhook handling run in the same binary that serves your data.

Backend and payments, one deploy.

05 — Baseline, covered
Realtime, in-process
A WebSocket on/v1/realtime. No second vendor, no channel service to operate.
db.subscribe('orders', (row) => {
queue.add(row);
});
Functions, plain JavaScript
Deployed JS executes in an embedded engine inside the same process. No compile step, no bundler, no cold start.
export defaultasync(req) => {
return{ ok:true, id: req.body.id };
};
06 — Competitive position

Where Supabase leads, and where the gap is structural.

Supabase is a $10B company on merit, and remains the lowest-risk default for teams optimizing for ecosystem maturity. Stated plainly, because the two places it does not compete are the reason this page exists.

Maturity
Years of production traffic at scale. That track record takes time, not positioning.
Ecosystem gravity
Bolt, Lovable, v0, and Cursor default to it. Years of integration work and a durable distribution advantage.
Dashboard polish
Studio is a mature product surface. Ours prioritizes the API first.
Community depth
Substantially deeper corpus of answers, issues, and tutorials.
Supabase
Stackhouse
Schema changes
Migrations authored by you
Push JSON, schema evolves
Vector search
pgvector, co-located with transactions
Qdrant, decoupled — no separate vector bill
Payments
Out of scope — integrate Stripe + RevenueCat
Native subscriptions, entitlements, receipts
Functions
Edge Functions on Deno
JavaScript, embedded in the binary
Self-hosting
Exists, second-class path
Primary path. One MIT-licensed binary
Cost model
$25/mo, then $599/mo
Self-hosted, no license cost

Two structural differences, not feature parity claims: no separate vector-database line item, and monetization shipped with the backend.

07 — Commercial model

One way to run it today: yours.

Self-host
Free
MIT · unlimited · no expiry
Your infrastructure, your data, your terms
No seat counts, MAU caps, or idle suspension
Full source available for review
Vendor-continuity risk resolved at the license level:if the company stops, your deployment does not.
Managedin development
Not yet available
a hosted option is planned; nothing to buy today
The self-hosted build is the full product, not a trial edition
No paid tier gates features behind it
Hosting will be an operations decision, not a capability one
Until then there is no pricing page to decode and no contract to sign.Clone it and run it.
08 — Diligence

Verifiable, not vouched for.

Early-stage and under active development. No customer logos, no usage figures, no borrowed credibility. The evaluation path is direct: read the source, run it, judge it.

MIT licensed
Fork, deploy, retain. No open-core bait-and-switch.
Auditable schema history
Every generated DDL logged with up/down SQL and a checksum.
Documented security controls
Argon2id, JWT, row-level security, MFA, identifier validation. Documented, not badge-certified.
Self-hostable today
No waitlist, no sales call. Clone and deploy.

Evaluate it in ten minutes.

Point it at a Postgres instance, start the binary, push a document. The schema provisions itself. Everything above is verifiable in the first ten minutes.

deploy
# 1. run the binary
cargorun --release -- serve
# 2. push a document — no schema defined
curl-X POST localhost:3000/v1/push/users \
-H"Content-Type: application/json"\
-d'{"name":"Alice","age":28}'
# 3. queryable immediately
curllocalhost:3000/v1/query/users