gemeinwert
BIM CVP

gemeinwert  /  wiki  /  mapping  /  standards-to-events

Standards-to-Events Mapping

How each buildingSMART and ISO standard is mapped onto signed events. Complete overview with example JSON per event kind, sorted by layer.

In one sentence

Standards stay untouched — we wrap the exchange in signed events. IFC files stay IFC, BCF topics stay BCF, IDS specs stay IDS. The event layer carries identity, availability and chaining.

Overview table

KindNameStandardRepl.
0ProfileNIP-01
1063File metadataNIP-94
1170BCF commentBCF 3.0
1171BCF auditBCF API 3.0
1172BCF reaction
1180IDS validation resultIDS 1.0
1190Sustainability snapshotLevel(s) / CAM
1230HVAC telemetryBACnet / ESG
9007 / 9000NIP-29 group create / add-userNIP-29
9735Zap receiptNIP-57
30009Badge awardNIP-58par. repl.
30023Long-formNIP-23par. repl.
30810IDS specificationIDS 1.0par. repl.
30811LOIN definitionEN 17412-1par. repl.
30850Product Data Template (PDT)ISO 23387par. repl.
30880PIR — client requirementsISO 19650-1par. repl.
30881Room-book entryDIN 18205par. repl.
30900BCF topicBCF 3.0par. repl.
30901BCF viewpointBCF 3.0addressable, no republish
30902BCF projectBCF 3.0par. repl.
30903Document referenceBCF 3.0 + openCDEpar. repl.
30904IFC file referenceIFC 4.3.2.0par. repl.
30930Document recordopenCDE Docs 1.0par. repl.
30940LCA studyEN 15804 / 15978par. repl.
30941LCC studyEN 16627par. repl.
30942Level(s) indicator setEU Level(s)par. repl.
30960Site-diary entryOTS-anchoredpar. repl.
30962Maintenance cycleCAM 2.3.16par. repl.
30970ApprovalISO 19650par. repl.
30971Deconstruction-plan approvalCAM 2.3.17 / UNI PdR 75par. repl.

“par. repl.” = parameterised replaceable / addressable (NIP-01 convention): the current version per (pubkey, kind, d-tag) is authoritative, history is reconstructed via separate audit events (kind:1171). BCF viewpoints use kind:30901 for addressability, but the BIM-CVP profile forbids republishing the same d because BCF viewpoints are immutable.

Identity — profiles, groups, roles, badges

Profile kind:0 NIP-01

Standard profile. We extend with BIM-specific fields in the JSON content (discipline, nip05).

NIP-29 group kind:9007 / 9000 NIP-29

Project workspace as a private group. Group-create (9007) opens it, add-user (9000) invites members.

BCF project kind:30902 BCF 3.0 + ISO 19650

Project metadata plus member list with two-axis role assignment (discipline + authority).

{
  "kind": 30902,
  "tags": [
    ["d", "pilot-2026"],
    ["title", "Sample project"],
    ["bcf-version", "3.0"],
    ["iso19650-state", "Shared"],
    ["h", "<nip29-group-id>"],
    // members: [pubkey, relay, IFC discipline, ISO 19650 authority]
    ["p", "<owner-hex>", "", "client",             "appointing-party"],
    ["p", "<arch-hex>",  "", "architect",          "lead-appointed"],
    ["p", "<coord-hex>", "", "coordinator",        "info-manager"],
    ["p", "<struc-hex>", "", "structuralEngineer", "appointed"],
    ["p", "<mep-hex>",   "", "mepEngineer",        "appointed"],
    // BCF project extensions
    ["bcf-status-list",   "Open,InProgress,Review,Resolved,Closed"],
    ["bcf-type-list",     "Clash,Issue,RFI,Information,Decision"],
    ["bcf-priority-list", "Low,Normal,High,Critical"],
    ["bcf-stage-list",    "LP3,LP4,LP5,LP6,LP7,LP8"]
  ],
  "content": "{...project description...}"
}
Italian UNI 11337-7 mapping: appointing-party = Committente, info-manager = BIM Manager, appointed = BIM Specialist, cde-admin = CDE Manager. Both labels can sit side by side in the UI.

Badge award kind:30009 NIP-58

Role attestation by professional chambers. The badge attests “this npub is a verified architect of the chamber X”.

Model — IFC and file metadata

NIP-94 file metadata kind:1063 NIP-94

Generic file provenance. For every IFC, every snapshot, every document on Blossom.

{
  "kind": 1063,
  "tags": [
    ["url",  "https://blossom.example/8f3e..."],
    ["m",    "application/x-step"],
    ["x",    "<sha256>"],
    ["size", "42850432"],
    ["schema",         "IFC4X3_ADD2"],
    ["mvd",            "ReferenceView"],
    ["authoring-tool", "Revit 2026"],
    ["discipline",     "mep"],
    ["a",              "30902:<owner-hex>:pilot-2026"],
    ["ifc-project",    "0aB1cD2eF3gH4iJ5kL6mN7"],
    ["filename",       "MEP_Pilot_V03.ifc"]
  ],
  "content": "{\"ifc_project_name\":\"Pilot\",\"entity_count\":18432}"
}

IFC file reference kind:30904 BCF file-ref + IFC 4.3

Replaceable wrapper around the NIP-94 event. Carries the current IFC version per discipline + phase.

{
  "kind": 30904,
  "tags": [
    ["d", "pilot-arc-2026"],
    ["e", "<nip94-event-id>", "", "file"],
    ["a", "30902:<owner-hex>:pilot-2026"],
    ["discipline",     "architecture"],
    ["schema",         "IFC4X3_ADD2"],
    ["mvd",            "ReferenceView"],
    ["ifc-project",    "0aB1cD2eF3gH4iJ5kL6mN7"],
    ["iso19650-state", "Shared"],
    ["revision",       "V03"],
    ["date",           "2026-05-13"],
    ["ots",            "<opentimestamps-proof>"]
  ]
}

Coordination — BCF, approvals

BCF topic kind:30900 BCF 3.0 markup.bcf

Issue / topic with all BCF 3.0 mandatory fields plus extension tags. Replaceable — the current status is overwritten by re-publishing the same d-tag.

{
  "kind": 30900,
  "tags": [
    ["d", "topic-001-duct-vs-girder-axis-4"],
    ["a", "30902:<owner-hex>:pilot-2026"],
    ["bcf-version",  "3.0"],
    ["bcf-status",   "Open"],
    ["bcf-type",     "Clash"],
    ["bcf-priority", "High"],
    ["bcf-stage",    "LP4"],
    ["bcf-due",      "1749600000"],
    ["bcf-server-assigned-id", "P-2026-042"],
    ["t", "HVAC"],
    ["t", "Structure"],
    ["p", "<mep-hex>",   "", "assignee"],
    ["p", "<struc-hex>", "", "consulted"],
    ["ifc",      "0aB1cD2eF3gH4iJ5kL6mN7"],
    ["ifc-file", "<kind-30904-arc-id>"],
    ["ifc-file", "<kind-30904-mep-id>"],
    ["e", "<kind-30901-id>", "", "viewpoint"],
    ["e", "<nip94-snapshot-id>", "", "snapshot"]
  ],
  "content": "{\"title\":\"Duct crosses main girder axis 4/B\",...}"
}

BCF viewpoint kind:30901 BCF 3.0 visinfo.bcfv

Camera, component list, visibility. Addressable for lookup, but immutable by profile: improving a viewpoint creates a new BCF viewpoint GUID and a new event.

BCF comment kind:1170 BCF 3.0 comment

Reply to a topic. Immutable — edits are handled via delete + republish.

{
  "kind": 1170,
  "pubkey": "<struc-hex>",
  "tags": [
    ["e", "<topic-event-id>", "", "root"],
    ["a", "30902:<owner-hex>:pilot-2026"],
    ["p", "<mep-hex>"],
    ["e", "<kind-30901-id>", "", "viewpoint"]
  ],
  "content": "{\"text\":\"Girder HEB400 cannot be lowered...\"}"
}

BCF audit kind:1171 BCF API 3.0 topic events

Every field change on a topic produces an immutable audit record.

{
  "kind": 1171,
  "tags": [
    ["e", "<topic-event-id>"],
    ["a", "30902:<owner-hex>:pilot-2026"],
    ["audit-field", "bcf-status"],
    ["audit-from",  "Open"],
    ["audit-to",    "InProgress"],
    ["bcf-action",  "update"]
  ]
}

Approval kind:30970 ISO 19650 gate

Single-sig or Frostr multi-sig for formal release (phase end, state transition to Published).

{
  "kind": 30970,
  "tags": [
    ["d", "approval-lp4-shared-to-published-2026-05-15"],
    ["a", "30902:<owner-hex>:pilot-2026"],
    ["approval-type", "PhaseGate"],
    ["target-state",  "Published"],
    ["target-stage",  "LP4"],
    ["e", "<arc-kind-30904-id>", "", "file"],
    ["e", "<tw-kind-30904-id>",  "", "file"],
    ["e", "<mep-kind-30904-id>", "", "file"],
    ["signers",    "<owner-hex>,<coord-hex>,<arch-hex>"],
    ["sig-policy", "3-of-3"],
    ["ots",        "<opentimestamps-proof>"]
  ]
}

Requirements — IDS, LOIN, PIR, room book

IDS specification kind:30810 IDS 1.0

Machine-readable information requirements. Small specs carry inline XML in content; large ones reference a Blossom URL.

IDS validation result kind:1180 IDS 1.0 audit

Result of an IFC validation against an IDS spec, signed by the validator tool.

{
  "kind": 1180,
  "pubkey": "<validator-hex>",
  "tags": [
    ["e", "<ids-spec-event-id>",  "", "spec"],
    ["e", "<ifc-30904-event-id>", "", "model"],
    ["result",           "pass-with-warnings"],
    ["applicable-count", "150"],
    ["passed-count",     "147"],
    ["failed-count",     "3"],
    ["x",                "<sha256-of-report>"],
    ["report-url",       "https://blossom.example/report-xyz.json"]
  ],
  "content": "{\"summary\":\"147/150 walls compliant, 3 violations on FireRating\"}"
}

LOIN definition kind:30811 EN 17412-1

Granularity definition per information item. Geometry + alphanumeric + documentation.

PIR / client requirements kind:30880 ISO 19650-1 / DIN 18205

Strategic requirements from the client. Replaceable, because requirements are refined until endorsed.

Room-book entry kind:30881 DIN 18205

One room with target values. One event per room.

Lifecycle — site diary, maintenance, deconstruction, LCA

Site-diary entry kind:30960 OTS-anchored

Daily site entry. Signed. Anchored with an OpenTimestamps proof.

{
  "kind": 30960,
  "pubkey": "<site-manager-hex>",
  "tags": [
    ["d", "pilot-2026-05-14"],
    ["a", "30902:<owner-hex>:pilot-2026"],
    ["date", "2026-05-14"],
    ["weather", "sunny, 18°C"],
    ["headcount", "14"],
    ["ots", "<opentimestamps-proof>"]
  ],
  "content": "{\"activities\":[\"...\"],\"deliveries\":[...],\"incidents\":[]}"
}

Maintenance cycle kind:30962 CAM 2.3.16

Maintenance event on equipment. Replaceable, because each cycle supersedes the previous.

LCA study kind:30940 EN 15804 / 15978

Life-cycle assessment study. With lca-source tag (model/verified/measured) we separate modelled estimates from real measurement.

Deconstruction-plan approval kind:30971 CAM 2.3.17 / UNI PdR 75

Approval of the end-of-life plan. Links PDT events with reuse classification. 70% reuse quota as a mandatory target for Italian public construction.

Sustainability snapshot kind:1190 Level(s) / CAM

Point-in-time snapshot of a single indicator. Immutable, because it captures one moment.

Products — PDT, telemetry

Product Data Template (PDT) kind:30850 ISO 23387 + CAM extension

Manufacturer-signed component data with EPD reference, dismount method, reuse classification.

{
  "kind": 30850,
  "pubkey": "<manufacturer-hex>",
  "tags": [
    ["d", "pdt-clay-block-hlz-365-type-a"],
    ["classification-uri", "https://identifier.buildingsmart.org/uri/.../IfcWall"],
    ["product-category",   "Clay block"],
    ["manufacturer",       "Wienerberger AG"],
    ["epd-uri",            "https://epditaly.it/epd/wienerberger-hlz365-2025"],
    ["epd-source",         "verified"],
    ["reuse-class",        "recycle"],
    ["dismount-method",    "dry mortaring, easily separable"],
    ["lang", "de"], ["lang", "it"]
  ]
}

HVAC telemetry kind:1230 BACnet / sensor

Sensor data point from building operation. Immutable, point-in-time. In operation continuously; low frequency on a public relay, high frequency on a private one.

Economy — zaps, bounties

Zap receipt kind:9735 NIP-57

Lightning payment to a topic or validation result. A bridge service publishes on receipt of payment.

DVM workflow (NIP-90)

No dedicated kind range — planning and validation services run on kind:5301-5310 (jobs) and kind:6301-6310 (results) in the NIP-90 range.

Global conventions

Honesty tags

Every sustainability value carries a source label — we separate modelled estimates from third-party verified data and real measurement:

TagValuesMeaning
epd-sourcemodel / verified / measuredEPD source
lca-sourcemodel / verified / measuredLCA calculation basis
co2-sourcemodel / verified / measuredCO2 value source

Project-reference convention

Every project-related event carries an a tag of the form 30902:<owner-pubkey>:<project-d-tag>. This makes the event discoverable and filterable at project scope.

Language tags

Multilingual content is marked by repeated lang tags and stored in the content JSON as a map: {"name":{"en":"...","de":"...","it":"..."}}. The project event defines the default language; regional profiles may add required translations.

State-transition rights

State-tag changes (iso19650-state) are not free write rights. A transition requires a corresponding kind:30970 approval. This is not enforced at the relay layer but validated client-side.

OTS anchor

Security-critical events (site diary, approvals, final model versions) carry an ots tag with a base64-encoded OpenTimestamps proof. The content can then be checked against an external timestamp proof at the moment of creation.

Read on

Sources