Added
- OS capture on device activation: Record the operating system where licensed software is activated. The
osfield is stored on the device record and returned in license info responses (GET /license,GET /orgs/.../licenses/{id}). - SDK auto-detection: All SDKs (Rust, TypeScript, React) auto-detect the OS at activation time and send it with the
/redeemrequest. Developers can override withDeviceInfo { os: "custom" }. - New
osfield onDeviceInfo(SDK input) andLicenseDeviceInfo(SDK response) across all SDKs. - Database migration 002: Adds
os TEXTcolumn to existingdevicestables. Fresh databases include it in the schema automatically.
Changed
/redeemrequest body: New optionalosfield (max 64 chars). Fully backward compatible — omitting it results innull.- Device reactivation preserves OS: When an existing device reactivates, a new
osvalue updates the record, but omitting it preserves the previous value (COALESCEsemantics). - Bruno
Local.bruenvironment file untracked: Moved operator API key to Bruno secret vars; file is now gitignored.
Full Changelog: v0.8.2...v0.9.0