Changelog
Changes that may impact integrators. For the full backend git log, check the repository. This page only lists items integrators may need to act on.
Breaking-change notice SLA
- Path / method removal or rename: at least 30 days' notice + one release of parallel availability.
- Response key removal or type change: at least 14 days' notice.
- Response key addition: no notice — integrators must ignore unknown keys.
- New required query param / header: 14 days' notice plus a default-value compatibility window.
- All notices: this page + email or Slack to known supplier contacts.
2026-06-20 — Supplier OAuth + Permission Sync (V8~V13)
- feat (V8): Activation outbound to sdx-web. On device activation LinkOStar now POSTs to sdx-web's
/api/m2m/billing/activationto debit the credit ledger.device_activation_eventgrewsync_status/synced_at/last_attempt_at/sync_errorcolumns. Ops can track viaGET /platform/activation-events?syncStatus=PENDING|SYNCED|FAILED|REJECTED_BALANCE. No integrator action — the billing model now has a single SSOT. - feat (V9): supplier-opaque metadata + provisioning two-mode. (a)
hub_claim_code.metadata+hub_instance.metadataJSON slots — supplier attaches owner/space/spot ids on claim code creation and reads them back on hub fetch. (b) Provisioning stepconfigJsoncontract forexternal_submit_url/external_headers/track_state_in_linkostar. When the mobile app POSTs straight to the supplier, LinkOStar is bypassed. The default LinkOStar submit endpoint (/tenant/hubs/{uuid}/provisioning/steps/{stepId}/submit) still works. (c) Optionaldevice_instance.hub_uuidmapping column — customers that don't maintain the mapping keep it NULL. - feat (V10): Supplier OAuth client (Authorization Code + PKCE). LinkOStar app users can link their accounts to a supplier identity.
POST /app/supplier-link/authorize→ external browser (RFC 8252) →GET /auth/supplier-link/callback→ tokens kept server-side (AES-GCM) →GET /app/supplier-links/{id}/access-tokenreturns a refresh-aware bearer. n:1 model (user × supplier × sub) — one user can connect multiple accounts of the same supplier. See Supplier OAuth. - feat (V11): Five new fields on
supplier_oauth_config—permission_query_url·permission_webhook_url·hub_registration_url·device_registration_url·registration_shared_secret. All optional. Each opens a corresponding sync channel. - feat (V12): LinkOStar → supplier registration outbox. New hub / device events are POSTed to the supplier with HMAC-SHA256 (
X-LinkOStar-Signature: sha256=<hex>) and an idempotency header. Failures retry with backoff; 4xx is DEAD. The supplier only has to implement a receiver and verify the signature. - feat (V13, potentially breaking): Supplier-SSOT permission sync. When a supplier registers
permission_query_url,/app/hubs·/app/devicesresponses are filteredby the supplier's permission view. Suppliers without a registered config are unaffected. Cache invalidation viaPOST /webhook/supplier-permission/{supplierUuid}(HMAC-signed). Permissions: OWNER > OPERATOR > VIEWER. Integrator action: confirm whether your supplier registerspermission_query_url. If not, LinkOStar-SSOT semantics continue. - feat (V13):
GET /app/bundle-catalogadded — PUBLISHED bundle listing with per-viewerrequiresSupplierLink/currentUserLinkedflags. A catalog entry is visible even when the hub instance is hidden by supplier-SSOT — the link entry point. - feat (Flutter): new Link step in the provisioning flow + a Connected Services settings screen.
external_submit_urlcalls now carry the supplier-issued Bearer automatically. - Ops note:
LINKOSTAR_CRYPTO_SECRET(32-byte base64) env is now required in production — without it, every token / client_secret is encrypted with the dev fallback key. See Supplier OAuth for the first-supplier registration runbook.
2026-06-04
- fix: the
HubTokenAuthenticationFilterhub-bearer check now compares bytes directly. Rows that stored a trailing zero-pad byte under one Hibernate/MySQL combination were 401-ing on every request. No integrator action — hub-agent telemetry and refresh just work again. - feat: ProvisioningStep gained an
INFOtype — a read-only acknowledge step (title + description + Next button). The existing four types remain compatible. - feat: the hub-agent BLE service UUID changed from
00001801-...to6d18c51f-0440-4e48-bbee-aa908ce6d0ef(LinkOStar custom). Hubs running hub-os ≤ v0.1.5 are not discoverable by the updated mobile scan; re-flash to v0.1.6+ to recover. - feat: the hub-agent telemetry / reconcile / self-update loops now run regardless of MQTT being enabled. Setting
mqtt.enabled: falsepreviously silenced telemetry as well; that regression is fixed in v0.1.5.
2026-06-01
- revert:
/dashboard/statsremoved. Cross-resource aggregation belongs in the supplier BFF, not in LinkOStar — see the 4-tile dashboard example in Integration Guide.
2026-05-31
- feat:
POST /v1/hubs/{uuid}/telemetrynow accepts the hub-agent's flat reported-state shape directly. The previous{payloadJson: ...}envelope still works. - feat:
GET /tenant/hubsnow returnshubTypeandmacAddress. All previous keys remain.
Versioning
- Backend: rolling deploy. master push = production deploy. No semver tags.
- Hub-agent:
vMAJOR.MINOR.PATCHtags (e.g.v0.1.5). - Hub-OS:
hub-os-vMAJOR.MINOR.PATCHtags. Auto-bakes the latest hub-agent. - OpenAPI spec: no version number. Updates are reflected in the spec immediately and announced on this page.