GHOSTSOFTWARE by Logic Foundry
Implemented in 0.1

The normalized uplink contract

The actual output of the Ghost Signal 0.1 adapters.

Identity comes first

The adapter requires a trusted tenantId, integrationId and expected applicationId from the caller. Incoming application identity must match that binding. Device ownership is a separate authorization check for your receiver.

FieldMeaning
schemaVersion0.1; explicitly versioned envelope
source / eventIdProvider and its event identity
deduplicationKeyJSON tuple of tenant, integration, source and provider event ID
device.devEuiValidated 16-character hexadecimal identifier
receivedAtProvider receive time converted to UTC ISO format
frameCounter / fPortUnsigned frame counter and application port 1–223
payloadBase64Original application bytes represented as padded base64
decodedDetached provider object, or null; units unchanged

Explicit limits

Only application uplinks are accepted. Payload text is limited to 4,096 characters. Counter values must be integers within the unsigned 32-bit range. Invalid identifiers, ports, times and payload encodings throw TypeError. The library does not silently coerce these fields.

Retries are not universal duplicates

The key detects repeat delivery of the same provider event. Separate events representing the same radio transmission may have different IDs. If your system receives from multiple providers, define reconciliation separately. Never deduplicate using the frame counter alone; resets and sessions complicate its meaning.