[{"data":1,"prerenderedAt":249},["ShallowReactive",2],{"doc-\u002Fchangelog":3},{"id":4,"title":5,"body":6,"description":239,"edit":240,"extension":241,"meta":242,"navigation":243,"path":244,"seo":245,"stem":246,"vertical":240,"weight":247,"__hash__":248},"content\u002Fchangelog.md","Changelog",{"type":7,"value":8,"toc":223},"minimark",[9,26,31,36,63,67,86,90,93,97,120,124,146,150,176,180,191,195,205,208],[10,11,12,13,20,21,25],"p",{},"This page is auto-extracted from the top-level git tags on the OpenSense\nmonorepo. Patch versions are folded into the nearest minor. We follow\n",[14,15,19],"a",{"href":16,"rel":17},"https:\u002F\u002Fsemver.org",[18],"nofollow","Semantic Versioning"," for API surface (",[22,23,24],"code",{},"v1",").",[27,28,30],"h2",{"id":29},"unreleased","Unreleased",[32,33,35],"h3",{"id":34},"docs-site-2026-05-17","Docs site (2026-05-17)",[37,38,39,47,50],"ul",{},[40,41,42,43,46],"li",{},"Docs site launched at ",[22,44,45],{},"docs.opensense.murzin.digital",". Built with\nNuxt 3 + @nuxt\u002Fcontent; SSG; same Cold Storage Panel design\nlanguage as the marketing site. ~80 pages covering Getting\nstarted, Hardware, API, Verticals, Troubleshooting, Security,\nIntegrations and About.",[40,48,49],{},"Search via minisearch — offline, runs in the browser, no\nthird-party JS.",[40,51,52,55,56,55,59,62],{},[22,53,54],{},"\u002Fsitemap.xml",", ",[22,57,58],{},"\u002Fllms.txt",[22,60,61],{},"\u002Ffeed.xml"," for crawler-friendliness.",[32,64,66],{"id":65},"backend","Backend",[37,68,69,76],{},[40,70,71,75],{},[72,73,74],"strong",{},"MQTT bridge",": per-account topic enforcement via mTLS subject CN.",[40,77,78,81,82,85],{},[72,79,80],{},"TTN webhook",": device-by-DevEUI auto-assignment improved;\nuplinks from unregistered DevEUIs land in the per-site\n",[22,83,84],{},"unassigned"," tray rather than 404-ing.",[27,87,89],{"id":88},"v010-alpha-2026-05-slovakia-pilot","v0.1.0-alpha — 2026-05 (Slovakia pilot)",[10,91,92],{},"The first version we let real customers use.",[32,94,96],{"id":95},"verticals","Verticals",[37,98,99,108,111,114,117],{},[40,100,101,102,55,105,25],{},"HACCP cold-chain report template (",[22,103,104],{},"haccp_monthly",[22,106,107],{},"haccp_annual",[40,109,110],{},"Legionella vertical templates with the 50\u002F60\u002F50 rule defaults.",[40,112,113],{},"Server-room uptime template against ASHRAE TC 9.9.",[40,115,116],{},"Indoor climate vertical for CO₂ \u002F RH (offices, schools, museums).",[40,118,119],{},"Energy vertical with baseline drift detection.",[32,121,123],{"id":122},"hardware","Hardware",[37,125,126,129,132,135,143],{},[40,127,128],{},"Shelly H&T Gen1 \u002F Plus \u002F Gen3 supported.",[40,130,131],{},"Aqara TH via Zigbee2MQTT bridge.",[40,133,134],{},"Efento NS-T \u002F NX-T via TTN webhook.",[40,136,137,138,142],{},"Generic LoRaWAN with the\n",[14,139,141],{"href":140},"\u002Fhardware\u002Fgeneric-lorawan","generic decoder shape",".",[40,144,145],{},"DIY ESP32 + ESPHome with the documented YAML.",[32,147,149],{"id":148},"api","API",[37,151,152,158,164,167,170,173],{},[40,153,154,157],{},[22,155,156],{},"POST \u002Fv1\u002Fingest"," general-purpose endpoint.",[40,159,160,163],{},[22,161,162],{},"GET  \u002Fv1\u002Fingest\u002Fshelly"," legacy GET path.",[40,165,166],{},"Webhook ingest from TTN.",[40,168,169],{},"Magic-link auth, session cookies, bearer tokens.",[40,171,172],{},"Idempotent ingest by content key (no Idempotency-Key required).",[40,174,175],{},"Rate-limit headers per route family.",[32,177,179],{"id":178},"compliance","Compliance",[37,181,182,185,188],{},[40,183,184],{},"GDPR DPA template (SCC 2021 derived).",[40,186,187],{},"eu-central data residency (Hetzner Falkenstein).",[40,189,190],{},"Audit trail with daily-published hash-chain head.",[27,192,194],{"id":193},"reading-this-page","Reading this page",[10,196,197,198,201,202,142],{},"The dates above are best-effort. The audit trail in your account is\nthe authoritative log of what changed in ",[72,199,200],{},"your"," data; this page is\nabout what changed in ",[72,203,204],{},"the product",[10,206,207],{},"For breaking API changes we will publish:",[37,209,210,213,216],{},[40,211,212],{},"An entry here.",[40,214,215],{},"An email to all account holders 30 days in advance.",[40,217,218,219,222],{},"A ",[22,220,221],{},"Deprecation"," HTTP response header on the affected endpoint for\nthe deprecation window.",{"title":224,"searchDepth":225,"depth":225,"links":226},"",3,[227,232,238],{"id":29,"depth":228,"text":30,"children":229},2,[230,231],{"id":34,"depth":225,"text":35},{"id":65,"depth":225,"text":66},{"id":88,"depth":228,"text":89,"children":233},[234,235,236,237],{"id":95,"depth":225,"text":96},{"id":122,"depth":225,"text":123},{"id":148,"depth":225,"text":149},{"id":178,"depth":225,"text":179},{"id":193,"depth":228,"text":194},"Notable changes",null,"md",{},true,"\u002Fchangelog",{"title":5,"description":239},"changelog",900,"ADAkwmclYZDZ8x63ukaia-x63CxHQD5_FPOCnu4SPoo",1779022956716]