PostgreSQL
source of truth · control plane only
Projects, users and roles, routes and workflows, every block and edge, triggers, test suites, orchestration state and the license. Read by the compiler at save time, never by a worker.
architecture
Your flow is a directed acyclic graph of blocks. Fluxify turns it into JavaScript when you save, so the work done per request is the work your blocks actually do — not the bookkeeping of interpreting them.
why it's fast
Walking a graph at runtime means, for every block of every request: find what comes next, look up how that block type behaves, run it, wrap its output for the next one. Compiling removes the loop — a wire becomes a direct function call.
a request on a worker
Matching a path is a lookup, so adding routes doesn't slow the ones you have. Bad input is rejected before a single block runs.
topology
The control plane is where you build — run one. Workers are where your API runs — run many. Only the control plane can reach Fluxify's database.
| Control plane | Request workers | |
|---|---|---|
| Does | Editor, admin API, compiler, AI gateway | Serves your routes and runs workflows |
| Fluxify's PostgreSQL | Reads and writes it | Never — no credentials are given |
| Scale | One is plenty | Add more as traffic grows (Community: 1, Enterprise: no cap) |
| If it goes down | You can't edit; your API keeps serving | That worker stops answering; others carry on |
deploys
Workers watch for new builds and swap them into the route table in place. Requests already running finish on the version they started with.
state
It's easy to assume the graph is cached somewhere and re-read on every request. It isn't: workers hold compiled code in memory.
source of truth · control plane only
Projects, users and roles, routes and workflows, every block and edge, triggers, test suites, orchestration state and the license. Read by the compiler at save time, never by a worker.
compiled routes · change events · required
Compiled routes live in a KV bucket, so a worker never needs a Postgres connection. The same bus carries hot-reload events for routes, settings, integrations and custom blocks. If NATS is down, Fluxify fails loudly instead of limping.
control-plane cache · and your KV store
Admin caches sessions, project settings and generated OpenAPI docs in Redis. Separately, Redis (or Memcached, Valkey, DragonflyDB) can be an integration your own flows use — like the cache-aside route on the home page.
database schema
What you draw is stored as plain rows — easy to back up, diff and migrate.
benchmarks
Same route, same data, same traffic — the old interpreting engine against the compiled one. Throughput and latency improved together, which only happens when each request genuinely got cheaper.
One benchmark, one developer machine: GET /users?id=… ramped to 100 concurrent users for 60s, same
route and data on both engines. Read the ratios, not the absolute numbers. The slowest single request was worse on the compiled
engine (258 ms vs 215 ms) — likely GC or machine noise. Source: docs/architecture/performance.md.
| Metric | Interpreted | Compiled |
|---|---|---|
| Requests / s | 860.7 | 1403.2 |
| Requests in 60s | 51,650 | 84,198 |
| Average | 87.1 ms | 53.3 ms |
| Median | 91 ms | 51.5 ms |
| p90 | 124.8 ms | 88.4 ms |
| p95 | 134.8 ms | 101.1 ms |
| Slowest | 215 ms | 258 ms |
| Memory | 256 MB | 210 MB |
| CPU time / request | 1.51 ms | 0.86 ms |
Where Fluxify isn't the bottleneck: a route waiting 200 ms on a slow upstream is dominated by that wait. This measures the engine's own overhead. Reproduce it with testing/load-testing.
Want the internals? Read the compiler or the architecture docs.