.pkg on a single Mac without any MDM. It is the right choice for an individual machine, a pilot, or a small team where you do not yet have a managed device fleet. The package places Hilt EDR (EDRApp.app) into /Applications and registers a small forwarder LaunchDaemon; the user then performs a one-time, ~30-second approval of the system extension and grants it Full Disk Access.
This works on a normal, hardened Mac — System Integrity Protection (SIP) stays enabled, there is no csrutil disable, no developer mode, and no Terminal required for the consents. That is possible because the app and its embedded extensions are signed with a Developer ID Application certificate, carry an embedded provisioning profile that authorizes the restricted Endpoint Security entitlement, use the Hardened Runtime, and are notarized and stapled by Apple. See Networking and trust model for the full entitlement and signing story.
The macOS Collector is in early access. The notarized
.pkg with SIP-on install described here is the target shipping model. For zero-click fleet rollout via Jamf, Kandji, or Intune, see Deploy with MDM.Requirements
Host resources
The package installs a small, well-defined set of items on the host:
The two extensions delivered inside the app bundle are:
There is no kernel extension (kext). Both components are pure user-space System Extensions on Apple’s modern frameworks.
Installation
The standalone install is a double-click followed by two one-time consents. For the click-by-click walkthrough with the exact System Settings panes and screenshots, see Install flow; the summary below mirrors that procedure.1
Run the installer
Double-click
Hilt-EDR-<version>.pkg and follow the prompts. Authenticate with an administrator password when asked. The installer copies EDRApp.app into /Applications and registers the forwarder LaunchDaemon.2
Open the app once
Launch Hilt EDR from
/Applications (or Spotlight). On first launch it requests activation of its system extension. Click Open System Settings (or Allow) when prompted.3
Approve the system extension
Go to System Settings → General → Login Items & Extensions → Endpoint Security Extensions, enable ESensor, and authenticate. This is the system-extension approval; SIP remains enabled throughout.
4
Grant Full Disk Access
Go to System Settings → Privacy & Security → Full Disk Access and enable the ESensor entry, which appears automatically after step 3. It is listed as ESensor / “Hilt EDR Sensor”, not as “EDRApp”.
Full Disk Access is required. Any third-party Endpoint Security client needs it, and the same is true for CrowdStrike, SentinelOne, and similar products. These two consents (system-extension approval and Full Disk Access) are Apple security requirements and cannot be suppressed without MDM — the user must physically authenticate at least once. If you need a fully silent, zero-click install, use Deploy with MDM instead.
Configuration
The forwarder reads its configuration from/Library/Application Support/Hilt/EDR/. The collector ships events to a single configured ingest endpoint and identifies the host by its human-readable Mac name (device_name). Relevant settings:
ESensor emits events as JSON lines, which the forwarder
LaunchDaemon ships over outbound HTTPS to the edr-collector. The collector routes events to MSK Kafka topics (dag.endpoint.exec, dag.endpoint.file, dag.endpoint.net), the enrichment service processes them with ENRICH_PLATFORM=macos, and they land in the ClickHouse endpoint_events table. See Data flow for the full pipeline.
Verification
After approving the extension, confirm ESensor is activated and enabled:[activated enabled] state:
LaunchDaemon is loaded and running:
If
systemextensionsctl list shows ESensor as [activated waiting for user], the extension has not yet been approved — return to System Settings → General → Login Items & Extensions → Endpoint Security Extensions and enable ESensor. If the sensor activates but no events reach the dashboard, confirm Full Disk Access is granted to ESensor and that outbound HTTPS (443) to your ingest endpoint is permitted.What this install does not do
- No SIP changes. It never runs
csrutil disableand never enables developer mode; SIP stays enabled. - No kernel extension. Both components are user-space System Extensions; nothing loads into the kernel.
- No inbound listener and no phone-home. The only network egress is outbound HTTPS to your configured ingest endpoint.
- No file contents. ESensor captures event metadata (paths, signing identity, attribution), not the contents of files.
- No arbitrary blocking or quarantine response. Telemetry is overwhelmingly NOTIFY; a small AUTH self-protection set denies unauthorized tampering with the agent in-kernel (see Event coverage). Console-driven on-device quarantine response is not yet available on macOS (early access).
- No auto-update. Upgrades are performed by re-running a newer
.pkg; in-place auto-update is not yet available on macOS.
Upgrade
Because the app and extension are signed with the same Team ID (MVMB6LCP2A), an upgrade does not require re-approval — the existing system-extension approval and Full Disk Access grant carry over, and launchd relaunches the new extension build automatically.
1
Quit the app
Quit Hilt EDR if it is running.
2
Run the new package
Double-click the newer
Hilt-EDR-<version>.pkg and authenticate. It replaces EDRApp.app in /Applications in place.3
Confirm the new build
Run
systemextensionsctl list and confirm ESensor shows the new version in the [activated enabled] state.macOS major upgrades. Full Disk Access grants can occasionally reset across a major macOS upgrade (a known TCC behavior). On a standalone Mac you may need to re-toggle Full Disk Access for ESensor once after such an upgrade. MDM-managed hosts have this re-applied automatically via PPPC — see Deploy with MDM.
Uninstall
Deactivate the system extension and remove the installed components:System Extensions are deactivated through the system-extension lifecycle, not by deleting files alone. Use the app’s uninstall action (or its deactivation request) so macOS removes the extension from
/Library/SystemExtensions/; removing only the app bundle can leave a deactivated-but-staged extension behind.