Edgesource
SQL queries over raw FlatBuffer storage.
PolyForm Noncommercial 1.0.0 licensed: free for noncommercial use; commercial use requires a license.
Built on FlatBuffers
No parsing. No conversion. Binary data arrives ready to query.
Pipe size-prefixed FlatBuffers directly to the engine. File identifiers route to tables automatically.
Each FlatBuffer's 4-byte identifier routes it to the correct table. No external metadata needed.
B-tree indexes built during streaming ingest. No separate indexing phase. Query immediately.
Direct pointer access to FlatBuffer data. No deserialization. Maximum performance.
A database built for the real-time, decentralized web.
Modern apps receive data from everywhere
FlatSQL keeps data in its native FlatBuffer format, routes it by source, and queries it with SQL. Ideal for isomorphic applications where the same code runs in browsers, workers, and servers—all sharing the same binary protocol.
_source fieldStream FlatBuffers and query with SQL in real-time.
Sign in with your wallet to create a database only your wallet can unlock.
Content key wrapped to your wallet: $ENC header, then $KMF record
First stored record: email and phone are ciphertext at rest
Each database gets its own random content key. The page wraps it to your wallet's encryption key and the engine encrypts the email and phone columns of every record under it; SQL reads them decrypted in this session only. The page saves the database in this browser as ciphertext; a later session reopens it only through your wallet.
One C++ WASI artifact runs in browsers through a small shim and in WasmEdge through a resident runner with native query caching.
import { createStandaloneArtifactBuilder } from "flatsql/artifacts/standalone"; const builder = await createStandaloneArtifactBuilder(schema, { runtime: "standalone" }); await builder.registerFileId("TELE", "Telemetry"); await builder.ingestBuffers(telemetryBuffers); await builder.registerQueryTemplate( "packetById", "SELECT packet_id, subsystem FROM Telemetry WHERE packet_id = ?", true ); await builder.queryTemplate("packetById", [42]); // cache miss await builder.queryTemplate("packetById", [42]); // cache hit const stats = await builder.getQueryCacheStats();