I often joke that nearly everything in the universe can be represented using graph theory. But think about it for a moment: since childhood, you’ve been surrounded by graphs. Your family tree. A sports tournament bracket. A subway map. Your network of friends. The roads connecting cities, the links between websites, the chain of dependencies in a software system, or the paths through which goods, money, and information move.
Human society itself has advanced by creating more connections. We build bridges between communities, open our economies to new participants, migrate across borders, exchange ideas across cultures, and ship products halfway around the world.
Asked to represent any of these systems with a pen and paper, you would probably begin by drawing a few points and connecting them with lines.
Nodes and edges.
Why am I bringing this up?
Because throughout my career as a software engineer, I’ve repeatedly encountered different versions of the same underlying problem and the industry as a whole has struggled with it too.
We’ve built databases that can answer complex queries in milliseconds. We’ve created reactive frameworks that fundamentally changed how applications are designed. We’ve built networks capable of moving enormous quantities of data at remarkable speeds.
And yet, once these pieces need to work together, we return to the same challenge: orchestration.
Orchestration may sound like a solved problem. For many products, it largely is. A few services, a job queue, some scheduled tasks, and a database may be all that is required.
But as a system grows, its complexity compounds. Computations begin to depend on other computations. Data arrives at different times and from different sources. A change in one part of the system must propagate through many others. Engineers must balance throughput, latency, data freshness, storage, reliability, and cost, often while maintaining infrastructure that was never designed for the scale it has reached.
What begins as a straightforward application gradually becomes a network of interconnected processes, dependencies, and data flows.
In other words, the problem becomes a graph.
Managing that network can require an entire team of engineers spending weeks or months designing, operating, and continuously repairing the machinery that keeps it all coordinated.
What begins as a simple workflow can quickly become an operational disaster. A batch job that completed in ten minutes six months ago may now require an entire night to run. And what happens when it fails halfway through? Will your team have enough time to diagnose the problem, fix it, and rerun the job before your users expect fresh data the next morning?
So why not solve the problem at its foundation?
Why not build a system that understands the relationships between processes and data, while embedding computation and logic directly into that model, so it can determine what needs to happen, when it needs to happen, and execute it as efficiently and granularly as possible?
That is what CalcGraph is: an orchestration engine and a computation engine built as a single system.
CalcGraph models the relationships between data, computations, and processes, then uses that model to determine what must run, when it must run, and what must be recomputed when something changes.
It provides its own declarative language, cg-lang, while remaining modular enough to execute business logic written in languages such as Python and Rust. Applications can subscribe to changes through its notification system, allowing updates to be broadcast as soon as new data arrives, a computation completes, or the state of the graph changes.
CalcGraph is also a database. It supports bitemporal data natively, allowing you to query not only what the system currently knows, but what it knew at any point in the past, and when that information became effective in the real world. This makes historical analysis, corrections, and auditing part of the data model rather than features that must be reconstructed afterward.
Its storage engine manages data across multiple tiers, keeping frequently accessed data close to computation while moving colder historical data to more cost-efficient, durable storage. The underlying storage location remains transparent to the application, so recent and historical data can be queried through the same interface.
Finally, CalcGraph is designed to scale without sacrificing availability or durability. Data and computation are partitioned into shards that can be dynamically redistributed across a cluster and coordinated through consensus. The system can scale vertically or horizontally while it is running, apply configuration and topology changes without requiring a restart, and recover safely from machine and network failures. Through replication, consensus, and durable storage, CalcGraph is designed to preserve committed data even when individual machines fail.
Orchestration, computation, storage, history, and event propagation are not separate systems stitched together around the edges. In CalcGraph, they are different parts of the same graph.
Contact Us