The graph data engine powering HASH

The multi-temporal graph

Where queries are typed programs and database systems are compilation targets

Architecture

hgres consists of three layers:
storage, query/execution and transport

Storage layer

Typed Graph Data

Data inside a graph shouldn’t be untyped. Every field deserves not just a shape, but semantic meaning. hGraph implements semtype’s data model and enforces constraint validation directly in the graph layer, not the application layer.

Multi-Temporal

Facts change, and so should data, but what happened before still matters. hGraph tracks every change across two independent time axes, so prior state is always recoverable, never overwritten.

Explore hGraph
JaneAlexAudiCarVehicleownsownstype oftype of
Decision
Transaction
Jane owns a blue Audi
head::entities(temporal_axes)  |> body::filter(p -> `https://.../person/v/1` in p.entity_types)  |> body::filter(p -> p.properties.`https://.../age` >= 18)  |> body::map(p -> (       name: p.properties.`https://.../name`,       recent_hr: p.properties.`https://.../heart_rate`,     ))  |> tail::collect
placed onPostgreSQLTime-seriesInterpreter

Query and execution layer

HashQL

Optimized Querying

HashQL is the natural extension of semtype. Instead of only typing data, HashQL types queries and brings the same type safety that exists in the application layer to data access. The line between querying and computing dissolves: aggregations, transformations, and filters are all part of the same typed program.

Specialized Backends

Data lives in different stores because it should. Time series data belongs in a time series database, not crammed into a relational one. HashQL supports multiple storage backends transparently. The compiler determines which backend handles each part of the query at compilation time and runs placement algorithms to colocate data and computation. No manual annotations required.

Explore HashQL

Transport layer

HaRPC

Typed Protocols

Web APIs are untyped by convention. Every service invents its own protocol, its own versioning, its own error model. HaRPC extends the same discipline that semtype brings to data and HashQL brings to queries: typed, versioned interfaces with semantic meaning at the protocol level.

Streaming Sessions

HaRPC is stream-based and session-aware, not request/response. A single call can involve back-and-forth between client and server, encoding branching logic as a dialogue within one persistent connection. Subsystems and procedures are semantically versioned, and the protocol treats breaking changes as a first-class part of API evolution, not an accident.

Portable Clients

Complexity lives on the server. The client stays minimal and portable: the same straightforward implementation works in any language that can open a connection. How payloads are serialized is a separate choice entirely.

Explore HaRPC
#1BEGINgraph@1.0::get_entity24B
#1BEGINok1.2K
#1FRAME4.8K
#2BEGINgraph@1.0::update_links256B
#1FRAME2.1K
#1END128B
#2BEGINok64B
#2FRAME96B
#2FRAME512B
#2FRAME128B
#2END32B
#3BEGINgraph@1.0::query_entities192B
#4BEGINauth@1.0::check_permissions64B
#4BEGINok32B
#3BEGINerr 0x000348B
#4END16B
#3END16B
#5BEGINgraph@1.0::get_links48B
#5BEGINok2.1K
#5FRAME8.4K
#5FRAME6.2K
#5FRAME3.1K
#5FRAME1.8K
#5END64B
#7BEGINgraph@2.0::create_entity1.4K
#7BEGINok256B