Skip to main content
Custom checks

Check Repository Reference

Repository types, synchronization, file layout and access to shared checks.

A check repository is a source of monitoring-check definitions. octoja reads a repository, caches its check list, and shows the checks in the Check Library so you can assign them to devices. This reference covers the repository types, how octoja syncs them, and the exact layout a repository must publish. For the step-by-step of adding one, see Connect a Community Check Repository.

Repository types

TypeWhere it comes fromSynced from a URL?
Officialoctoja's own maintained repository at https://repo.octoja.com. Present by default and read-only.Yes — managed by octoja
CommunityA repository you connect by URL — a site you or a third party hosts, or another octoja instance that shares its own custom checks. Editable, syncable, and removable.Yes
CustomYour own custom checks, built inside octoja under Configuration → Check Library.No — they already live in octoja

How syncing works

  • octoja re-syncs every URL-based repository automatically once an hour.
  • The hourly sync only pulls when the repository's registry reports a generated timestamp newer than your last sync — an unchanged repository is skipped. The manual Sync now action always forces a full pull.
  • Each repository is synced independently: one unreachable or malformed repository does not stop the others, and a failed sync keeps the previously cached check list intact.
  • On every successful sync octoja replaces the cached entry for each check by id, so updates to a check propagate to the Check Library. A check that is removed from the registry stays in the Check Library until you delete the repository.
  • A check's UI manifest is fetched again only when the registry advertises a uiVersion that differs from the cached one. A registry that leaves uiVersion out has every manifest fetched on every sync, because there is nothing to compare.
  • If the repository uses HTTP basic authentication, the same credentials are sent on the registry fetch, on each check's manifest fetch, and on each binary download.

What a repository must publish

A check repository is a plain HTTP or HTTPS site. octoja resolves every path against the base URL you register — not against the baseUrl inside registry.json — and expects:

Path (relative to the base URL)What it is
registry.jsonThe index of every check the repository offers. Fetched first on every sync.
checks/{id}/{version}/ui.jsonThe UI manifest for one check version — the input fields and result rendering.
each executable's downloadUriThe check binary the agent downloads and runs on the device.

The whole site may sit behind a single HTTP basic-auth realm; provide the credentials when you connect the repository. A repository that asks for credentials has to be published over https://: octoja pairs a username with plain http:// only for loopback addresses such as localhost, and it accepts a password only alongside a username.

registry.json

FieldTypeDescription
versionstringThe registry's own version label.
generatedtimestampWhen the registry was generated. octoja compares this to the last sync to decide whether the hourly sync needs to pull. Bump it whenever you publish a change.
baseUrlstringThe repository's own base URL. Informational: octoja resolves the manifest and binary paths against the URL you registered for the repository, not against this value.
checksarrayOne entry per check the repository offers (see below).
{
  "version": "1.0",
  "generated": "2026-07-08T10:00:00Z",
  "baseUrl": "https://checks.example.com/",
  "checks": [
    {
      "id": "disk-temperature",
      "name": { "en": "Disk Temperature", "de": "Festplattentemperatur" },
      "description": { "en": "Reports the temperature of each drive.", "de": "Meldet die Temperatur jeder Festplatte." },
      "author": "Example MSP",
      "icon": { "type": "component", "library": "lucide", "name": "thermometer" },
      "category": "hardware",
      "tags": ["disk", "temperature"],
      "platforms": ["win-x64", "linux-x64"],
      "version": "1.2.0",
      "uiVersion": "9f2c41e7",
      "interval": 15,
      "timeoutSeconds": 120,
      "executionLocation": "Device",
      "executable": {
        "win-x64": {
          "downloadUri": "https://checks.example.com/checks/disk-temperature/1.2.0/win-x64/check.exe",
          "executableName": "check.exe",
          "fileType": "Exe",
          "executionType": "Exe"
        }
      }
    }
  ]
}

Check definition fields

Each entry in checks[] describes one check. Localized text fields (name, description) take an object with en, de, es, fr, it, and nl keys; en is used when the reader's language is missing.

FieldTypeDescription
idstringStable identifier for the check. Used as the key in the Check Library and as the path segment for its manifest and binaries.
namelocalized stringDisplay name shown in the Check Library.
descriptionlocalized stringShort description shown on the check card.
authorstringAuthor or maintainer, shown on the card.
iconobjectIcon descriptor. { "type": "component", "library": "lucide", "name": "<lucide-icon>" } for a built-in icon, or { "type": "embedded", "name": "<svg-or-base64>" } for an inline image.
categorystringGrouping in the Check Library. The values carrying a translated label are backup, hardware, network, services, security, and custom. Any other value still works, but is shown untranslated as the raw value.
tagsstring arrayFree-form tags used by the library search and filters.
platformsstring arrayRuntime identifiers the check supports (for example win-x64, linux-x64, osx-arm64).
versionstringThe version octoja offers. Also the {version} path segment for the UI manifest and binaries.
uiVersionstringContent marker for the check's ui.json. Change it when only the manifest changed, so a new renderer ships without a new version and devices skip re-downloading an identical binary. Leave it out and octoja fetches the manifest on every sync.
intervalnumberDefault run interval in minutes.
timeoutSecondsnumberHow long one run may take before it is stopped, in seconds. Defaults to 300.
executionLocationstringDevice (default) runs the check on the agent; Server evaluates it server-side. Omit for a normal device check.
executableobjectMap of platform identifier to the binary for that platform (see below).

executable entries

FieldDescription
downloadUriAbsolute URL the agent downloads the check binary from.
executableNameFile name to store the binary as on the device.
fileTypeWhat the download is: Exe, Zip, Ps1 or Bash. Any other value is read as Exe.
executionTypeHow the agent runs it: Exe, PowerShell or Bash. Any other value is read as Exe.

Per-check UI manifest (ui.json)

octoja fetches each check's manifest from checks/{id}/{version}/ui.json, where {version} is the check's version from the registry. The manifest defines two things:

  • input — the parameters shown when the check is assigned to a device, keyed by parameter name. Each field declares its type, localized title and description, whether it is required, a default, and (for choices) its options. The field types are string (the fallback for an unrecognized type), text, password, integer, number, boolean, select, radio, and array; separator draws a divider instead of a field. Use password for secrets — the value is masked in the interface and stored with the assignment, so it never has to live in the repository. A field may also carry visibleIf to appear only when another field holds a given value.
  • output — how the check's result renders: a detail renderer for the device's Checks tab, a history renderer for past results, and a widget renderer for dashboard tiles.

The input keys also decide whether a check is offered on network devices — devices monitored without an agent by one of your existing agents. A field of type string whose key is host, ip, ipaddress, target, url, endpoint, or address (matched regardless of capitalisation), or a field of type array with string items whose key is hosts, targets, or endpoints, marks the check as probing a remote target. Such a check appears in a network device's Add Check dialog; the field itself is hidden there, and octoja fills in the device's address on every run. The type has to match exactly: text does not qualify — despite the name it is not a text input but a static label rendered between fields — and neither does an endpoints array whose items are objects rather than strings. How the substitution behaves at run time — including the SNMP credential keys — is described in Custom Script.

A check whose UI manifest cannot be fetched is still listed. On its first sync it appears without custom input fields and result rendering; on a later sync the manifest octoja already holds stays in place, so a repository that goes quiet leaves a working renderer alone. One unreadable manifest does not stop the rest of the registry from syncing.

Check result protocol

Every check that runs on a device speaks the same protocol, whatever language it is written in. octoja launches it according to its executionType — powershell -ExecutionPolicy Bypass -File for PowerShell, bash for Bash, or the downloaded file itself for Exe — writes the check's configuration to standard input, and reads the result from standard output. Note that the PowerShell invocation does not use -NoProfile, so a machine-wide PowerShell profile runs before the check does.

AspectBehaviour
InputThe configured input values as one line of base64-encoded JSON on standard input, followed by a newline; the stream is then closed. A check with no configured inputs receives the base64 encoding of {}.
OutputBase64-encoded JSON on standard output. octoja reads the bytes between <<<OCTO_RESULT_BEGIN>>> and <<<OCTO_RESULT_END>>>. When those markers are absent it falls back to reading the entire trimmed output as the payload — so an unmarked check breaks the moment anything else writes to standard output.
StatusFrom the checkResult field of the decoded JSON. The field name is matched case-insensitively, and the value may be the number or the status name.
Exit codeMust be 0. A non-zero exit code makes octoja discard the output and report Failure, whatever the payload said.
DiagnosticsStandard error does not affect the status. The agent stores it in its check log on the device, so it stays available for troubleshooting. When the check exits with a non-zero code, it is also sent as the error message of the Failure result.
SizeThe decoded payload is capped at 1 MB. Above that the status survives and the field values are dropped.
TimeoutThe run is stopped once it exceeds timeoutSeconds (default 300) and the check reports Failure.
Working directoryNot set to the check's own folder. A script that reads files stored beside it has to resolve their paths explicitly.

checkResult values

NumberNameMeaning
0SuccessThe monitored state is fine.
1WarningWorth attention, not yet critical.
2CriticalThe check ran and found a critical state.
3FailureThe check itself could not run properly.

Who writes the markers. A check published by a repository is downloaded and run unchanged, so its own script has to emit the markers around the payload. A custom script check built inside octoja is different: octoja wraps the script and emits the markers itself, and a script that writes them a second time breaks its own result. For a worked example of a repository check that implements this protocol, see Publish Your Own Community Check Repository.

Another octoja instance as a repository

An octoja instance can publish the custom checks you pick in exactly this format, so a second instance connects it as a Community repository. The details live under Settings → Check repository access on the publishing instance.

AspectWhat the publishing instance does
Base URL<instance-address>/api/custom-check-repository/. The page shows it as Repository URL and copies it to the clipboard.
AuthenticationHTTP basic auth against a repository credential. Every path needs one, so the connecting instance always fills in a username and password — and therefore needs an https:// URL unless the address is loopback.
Which checks appearOnly the custom checks picked under Exposed custom checks for the credential in use. Two credentials on the same instance can expose different sets.
Versionsoctoja derives version from the check's scripts and uiVersion from its manifest, so editing a script or a result layout publishes a new version on its own.
PermissionCustom Check Management (custom-checks.manage) together with Monitoring Check Management (monitoring-checks.manage) on the publishing instance.

Connection test results

The Check connection button on the add and edit dialogs probes the repository through the same code path a real sync uses.

MessageMeaning
Connected — N checks found.registry.json was fetched and read. N is the number of checks it lists.
Connection failed: The repository could not be reached. Check the URL and network connectivity.octoja could not reach the URL — wrong address, network/DNS/TLS problem, or rejected basic-auth credentials.
Connection failed: The repository responded, but the registry.json could not be parsed.The URL answered, but no readable registry.json came back from the base URL.

Permissions

PermissionRequired for
Check Repository Management (check-repositories.manage)Adding, editing, deleting, and syncing check repositories.
Monitoring Check Management (monitoring-checks.manage)Browsing the Check Library and assigning the checks it lists.
Custom Check Management (custom-checks.manage)Building custom checks, and — together with Monitoring Check Management — handing out repository URLs and credentials under Check repository access.
  • Custom Script — build your own check inside octoja instead of hosting a repository.
  • Checks — how checks work and the full built-in catalogue.