Stay close to your data.
Your logic and decisions run where the data lives. Every view stays live. Every change reaches your apps and agents as it happens.
THE LIVE DATA PLATFORM
Your data. Your logic. Your decisions.
One living circuit.
Turn changes into answers with SQL pipelines that stay live — and agents that work right alongside your data.
-- a query that keeps answering
SELECT customer, COUNT(*) AS n,
SUM(amount) AS total
FROM payments WHERE risk = 'high'
GROUP BY customer,
TUMBLE(ts, INTERVAL '1' HOUR);Your logic and decisions run where the data lives. Every view stays live. Every change reaches your apps and agents as it happens.
Pipelines are stored, versioned, and forked like the rows they process. Try ten versions on real data. Keep the one that works.
THE CIRCUIT STUDIO / MADE TO BE EXPLORED
Start with an idea. Connect a few components. Make it yours.
Your next application is a circuit waiting to happen.
Drag in a component, choose an example,
or tell the copilot what you have in mind.
Add a domain or replication.
The places where your components connect to the core. Select a socket to explore.
An interactive vision of what you can build. Components, sample runs, downloads, and cloud deployments are illustrative.
01 / FROM DATA TO DECISION
Try three ways to approve risky orders on forks of real traffic. Compare the results. Promote the winner. Production keeps moving.
One stream. Three possibilities.
Run the simulation to compare outcomes.
↳ Illustrative outcomes. Each fork runs its own pipeline version. At merge, the fork’s commands are decided again on current production under optimistic locking.
02 / A SMALL INTERFACE. A LOT OF POSSIBILITY.
A SQL file becomes a live pipeline. A change becomes an updated answer. No extra framework between your question and your data.
-- fc:pipeline views
CREATE VIEW high_risk_payments AS
SELECT
customer,
COUNT(*) AS n,
SUM(amount) AS total
FROM payments
WHERE risk = 'high'
GROUP BY
customer,
TUMBLE(ts, INTERVAL '1' HOUR);Aggregates, windows, and as many joins as the question needs. When one row changes, only the affected results are recomputed.
We store changes. Every view you ask for keeps pushing its changes to you, with the full power of SQL behind it.
+1 / −1 · LIVE VIEWS · OPTIMISTIC LOCKINGPipelines are data, too. Run versions side by side, explore a fork, or roll back in seconds.
VERSIONS / FORKS / SIMULATIONSDurable Streams let readers resume from an offset. Ordinary proxies and CDNs can fan out your live data.
DURABLE STREAMS / HTTP / CDNEvery app, fork, and agent has its own durable stream. Restarts and restores are positions in that stream.
STATE / CHECKPOINTS / RESTORE03 / AGENTS, INSIDE THE CIRCUIT
Managed agents read your schemas, views, and pipelines. Once authorized, they make decisions as data arrives — under the same locking and rules as any other writer.
Start with a business case. An agent writes the SQL and wires the live views.
New reports, created on demand from live data. Your next question doesn’t need a new backlog.
Run tens of candidates on separate forks. Compare outcomes. Keep the best approach.
Authorize an agent to classify, approve, or reject as data arrives. Inspect its decisions on its stream.
Agents create and orchestrate other agents, each with its own durable, inspectable state.
04 / THIN CORE. OPEN POSSIBILITIES.
Live views, locking, checkpoints, forks, and SQL pipelines form the core. Everything else is a module. Yours plug in the same way ours do.
NATIVE / RUST
Rust modules shipped in the server. Transform, seal, guard, decide, and verify as data is written.
DECLARATIVE / SQL
Declare a module’s own incremental views and joins in SQL. Keep the logic close to the data it works with.
SANDBOXED / WEBASSEMBLY
Compile custom logic to WebAssembly and run it under the append lock, with explicit fuel, time, and memory limits.
INDEPENDENT / ANY LANGUAGE
Run a module independently, in any language. Connect it to the core over signed HTTP. Append from TypeScript or any HTTP client.
BUNDLED TODAY
BUILT TO BE QUESTIONED
Check a component. Reproduce a failure. Know which promises your tests actually keep.
Test against an isolated, real core. Exercise permissions, restart a process, and connect each declared capability to an assertion.
Rust · TypeScript · PythonOur direction for deterministic simulation testing: explore failures, save the seed, and return to the same sequence while you fix it.
DST · repeatable fault scenariosThe next layer: use TLA+ models to examine the states a design can reach and the rules that should hold across them.
TLA+ · model checkingChoose what to test. Run it twice with the same seed to see the same trace.
Apply a few changes, replay them, and compare the resulting state.
Enter a whole number from 0 to 999999999. The same scenario, seed and bug setting reproduce the same trace.
Run a scenario to follow its changes, interruption, and result.
Assertions make the expected behavior explicit.
From the repository root, run your module project’s tests and require coverage for every declared capability.
python3 scripts/module.py test /tmp/my-module --strict --jsonReports distinguish passed, failed, skipped, and not applicable. Strict mode rejects missing coverage and applicable skips.
cargo test -p bank --test determinismCompare identical event histories across worker counts and replay boundaries.
The planned circuit CLI would bring component tests, seeded simulation, and model checks into one guided workflow.
# Command concept — not available yet
fcircuit test ./my-circuit --suite all --seed 42Proposed syntax, not an executable feature today. DST and TLA+ orchestration are part of this planned experience.
05 / START WHERE YOU ARE
Own the process from data to decision. Build on f{circuit} from day one, or put the data you already have to work.
Data arrives as appends. Commands make decisions under optimistic locking. Live views report the outcome. Agents participate where you authorize them.
Data, logic, decisions, and reports — together.
Explore the application flow ↗ONE STREAM CONNECTS THE WHOLE PROCESS.
Connect your Postgres without a migration or rewrite. f{circuit} reads each change once and classifies it on arrival. Postgres stays your source of record.
Connect. Classify. Keep your answers live.
See what agents can do ↗YOUR SOURCE OF RECORD STAYS WHERE IT IS.
A FEW IMPORTANT DISTINCTIONS
Familiar interfaces.
A different foundation.
No new framework abstractions to learn. A pipeline is a SQL file, and any HTTP client can append data.
Beyond answering a query once, f{circuit} keeps pushing the changes to that view. It maintains answers incrementally as data arrives, rather than rescanning history each night.
State lives on durable streams. Work can be rerun, forked, and rolled back. Restarts and restores are positions in a stream.
A stream is the record itself. Reading it does not consume it. Readers can return to an offset and resume over ordinary HTTP.
Connectors, backup, metrics, the console, and agents are modules. Switch them, replace them, or write your own with explicitly granted capabilities.
Agents work with grants you authorize, under the same locking and rules as other writers. Their decisions live on streams you can inspect.
Connect your data. Explore the possibilities.
Let the best decisions flow into production.