v4.0
Time-travel joins · Changelog →
Realtime data, one command away.
Basalt turns Kafka topics, Postgres changes and webhooks into typed tables and APIs in milliseconds. Define it in SQL, ship it from the CLI, read it from anywhere.
~/acme-prod · zsh
eu-north-1
$
basalt
source add payments --kafka payments.v3
✓
connected payments.v3 · 12 partitions · 1.28M ev/s
✓
schema inferred · 14 fields · 0.4 s
$
basalt
view apply revenue.sql
✓
revenue_by_minute materialized · 812 ms
$
basalt
deploy --region eu-north-1
✓
build 41c9e2 · 2 sources · 3 views · 9.4 s
✓
GET /v1/revenue_by_minute live · p99 3.1 ms
$
Events per second
1,284,301
p99 read
4.2 ms
Regions
38
Views served
61.4k
Uptime · 90 days
99.995%
Before and after
Seven systems, or one.
Without Basalt
The usual stack
A pipeline you babysit.
Every hop has its own config, its own retries and its own pager. Numbers drift between the cache and the warehouse, and nobody owns the gap.
7
Systems
4
Teams on call
2 h
Typical lag
With Basalt
One system
A pipeline you deploy.
Sources, views and endpoints live in one project and ship with one command. The API, the dashboard and the model all read the same row.
1
System
0
Glue jobs
4.2 ms
End to end
Features
Six things you stop building yourself.
01
Ingest
Connect any stream.
Kafka topics, Kinesis shards, Postgres change streams, webhooks and SDK calls land in one ordered log. Retries are deduplicated, so every event counts once.
Kafka · Kinesis · PG CDC · Webhooks
02
SQL views
Views in plain SQL.
Write a SELECT and Basalt keeps it current with every event. Joins, windows and aggregates update incrementally, never as a nightly batch.
Postgres dialect · Incremental
03
Lineage
Trace any column back.
Every cell knows which events produced it. Click a number in the console and walk the path to the raw rows, column by column.
Column level · Built in
04
Time travel
Query any second.
Read a view as of any moment in the last 30 days. Debug an incident with the exact rows your API served at 02:14:07.
30 days on Scale · 1 year on Enterprise
05
Schemas
Fields change, nothing breaks.
Add or retype a field and Basalt versions the schema in place. Old readers keep working while new code picks up the change.
Versioned · Zero downtime
06
Autoscale
Partitions that split themselves.
Hot keys get their own partition and quiet ones merge back. Throughput follows traffic with no capacity planning or rebalancing jobs.
Up to 4M ev/s per project
SDKs
One pipeline, your language.
Typed SDKs for TypeScript, Python and Go, or plain SQL files the CLI deploys. Each tab below builds the same source, view and endpoint.
TypeScript
Python
Go
SQL
import
_
{ basalt }
_
from
_
"@basalt/sdk"
;
const
_
db = basalt({ project:
_
"acme-prod"
_
});
await
_
db.source(
"payments"
, { kafka:
_
"payments.v3"
_
});
await
_
db.view(
"revenue_by_minute"
,
_
`
__
SELECT window(ts, '1m') AS minute, sum(amount) AS revenue
__
FROM payments GROUP BY 1`
);
const
_
rows =
_
await
_
db.table(
"revenue_by_minute"
).last(
3
);
Result
revenue_by_minute
minute
revenue
2026-10-03 14:02
$48,210.40
2026-10-03 14:01
$51,377.15
2026-10-03 14:00
$46,902.88
3 rows · 3.1 ms · eu-north-1
Shipped recently
Full changelog →
New every week. Breaking never.
Sep 30, 2026
New
Time-travel joins
Join two views as of the same second, up to 30 days back.
Sep 22, 2026
Improved
Go SDK 1.4
Typed rows from generated structs, plus context-aware retries.
Sep 15, 2026
New
Postgres 17 CDC
Logical replication from Postgres 17, partitioned tables included.
Sep 08, 2026
Engineering
How we cut p99 to 4.2 ms
A tour of the read path rewrite that shipped with v4.0.
Community
Built by people who ship.
Pricing
Start free. Pay as it flows.
Hobby
Free forever
$0
/ mo
10M events a month, 3 views and community support. Enough for a side project that needs real streaming.
Scale
Most teams
$249
/ mo
1B events included, unlimited views and sources, a 99.95% SLA and 30 days of time travel.
Enterprise
Annual
Custom
Dedicated cells, VPC peering, SSO, a year of history and an engineer who knows your schema.

