Mehdi Akiki
← Work

Inferal · Relay

Building Relay from the ground up

Relay synchronizes data from internal systems and third-party APIs into Inferal. I built the capability from its initial architecture through a working product foundation.

The problem

A system cannot reason about operational data it does not have. That data often lives behind unrelated third-party APIs, with different resource models, pagination rules, versioning policies, and operational limits. Relay exists to make those sources available inside Inferal with a model the rest of the product can understand.

Building the foundation

Building Relay from the ground up meant defining boundaries as well as implementing them: where provider-specific behavior should stop, how synchronized resources should be represented, and how the ingestion path should connect to Inferal's ontology and engine layers.

Those boundaries matter because connector code grows quickly. Without a stable internal model, every new provider leaks its assumptions into the product and makes later behavior harder to reason about.

The engineering pressures

A synchronization system has to account for conditions the happy path hides:

  • Remote APIs change shape and behavior across versions.
  • Requests are paginated, rate-limited, interrupted, or partially successful.
  • The same resource may be observed more than once or arrive out of order.
  • Freshness has to be balanced against provider limits and operating cost.
  • External schemas need a durable representation inside the receiving system.

The public account deliberately describes these design pressures rather than proprietary implementation details. The relevant evidence is the ownership of the system boundary and its connection to the larger product architecture.

Why this work is foundational

Relay is not a standalone importer. It is the path between external operational data, the ontologies that describe its meaning, and the engine that uses it. Decisions made at that boundary determine how safely the product can add sources, evolve schemas, and reason about synchronized state later.