Product
One layer from event to answer.
Basalt replaces the queue, the stream processor, the warehouse job and the cache with one system. Events go in, typed tables come out, and every table is an API.
Event to query
< 5 ms p99
Native sources
60+ sources
Edge network
38 regions
Architecture
Three stages, one system.
Fig. 01 · Event path
Exactly-once from source to API
Step 01
Ingest
Catch every event, exactly once.
Kafka topics, Postgres change streams, webhooks and SDK calls all write to one ordered, replicated log. Producers can retry as often as they like. Basalt keeps the first copy and drops the rest.
Idempotent writes keyed per producer and partition
Schema inferred on the first event, versioned on every change
72 hours of back-pressure buffer without dropping a row
Ingest
Shape
Serve
Throughput
1.28M
ev/s
Sources
17
live
Dropped
0
/ 24h
Time
Event
Region
Set in
Ingest
Shape
Serve
-- materialized, incrementally maintained
CREATE
_
TABLE
_
revenue_by_minute
_
AS
SELECT
__
window
(ts,
_
'1 minute'
)
____
AS
_
minute,
__
p.region,
__
sum
(p.amount_cents) /
_
100
___
AS
_
revenue,
__
count
(
DISTINCT
_
s.user_id)
__
AS
_
buyers
FROM
_
stream.payments p
JOIN
_
stream.sessions s
_
USING
_
(session_id)
WHERE
_
p.status =
_
'succeeded'
GROUP
_
BY
_
1
,
_
2
;
stream.payments
stream.sessions
revenue_by_minute
api / v1
Step 02
Shape
Write SQL. Basalt keeps it current.
Define a view once in plain SQL. Basalt maintains it incrementally, so joins, windows and aggregates update with each event instead of waiting for a nightly job.
Streaming joins, windows and aggregates across any source
Column-level lineage from every row back to its raw event
Edit a view and the backfill runs beside the live version
Step 03
Serve
Every table is already an API.
The moment a view exists, your app, dashboards and models can read it. Replicas sit close to your users and answer in single-digit milliseconds at p99.
REST, GraphQL and the Postgres wire protocol
Read replicas in 38 regions with sub-second failover
Row-level security keyed to your auth provider
Ingest
Shape
Serve
p50
1.9
ms
p99
4.2
ms
Cache hit
98.7
%
p99 latency · last 60 s
ms
GET
/v1/revenue_by_minute?region=eu
200 · 3.1 ms
Platform
Everything else you'd build yourself.
Schema registry
Every field is typed and versioned. Breaking changes are flagged before they ship, not after a dashboard goes blank.
Lineage
Trace any number in any table back to the exact events that produced it, down to the column.
Backfills
Replay two years of history into a new view while the old one keeps serving. Swap when it catches up.
Access policies
Row and column policies written in SQL, enforced on every API, replica and export.
Observability
Lag, throughput and p99 per source and view, with OpenTelemetry export to the tools you already watch.
Edge cache
Hot reads are served from the nearest of 38 regions and invalidated the instant a row changes.
By the numbers
Measured in production.
Events per day
2.1
B
Peak sustained load on one production cluster.
View freshness
12
ms
Median time from event to updated view.
Edge regions
38
From Reykjavík to Singapore, more every quarter.
Customer
“We replaced a Flink cluster, two Airflow DAGs and a Redis cache with eleven SQL views. Our dashboards went from hourly to live, and nobody gets paged for it anymore.”
HS
Halldór Sigurðsson
Staff Engineer, Northwind

