Search
Ctrl+K
On this page
Documentation for endpoint posture monitoring, disk encryption, screen lock enforcement, software inventory, local code package scanning, remote web terminals, and response actions in Shuffle Security.
Shuffle Security (shuffle.security/monitors) provides lightweight endpoint posture monitoring and remote response capabilities directly from your Shuffle instance.
Instead of deploying a separate third-party agent that cannot interact with your SOAR workflows, Host Monitors runs Orborus (Shuffle's worker binary) in sensor mode (--sensor_mode=true).
npm, pip, cargo, go.mod).shuffle-security_sensors category (and hardware asset specs under shuffle-security_assets).[!NOTE] Zero License Paywalls
Host Monitors is included in both Shuffle Cloud and self-hosted open-source deployments. There are no per-seat or per-agent license fees. Standard app runs only execute when your automation workflows run (e.g. executing a remediation script or sending an alert). Normal heartbeats and posture checks consume zero app runs.
The monitor daemon is built into Orborus and runs across major operating systems:
| Platform | Supported Versions | Monitored Controls |
|---|---|---|
| macOS | macOS 12 Monterey, 13 Ventura, 14 Sonoma, 15 Sequoia | FileVault 2 disk encryption, screen lock idle timeout, installed applications catalog, local repository manifests |
| Windows | Windows 10, Windows 11, Windows Server 2016+ | BitLocker drive protection, screen lock inactivity policy, installed applications, local repository manifests |
| Linux | Ubuntu, Debian, RHEL, CentOS, Fedora, Arch | LUKS volume encryption, screen lock idle timeout, system packages, local repository manifests |
Host Monitors organizes telemetry and endpoint state across four specialized datastore categories. Instead of bundling hardware specs, application inventories, manifest dependencies, and live heartbeats into a single monolithic document, Shuffle decouples them into distinct categories:
shuffle-security_assets: Hardware inventory, system specifications, ownership, and network metadata.shuffle-security_software: Operating system applications, daemon versions, and installed binary catalogs across hosts.shuffle-security_packages: Code libraries and project manifest dependencies (package.json, requirements.txt, Cargo.toml, go.mod) scanned from developer repositories.shuffle-security_sensors: Monitor daemon runtime state, heartbeats, posture check baselines (hd_encrypted, screenlock), and response capabilities.Access these categories directly in the Datastore console:
/admin/datastore?category=shuffle-security_assets (Shuffle Core Datastore)/admin/datastore?category=shuffle-security_software (Shuffle Core Datastore)/admin/datastore?category=shuffle-security_packages (Shuffle Core Datastore)/admin/datastore?category=shuffle-security_sensors (Shuffle Core Datastore)shuffle-security_assets)Keyed by hostname or asset identifier (e.g. srv-prod-db-01 or dev-macbook-pro-14).
| Field | Type | Description |
|---|---|---|
id | String | Unique asset identifier (e.g. asset-srv-prod-01). |
hostname | String | Primary hostname reported by the endpoint. |
os | String | Operating system name and release (e.g. Ubuntu 22.04.4 LTS, macOS 15.1 Sequoia). |
architecture | String | CPU architecture (x86_64, arm64). |
cpu_cores | Number | Number of virtual or physical CPU cores. |
ram_gb | Number | Total physical memory in gigabytes. |
disk_gb | Number | Total system storage capacity in gigabytes. |
ip | String | Primary IPv4 address. |
mac_address | String | Network interface MAC address. |
serial_number | String | Hardware or hypervisor serial number. |
environment | String | Environment tier (production, staging, workstation). |
tags | Array | Organizational labels (e.g. ["database", "postgresql", "critical"]). |
owner | String | Responsible email or team handle. |
status | String | Lifecycle status (active, decommissioned, maintenance). |
shuffle-security_software)Keyed by software identifier (e.g. sw_docker_engine_26, sw_openssh_server_9).
| Field | Type | Description |
|---|---|---|
name | String | Application or binary name (e.g. Docker Engine, OpenSSH Server). |
version | String | Detected software release version string. |
publisher | String | Vendor or software maintainer. |
install_type | String | Packaging format (system_binary, deb_package, rpm_package, application_bundle). |
install_path | String | Primary executable path (e.g. /usr/bin/docker, /Applications/Google Chrome.app). |
hosts_count | Number | Total count of fleet endpoints running this application. |
associated_hosts | Array | List of hostnames where this software version was detected. |
last_scanned | Number | Unix epoch timestamp of the most recent inventory sweep. |
shuffle-security_packages)Keyed by package identifier (e.g. pkg_lodash_4_17_20, pkg_requests_2_31_0).
| Field | Type | Description |
|---|---|---|
name | String | Package library name (e.g. lodash, requests, xz-utils). |
version | String | Exact installed version discovered in manifest. |
ecosystem | String | Package ecosystem (npm, pip, cargo, go, deb, maven). |
manifest_file | String | Source manifest filename (package.json, requirements.txt, Cargo.toml, go.mod). |
repository_path | String | Absolute directory path where the dependency manifest resides. |
host | String | Hostname of the machine running the code scanner. |
has_vulnerability | Boolean | True if the package version matches an active OSV/CVE advisory. |
advisory_id | String | Linked CVE or GHSA identifier (e.g. GHSA-7867-xwm8-2v3q), or null if clean. |
fixed_version | String | Recommended patched version if vulnerable. |
shuffle-security_sensors)Keyed by host sensor ID (e.g. sensor_srv_prod_db_01).
| Field | Type | Description |
|---|---|---|
host_id | String | Unique daemon runtime identifier. |
hostname | String | Hostname associated with the daemon instance. |
platform | String | Operating system family (linux, macos, windows). |
agent_version | String | Running Orborus sensor version. |
sensor_group | String | Configured Orborus queue group (e.g. production-eu). |
status | String | Daemon heartbeat status (online, offline). |
last_heartbeat | Number | Unix epoch timestamp of the latest ping. |
compliance | Object | Posture check results: hd_encrypted, screenlock, filevault, firewall_active. |
capabilities | Array | Enabled monitor features: installed_software, code_scanner, remote_terminal, response_actions. |
# 1. Check endpoint posture baseline
sensor = self.get_cache("sensor_srv_prod_db_01", category="shuffle-security_sensors")
if sensor:
compliance = sensor.get("compliance", {})
if not compliance.get("hd_encrypted"):
print(f"Non-compliant host: {sensor.get('hostname')} lacks disk encryption")
# 2. Correlate vulnerable packages with host assets
package = self.get_cache("pkg_lodash_4_17_20", category="shuffle-security_packages")
if package and package.get("has_vulnerability"):
target_host = package.get("host")
asset = self.get_cache(target_host, category="shuffle-security_assets")
print(f"Alert: {package.get('name')} {package.get('version')} is vulnerable on {target_host} (Owner: {asset.get('owner')})")
Every key across all four monitor categories (shuffle-security_assets, shuffle-security_software, shuffle-security_packages, shuffle-security_sensors) is automatically stored with immutable revisions.
hd_encrypted, screenlock) changed state.API Call
curl -X GET 'https://uk.shuffle.security/api/v2/datastore/category/shuffle-security_assets/{hostname}/revisions' \ -H 'Authorization: Bearer <api_key…'
Response
No response received.
# Fetch package revisions to see previous version or recover dropped data
pkg_revisions = self.get_cache_revisions(key="pkg_lodash_4_17_20", category="shuffle-security_packages")
if len(pkg_revisions) > 1:
# Revert to known-good baseline
self.set_cache(
key="pkg_lodash_4_17_20",
value=pkg_revisions[1]["value"],
category="shuffle-security_packages"
)
/monitors in Shuffle Security.hd_encrypted)screenlock)installed_software)code_scanner_enabled)response_actions)The Add Host dialog generates an automated installation command pre-configured with your instance URL, queue, and authentication header:
macOS & Linux:
API Call
curl -X GET 'https://uk.shuffle.security/api/v1/orborus?base_url=<SHUFFLE_URL>&sensor_mode=true&queue=<QUEUE>' \ -H 'Auth: <AUTH_KEY>'
Response
No response received.
Windows (PowerShell as Administrator):
powershell -ExecutionPolicy Bypass -Command "& {iex (irm 'https://shuffler.io/api/v1/orborus?base_url=<SHUFFLE_URL>&sensor_mode=true&queue=<QUEUE>&os=windows' -Headers @{'Auth'='<AUTH_KEY>'})}"
You can also download the standalone orborus binary directly from the official releases:
./orborus \
--base_url="https://<your-shuffle-instance>" \
--sensor_mode=true \
--queue="<QUEUE_NAME>" \
--org_id="<ORG_ID>" \
--auth="<AUTH_KEY>" \
--software_list_enabled=true \
--hd_encrypted_check=true \
--screenlock_check=true \
--code_scanner_enabled=true \
--response_actions=full
Host Monitors continuously evaluate endpoints against defined posture controls:
hd_encrypted)Verifies full-disk encryption is active on the system drive:
C:).screenlock)Verifies that the operating system locks the screen after a maximum of 15 minutes of user inactivity:
log_forwarding)Active event and log streaming from monitored hosts is currently in development and not generally available yet.
When installed_software is enabled, the monitor catalogs applications and packages installed on the machine:
/monitors.When code_scanner_enabled is active, the monitor inspects local project directories on the host:
package.json (npm/yarn), requirements.txt / Pipfile (pip), Cargo.toml (Cargo), and go.mod (Go).Shuffle Security provides an embedded Remote Web Terminal accessible from the host detail panel or directly at /terminal:
ps aux, df -h, network checks) directly from the web browser to investigate alerts.When response_actions is set to full, administrators can execute remote commands on the endpoint from the web terminal, predefined action chips, or automated workflows:
screenshot): Captures the current display of the active user session.isolate_host): Restricts network connectivity while keeping the management channel alive (requires root on Linux/macOS or SYSTEM on Windows).unisolate_host): Restores network connectivity (requires root or SYSTEM).disable_rce): Permanently disables remote command execution on the host monitor daemon.remote_control): Sends automated input actions (mouse click/move, keystrokes, shortcuts) on Windows hosts.[!NOTE] Controlled execution (restricting commands to pre-approved script files) is currently in development.
The fleet interface at /monitors displays all registered hosts:
All, macOS, Windows, Linux) or search by hostname and IP address.HostDetailPanel): Clicking any host opens a panel showing hardware specifications (CPU, RAM, MAC address), compliance breakdown, software list, scanned project dependencies, and action triggers.Host monitor records, heartbeats, and compliance data are stored in Shuffle Core's Datastore under the shuffle-security_sensors category (and hardware asset specifications in shuffle-security_assets).
List Sensor Groups / Environments: GET /api/v1/getenvironments (filter by sensor_group === true)
Execute Remote Host Action:
API Call
curl -X POST 'https://<instance>/api/v1/apps/sensors/run' \ -H 'Authorization: Bearer $SHUFFLE…' \ -H 'Content-Type: application/json' \ -d '{ "app_id": "sensors", "app_name": "sensors", "name": "run_action", "parameters": [ { "name": "action", "value": "uname -a" }, { "name": "hosts", "value": "<HOSTNAME>" }, { "name": "sensor_group", "value": "<SENSOR_GROUP>" } ] }'
Response
No response received.
Query Host from Datastore Directly:
API Call
curl -X POST 'https://<instance>/api/v1/orgs/<org_id>/get_cache' \ -H 'Authorization: Bearer $SHUFFLE…' \ -H 'Content-Type: application/json' \ -d '{ "category": "shuffle-security_sensors", "key": "<HOST_ID>", "org_id": "<ORG_ID>" }'
Response
No response received.
# Retrieve host telemetry directly from the datastore
host = self.get_cache("host_id_123", category="shuffle-security_sensors")
# Check compliance state
if host:
compliance = host.get("compliance", {})
if not compliance.get("hd_encrypted"):
print(f"Warning: Host {host.get('hostname')} does not have disk encryption enabled")
For more details on backend API endpoints and datastore caching rules, see the API documentation.