Analyze & annotate
Make your data tell you something. Label moments that matter, pair sensors against reference instruments, and let scheduled jobs surface patterns automatically.
Annotations: labels on your data
An AnnotationClass defines a kind of label — its fields, and which scopes it applies to (a site, device, component, or sensor). An Annotation is an applied label: a point in time or a time range, with structured values. Annotations can come from people (MANUAL) or from the system (a fired rule, a reference sensor, an external feed, or an ML inference), so a labelled history builds up as you operate.
Because annotation forms are generated from the class schema, the same UI captures very different labels — no custom form per use case.
Reference pairs and analytics jobs
A ReferencePair links a primary component to a reference component over a time span — for example a field sensor paired with a lab instrument. A JobDefinition is a declarative, scheduled computation: it names a function (such as a Pearson correlation), an input selector, a window, thresholds, and the annotation class it emits. Jobs run on a schedule and write their findings back as annotations, so analytics shows up in the same timeline as everything else.
Analytics-emitted annotations surface as auto-events — a read-only feed filtered to system sources — so operators can review what the platform noticed.
In the app
Explore labels under Annotations (/{slug}/annotations), review machine-generated findings under Auto-events (/{slug}/admin/auto-events), and manage Reference pairs (/{slug}/admin/reference-pairs).
In the API
GET|POST|PUT|DELETE /api/v1/annotations— apply and query labels;GET …/by-sourcefilters by originGET|POST|PUT|DELETE /api/v1/annotation-classes— define labelable categoriesGET|POST|PUT|DELETE /api/v1/reference-pairs— pair primary and reference components
Job definitions are installed as data — typically by a Pack — rather than created through the API, which keeps analytics logic declarative and the platform vertical-neutral.