Open source · Single binary · Zero infrastructure

Turn any API into a real-time stream

Point LiteJoin at your APIs, join data from multiple sources with SQL, and get live results instantly. No Kafka required. No Flink. No cluster to manage.

$ curl -sSL https://litejoin.dev/install | sh

Three steps to real-time data

No event bus to set up. No streaming infrastructure to learn. Just URLs and SQL.

01

Connect your sources

Point LiteJoin at any REST API, webhook, or event stream. It polls, detects changes, and emits only the deltas — turning any request/response API into a live stream automatically.

02

Join with SQL

Write standard SQL to join streams together. Enrich orders with user profiles. Combine IoT readings with device metadata. LiteJoin executes joins reactively — results emit the instant new data arrives.

03

Subscribe to results

Consume joined results via SSE, HTTP webhooks, or Kafka. Power live dashboards, trigger workflows, feed downstream services — all from a single binary running on your terms.

litejoin.yaml
# Turn any REST API into a real-time stream
sources:
  - name: weather
    type: api
    url: https://api.weather.gov/stations/KNYC/observations/latest
    interval: 30s
    topic: weather
    key_path: $.id
    change_detection: diff

  - name: github_prs
    type: api
    url: https://api.github.com/repos/org/repo/pulls
    interval: 60s
    topic: pull_requests
    key_path: $.number
    headers:
      Authorization: Bearer ${GITHUB_TOKEN}

Every REST API is now a stream

Most APIs don't push changes to you. LiteJoin polls them, diffs against previous state, and emits only what changed. No webhook setup. No event bus. Just a URL.

  • Weather + delivery fleet Join live weather data with your logistics API for real-time adjusted ETAs
  • GitHub + Jira Stream PR activity joined with ticket status for live dev velocity dashboards
  • Stripe + your user DB Enrich payment events with customer profiles without configuring webhooks

Define your entire pipeline in one file

Sources, joins, windows, and sinks — all in a single YAML config. LiteJoin reads it and runs the pipeline. No boilerplate services, no orchestration layer, no build step.

  • Poll any API on an interval with automatic change detection
  • Reactive SQL joins — results fire the instant data lands
  • Tumbling, sliding, and session windows built in
  • JSON field extraction with auto-generated indexed columns
  • JavaScript SDK for subscribing from the browser
litejoin.yaml
sources:
  - name: orders
    type: http
    topic: orders

  - name: users
    type: http
    topic: users

joins:
  - name: order-enrichment
    sql: |
      SELECT o.*, u.payload AS user_info
      FROM orders o
      LEFT JOIN users u
        ON json_extract(o.payload, '$.user_id')
         = json_extract(u.payload, '$.id')
    triggers: [orders]
    result_key: $.user_id

sinks:
  - name: live-dashboard
    type: sse
    addr: :8081
app.js
import { LiteJoin } from 'litejoin';

const lj = new LiteJoin('http://localhost:8081');

// Subscribe to joined results in 3 lines
lj.subscribe('order-enrichment', (result) => {
  console.log(result.user_info.name, result.total);
  renderDashboard(result);
});

// Or use the REST API for materialized views
const latest = await lj.query('order-enrichment', {
  where: { region: 'us-east' }
});

Subscribe from the browser in 3 lines

The LiteJoin JS SDK connects to your SSE sink and delivers typed, parsed results directly to your frontend. No WebSocket boilerplate. No polling. Just a callback.

  • Auto-reconnect with exponential backoff
  • TypeScript types generated from your join schema
  • Works in Node.js, browsers, and React/Vue/Svelte
  • Query materialized views with a simple REST client
  • Lightweight — zero dependencies, under 4KB gzipped

See the full picture

Config to live dashboard. One binary. No moving parts in between.

Sources
REST APIs Webhooks Kafka topics
LiteJoin
ingest → store → join → window
Sinks
SSE → browser HTTP webhooks Kafka topics

The hard parts, explained

LiteJoin makes trade-offs that favor simplicity and latency over heavyweight guarantees. Here's exactly what you're getting.

Delivery

Best-effort or at-least-once — you choose

By default, LiteJoin runs in best-effort mode for maximum speed — if a sink is down, results are dropped. Flip one config flag to enable at-least-once delivery: failed results are persisted to a SQLite-backed dead-letter queue and retried with exponential backoff until they land.

delivery.guarantee: "at_least_once" → DLQ with configurable retries, backoff, TTL, and size-based eviction
Storage

SQLite in WAL mode, sharded by key

Each message is stored in one of 8 shards (configurable), selected by hashing the message key. SQLite WAL mode gives high read concurrency without blocking writes. Data persists to disk — restart without losing state.

Default: 8 shards, 4 readers/shard, 24h retention, upsert (last-write-wins per key)
Windows

Tumbling, sliding, and session

Tumbling windows emit on fixed, non-overlapping intervals. Sliding windows overlap and advance by a configurable slide. Session windows close dynamically after an inactivity gap. All support a grace period for late arrivals.

Configured in YAML. Each window type has its own query, group-by, and sink target.
Source Failure

Joins continue against last-known state

If a polled API goes down, LiteJoin retries on the next poll interval. Joins keep executing against whatever data is in storage. Stale records are evicted by a configurable TTL (default 24 hours) so you don't silently serve old data forever.

Sources are stateless — recovery is automatic on the next poll interval. No circuit breaker needed.
Join Execution

Reactive, concurrent, per-key

Joins fire when new data arrives on a trigger topic. Each batch is processed by a pool of 16 concurrent workers (configurable). Queries run against the SQLite reader pool in parallel. Results emit within milliseconds of ingestion.

Batched writes (default 1000 msgs / 10ms flush) → join → async sink dispatch
Performance

Thousands of joins/sec, single instance

A single LiteJoin instance sustains 8,000+ join evaluations per second with 16 workers and 8 SQLite shards on commodity hardware. Throughput scales with shard count and worker concurrency. The bottleneck is almost always your source API, not LiteJoin.

SQLite WAL + sharding + batch writes + concurrent readers = low overhead per join

You shouldn't need a platform team for real-time data

LiteJoin is purpose-built for app developers who need real-time joins without the operational overhead of stream processing infrastructure.

LiteJoin Kafka Streams Apache Flink Materialize
Setup time 5 minutes Hours Days ~1 hour
Infrastructure required None — single binary Kafka cluster Flink + Kafka cluster Postgres-compatible server
Configuration One YAML file Java/Kotlin code Java/SQL + deployment config SQL DDL
REST API → stream Built in — just add a URL Requires Kafka Connect Requires custom source Requires webhook bridge
Browser streaming SSE sink + JS SDK Build your own Build your own SUBSCRIBE (Postgres wire)
Operational complexity Run the binary JVM tuning, partition mgmt Cluster ops, checkpointing Managed or self-hosted
Best for App developers Java backend teams Data engineering teams Analytics / BI

Built for app developers

You shouldn't need a data engineering team to get real-time features in your app.

Mobile & Web Apps

Live order tracking

Join your orders API with a delivery fleet API and a weather service. Push enriched, real-time order status to your mobile app over SSE. No webhooks to configure on any of the source systems.

orders fleet-gps weather → live-tracking
SaaS Platforms

Real-time usage dashboards

Stream Stripe payment events joined with your user database and product catalog. Compute rolling revenue windows per plan tier, per region, updated every 5 seconds. Display in-app.

stripe-charges users → revenue-by-tier
IoT & Edge

Sensor correlation & alerting

Run LiteJoin on an edge device. Join temperature sensor readings with humidity and equipment metadata. Trigger alerts when correlated thresholds are breached. Works offline — single binary, no cloud required.

temp-sensors humidity equipment → alerts
Internal Tools

Cross-API activity feeds

Poll GitHub, Linear, Slack, and your deploy pipeline API. Join events by engineer and team. Power a single activity feed for your engineering org — built in 15 minutes, not weeks.

github linear deploys → team-feed

Beyond the core engine

LiteJoin is the open-source engine. We're building tools around it.

Desktop App

LiteJoin Studio

A visual interface for building streaming pipelines. Set up API sources like Postman requests. Draw joins between them. See results in real time. Export to production YAML when ready.

Coming Later

LiteJoin Cloud

Managed infrastructure with durability guarantees the open-source engine doesn't provide. Your pipelines, always on.

  • Indefinite data retention — joins always return their most recent state, no matter how far back the data goes
  • Database ingestion — stream changes from Postgres, MySQL, and MongoDB directly into your pipelines via CDC
  • At-least-once delivery
  • Automatic crash recovery — your data is restored on restart
  • Durable materialized views — continuously updated, always queryable
  • REST API over your materialized views
  • Deploy from Studio in one click
You're on the list. We'll be in touch.

Start streaming in 5 minutes

Install the binary. Write a config. Get real-time joined data flowing to your app.

Watch the 2-minute demo
$ curl -sSL https://litejoin.dev/install | sh