Overview
Use this guide to deploy Beacon to Apple Silicon Macs with Rippling Device Management, configure Claude Code telemetry for the logged-in user, and forward runtime and inventory events to Google Cloud Storage (GCS). The deployed state is:- Rippling assigns the signed Beacon package to a Supergroup.
- Beacon and Vector are installed under
/opt/beacon. com.beacon.endpoint.collectorreceives local Claude Code telemetry.- Claude Code hooks are installed for the active console user.
- Runtime and inventory events are written to:
/var/log/beacon-agent/runtime.jsonl/var/log/beacon-agent/inventory_state.jsonl
com.beacon.endpoint.gcs-forwarderuploads both streams:
beacon-prod, not beacon-prod/runtime or
beacon-prod/inventory.
Prerequisites
Prepare:- Rippling IT with Device Management.
- Target Macs enrolled in Rippling MDM and connected through the Rippling Agent.
- A pilot Supergroup scoped to assigned Apple Silicon Macs and the intended Claude Code users.
- A signed and notarized
BeaconEndpointAgent-<version>-arm64.pkgthat includes/opt/beacon/bin/vector. - A GCS bucket and permission to manage its IAM policy.
- A policy decision that permits a service-account key on managed endpoints.
- A separate GCS reader identity for delivery validation.
1. Prepare Google Cloud
Set administrator-shell placeholders:roles/storage.objectCreator permits new object creation but not listing,
reading, overwriting, or deleting objects. This limits the endpoint credential,
but it also means that credential cannot validate uploads.
Create a separate read-only identity:
2. Create and deliver the writer credential
The packaged Vector version supports a service-account JSON file throughGOOGLE_APPLICATION_CREDENTIALS and GCE metadata credentials. A managed Mac
does not normally have GCE metadata. Interactive Application Default
Credentials and Workload Identity Federation are not a reliable authentication
contract for this launchd service.
Create a key only when service-account keys are permitted:
- A protected arbitrary-file or secret-delivery capability enabled in your Rippling tenant.
- A separate, tightly scoped signed custom installer package that writes only
this credential file with
root:wheelownership and mode0600.
- paste the JSON into a Rippling custom Bash script;
- print it in script output or activity logs;
- place it under
/opt/beaconor/Library/Application Support/Beacon, which Beacon owns; - deploy it with group or world read permission.
3. Upload the Beacon custom installer
In the Rippling Devices app:- Upload the signed Beacon
.pkgas a custom installer. - Configure it as system-level software.
- Assign it to the pilot Supergroup.
- Wait for installation on the next device connection.
- Review software installation status, pending actions, and activity logs.
4. Deploy the Rippling reconciliation script
Create a macOS custom Bash script in Rippling and assign it to the same pilot Supergroup. Configure it on a recurring schedule during rollout because:- Rippling’s public documentation does not define custom installer dependency ordering;
- the credential may arrive separately;
- Claude Code hooks require a logged-in non-root console user.
Do not add the credential JSON itself to the script.
The helper’s smoke test prints recent runtime and inventory events. The wrapper
truncates a mode-
0600 log under root’s private home and redirects verbose
output there so retained prompts, tool inputs, or command output are not
exported through Rippling’s script-output view.
The packaged helpers remain under
/opt/beacon/jamf for compatibility, but
this flow does not call Jamf APIs. Environment variables are used instead of
Jamf positional parameters.What the helper does
The combined helper:- verifies the GCS bucket, Vector binary, and credential path;
- requires the credential to be root-owned with mode
0400or0600; - writes and validates the Vector configuration;
- creates:
- starts
com.beacon.endpoint.gcs-forwarder; - repairs
com.beacon.endpoint.collector; - prepares the runtime and inventory JSONL files;
- grants the active console user append access;
- installs Claude Code hooks for the active user;
- runs a local hook smoke test and validates endpoint status.
end. Inventory starts at beginning so the
initial inventory snapshot is not missed.
If no interactive user is logged in, forwarder and endpoint reconciliation can
complete before the hook-repair phase returns non-zero. Keep the recurring
script assigned so a later user session completes hook installation.
5. Validate a pilot Mac
Rippling state
In Rippling, confirm:- the device is assigned and remains in the pilot Supergroup;
- MDM and Rippling Agent status are healthy;
- the Beacon custom installer succeeded;
- the credential delivery action succeeded;
- no relevant pending action remains;
- the recurring script’s latest output completed after an interactive login.
Local endpoint and services
Generate validation events
Generate a runtime event and a forced inventory heartbeat after the forwarder is running:Validate GCS with the reader
Use the separate reader identity, not the endpoint writer:roles/iam.serviceAccountTokenCreator on the reader service account:
6. Expand the rollout
After the pilot is healthy:- Expand the custom installer, credential delivery, and reconciliation script to a staged production Supergroup.
- Keep all three assignments scoped identically.
- Continue recurring reconciliation for newly assigned devices and user logins.
- Review Rippling software status, pending actions, script output, and activity logs during each stage.
- Validate GCS object freshness with the reader identity or your downstream security pipeline.
Credential rotation
Create the replacement key before deleting the old one:root:wheel ownership, and mode 0600. The recurring
reconciliation script restarts the forwarder when it next runs. To restart
immediately:
Package updates
Upload the newer signed Beacon package to Rippling and test it with the pilot Supergroup. Package postinstall restarts the collector and restores an existing GCS forwarder. Keep the reconciliation script assigned to repair hooks and forwarding state after the update. Rippling’s public documentation does not define custom-installer supersedence or version comparison behavior. Verify your chosen update pattern in the pilot before replacing the production assignment.Uninstall
Use an explicit cleanup sequence:- Remove the Mac from the recurring reconciliation script.
- Copy the cleanup helper to a temporary root-only path while
/opt/beaconstill exists. - Remove or unassign the Beacon custom installer so Rippling does not reinstall it after cleanup.
- Run the copied helper as a one-time root script and review all warnings.
- Verify Beacon LaunchDaemons, files, and the package receipt are gone.
- Remove the separately managed writer credential.
- Revoke the writer key.
Troubleshooting
The reconciliation script fails before configuration
The reconciliation script fails before configuration
Review Rippling script output. Confirm it ran as root and that the Beacon
package, Vector binary, helper script, and credential file all exist. A
recurring run may occur before the custom installers have completed.
No interactive console user was found
No interactive console user was found
The helper intentionally returns non-zero because Claude Code hooks are
per-user. Keep the recurring script assigned and rerun it after the employee
logs in. Forwarder and collector setup may already be healthy.
The credential is rejected
The credential is rejected
Check path, ownership, and mode:The path must be absolute, the owner must be
root, and the mode must be
0400 or 0600.The GCS forwarder is not running
The GCS forwarder is not running
Inspect launchd and Vector errors, then validate the saved configuration
without starting a second Vector process:
GCS returns 403 Forbidden
GCS returns 403 Forbidden
Confirm the JSON belongs to the expected writer service account and that
the account has
roles/storage.objectCreator on the target bucket. If the
bucket uses CMEK, confirm the writer can use the encryption key.The writer cannot list uploaded objects
The writer cannot list uploaded objects
This is expected.
roles/storage.objectCreator cannot list or read objects.
Validate with the reader identity.Runtime objects are missing
Runtime objects are missing
Runtime forwarding starts at
end. Generate
beacon endpoint gcs validate --system after the forwarder is running, wait
up to five minutes, and inspect Vector stderr.Inventory objects are missing
Inventory objects are missing
Force an inventory heartbeat, inspect
/var/log/beacon-agent/inventory_state.jsonl, and confirm the Vector config
includes the inventory source and /inventory/date=%F/ key prefix.Rippling references
- Rippling Device Management
- Role-based software installation with Supergroups
- Device health monitoring
- Rippling Device Management whitepaper
Related
Rippling MDM overview
Review package deployment, Supergroups, recurring scripts, updates, and uninstall.
Claude Code
Review the Claude Code telemetry surface and local configuration.
GCS command reference
Review local GCS validation commands and generated forwarding assets.
Endpoint operations
Review system paths, services, permissions, update behavior, and cleanup.

