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.
Contents
Overview table
| Kind | Name | Standard | Repl. |
|---|---|---|---|
0 | Profile | NIP-01 | — |
1063 | File metadata | NIP-94 | — |
1170 | BCF comment | BCF 3.0 | — |
1171 | BCF audit | BCF API 3.0 | — |
1172 | BCF reaction | — | — |
1180 | IDS validation result | IDS 1.0 | — |
1190 | Sustainability snapshot | Level(s) / CAM | — |
1230 | HVAC telemetry | BACnet / ESG | — |
9007 / 9000 | NIP-29 group create / add-user | NIP-29 | — |
9735 | Zap receipt | NIP-57 | — |
30009 | Badge award | NIP-58 | par. repl. |
30023 | Long-form | NIP-23 | par. repl. |
30810 | IDS specification | IDS 1.0 | par. repl. |
30811 | LOIN definition | EN 17412-1 | par. repl. |
30850 | Product Data Template (PDT) | ISO 23387 | par. repl. |
30880 | PIR — client requirements | ISO 19650-1 | par. repl. |
30881 | Room-book entry | DIN 18205 | par. repl. |
30900 | BCF topic | BCF 3.0 | par. repl. |
30901 | BCF viewpoint | BCF 3.0 | addressable, no republish |
30902 | BCF project | BCF 3.0 | par. repl. |
30903 | Document reference | BCF 3.0 + openCDE | par. repl. |
30904 | IFC file reference | IFC 4.3.2.0 | par. repl. |
30930 | Document record | openCDE Docs 1.0 | par. repl. |
30940 | LCA study | EN 15804 / 15978 | par. repl. |
30941 | LCC study | EN 16627 | par. repl. |
30942 | Level(s) indicator set | EU Level(s) | par. repl. |
30960 | Site-diary entry | OTS-anchored | par. repl. |
30962 | Maintenance cycle | CAM 2.3.16 | par. repl. |
30970 | Approval | ISO 19650 | par. repl. |
30971 | Deconstruction-plan approval | CAM 2.3.17 / UNI PdR 75 | par. 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...}"
}
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:
| Tag | Values | Meaning |
|---|---|---|
epd-source | model / verified / measured | EPD source |
lca-source | model / verified / measured | LCA calculation basis |
co2-source | model / verified / measured | CO2 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
- Workflow model — end-to-end process before implementation
- IFC — the data model referenced by kind:30904
- BCF to Nostr events — detailed topic/comment/viewpoint mapping
- IDS — the spec that becomes kind:30810
- ISO 19650 — the process frame for state tags and roles
- Standards profile — pinned versions
Sources
- Standards profile — the versions we commit to
- Kind registry — complete tag and kind list (in dev/docs)
- BCF-NIP research — deeper BCF mapping analysis
- CAM Edilizia 2025 — Italian sustainability mandate