Skip to main content
Reality Oracle
OverviewCitizensReality FeedVerified ActorsIntel SubscribersMarket PredictionInvestment FundsHow It WorksGates
Products
Backtest ForensicsLiving MapDrift AlertsPath QueriesCustom AxesRisk Maps
Solutions
Compliance OfficersRisk Managers / CROPortfolio ManagersCTOs & Engineering
Enterprise
Enterprise OverviewReality Oracle · SuperappThe AppsArchitectureAudit ManifestTrust CenterPricing
Developers
DocumentationAPI ReferenceSDKsArchitectureAudit Manifest
Resources
BlogUse CasesCustomer StoriesPressChangelog
Company
AboutFoundersCareersContact
Trust
Trust Center
More
PricingJoin Waitlist
··9 min read

Sources are data, not code

Add a feed by adding a SourceDescriptor — never touch the engine.

Sources are data, not code

Most integration platforms treat adding a feed as a code change: a new adapter class, a new parser, a deploy. deino-atlas treats it as a data change. Add a SourceDescriptor to the registry and the engine picks it up — the normalization machinery is already there, waiting.

Most integration platforms treat adding a feed as a code change: a new adapter class, a new parser, a deploy. deino-atlas treats it as a data change. Add a SourceDescriptor to the registry and the engine picks it up — the normalization machinery is already there, waiting.

The engine is closed; the registry is open

World Monitor is a gateway — one background poller per source on a fixed schedule, normalizing every feed to a single GeoSignal type, upserting into a durable Postgres cache, and handing the delta to a GeoPublisher. The engine that does all of that is fixed code. The thing that varies — which feeds, how often, with what credentials — lives in registry(), a list of SourceDescriptor values. Adding a feed is adding a row to that list. You do not touch the poller, the normalizer, or the publisher to add a source.

A descriptor card: key, schedule, mapper, env. The engine reads it; the feed exists. No branch, no deploy for the engine itself.
A descriptor card: key, schedule, mapper, env. The engine reads it; the feed exists. No branch, no deploy for the engine itself.

Why data, not code

The temptation is to make each source its own module — a flight adapter, a quake adapter, a weather adapter — each with its own parser bolted to the engine. That works until you have fifteen feeds and the engine is a fork of forks. The discipline here is the opposite: one engine, many descriptors. The variance between feeds is captured in the descriptor fields (the key, the schedule, the mapper name, the env var for the credential) and in the Strategy mappers that turn a raw response into a GeoSignal. Everything else is shared.

The engine is closed; the registry is open. A feed is a row, not a fork.

Strategy mappers do the normalization

Each descriptor names a Strategy mapper — the function that knows the shape of one specific feed and turns it into a GeoSignal. The mapper is the one piece of per-source code that actually exists, and it is small: it reads a raw response, pulls out the fields that map to GeoSignal, and returns. Everything after that — caching, dedup, publish — is engine code, shared across every source.

  • One engine, many descriptors — the poller, cache, and publisher are shared.
  • A descriptor carries the key, schedule, mapper, and credential env var — variance as data.
  • Strategy mappers are the only per-source code, and they are small — raw response in, GeoSignal out.

What this buys

The property is that the engine does not rot as sources accumulate. Adding the fifteenth feed is the same operation as adding the first — a descriptor, a mapper, a commit. The engine code that ran for the first feed runs unchanged for the fifteenth. That is what keeps a gateway from becoming a pile of adapters: the stable core stays stable because the varying part is data.

A gateway that grows by adding data, not by forking the engine, is a gateway that can carry twenty feeds without becoming twenty codebases.

— deino-atlas design note

What it is not

This is not a claim that any feed can be added with zero code. A new feed shape needs a mapper; a new transport needs engine support. The line is that the engine is extended for new transports (streaming vs polling), not for new feeds of an existing transport. AIS is the one streaming source today, and it required engine work — the streaming exception. Adding another polling feed does not. We are pre-revenue and building the POC; the registry is built, and the feeds in it are real, but calibration of any forecast that consumes them is gated (Gate 1b).

§Keep reading