El-Msadi Online Register
How this is built, and how to take it

Method & data

The register is a set of JSON files in data/ plus markdown in site/articles/. All pages are generated from those records, and a link to a record that does not exist fails the build.

What the confidence ratings mean

Confidence is the compiler's assessment, applied consistently across every finding and every entity. It is a separate colour system from everything else on the site, so a claim's strength reads at a glance and cannot be confused with a category or a status.

Confirmed

Stated by a primary source — the party's own filing, site, or an official designation.

6 findings

Strong

Multiple independent technical or documentary indicators agree, with no contrary evidence.

10 findings

Suggestive

Consistent with the hypothesis but explainable other ways. Do not rely on it.

1 finding

Struck

Investigated and disproven. Kept on the record so the dead end is not walked twice.

0 findings

The rule that matters most

Shared infrastructure proves a shared operator. It does not prove a shared owner. Almost everything in this file rests on DNS, WHOIS and reverse-IP, and all of that evidence is operator-level.

Where a claim rises above that — where a party's own filing, website or an official designation says something directly — it is rated confirmed and the quote is reproduced with its citation. Where it does not, it is rated suggestive however suggestive the pattern feels.

Disproven leads are kept at struck rather than deleted, so nobody walks the same dead end twice. There are currently none on the record.

Why a dead site still counts

Most of the domains in this register are no longer live — parked, suspended, or not resolving at all. That is expected, not a data-quality problem. DNS, WHOIS, mail and registrar records survive long after a website goes dark, and this register exists to reconstruct a network of ownership and infrastructure, not to monitor who currently has a homepage online.

Each domain's status — live, dormant, suspended, not resolving, or mail only — is recorded on the domain register for exactly this reason: so a dead site reads as a dead site, and the historical trail it left is not mistaken for something happening today.

Adding a company or a person

Append a record to data/entities.json. Fields come from data/schema.json.

{
  "id": "some-company",              // lowercase, becomes /entity/some-company/
  "name": "Some Company L.L.C.",
  "aka": ["شركة ما"],
  "type": "company",                 // enums.entity_type
  "jurisdiction": "AE",              // enums.jurisdiction
  "sanctions": "not_designated",     // enums.sanctions
  "confidence": "strong",            // enums.confidence
  "sector": "General trading",
  "summary": "What it is and why it is in the file.",
  "parent": "amh-group",             // must exist in entities.json
  "controlled_by": ["some-person"],  // must exist
  "sources": ["expertblue-2014"]     // must exist in sources.json
}

Record each relationship once, on the child. The reverse edges — subsidiaries, controls, the domains and findings that point back at an entity — are computed at build time in lib/dossier.mjs, so the two directions cannot disagree.

Adding a finding

Append to data/findings.json. Every finding must cite at least one source — that one is an error, not a warning.

{
  "id": "some-finding",
  "order": 11,                       // position on the front page
  "title": "What was found",
  "confidence": "strong",
  "summary": "One or two sentences.",
  "quote": { "text": "…", "cite": "where it came from" },
  "detail": ["A paragraph.", "Another paragraph."],
  "entities": ["some-company"],
  "sources": ["obs-dns-20260812"]
}

Adding an article

Drop a markdown file in site/articles/. Attach it to any number of findings and entities by id and it appears on each of those pages automatically — no edit to the entity or finding record needed.

---
title: Expert Blue, 23rd floor
summary: One sentence for the index card.
date: 2026-08-12
byline: Entity note
findings: [expert-blue-dubai]
entities: [expert-blue, amh-group]
sources: [expertblue-2014]
---

Markdown body.

npm run validate checks article frontmatter the same way it checks the JSON: a reference to a finding, entity or source id that does not exist stops the build.

Take the data

Everything here is licensed under CC BY 4.0. Copy it, adapt it, republish it, build on it — for any purpose, commercial or not — as long as you credit the register and link back to it.

The register is a handful of JSON files, one per record type — entities, findings, domains, servers, events and sources — plus a schema that defines every field. Each relationship is recorded once, on the child, and the reverse edges — an entity's subsidiaries, the findings that cite it — are computed at build time, so the two directions can't disagree.

  • dossier.json — the whole register, schema-versioned
  • domains.csv — the domain table, columns generated from the schema
  • Sources — the bibliography every claim cites