Skip to main content

How it’s built.

geo.qa is the premium upgrade over the open emem.dev protocol. Edge encoding on the cameras and sensors you run, satellite facts drawn from that open ledger, a layered representation over real foundation encoders, a fact algebra that never guesses silently, hard per-tenant isolation, and a memory you can train your own world models on.

encode  latent  decode
Postgres truth · Vespa speed
ed25519 · BLAKE3 · CBOR

Chapter I

The encoder runs on the device.

Most platforms ship you the picture and embed it in a cloud you don’t control. For the cameras and sensors you run, geo.qa encodes at the edge of capture, so a frame becomes a latent before it ever leaves the source. Only the latent moves on; a decoder resolves it onto the cell lattice. Satellite scenes arrive already encoded, as emem.dev embeddings.

01

Capture device

The sensors you run: drones, fixed and mobile cameras, ground sensors, plus satellite feeds from emem.dev. The fleet, not the single feed, is the unit.

02

Encode → latent

The encoder runs at the edge of capture. A scene collapses to a latent vector at the source, so bandwidth and exposure both drop before anything is transmitted.

03

Only the latent travels

No raw imagery leaves the boundary. What moves to the ground is the compact representation, not the pixels it was made from.

04

Ground decoder

On the ground, the decoder resolves each latent onto its cell, its bands and its tslot. One shared, addressable Earth memory.

05

File a signed fact

Each value lands with its source, its hash and an ed25519 signature. Nothing is overwritten; the past stays queryable.

Fig. i. The decode path. The encode→latent→decode split is geo.qa’s capture architecture; the public commons at emem.dev fuses already-public data instead.

The contract the rest of the system depends on is small. A device observes a place at an instant with whatever sensors it carries, and hands back a latent. Everything downstream, from recall to find_similar to the JEPA forecast, reads that latent and the facts it decodes to. None of it ever touches the raw frame.

That single split is what makes the rest possible. Because the picture stays at the source, a tenancy can run sealed and still be audited; because the latent is uniform, twelve different modalities can write into the same address.

encode.contract
# the only signature downstream depends on
encode :: Place × Time × Sensors  Latent

# where
Place   = Cell      # a stable ~10 m address
Time    = Tslot     # a bi-temporal slot
Sensors = whatever the device carries
Latent  = a vector, # signed beside its receipt
          #   never the raw scene
Spec. i. The encode step is the boundary. The raw frame stays behind it; only the latent crosses.

Chapter II

The representation is layered.

There is no single magic dimension. Different jobs want different geometry, so geo.qa keeps several representations side by side over real, pre-trained foundation encoders, and routes each query to the layer that fits it.

LayerDimsEncoder / sourceWhat it is for
GeoTessera128‑DSentinel‑1 / Sentinel‑2, 10 mSimilarity at scale. Cosine k‑NN behind find_similar: “show me places that look like this one.”
Clay v1.51024‑DSentinel‑2 (CLS token)A foundation encoder for optical scenes: the dense semantic backbone for a place’s appearance, the 1024-D CLS token over Sentinel-2.
Prithvi‑EO‑2.01024‑DHLS (Harmonised Landsat–Sentinel), CLSA second foundation encoder trained on HLS with a different prior. Where it and Clay disagree, the divergence is the signal.
BGE semantic768‑Dtext · captions · reportsSemantic memory search. Free-text questions and human field notes resolve into the same place graph.
State cube1792‑Dwired bands, packedThe full measured state of a place at a time: the wired bands packed into a 1792-D state vector, the substrate models train on.

The encoders are stacked, not blended into one number. When you ask for the nearest look-alike of a parcel, the query goes to GeoTessera’s 128-D space, where cosine distance is cheap and meaningful. When you ask what a scene is, it goes to the foundation encoders. When you ask a question in words, it goes through BGE. When you want to predict, the model reads the 1792-D state cube, which holds every wired band for the cell at that instant.

Keeping Clay and Prithvi both around is deliberate. They were trained on different data with different priors, so where they agree you have corroboration, and where they diverge you have a signal worth surfacing rather than averaging away.

Chapter III

One address, three kinds of fact.

Every place resolves to a cell, every measurement to a band, every observation to a tslot. The three compose into a fact. A fact is never a silent guess.

Cell×Band×TslotFact
cellWhere. A stable address roughly ten metres on a side. geo.qa resolves places onto an H3 lattice; the public commons uses emem’s flat cell64 grid (~9.55 m). Both name the same ground.
bandWhat. A named measurement slot: optical, NDWI, SAR-VV, land surface temperature, elevation, surface-water recurrence. 124 bands are wired; 42 are callable by name.
tslotWhen. A bi-temporal slot, tiered static to ultra-fast (static, yearly, 30-day, daily, hourly). Reads are append-only; nothing is ever overwritten.
receiptThe proof. Canonical CBOR over the sources, hashed with BLAKE3, signed with ed25519. Verify it offline against the public key at /.well-known/emem.json.
Plate ii · one cell, decomposedband × tslot
Fig. ii. A single address holds many bands across many tslots. Resolving one returns a fact and its receipt.
factndvi.trend = +0.04 / 30d
kindDerivativeFact · op = trend
cell8a2a1072bffffff
tslot2026-05-04 … 2026-06-01
parents4 PrimaryFact CIDs
cid · 26-char base32 · ed25519 signed · emem.dev verifiable

Three fact types, and a rule against silence.

PrimaryFactA measured value. Directly observed at a cell, band and tslot: an optical surface reflectance, a SAR backscatter, a sensor reading.
DerivativeFactAn operation over parents. One of delta, mean, trend, rate or anomaly, carrying the CIDs of the primary facts it was computed from. The derivation is itself part of the receipt.
NegativeFactA signed absence, with a reason. Not an empty result. A deliberate “nothing here, because”: outside_coverage, gpu_unavailable, no observation in the window. The absence is the answer, and it is signed too.
no fallbackNot queried is not empty. The system refuses to substitute a static dataset for a real observation. A place you never asked about and a place that is genuinely empty return different facts, on purpose.

Chapter IV

Two stores, one shape.

Postgres is the source of truth for what was observed. Vespa is the source of speed for finding it. Facts are written once to truth and projected into the index; the two never disagree about what happened.

truth · Postgres

schema.sql
-- one schema per tenant; RLS below the app
CREATE TABLE org_acme.memory (
  cell      bytea        NOT NULL, -- cell id
  band      smallint     NOT NULL,
  tslot     bigint       NOT NULL, -- u64 slot
  value     double precision,
  latent    vector,      -- layered dims
  prov      bytea        NOT NULL, -- cbor blob
  sig       bytea        NOT NULL -- ed25519
);
ALTER TABLE org_acme.memory ENABLE ROW LEVEL SECURITY;

Each tenant lives in its own schema, org_{id}. Every row carries its CBOR provenance blob and ed25519 signature, so the truth store is self-verifying. Row-level security enforces tenancy below the application layer, not just in front of it.

speed · Vespa

Reference deploymentvalue
p50 recall~2.4 ms
p99 recall~11 ms
index span~14 M cells
top-k default12
distanceangular (cosine)
groupingper-tenant content group
Tab. i. Illustrative figures from a single reference deployment, not a guaranteed SLA. Your numbers depend on the index, the hardware and the band mix.

Vespa keeps the layered vectors hot in a per-tenant content group. Recall runs angular distance over the right layer for the question, returns the top-k cells, and those exact cell ids travel back into the answer and into its receipt. The agent can name every observation it leaned on, by id.

Chapter V

Two fences, no gate between them.

An agent in tenant A cannot reach a cell in tenant B even when it asks for the exact same coordinates. There is no replication path that crosses the boundary, so the only thing that leaves an org is what a human in that org chooses to share.

Two tenants, two stores, no crossing path.Aagentorg_acme · schema + RLSprivate memory~14 M cellscell · 27.485°N 51.531°E …cell · 27.486°N 51.534°E …cell · 27.491°N 51.529°E …▸ read scoped to org_acmegateway · tenant filterorg_aero · schema + RLSprivate memory~6 M cellscell · 52.378°N 4.900°E …cell · 52.379°N 4.902°E …cell · 52.382°N 4.894°E …▸ read scoped to org_aeroBagentDENY · no cross-tenant path existsemem.dev · public commons · read-only to bothreadable by A and B · signed · citable · neither can write
Fig. iii. Two enforcement points: the per-tenant schema with row-level security at the storage layer, and the tenant filter at the gateway. Both tenants read the public commons; neither can write to it, and neither can read the other. Cell counts shown are illustrative, from one reference deployment.

Chapter VI

Train your own model on it.

The unified memory is not only something to query. Every dated, multimodal fact is supervision for a model you train, own, and deploy: JEPA dynamics, forecasting, detection, all of it learned inside your boundary and never leaving it.

train.py
# train a JEPA dynamics model on your own memory (Max plan)
curl -s -X POST https://geo.qa/api/world-model/training \
  -H "Authorization: Bearer $GEOQA_KEY" \
  -d '{ "bands": ["optical","sar_vv","lst","weather"], "horizon": "7d" }'

# → { "job_id": "wm_…", "status": "queued" }
train.jepa(memory)predict the next latent state of a place: a dynamics model of your own ground, learned in latent space
train.forecast(band)project a band’s trajectory forward, cell by cell, over held-out tslots
train.detect(classes)your own categories over SAM3 / SAMGeo masks and your fused imagery
train.embed()a private encoder tuned to your fleet and your places
model.deploy()serve it inside your tenancy, citing the same signed receipts
model.evaluate()score against held-out tslots. Nothing was overwritten, so last year is a clean test set you can replay

The pattern is the same one most world-model labs ship as a single pre-trained model: fuse modalities into one representation, then learn dynamics on it. The difference is ownership. Here you fuse your modalities into your memory, train your model on it, and deploy that model where the data already lives. emem’s public JEPA head is a starting point, not a finished product; the point of geo.qa is that you bring or train your own.

Chapter VII

It speaks emem.dev.

emem.dev is the open, free public Earth memory: a signed, content-addressed ledger anyone can read with no keys. geo.qa is the private upgrade on top, and it extends the same protocol, so public and private facts cite the same way.

The open protocol, in numberscountwhat it covers
source schemes46EO and ground feeds: Sentinel-2 (10 m, ~5 d), Sentinel-1 SAR, MODIS NDVI (8 d), ERA5 (daily), Hansen GFC (annual), JRC surface water (monthly), Met.no, FIRMS fires, CAMS air, SoilGrids, Overture buildings
composition algorithms160indices, fusions and derivations that turn raw bands into facts
wired bands124named measurement slots; 42 callable by name today
MCP tools81emem_locate, emem_ask, emem_recall, emem_find_similar, emem_verify_receipt, domain shortcuts and physics solvers
REST paths93the same surface over HTTP for non-MCP clients
topics27event streams agents can subscribe to

Where private and public differ, and where they agree.

aspectprivate · geo.qapublic · emem.dev
representationlayered (128 / 768 / 1024 / 1792)signed public facts + state cube
licencetenant-private, you own itopen commons, free to read
addressingH3-resolved, per-tenant schemacell64 (~9.55 m, non-H3)
capturecustom devices, encode at sourcealready-public EO sources
hashBLAKE3BLAKE3
signatureed25519ed25519
receiptcanonical CBORcanonical CBOR
verify offlineyesyes

Because the receipt format is shared, an agent can cite a private fact and a public one in the same breath, and a third party can verify both offline from the public key. No callback to us. No trust in our servers required.

Read the spec, or build.

The live endpoints, the OpenAPI spec, and the MCP config live in the docs. Anything outside that is a conversation.

geo.qa · a vortx ground decoder · emem.dev open protocol